Lines Matching full:imx219

3  * A V4L2 driver for Sony IMX219 cameras.
142 /* IMX219 native and active pixel array size. */
339 struct imx219 { struct
344 struct clk *xclk; /* system clock to IMX219 */
364 static inline struct imx219 *to_imx219(struct v4l2_subdev *_sd) in to_imx219() argument
366 return container_of(_sd, struct imx219, sd); in to_imx219()
370 static u32 imx219_get_format_code(struct imx219 *imx219, u32 code) in imx219_get_format_code() argument
381 i = (i & ~3) | (imx219->vflip->val ? 2 : 0) | in imx219_get_format_code()
382 (imx219->hflip->val ? 1 : 0); in imx219_get_format_code()
393 struct imx219 *imx219 = in imx219_set_ctrl() local
394 container_of(ctrl->handler, struct imx219, ctrl_handler); in imx219_set_ctrl()
395 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_set_ctrl()
400 state = v4l2_subdev_get_locked_active_state(&imx219->sd); in imx219_set_ctrl()
410 __v4l2_ctrl_modify_range(imx219->exposure, in imx219_set_ctrl()
411 imx219->exposure->minimum, in imx219_set_ctrl()
412 exposure_max, imx219->exposure->step, in imx219_set_ctrl()
425 cci_write(imx219->regmap, IMX219_REG_ANALOG_GAIN, in imx219_set_ctrl()
429 cci_write(imx219->regmap, IMX219_REG_EXPOSURE, in imx219_set_ctrl()
433 cci_write(imx219->regmap, IMX219_REG_DIGITAL_GAIN, in imx219_set_ctrl()
437 cci_write(imx219->regmap, IMX219_REG_TEST_PATTERN, in imx219_set_ctrl()
442 cci_write(imx219->regmap, IMX219_REG_ORIENTATION, in imx219_set_ctrl()
443 imx219->hflip->val | imx219->vflip->val << 1, &ret); in imx219_set_ctrl()
446 cci_write(imx219->regmap, IMX219_REG_VTS, in imx219_set_ctrl()
450 cci_write(imx219->regmap, IMX219_REG_TESTP_RED, in imx219_set_ctrl()
454 cci_write(imx219->regmap, IMX219_REG_TESTP_GREENR, in imx219_set_ctrl()
458 cci_write(imx219->regmap, IMX219_REG_TESTP_BLUE, in imx219_set_ctrl()
462 cci_write(imx219->regmap, IMX219_REG_TESTP_GREENB, in imx219_set_ctrl()
482 static unsigned long imx219_get_pixel_rate(struct imx219 *imx219) in imx219_get_pixel_rate() argument
484 return (imx219->lanes == 2) ? IMX219_PIXEL_RATE : IMX219_PIXEL_RATE_4LANE; in imx219_get_pixel_rate()
488 static int imx219_init_controls(struct imx219 *imx219) in imx219_init_controls() argument
490 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_init_controls()
497 ctrl_hdlr = &imx219->ctrl_handler; in imx219_init_controls()
503 imx219->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
505 imx219_get_pixel_rate(imx219), in imx219_init_controls()
506 imx219_get_pixel_rate(imx219), 1, in imx219_init_controls()
507 imx219_get_pixel_rate(imx219)); in imx219_init_controls()
509 imx219->link_freq = in imx219_init_controls()
513 (imx219->lanes == 2) ? imx219_link_freq_menu : in imx219_init_controls()
515 if (imx219->link_freq) in imx219_init_controls()
516 imx219->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx219_init_controls()
519 imx219->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
524 imx219->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
527 if (imx219->hblank) in imx219_init_controls()
528 imx219->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx219_init_controls()
532 imx219->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
546 imx219->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
548 if (imx219->hflip) in imx219_init_controls()
549 imx219->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT; in imx219_init_controls()
551 imx219->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops, in imx219_init_controls()
553 if (imx219->vflip) in imx219_init_controls()
554 imx219->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT; in imx219_init_controls()
591 imx219->sd.ctrl_handler = ctrl_hdlr; in imx219_init_controls()
601 static void imx219_free_controls(struct imx219 *imx219) in imx219_free_controls() argument
603 v4l2_ctrl_handler_free(imx219->sd.ctrl_handler); in imx219_free_controls()
610 static int imx219_set_framefmt(struct imx219 *imx219, in imx219_set_framefmt() argument
639 cci_write(imx219->regmap, IMX219_REG_X_ADD_STA_A, in imx219_set_framefmt()
641 cci_write(imx219->regmap, IMX219_REG_X_ADD_END_A, in imx219_set_framefmt()
643 cci_write(imx219->regmap, IMX219_REG_Y_ADD_STA_A, in imx219_set_framefmt()
645 cci_write(imx219->regmap, IMX219_REG_Y_ADD_END_A, in imx219_set_framefmt()
668 cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_H, bin_h, &ret); in imx219_set_framefmt()
669 cci_write(imx219->regmap, IMX219_REG_BINNING_MODE_V, bin_v, &ret); in imx219_set_framefmt()
671 cci_write(imx219->regmap, IMX219_REG_X_OUTPUT_SIZE, in imx219_set_framefmt()
673 cci_write(imx219->regmap, IMX219_REG_Y_OUTPUT_SIZE, in imx219_set_framefmt()
676 cci_write(imx219->regmap, IMX219_REG_TP_WINDOW_WIDTH, in imx219_set_framefmt()
678 cci_write(imx219->regmap, IMX219_REG_TP_WINDOW_HEIGHT, in imx219_set_framefmt()
681 cci_write(imx219->regmap, IMX219_REG_CSI_DATA_FORMAT_A, in imx219_set_framefmt()
683 cci_write(imx219->regmap, IMX219_REG_OPPXCK_DIV, bpp, &ret); in imx219_set_framefmt()
688 static int imx219_configure_lanes(struct imx219 *imx219) in imx219_configure_lanes() argument
691 return cci_multi_reg_write(imx219->regmap, in imx219_configure_lanes()
692 imx219->lanes == 2 ? imx219_2lane_regs : imx219_4lane_regs, in imx219_configure_lanes()
693 imx219->lanes == 2 ? ARRAY_SIZE(imx219_2lane_regs) : in imx219_configure_lanes()
697 static int imx219_start_streaming(struct imx219 *imx219, in imx219_start_streaming() argument
700 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_start_streaming()
708 ret = cci_multi_reg_write(imx219->regmap, imx219_common_regs, in imx219_start_streaming()
716 ret = imx219_configure_lanes(imx219); in imx219_start_streaming()
723 ret = imx219_set_framefmt(imx219, state); in imx219_start_streaming()
731 ret = __v4l2_ctrl_handler_setup(imx219->sd.ctrl_handler); in imx219_start_streaming()
736 ret = cci_write(imx219->regmap, IMX219_REG_MODE_SELECT, in imx219_start_streaming()
742 __v4l2_ctrl_grab(imx219->vflip, true); in imx219_start_streaming()
743 __v4l2_ctrl_grab(imx219->hflip, true); in imx219_start_streaming()
752 static void imx219_stop_streaming(struct imx219 *imx219) in imx219_stop_streaming() argument
754 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_stop_streaming()
758 ret = cci_write(imx219->regmap, IMX219_REG_MODE_SELECT, in imx219_stop_streaming()
763 __v4l2_ctrl_grab(imx219->vflip, false); in imx219_stop_streaming()
764 __v4l2_ctrl_grab(imx219->hflip, false); in imx219_stop_streaming()
771 struct imx219 *imx219 = to_imx219(sd); in imx219_set_stream() local
778 ret = imx219_start_streaming(imx219, state); in imx219_set_stream()
780 imx219_stop_streaming(imx219); in imx219_set_stream()
786 static void imx219_update_pad_format(struct imx219 *imx219, in imx219_update_pad_format() argument
791 fmt->code = imx219_get_format_code(imx219, code); in imx219_update_pad_format()
805 struct imx219 *imx219 = to_imx219(sd); in imx219_enum_mbus_code() local
810 code->code = imx219_get_format_code(imx219, imx219_mbus_formats[code->index * 4]); in imx219_enum_mbus_code()
819 struct imx219 *imx219 = to_imx219(sd); in imx219_enum_frame_size() local
825 code = imx219_get_format_code(imx219, fse->code); in imx219_enum_frame_size()
841 struct imx219 *imx219 = to_imx219(sd); in imx219_set_pad_format() local
852 imx219_update_pad_format(imx219, mode, &fmt->format, fmt->format.code); in imx219_set_pad_format()
876 __v4l2_ctrl_modify_range(imx219->vblank, IMX219_VBLANK_MIN, in imx219_set_pad_format()
879 __v4l2_ctrl_s_ctrl(imx219->vblank, in imx219_set_pad_format()
885 __v4l2_ctrl_modify_range(imx219->exposure, in imx219_set_pad_format()
886 imx219->exposure->minimum, in imx219_set_pad_format()
887 exposure_max, imx219->exposure->step, in imx219_set_pad_format()
895 __v4l2_ctrl_modify_range(imx219->hblank, hblank, hblank, 1, in imx219_set_pad_format()
979 struct imx219 *imx219 = to_imx219(sd); in imx219_power_on() local
983 imx219->supplies); in imx219_power_on()
990 ret = clk_prepare_enable(imx219->xclk); in imx219_power_on()
997 gpiod_set_value_cansleep(imx219->reset_gpio, 1); in imx219_power_on()
1004 regulator_bulk_disable(IMX219_NUM_SUPPLIES, imx219->supplies); in imx219_power_on()
1012 struct imx219 *imx219 = to_imx219(sd); in imx219_power_off() local
1014 gpiod_set_value_cansleep(imx219->reset_gpio, 0); in imx219_power_off()
1015 regulator_bulk_disable(IMX219_NUM_SUPPLIES, imx219->supplies); in imx219_power_off()
1016 clk_disable_unprepare(imx219->xclk); in imx219_power_off()
1025 static int imx219_get_regulators(struct imx219 *imx219) in imx219_get_regulators() argument
1027 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_get_regulators()
1031 imx219->supplies[i].supply = imx219_supply_name[i]; in imx219_get_regulators()
1035 imx219->supplies); in imx219_get_regulators()
1039 static int imx219_identify_module(struct imx219 *imx219) in imx219_identify_module() argument
1041 struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); in imx219_identify_module()
1045 ret = cci_read(imx219->regmap, IMX219_REG_CHIP_ID, &val, NULL); in imx219_identify_module()
1059 static int imx219_check_hwcfg(struct device *dev, struct imx219 *imx219) in imx219_check_hwcfg() argument
1084 imx219->lanes = ep_cfg.bus.mipi_csi2.num_data_lanes; in imx219_check_hwcfg()
1087 switch (imx219->lanes) { in imx219_check_hwcfg()
1131 struct imx219 *imx219; in imx219_probe() local
1134 imx219 = devm_kzalloc(&client->dev, sizeof(*imx219), GFP_KERNEL); in imx219_probe()
1135 if (!imx219) in imx219_probe()
1138 v4l2_i2c_subdev_init(&imx219->sd, client, &imx219_subdev_ops); in imx219_probe()
1139 imx219->sd.internal_ops = &imx219_internal_ops; in imx219_probe()
1142 if (imx219_check_hwcfg(dev, imx219)) in imx219_probe()
1145 imx219->regmap = devm_cci_regmap_init_i2c(client, 16); in imx219_probe()
1146 if (IS_ERR(imx219->regmap)) in imx219_probe()
1147 return dev_err_probe(dev, PTR_ERR(imx219->regmap), in imx219_probe()
1151 imx219->xclk = devm_clk_get(dev, NULL); in imx219_probe()
1152 if (IS_ERR(imx219->xclk)) in imx219_probe()
1153 return dev_err_probe(dev, PTR_ERR(imx219->xclk), in imx219_probe()
1156 imx219->xclk_freq = clk_get_rate(imx219->xclk); in imx219_probe()
1157 if (imx219->xclk_freq != IMX219_XCLK_FREQ) in imx219_probe()
1160 imx219->xclk_freq); in imx219_probe()
1162 ret = imx219_get_regulators(imx219); in imx219_probe()
1167 imx219->reset_gpio = devm_gpiod_get_optional(dev, "reset", in imx219_probe()
1178 ret = imx219_identify_module(imx219); in imx219_probe()
1187 ret = cci_write(imx219->regmap, IMX219_REG_MODE_SELECT, in imx219_probe()
1195 ret = cci_write(imx219->regmap, IMX219_REG_MODE_SELECT, in imx219_probe()
1202 ret = imx219_init_controls(imx219); in imx219_probe()
1207 imx219->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in imx219_probe()
1208 imx219->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx219_probe()
1211 imx219->pad.flags = MEDIA_PAD_FL_SOURCE; in imx219_probe()
1213 ret = media_entity_pads_init(&imx219->sd.entity, 1, &imx219->pad); in imx219_probe()
1219 imx219->sd.state_lock = imx219->ctrl_handler.lock; in imx219_probe()
1220 ret = v4l2_subdev_init_finalize(&imx219->sd); in imx219_probe()
1229 ret = v4l2_async_register_subdev_sensor(&imx219->sd); in imx219_probe()
1241 v4l2_subdev_cleanup(&imx219->sd); in imx219_probe()
1246 media_entity_cleanup(&imx219->sd.entity); in imx219_probe()
1249 imx219_free_controls(imx219); in imx219_probe()
1260 struct imx219 *imx219 = to_imx219(sd); in imx219_remove() local
1265 imx219_free_controls(imx219); in imx219_remove()
1275 { .compatible = "sony,imx219" },
1286 .name = "imx219",
1297 MODULE_DESCRIPTION("Sony IMX219 sensor driver");