Lines Matching refs:imx219
445 struct imx219 {
479 static inline struct imx219 *to_imx219(struct v4l2_subdev *_sd)
481 return container_of(_sd, struct imx219, sd);
485 static int imx219_read_reg(struct imx219 *imx219, u16 reg, u32 len, u32 *val)
487 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
518 static int imx219_write_reg(struct imx219 *imx219, u16 reg, u32 len, u32 val)
520 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
535 static int imx219_write_regs(struct imx219 *imx219,
538 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
543 ret = imx219_write_reg(imx219, regs[i].address, 1, regs[i].val);
557 static u32 imx219_get_format_code(struct imx219 *imx219, u32 code)
561 lockdep_assert_held(&imx219->mutex);
570 i = (i & ~3) | (imx219->vflip->val ? 2 : 0) |
571 (imx219->hflip->val ? 1 : 0);
576 static void imx219_set_default_format(struct imx219 *imx219)
580 fmt = &imx219->fmt;
595 struct imx219 *imx219 = to_imx219(sd);
600 mutex_lock(&imx219->mutex);
605 try_fmt->code = imx219_get_format_code(imx219,
616 mutex_unlock(&imx219->mutex);
623 struct imx219 *imx219 =
624 container_of(ctrl->handler, struct imx219, ctrl_handler);
625 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
632 exposure_max = imx219->mode->height + ctrl->val - 4;
635 __v4l2_ctrl_modify_range(imx219->exposure,
636 imx219->exposure->minimum,
637 exposure_max, imx219->exposure->step,
650 ret = imx219_write_reg(imx219, IMX219_REG_ANALOG_GAIN,
654 ret = imx219_write_reg(imx219, IMX219_REG_EXPOSURE,
658 ret = imx219_write_reg(imx219, IMX219_REG_DIGITAL_GAIN,
662 ret = imx219_write_reg(imx219, IMX219_REG_TEST_PATTERN,
668 ret = imx219_write_reg(imx219, IMX219_REG_ORIENTATION, 1,
669 imx219->hflip->val |
670 imx219->vflip->val << 1);
673 ret = imx219_write_reg(imx219, IMX219_REG_VTS,
675 imx219->mode->height + ctrl->val);
678 ret = imx219_write_reg(imx219, IMX219_REG_TESTP_RED,
682 ret = imx219_write_reg(imx219, IMX219_REG_TESTP_GREENR,
686 ret = imx219_write_reg(imx219, IMX219_REG_TESTP_BLUE,
690 ret = imx219_write_reg(imx219, IMX219_REG_TESTP_GREENB,
714 struct imx219 *imx219 = to_imx219(sd);
719 code->code = imx219_get_format_code(imx219, codes[code->index * 4]);
728 struct imx219 *imx219 = to_imx219(sd);
733 if (fse->code != imx219_get_format_code(imx219, fse->code))
754 static void imx219_update_pad_format(struct imx219 *imx219,
764 static int __imx219_get_pad_format(struct imx219 *imx219,
770 v4l2_subdev_get_try_format(&imx219->sd, cfg, fmt->pad);
772 try_fmt->code = imx219_get_format_code(imx219, try_fmt->code);
775 imx219_update_pad_format(imx219, imx219->mode, fmt);
776 fmt->format.code = imx219_get_format_code(imx219,
777 imx219->fmt.code);
787 struct imx219 *imx219 = to_imx219(sd);
790 mutex_lock(&imx219->mutex);
791 ret = __imx219_get_pad_format(imx219, cfg, fmt);
792 mutex_unlock(&imx219->mutex);
801 struct imx219 *imx219 = to_imx219(sd);
807 mutex_lock(&imx219->mutex);
816 fmt->format.code = imx219_get_format_code(imx219, codes[i]);
822 imx219_update_pad_format(imx219, mode, fmt);
826 } else if (imx219->mode != mode ||
827 imx219->fmt.code != fmt->format.code) {
828 imx219->fmt = fmt->format;
829 imx219->mode = mode;
831 __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN,
834 __v4l2_ctrl_s_ctrl(imx219->vblank,
840 __v4l2_ctrl_modify_range(imx219->exposure,
841 imx219->exposure->minimum,
842 exposure_max, imx219->exposure->step,
850 __v4l2_ctrl_modify_range(imx219->hblank, hblank, hblank, 1,
854 mutex_unlock(&imx219->mutex);
859 static int imx219_set_framefmt(struct imx219 *imx219)
861 switch (imx219->fmt.code) {
866 return imx219_write_regs(imx219, raw8_framefmt_regs,
873 return imx219_write_regs(imx219, raw10_framefmt_regs,
880 static int imx219_set_binning(struct imx219 *imx219)
882 if (!imx219->mode->binning) {
883 return imx219_write_reg(imx219, IMX219_REG_BINNING_MODE,
888 switch (imx219->fmt.code) {
893 return imx219_write_reg(imx219, IMX219_REG_BINNING_MODE,
901 return imx219_write_reg(imx219, IMX219_REG_BINNING_MODE,
910 __imx219_get_pad_crop(struct imx219 *imx219, struct v4l2_subdev_pad_config *cfg,
915 return v4l2_subdev_get_try_crop(&imx219->sd, cfg, pad);
917 return &imx219->mode->crop;
929 struct imx219 *imx219 = to_imx219(sd);
931 mutex_lock(&imx219->mutex);
932 sel->r = *__imx219_get_pad_crop(imx219, cfg, sel->pad,
934 mutex_unlock(&imx219->mutex);
960 static int imx219_start_streaming(struct imx219 *imx219)
962 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
973 ret = imx219_write_regs(imx219, imx219_common_regs, ARRAY_SIZE(imx219_common_regs));
980 reg_list = &imx219->mode->reg_list;
981 ret = imx219_write_regs(imx219, reg_list->regs, reg_list->num_of_regs);
987 ret = imx219_set_framefmt(imx219);
994 ret = imx219_set_binning(imx219);
1002 ret = __v4l2_ctrl_handler_setup(imx219->sd.ctrl_handler);
1007 ret = imx219_write_reg(imx219, IMX219_REG_MODE_SELECT,
1013 __v4l2_ctrl_grab(imx219->vflip, true);
1014 __v4l2_ctrl_grab(imx219->hflip, true);
1023 static void imx219_stop_streaming(struct imx219 *imx219)
1025 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
1029 ret = imx219_write_reg(imx219, IMX219_REG_MODE_SELECT,
1034 __v4l2_ctrl_grab(imx219->vflip, false);
1035 __v4l2_ctrl_grab(imx219->hflip, false);
1042 struct imx219 *imx219 = to_imx219(sd);
1045 mutex_lock(&imx219->mutex);
1046 if (imx219->streaming == enable) {
1047 mutex_unlock(&imx219->mutex);
1056 ret = imx219_start_streaming(imx219);
1060 imx219_stop_streaming(imx219);
1063 imx219->streaming = enable;
1065 mutex_unlock(&imx219->mutex);
1070 mutex_unlock(&imx219->mutex);
1080 struct imx219 *imx219 = to_imx219(sd);
1084 imx219->supplies);
1091 ret = clk_prepare_enable(imx219->xclk);
1098 gpiod_set_value_cansleep(imx219->reset_gpio, 1);
1105 regulator_bulk_disable(IMX219_NUM_SUPPLIES, imx219->supplies);
1114 struct imx219 *imx219 = to_imx219(sd);
1116 gpiod_set_value_cansleep(imx219->reset_gpio, 0);
1117 regulator_bulk_disable(IMX219_NUM_SUPPLIES, imx219->supplies);
1118 clk_disable_unprepare(imx219->xclk);
1127 struct imx219 *imx219 = to_imx219(sd);
1129 if (imx219->streaming)
1130 imx219_stop_streaming(imx219);
1139 struct imx219 *imx219 = to_imx219(sd);
1142 if (imx219->streaming) {
1143 ret = imx219_start_streaming(imx219);
1151 imx219_stop_streaming(imx219);
1152 imx219->streaming = false;
1157 static int imx219_get_regulators(struct imx219 *imx219)
1159 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
1163 imx219->supplies[i].supply = imx219_supply_name[i];
1167 imx219->supplies);
1171 static int imx219_identify_module(struct imx219 *imx219)
1173 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
1177 ret = imx219_read_reg(imx219, IMX219_REG_CHIP_ID,
1222 static int imx219_init_controls(struct imx219 *imx219)
1224 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
1226 unsigned int height = imx219->mode->height;
1231 ctrl_hdlr = &imx219->ctrl_handler;
1236 mutex_init(&imx219->mutex);
1237 ctrl_hdlr->lock = &imx219->mutex;
1240 imx219->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1247 imx219->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1250 imx219->mode->vts_def - height);
1251 hblank = IMX219_PPL_DEFAULT - imx219->mode->width;
1252 imx219->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1255 if (imx219->hblank)
1256 imx219->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1257 exposure_max = imx219->mode->vts_def - 4;
1260 imx219->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1274 imx219->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1276 if (imx219->hflip)
1277 imx219->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
1279 imx219->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1281 if (imx219->vflip)
1282 imx219->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
1320 imx219->sd.ctrl_handler = ctrl_hdlr;
1326 mutex_destroy(&imx219->mutex);
1331 static void imx219_free_controls(struct imx219 *imx219)
1333 v4l2_ctrl_handler_free(imx219->sd.ctrl_handler);
1334 mutex_destroy(&imx219->mutex);
1387 struct imx219 *imx219;
1390 imx219 = devm_kzalloc(&client->dev, sizeof(*imx219), GFP_KERNEL);
1391 if (!imx219)
1394 v4l2_i2c_subdev_init(&imx219->sd, client, &imx219_subdev_ops);
1401 imx219->xclk = devm_clk_get(dev, NULL);
1402 if (IS_ERR(imx219->xclk)) {
1404 return PTR_ERR(imx219->xclk);
1407 imx219->xclk_freq = clk_get_rate(imx219->xclk);
1408 if (imx219->xclk_freq != IMX219_XCLK_FREQ) {
1410 imx219->xclk_freq);
1414 ret = imx219_get_regulators(imx219);
1421 imx219->reset_gpio = devm_gpiod_get_optional(dev, "reset",
1432 ret = imx219_identify_module(imx219);
1437 imx219->mode = &supported_modes[0];
1443 ret = imx219_write_reg(imx219, IMX219_REG_MODE_SELECT,
1450 ret = imx219_write_reg(imx219, IMX219_REG_MODE_SELECT,
1456 ret = imx219_init_controls(imx219);
1461 imx219->sd.internal_ops = &imx219_internal_ops;
1462 imx219->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1463 imx219->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1466 imx219->pad.flags = MEDIA_PAD_FL_SOURCE;
1469 imx219_set_default_format(imx219);
1471 ret = media_entity_pads_init(&imx219->sd.entity, 1, &imx219->pad);
1477 ret = v4l2_async_register_subdev_sensor_common(&imx219->sd);
1491 media_entity_cleanup(&imx219->sd.entity);
1494 imx219_free_controls(imx219);
1505 struct imx219 *imx219 = to_imx219(sd);
1509 imx219_free_controls(imx219);
1520 { .compatible = "sony,imx219" },
1532 .name = "imx219",