Lines Matching refs:imx219
444 struct imx219 {
475 static inline struct imx219 *to_imx219(struct v4l2_subdev *_sd)
477 return container_of(_sd, struct imx219, sd);
481 static u32 imx219_get_format_code(struct imx219 *imx219, u32 code)
492 i = (i & ~3) | (imx219->vflip->val ? 2 : 0) |
493 (imx219->hflip->val ? 1 : 0);
500 struct imx219 *imx219 =
501 container_of(ctrl->handler, struct imx219, ctrl_handler);
502 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
509 exposure_max = imx219->mode->height + ctrl->val - 4;
512 __v4l2_ctrl_modify_range(imx219->exposure,
513 imx219->exposure->minimum,
514 exposure_max, imx219->exposure->step,
527 cci_write(imx219->regmap, IMX219_REG_ANALOG_GAIN,
531 cci_write(imx219->regmap, IMX219_REG_EXPOSURE,
535 cci_write(imx219->regmap, IMX219_REG_DIGITAL_GAIN,
539 cci_write(imx219->regmap, IMX219_REG_TEST_PATTERN,
544 cci_write(imx219->regmap, IMX219_REG_ORIENTATION,
545 imx219->hflip->val | imx219->vflip->val << 1, &ret);
548 cci_write(imx219->regmap, IMX219_REG_VTS,
549 imx219->mode->height + ctrl->val, &ret);
552 cci_write(imx219->regmap, IMX219_REG_TESTP_RED,
556 cci_write(imx219->regmap, IMX219_REG_TESTP_GREENR,
560 cci_write(imx219->regmap, IMX219_REG_TESTP_BLUE,
564 cci_write(imx219->regmap, IMX219_REG_TESTP_GREENB,
584 static void imx219_update_pad_format(struct imx219 *imx219,
589 fmt->code = imx219_get_format_code(imx219, code);
601 struct imx219 *imx219 = to_imx219(sd);
607 imx219_update_pad_format(imx219, &supported_modes[0], format,
624 struct imx219 *imx219 = to_imx219(sd);
629 code->code = imx219_get_format_code(imx219, imx219_mbus_formats[code->index * 4]);
638 struct imx219 *imx219 = to_imx219(sd);
644 code = imx219_get_format_code(imx219, fse->code);
660 struct imx219 *imx219 = to_imx219(sd);
671 imx219_update_pad_format(imx219, mode, &fmt->format, fmt->format.code);
680 imx219->mode = mode;
682 __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN,
685 __v4l2_ctrl_s_ctrl(imx219->vblank,
691 __v4l2_ctrl_modify_range(imx219->exposure,
692 imx219->exposure->minimum,
693 exposure_max, imx219->exposure->step,
701 __v4l2_ctrl_modify_range(imx219->hblank, hblank, hblank, 1,
708 static int imx219_set_framefmt(struct imx219 *imx219,
716 return cci_multi_reg_write(imx219->regmap, raw8_framefmt_regs,
723 return cci_multi_reg_write(imx219->regmap, raw10_framefmt_regs,
730 static int imx219_set_binning(struct imx219 *imx219,
733 if (!imx219->mode->binning)
734 return cci_write(imx219->regmap, IMX219_REG_BINNING_MODE,
742 return cci_write(imx219->regmap, IMX219_REG_BINNING_MODE,
749 return cci_write(imx219->regmap, IMX219_REG_BINNING_MODE,
787 static int imx219_configure_lanes(struct imx219 *imx219)
789 return cci_write(imx219->regmap, IMX219_REG_CSI_LANE_MODE,
790 imx219->lanes == 2 ? IMX219_CSI_2_LANE_MODE :
794 static int imx219_start_streaming(struct imx219 *imx219,
797 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
807 ret = cci_multi_reg_write(imx219->regmap, imx219_common_regs,
815 ret = imx219_configure_lanes(imx219);
822 reg_list = &imx219->mode->reg_list;
823 ret = cci_multi_reg_write(imx219->regmap, reg_list->regs,
830 format = v4l2_subdev_get_pad_format(&imx219->sd, state, 0);
831 ret = imx219_set_framefmt(imx219, format);
838 ret = imx219_set_binning(imx219, format);
846 ret = __v4l2_ctrl_handler_setup(imx219->sd.ctrl_handler);
851 ret = cci_write(imx219->regmap, IMX219_REG_MODE_SELECT,
857 __v4l2_ctrl_grab(imx219->vflip, true);
858 __v4l2_ctrl_grab(imx219->hflip, true);
867 static void imx219_stop_streaming(struct imx219 *imx219)
869 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
873 ret = cci_write(imx219->regmap, IMX219_REG_MODE_SELECT,
878 __v4l2_ctrl_grab(imx219->vflip, false);
879 __v4l2_ctrl_grab(imx219->hflip, false);
886 struct imx219 *imx219 = to_imx219(sd);
892 if (imx219->streaming == enable)
900 ret = imx219_start_streaming(imx219, state);
904 imx219_stop_streaming(imx219);
907 imx219->streaming = enable;
918 struct imx219 *imx219 = to_imx219(sd);
922 imx219->supplies);
929 ret = clk_prepare_enable(imx219->xclk);
936 gpiod_set_value_cansleep(imx219->reset_gpio, 1);
943 regulator_bulk_disable(IMX219_NUM_SUPPLIES, imx219->supplies);
951 struct imx219 *imx219 = to_imx219(sd);
953 gpiod_set_value_cansleep(imx219->reset_gpio, 0);
954 regulator_bulk_disable(IMX219_NUM_SUPPLIES, imx219->supplies);
955 clk_disable_unprepare(imx219->xclk);
963 struct imx219 *imx219 = to_imx219(sd);
965 if (imx219->streaming)
966 imx219_stop_streaming(imx219);
974 struct imx219 *imx219 = to_imx219(sd);
978 if (imx219->streaming) {
980 ret = imx219_start_streaming(imx219, state);
989 imx219_stop_streaming(imx219);
990 imx219->streaming = false;
995 static int imx219_get_regulators(struct imx219 *imx219)
997 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
1001 imx219->supplies[i].supply = imx219_supply_name[i];
1005 imx219->supplies);
1009 static int imx219_identify_module(struct imx219 *imx219)
1011 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
1015 ret = cci_read(imx219->regmap, IMX219_REG_CHIP_ID, &val, NULL);
1056 static unsigned long imx219_get_pixel_rate(struct imx219 *imx219)
1058 return (imx219->lanes == 2) ? IMX219_PIXEL_RATE : IMX219_PIXEL_RATE_4LANE;
1062 static int imx219_init_controls(struct imx219 *imx219)
1064 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd);
1066 unsigned int height = imx219->mode->height;
1071 ctrl_hdlr = &imx219->ctrl_handler;
1077 imx219->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1079 imx219_get_pixel_rate(imx219),
1080 imx219_get_pixel_rate(imx219), 1,
1081 imx219_get_pixel_rate(imx219));
1083 imx219->link_freq =
1087 (imx219->lanes == 2) ? imx219_link_freq_menu :
1089 if (imx219->link_freq)
1090 imx219->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1093 imx219->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1096 imx219->mode->vts_def - height);
1097 hblank = IMX219_PPL_DEFAULT - imx219->mode->width;
1098 imx219->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1101 if (imx219->hblank)
1102 imx219->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1103 exposure_max = imx219->mode->vts_def - 4;
1106 imx219->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1120 imx219->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1122 if (imx219->hflip)
1123 imx219->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
1125 imx219->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
1127 if (imx219->vflip)
1128 imx219->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
1166 imx219->sd.ctrl_handler = ctrl_hdlr;
1176 static void imx219_free_controls(struct imx219 *imx219)
1178 v4l2_ctrl_handler_free(imx219->sd.ctrl_handler);
1181 static int imx219_check_hwcfg(struct device *dev, struct imx219 *imx219)
1206 imx219->lanes = ep_cfg.bus.mipi_csi2.num_data_lanes;
1215 (ep_cfg.link_frequencies[0] != ((imx219->lanes == 2) ?
1234 struct imx219 *imx219;
1237 imx219 = devm_kzalloc(&client->dev, sizeof(*imx219), GFP_KERNEL);
1238 if (!imx219)
1241 v4l2_i2c_subdev_init(&imx219->sd, client, &imx219_subdev_ops);
1244 if (imx219_check_hwcfg(dev, imx219))
1247 imx219->regmap = devm_cci_regmap_init_i2c(client, 16);
1248 if (IS_ERR(imx219->regmap)) {
1249 ret = PTR_ERR(imx219->regmap);
1255 imx219->xclk = devm_clk_get(dev, NULL);
1256 if (IS_ERR(imx219->xclk)) {
1258 return PTR_ERR(imx219->xclk);
1261 imx219->xclk_freq = clk_get_rate(imx219->xclk);
1262 if (imx219->xclk_freq != IMX219_XCLK_FREQ) {
1264 imx219->xclk_freq);
1268 ret = imx219_get_regulators(imx219);
1275 imx219->reset_gpio = devm_gpiod_get_optional(dev, "reset",
1286 ret = imx219_identify_module(imx219);
1291 imx219->mode = &supported_modes[0];
1297 ret = cci_write(imx219->regmap, IMX219_REG_MODE_SELECT,
1305 ret = cci_write(imx219->regmap, IMX219_REG_MODE_SELECT,
1312 ret = imx219_init_controls(imx219);
1317 imx219->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
1319 imx219->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1322 imx219->pad.flags = MEDIA_PAD_FL_SOURCE;
1324 ret = media_entity_pads_init(&imx219->sd.entity, 1, &imx219->pad);
1330 imx219->sd.state_lock = imx219->ctrl_handler.lock;
1331 ret = v4l2_subdev_init_finalize(&imx219->sd);
1337 ret = v4l2_async_register_subdev_sensor(&imx219->sd);
1351 v4l2_subdev_cleanup(&imx219->sd);
1354 media_entity_cleanup(&imx219->sd.entity);
1357 imx219_free_controls(imx219);
1368 struct imx219 *imx219 = to_imx219(sd);
1373 imx219_free_controls(imx219);
1382 { .compatible = "sony,imx219" },
1394 .name = "imx219",