Lines Matching refs:ov5645
90 struct ov5645 { struct
126 static inline struct ov5645 *to_ov5645(struct v4l2_subdev *sd) in to_ov5645() argument
128 return container_of(sd, struct ov5645, sd); in to_ov5645()
573 static int ov5645_write_reg(struct ov5645 *ov5645, u16 reg, u8 val) in ov5645_write_reg() argument
582 ret = i2c_master_send(ov5645->i2c_client, regbuf, 3); in ov5645_write_reg()
584 dev_err(ov5645->dev, "%s: write reg error %d: reg=%x, val=%x\n", in ov5645_write_reg()
592 static int ov5645_read_reg(struct ov5645 *ov5645, u16 reg, u8 *val) in ov5645_read_reg() argument
600 ret = i2c_master_send(ov5645->i2c_client, regbuf, 2); in ov5645_read_reg()
602 dev_err(ov5645->dev, "%s: write reg error %d: reg=%x\n", in ov5645_read_reg()
607 ret = i2c_master_recv(ov5645->i2c_client, val, 1); in ov5645_read_reg()
609 dev_err(ov5645->dev, "%s: read reg error %d: reg=%x\n", in ov5645_read_reg()
617 static int ov5645_set_aec_mode(struct ov5645 *ov5645, u32 mode) in ov5645_set_aec_mode() argument
619 u8 val = ov5645->aec_pk_manual; in ov5645_set_aec_mode()
627 ret = ov5645_write_reg(ov5645, OV5645_AEC_PK_MANUAL, val); in ov5645_set_aec_mode()
629 ov5645->aec_pk_manual = val; in ov5645_set_aec_mode()
634 static int ov5645_set_agc_mode(struct ov5645 *ov5645, u32 enable) in ov5645_set_agc_mode() argument
636 u8 val = ov5645->aec_pk_manual; in ov5645_set_agc_mode()
644 ret = ov5645_write_reg(ov5645, OV5645_AEC_PK_MANUAL, val); in ov5645_set_agc_mode()
646 ov5645->aec_pk_manual = val; in ov5645_set_agc_mode()
651 static int ov5645_set_register_array(struct ov5645 *ov5645, in ov5645_set_register_array() argument
660 ret = ov5645_write_reg(ov5645, settings->reg, settings->val); in ov5645_set_register_array()
667 ov5645_read_reg(ov5645, settings->reg, &tmp); in ov5645_set_register_array()
672 ov5645_write_reg(ov5645, settings->reg, settings->val); in ov5645_set_register_array()
680 static int ov5645_set_power_on(struct ov5645 *ov5645) in ov5645_set_power_on() argument
689 ret = clk_prepare_enable(ov5645->xclk); in ov5645_set_power_on()
691 dev_err(ov5645->dev, "clk prepare enable failed\n"); in ov5645_set_power_on()
697 gpiod_set_value_cansleep(ov5645->enable_gpio, 1); in ov5645_set_power_on()
700 gpiod_set_value_cansleep(ov5645->rst_gpio, 0); in ov5645_set_power_on()
707 static void ov5645_set_power_off(struct ov5645 *ov5645) in ov5645_set_power_off() argument
709 gpiod_set_value_cansleep(ov5645->rst_gpio, 1); in ov5645_set_power_off()
710 gpiod_set_value_cansleep(ov5645->enable_gpio, 0); in ov5645_set_power_off()
711 clk_disable_unprepare(ov5645->xclk); in ov5645_set_power_off()
717 struct ov5645 *ov5645 = to_ov5645(sd); in ov5645_s_power() local
720 mutex_lock(&ov5645->power_lock); in ov5645_s_power()
725 if (ov5645->power_count == !on) { in ov5645_s_power()
727 ret = ov5645_set_power_on(ov5645); in ov5645_s_power()
731 ret = ov5645_set_register_array(ov5645, in ov5645_s_power()
735 dev_err(ov5645->dev, in ov5645_s_power()
737 ov5645_set_power_off(ov5645); in ov5645_s_power()
744 ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x58); in ov5645_s_power()
745 ov5645_set_power_off(ov5645); in ov5645_s_power()
750 ov5645->power_count += on ? 1 : -1; in ov5645_s_power()
751 WARN_ON(ov5645->power_count < 0); in ov5645_s_power()
754 mutex_unlock(&ov5645->power_lock); in ov5645_s_power()
759 static int ov5645_set_saturation(struct ov5645 *ov5645, s32 value) in ov5645_set_saturation() argument
764 ret = ov5645_write_reg(ov5645, OV5645_SDE_SAT_U, reg_value); in ov5645_set_saturation()
768 return ov5645_write_reg(ov5645, OV5645_SDE_SAT_V, reg_value); in ov5645_set_saturation()
771 static int ov5645_set_hflip(struct ov5645 *ov5645, s32 value) in ov5645_set_hflip() argument
773 u8 val = ov5645->timing_tc_reg21; in ov5645_set_hflip()
781 ret = ov5645_write_reg(ov5645, OV5645_TIMING_TC_REG21, val); in ov5645_set_hflip()
783 ov5645->timing_tc_reg21 = val; in ov5645_set_hflip()
788 static int ov5645_set_vflip(struct ov5645 *ov5645, s32 value) in ov5645_set_vflip() argument
790 u8 val = ov5645->timing_tc_reg20; in ov5645_set_vflip()
798 ret = ov5645_write_reg(ov5645, OV5645_TIMING_TC_REG20, val); in ov5645_set_vflip()
800 ov5645->timing_tc_reg20 = val; in ov5645_set_vflip()
805 static int ov5645_set_test_pattern(struct ov5645 *ov5645, s32 value) in ov5645_set_test_pattern() argument
814 return ov5645_write_reg(ov5645, OV5645_PRE_ISP_TEST_SETTING_1, val); in ov5645_set_test_pattern()
825 static int ov5645_set_awb(struct ov5645 *ov5645, s32 enable_auto) in ov5645_set_awb() argument
832 return ov5645_write_reg(ov5645, OV5645_AWB_MANUAL_CONTROL, val); in ov5645_set_awb()
837 struct ov5645 *ov5645 = container_of(ctrl->handler, in ov5645_s_ctrl() local
838 struct ov5645, ctrls); in ov5645_s_ctrl()
841 mutex_lock(&ov5645->power_lock); in ov5645_s_ctrl()
842 if (!ov5645->power_count) { in ov5645_s_ctrl()
843 mutex_unlock(&ov5645->power_lock); in ov5645_s_ctrl()
849 ret = ov5645_set_saturation(ov5645, ctrl->val); in ov5645_s_ctrl()
852 ret = ov5645_set_awb(ov5645, ctrl->val); in ov5645_s_ctrl()
855 ret = ov5645_set_agc_mode(ov5645, ctrl->val); in ov5645_s_ctrl()
858 ret = ov5645_set_aec_mode(ov5645, ctrl->val); in ov5645_s_ctrl()
861 ret = ov5645_set_test_pattern(ov5645, ctrl->val); in ov5645_s_ctrl()
864 ret = ov5645_set_hflip(ov5645, ctrl->val); in ov5645_s_ctrl()
867 ret = ov5645_set_vflip(ov5645, ctrl->val); in ov5645_s_ctrl()
874 mutex_unlock(&ov5645->power_lock); in ov5645_s_ctrl()
929 __ov5645_get_pad_format(struct ov5645 *ov5645, in __ov5645_get_pad_format() argument
936 return v4l2_subdev_get_try_format(&ov5645->sd, cfg, pad); in __ov5645_get_pad_format()
938 return &ov5645->fmt; in __ov5645_get_pad_format()
948 struct ov5645 *ov5645 = to_ov5645(sd); in ov5645_get_format() local
950 format->format = *__ov5645_get_pad_format(ov5645, cfg, format->pad, in ov5645_get_format()
956 __ov5645_get_pad_crop(struct ov5645 *ov5645, struct v4l2_subdev_pad_config *cfg, in __ov5645_get_pad_crop() argument
961 return v4l2_subdev_get_try_crop(&ov5645->sd, cfg, pad); in __ov5645_get_pad_crop()
963 return &ov5645->crop; in __ov5645_get_pad_crop()
973 struct ov5645 *ov5645 = to_ov5645(sd); in ov5645_set_format() local
979 __crop = __ov5645_get_pad_crop(ov5645, cfg, format->pad, in ov5645_set_format()
991 ret = v4l2_ctrl_s_ctrl_int64(ov5645->pixel_clock, in ov5645_set_format()
996 ret = v4l2_ctrl_s_ctrl(ov5645->link_freq, in ov5645_set_format()
1001 ov5645->current_mode = new_mode; in ov5645_set_format()
1004 __format = __ov5645_get_pad_format(ov5645, cfg, format->pad, in ov5645_set_format()
1035 struct ov5645 *ov5645 = to_ov5645(sd); in ov5645_get_selection() local
1040 sel->r = *__ov5645_get_pad_crop(ov5645, cfg, sel->pad, in ov5645_get_selection()
1062 struct ov5645 *ov5645 = to_ov5645(subdev); in ov5645_s_stream() local
1066 ret = ov5645_set_register_array(ov5645, in ov5645_s_stream()
1067 ov5645->current_mode->data, in ov5645_s_stream()
1068 ov5645->current_mode->data_size); in ov5645_s_stream()
1070 dev_err(ov5645->dev, "could not set mode %dx%d\n", in ov5645_s_stream()
1071 ov5645->current_mode->width, in ov5645_s_stream()
1072 ov5645->current_mode->height); in ov5645_s_stream()
1075 ret = v4l2_ctrl_handler_setup(&ov5645->ctrls); in ov5645_s_stream()
1077 dev_err(ov5645->dev, "could not sync v4l2 controls\n"); in ov5645_s_stream()
1081 ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x45); in ov5645_s_stream()
1085 ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0, in ov5645_s_stream()
1090 ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40); in ov5645_s_stream()
1094 ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0, in ov5645_s_stream()
1106 struct ov5645 *ov5645 = to_ov5645(sd); in ov5645_g_frame_interval() local
1107 const struct ov5645_mode_info *mode = ov5645->current_mode; in ov5645_g_frame_interval()
1118 struct ov5645 *ov5645 = to_ov5645(sd); in ov5645_ioctl() local
1124 strlcpy(inf->base.module, ov5645->module_name, in ov5645_ioctl()
1126 strlcpy(inf->base.lens, ov5645->len_name, sizeof(inf->base.lens)); in ov5645_ioctl()
1132 ch_info->width = ov5645->current_mode->width; in ov5645_ioctl()
1133 ch_info->height = ov5645->current_mode->height; in ov5645_ioctl()
1140 ov5645_set_register_array(ov5645, in ov5645_ioctl()
1141 ov5645->current_mode->data, in ov5645_ioctl()
1142 ov5645->current_mode->data_size); in ov5645_ioctl()
1147 ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x45); in ov5645_ioctl()
1148 ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0, in ov5645_ioctl()
1151 ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40); in ov5645_ioctl()
1152 ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0, in ov5645_ioctl()
1255 struct ov5645 *ov5645; in ov5645_probe() local
1261 ov5645 = devm_kzalloc(dev, sizeof(struct ov5645), GFP_KERNEL); in ov5645_probe()
1262 if (!ov5645) in ov5645_probe()
1265 ov5645->i2c_client = client; in ov5645_probe()
1266 ov5645->dev = dev; in ov5645_probe()
1269 &ov5645->module_index); in ov5645_probe()
1271 &ov5645->module_facing); in ov5645_probe()
1273 &ov5645->module_name); in ov5645_probe()
1275 &ov5645->len_name); in ov5645_probe()
1288 &ov5645->ep); in ov5645_probe()
1297 if (ov5645->ep.bus_type != V4L2_MBUS_CSI2_DPHY) { in ov5645_probe()
1303 ov5645->xclk = devm_clk_get(dev, "xclk"); in ov5645_probe()
1304 if (IS_ERR(ov5645->xclk)) { in ov5645_probe()
1306 return PTR_ERR(ov5645->xclk); in ov5645_probe()
1322 ret = clk_set_rate(ov5645->xclk, xclk_freq); in ov5645_probe()
1338 ov5645->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH); in ov5645_probe()
1339 if (IS_ERR(ov5645->enable_gpio)) { in ov5645_probe()
1341 return PTR_ERR(ov5645->enable_gpio); in ov5645_probe()
1344 ov5645->rst_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); in ov5645_probe()
1345 if (IS_ERR(ov5645->rst_gpio)) { in ov5645_probe()
1347 return PTR_ERR(ov5645->rst_gpio); in ov5645_probe()
1350 mutex_init(&ov5645->power_lock); in ov5645_probe()
1352 v4l2_ctrl_handler_init(&ov5645->ctrls, 9); in ov5645_probe()
1353 v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops, in ov5645_probe()
1355 v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops, in ov5645_probe()
1357 v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops, in ov5645_probe()
1359 v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops, in ov5645_probe()
1361 v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops, in ov5645_probe()
1363 v4l2_ctrl_new_std_menu(&ov5645->ctrls, &ov5645_ctrl_ops, in ov5645_probe()
1366 v4l2_ctrl_new_std_menu_items(&ov5645->ctrls, &ov5645_ctrl_ops, in ov5645_probe()
1370 ov5645->pixel_clock = v4l2_ctrl_new_std(&ov5645->ctrls, in ov5645_probe()
1374 ov5645->link_freq = v4l2_ctrl_new_int_menu(&ov5645->ctrls, in ov5645_probe()
1379 if (ov5645->link_freq) in ov5645_probe()
1380 ov5645->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov5645_probe()
1382 ov5645->sd.ctrl_handler = &ov5645->ctrls; in ov5645_probe()
1384 if (ov5645->ctrls.error) { in ov5645_probe()
1386 __func__, ov5645->ctrls.error); in ov5645_probe()
1387 ret = ov5645->ctrls.error; in ov5645_probe()
1391 v4l2_i2c_subdev_init(&ov5645->sd, client, &ov5645_subdev_ops); in ov5645_probe()
1392 ov5645->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in ov5645_probe()
1393 ov5645->pad.flags = MEDIA_PAD_FL_SOURCE; in ov5645_probe()
1394 ov5645->sd.dev = &client->dev; in ov5645_probe()
1395 ov5645->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov5645_probe()
1397 ret = media_entity_pads_init(&ov5645->sd.entity, 1, &ov5645->pad); in ov5645_probe()
1403 ret = ov5645_s_power(&ov5645->sd, true); in ov5645_probe()
1409 ret = ov5645_read_reg(ov5645, OV5645_CHIP_ID_HIGH, &chip_id_high); in ov5645_probe()
1415 ret = ov5645_read_reg(ov5645, OV5645_CHIP_ID_LOW, &chip_id_low); in ov5645_probe()
1424 ret = ov5645_read_reg(ov5645, OV5645_AEC_PK_MANUAL, in ov5645_probe()
1425 &ov5645->aec_pk_manual); in ov5645_probe()
1432 ret = ov5645_read_reg(ov5645, OV5645_TIMING_TC_REG20, in ov5645_probe()
1433 &ov5645->timing_tc_reg20); in ov5645_probe()
1440 ret = ov5645_read_reg(ov5645, OV5645_TIMING_TC_REG21, in ov5645_probe()
1441 &ov5645->timing_tc_reg21); in ov5645_probe()
1448 ov5645_s_power(&ov5645->sd, false); in ov5645_probe()
1452 if (strcmp(ov5645->module_facing, "back") == 0) in ov5645_probe()
1457 snprintf(ov5645->sd.name, sizeof(ov5645->sd.name), "m%02d_%s_%s %s", in ov5645_probe()
1458 ov5645->module_index, facing, in ov5645_probe()
1459 "ov5645", dev_name(ov5645->sd.dev)); in ov5645_probe()
1461 ret = v4l2_async_register_subdev_sensor_common(&ov5645->sd); in ov5645_probe()
1466 ov5645_entity_init_cfg(&ov5645->sd, NULL); in ov5645_probe()
1471 ov5645_s_power(&ov5645->sd, false); in ov5645_probe()
1473 media_entity_cleanup(&ov5645->sd.entity); in ov5645_probe()
1475 v4l2_ctrl_handler_free(&ov5645->ctrls); in ov5645_probe()
1476 mutex_destroy(&ov5645->power_lock); in ov5645_probe()
1484 struct ov5645 *ov5645 = to_ov5645(sd); in ov5645_remove() local
1486 v4l2_async_unregister_subdev(&ov5645->sd); in ov5645_remove()
1487 media_entity_cleanup(&ov5645->sd.entity); in ov5645_remove()
1488 v4l2_ctrl_handler_free(&ov5645->ctrls); in ov5645_remove()
1489 mutex_destroy(&ov5645->power_lock); in ov5645_remove()