Lines Matching defs:imx208

270 struct imx208 {
304 static inline struct imx208 *to_imx208(struct v4l2_subdev *_sd)
306 return container_of(_sd, struct imx208, sd);
310 static u32 imx208_get_format_code(struct imx208 *imx208)
321 return codes[imx208->vflip->val][imx208->hflip->val];
325 static int imx208_read_reg(struct imx208 *imx208, u16 reg, u32 len, u32 *val)
327 struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
358 static int imx208_write_reg(struct imx208 *imx208, u16 reg, u32 len, u32 val)
360 struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
375 static int imx208_write_regs(struct imx208 *imx208,
378 struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
383 ret = imx208_write_reg(imx208, regs[i].address, 1,
412 static int imx208_update_digital_gain(struct imx208 *imx208, u32 len, u32 val)
418 ret = imx208_write_reg(imx208, IMX208_REG_GR_DIGITAL_GAIN, 2, val);
422 ret = imx208_write_reg(imx208, IMX208_REG_GB_DIGITAL_GAIN, 2, val);
426 ret = imx208_write_reg(imx208, IMX208_REG_R_DIGITAL_GAIN, 2, val);
430 return imx208_write_reg(imx208, IMX208_REG_B_DIGITAL_GAIN, 2, val);
435 struct imx208 *imx208 =
436 container_of(ctrl->handler, struct imx208, ctrl_handler);
437 struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
449 ret = imx208_write_reg(imx208, IMX208_REG_ANALOG_GAIN,
453 ret = imx208_write_reg(imx208, IMX208_REG_EXPOSURE,
457 ret = imx208_update_digital_gain(imx208, 2, ctrl->val);
461 ret = imx208_write_reg(imx208, IMX208_REG_VTS, 2,
462 imx208->cur_mode->height + ctrl->val);
465 ret = imx208_write_reg(imx208, IMX208_REG_TEST_PATTERN_MODE,
470 ret = imx208_write_reg(imx208, IMX208_REG_ORIENTATION_CONTROL,
472 imx208->hflip->val |
473 imx208->vflip->val << 1);
509 struct imx208 *imx208 = to_imx208(sd);
514 code->code = imx208_get_format_code(imx208);
523 struct imx208 *imx208 = to_imx208(sd);
528 if (fse->code != imx208_get_format_code(imx208))
539 static void imx208_mode_to_pad_format(struct imx208 *imx208,
545 fmt->format.code = imx208_get_format_code(imx208);
549 static int __imx208_get_pad_format(struct imx208 *imx208,
554 fmt->format = *v4l2_subdev_get_try_format(&imx208->sd,
558 imx208_mode_to_pad_format(imx208, imx208->cur_mode, fmt);
567 struct imx208 *imx208 = to_imx208(sd);
570 mutex_lock(&imx208->imx208_mx);
571 ret = __imx208_get_pad_format(imx208, sd_state, fmt);
572 mutex_unlock(&imx208->imx208_mx);
581 struct imx208 *imx208 = to_imx208(sd);
589 mutex_lock(&imx208->imx208_mx);
591 fmt->format.code = imx208_get_format_code(imx208);
595 imx208_mode_to_pad_format(imx208, mode, fmt);
599 imx208->cur_mode = mode;
600 __v4l2_ctrl_s_ctrl(imx208->link_freq, mode->link_freq_index);
603 __v4l2_ctrl_s_ctrl_int64(imx208->pixel_rate, pixel_rate);
605 vblank_def = imx208->cur_mode->vts_def -
606 imx208->cur_mode->height;
607 vblank_min = imx208->cur_mode->vts_min -
608 imx208->cur_mode->height;
609 __v4l2_ctrl_modify_range(imx208->vblank, vblank_min,
610 IMX208_VTS_MAX - imx208->cur_mode->height,
612 __v4l2_ctrl_s_ctrl(imx208->vblank, vblank_def);
615 - imx208->cur_mode->width;
616 __v4l2_ctrl_modify_range(imx208->hblank, h_blank,
620 mutex_unlock(&imx208->imx208_mx);
625 static int imx208_identify_module(struct imx208 *imx208)
627 struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
631 if (imx208->identified)
634 ret = imx208_read_reg(imx208, IMX208_REG_CHIP_ID,
648 imx208->identified = true;
654 static int imx208_start_streaming(struct imx208 *imx208)
656 struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
660 ret = imx208_identify_module(imx208);
665 link_freq_index = imx208->cur_mode->link_freq_index;
667 ret = imx208_write_regs(imx208, reg_list->regs, reg_list->num_of_regs);
674 reg_list = &imx208->cur_mode->reg_list;
675 ret = imx208_write_regs(imx208, reg_list->regs, reg_list->num_of_regs);
682 ret = __v4l2_ctrl_handler_setup(imx208->sd.ctrl_handler);
687 return imx208_write_reg(imx208, IMX208_REG_MODE_SELECT,
692 static int imx208_stop_streaming(struct imx208 *imx208)
694 struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
698 ret = imx208_write_reg(imx208, IMX208_REG_MODE_SELECT,
712 struct imx208 *imx208 = to_imx208(sd);
716 mutex_lock(&imx208->imx208_mx);
717 if (imx208->streaming == enable) {
718 mutex_unlock(&imx208->imx208_mx);
731 ret = imx208_start_streaming(imx208);
735 imx208_stop_streaming(imx208);
739 imx208->streaming = enable;
740 mutex_unlock(&imx208->imx208_mx);
743 v4l2_ctrl_grab(imx208->vflip, enable);
744 v4l2_ctrl_grab(imx208->hflip, enable);
750 mutex_unlock(&imx208->imx208_mx);
759 struct imx208 *imx208 = to_imx208(sd);
761 if (imx208->streaming)
762 imx208_stop_streaming(imx208);
771 struct imx208 *imx208 = to_imx208(sd);
774 if (imx208->streaming) {
775 ret = imx208_start_streaming(imx208);
783 imx208_stop_streaming(imx208);
784 imx208->streaming = 0;
810 static int imx208_read_otp(struct imx208 *imx208)
812 struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
817 mutex_lock(&imx208->imx208_mx);
819 if (imx208->otp_read)
828 ret = imx208_identify_module(imx208);
841 msgs[1].len = sizeof(imx208->otp_data);
842 msgs[1].buf = imx208->otp_data;
846 imx208->otp_read = true;
854 mutex_unlock(&imx208->imx208_mx);
865 struct imx208 *imx208 = to_imx208(sd);
868 ret = imx208_read_otp(imx208);
872 memcpy(buf, &imx208->otp_data[off], count);
879 static int imx208_init_controls(struct imx208 *imx208)
881 struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
882 struct v4l2_ctrl_handler *ctrl_hdlr = &imx208->ctrl_handler;
894 mutex_init(&imx208->imx208_mx);
895 ctrl_hdlr->lock = &imx208->imx208_mx;
896 imx208->link_freq =
903 if (imx208->link_freq)
904 imx208->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
910 imx208->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops,
915 vblank_def = imx208->cur_mode->vts_def - imx208->cur_mode->height;
916 vblank_min = imx208->cur_mode->vts_min - imx208->cur_mode->height;
917 imx208->vblank =
920 IMX208_VTS_MAX - imx208->cur_mode->height, 1,
923 imx208->hblank =
925 IMX208_PPL_384MHZ - imx208->cur_mode->width,
926 IMX208_PPL_384MHZ - imx208->cur_mode->width,
928 IMX208_PPL_384MHZ - imx208->cur_mode->width);
930 if (imx208->hblank)
931 imx208->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
933 exposure_max = imx208->cur_mode->vts_def - 8;
938 imx208->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops,
940 if (imx208->hflip)
941 imx208->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
942 imx208->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops,
944 if (imx208->vflip)
945 imx208->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
965 imx208->sd.ctrl_handler = ctrl_hdlr;
971 mutex_destroy(&imx208->imx208_mx);
976 static void imx208_free_controls(struct imx208 *imx208)
978 v4l2_ctrl_handler_free(imx208->sd.ctrl_handler);
983 struct imx208 *imx208;
996 imx208 = devm_kzalloc(&client->dev, sizeof(*imx208), GFP_KERNEL);
997 if (!imx208)
1001 v4l2_i2c_subdev_init(&imx208->sd, client, &imx208_subdev_ops);
1006 ret = imx208_identify_module(imx208);
1014 imx208->cur_mode = &supported_modes[0];
1016 ret = imx208_init_controls(imx208);
1023 imx208->sd.internal_ops = &imx208_internal_ops;
1024 imx208->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1025 imx208->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1028 imx208->pad.flags = MEDIA_PAD_FL_SOURCE;
1029 ret = media_entity_pads_init(&imx208->sd.entity, 1, &imx208->pad);
1035 ret = v4l2_async_register_subdev_sensor(&imx208->sd);
1054 v4l2_async_unregister_subdev(&imx208->sd);
1057 media_entity_cleanup(&imx208->sd.entity);
1060 imx208_free_controls(imx208);
1063 mutex_destroy(&imx208->imx208_mx);
1071 struct imx208 *imx208 = to_imx208(sd);
1076 imx208_free_controls(imx208);
1081 mutex_destroy(&imx208->imx208_mx);
1099 .name = "imx208",