Lines Matching +full:echo +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0
23 #include <linux/rk-camera-module.h>
24 #include <media/media-entity.h>
25 #include <media/v4l2-async.h>
26 #include <media/v4l2-ctrls.h>
27 #include <media/v4l2-subdev.h>
29 #include <linux/rk-preisp.h>
42 #define OF_CAMERA_HDR_MODE "rockchip,camera-hdr-mode"
573 .vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0
575 .vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr2
602 return -EINVAL; in ov02k10_write_reg()
610 val_i = 4 - len; in ov02k10_write_reg()
616 return -EIO; in ov02k10_write_reg()
647 return -EINVAL; in ov02k10_read_reg()
651 msgs[0].addr = client->addr; in ov02k10_read_reg()
657 msgs[1].addr = client->addr; in ov02k10_read_reg()
660 msgs[1].buf = &data_be_p[4 - len]; in ov02k10_read_reg()
662 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in ov02k10_read_reg()
664 return -EIO; in ov02k10_read_reg()
674 return abs(mode->width - framefmt->width) + in ov02k10_get_reso_dist()
675 abs(mode->height - framefmt->height); in ov02k10_get_reso_dist()
681 struct v4l2_mbus_framefmt *framefmt = &fmt->format; in ov02k10_find_best_fit()
684 int cur_best_fit_dist = -1; in ov02k10_find_best_fit()
687 for (i = 0; i < ov02k10->cfg_num; i++) { in ov02k10_find_best_fit()
689 if ((cur_best_fit_dist == -1 || dist <= cur_best_fit_dist) && in ov02k10_find_best_fit()
690 (supported_modes[i].bus_fmt == framefmt->code)) { in ov02k10_find_best_fit()
709 mutex_lock(&ov02k10->mutex); in ov02k10_set_fmt()
712 fmt->format.code = mode->bus_fmt; in ov02k10_set_fmt()
713 fmt->format.width = mode->width; in ov02k10_set_fmt()
714 fmt->format.height = mode->height; in ov02k10_set_fmt()
715 fmt->format.field = V4L2_FIELD_NONE; in ov02k10_set_fmt()
716 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in ov02k10_set_fmt()
718 *v4l2_subdev_get_try_format(sd, cfg, fmt->pad) = fmt->format; in ov02k10_set_fmt()
720 mutex_unlock(&ov02k10->mutex); in ov02k10_set_fmt()
721 return -ENOTTY; in ov02k10_set_fmt()
724 ov02k10->cur_mode = mode; in ov02k10_set_fmt()
725 h_blank = mode->hts_def - mode->width; in ov02k10_set_fmt()
726 __v4l2_ctrl_modify_range(ov02k10->hblank, h_blank, in ov02k10_set_fmt()
728 vblank_def = mode->vts_def - mode->height; in ov02k10_set_fmt()
729 __v4l2_ctrl_modify_range(ov02k10->vblank, vblank_def, in ov02k10_set_fmt()
730 OV02K10_VTS_MAX - mode->height, in ov02k10_set_fmt()
732 if (mode->hdr_mode == NO_HDR) { in ov02k10_set_fmt()
735 } else if (mode->hdr_mode == HDR_X2) { in ov02k10_set_fmt()
739 __v4l2_ctrl_s_ctrl_int64(ov02k10->pixel_rate, in ov02k10_set_fmt()
741 __v4l2_ctrl_s_ctrl(ov02k10->link_freq, in ov02k10_set_fmt()
745 mutex_unlock(&ov02k10->mutex); in ov02k10_set_fmt()
755 const struct ov02k10_mode *mode = ov02k10->cur_mode; in ov02k10_get_fmt()
757 mutex_lock(&ov02k10->mutex); in ov02k10_get_fmt()
758 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in ov02k10_get_fmt()
760 fmt->format = *v4l2_subdev_get_try_format(sd, cfg, fmt->pad); in ov02k10_get_fmt()
762 mutex_unlock(&ov02k10->mutex); in ov02k10_get_fmt()
763 return -ENOTTY; in ov02k10_get_fmt()
766 fmt->format.width = mode->width; in ov02k10_get_fmt()
767 fmt->format.height = mode->height; in ov02k10_get_fmt()
768 fmt->format.code = mode->bus_fmt; in ov02k10_get_fmt()
769 fmt->format.field = V4L2_FIELD_NONE; in ov02k10_get_fmt()
770 if (fmt->pad < PAD_MAX && mode->hdr_mode != NO_HDR) in ov02k10_get_fmt()
771 fmt->reserved[0] = mode->vc[fmt->pad]; in ov02k10_get_fmt()
773 fmt->reserved[0] = mode->vc[PAD0]; in ov02k10_get_fmt()
775 mutex_unlock(&ov02k10->mutex); in ov02k10_get_fmt()
786 if (code->index != 0) in ov02k10_enum_mbus_code()
787 return -EINVAL; in ov02k10_enum_mbus_code()
788 code->code = ov02k10->cur_mode->bus_fmt; in ov02k10_enum_mbus_code()
799 if (fse->index >= ov02k10->cfg_num) in ov02k10_enum_frame_sizes()
800 return -EINVAL; in ov02k10_enum_frame_sizes()
802 if (fse->code != supported_modes[fse->index].bus_fmt) in ov02k10_enum_frame_sizes()
803 return -EINVAL; in ov02k10_enum_frame_sizes()
805 fse->min_width = supported_modes[fse->index].width; in ov02k10_enum_frame_sizes()
806 fse->max_width = supported_modes[fse->index].width; in ov02k10_enum_frame_sizes()
807 fse->max_height = supported_modes[fse->index].height; in ov02k10_enum_frame_sizes()
808 fse->min_height = supported_modes[fse->index].height; in ov02k10_enum_frame_sizes()
818 val = (pattern - 1) | OV02K10_TEST_PATTERN_ENABLE; in ov02k10_enable_test_pattern()
822 return ov02k10_write_reg(ov02k10->client, OV02K10_REG_TEST_PATTERN, in ov02k10_enable_test_pattern()
830 const struct ov02k10_mode *mode = ov02k10->cur_mode; in ov02k10_g_frame_interval()
832 fi->interval = mode->max_fps; in ov02k10_g_frame_interval()
841 const struct ov02k10_mode *mode = ov02k10->cur_mode; in ov02k10_g_mbus_config()
844 if (mode->hdr_mode == NO_HDR) in ov02k10_g_mbus_config()
845 val = 1 << (OV02K10_LANES - 1) | in ov02k10_g_mbus_config()
848 if (mode->hdr_mode == HDR_X2) in ov02k10_g_mbus_config()
849 val = 1 << (OV02K10_LANES - 1) | in ov02k10_g_mbus_config()
854 config->type = V4L2_MBUS_CSI2_DPHY; in ov02k10_g_mbus_config()
855 config->flags = val; in ov02k10_g_mbus_config()
864 strlcpy(inf->base.sensor, OV02K10_NAME, sizeof(inf->base.sensor)); in ov02k10_get_module_inf()
865 strlcpy(inf->base.module, ov02k10->module_name, in ov02k10_get_module_inf()
866 sizeof(inf->base.module)); in ov02k10_get_module_inf()
867 strlcpy(inf->base.lens, ov02k10->len_name, sizeof(inf->base.lens)); in ov02k10_get_module_inf()
885 if (!ov02k10->has_init_exp && !ov02k10->streaming) { in ov02k10_set_hdrae()
886 ov02k10->init_hdrae_exp = *ae; in ov02k10_set_hdrae()
887 ov02k10->has_init_exp = true; in ov02k10_set_hdrae()
888 dev_dbg(&ov02k10->client->dev, "ov02k10 don't stream, record exp for hdr!\n"); in ov02k10_set_hdrae()
891 l_exp_time = ae->long_exp_reg; in ov02k10_set_hdrae()
892 m_exp_time = ae->middle_exp_reg; in ov02k10_set_hdrae()
893 s_exp_time = ae->short_exp_reg; in ov02k10_set_hdrae()
894 l_a_gain = ae->long_gain_reg; in ov02k10_set_hdrae()
895 m_a_gain = ae->middle_gain_reg; in ov02k10_set_hdrae()
896 s_a_gain = ae->short_gain_reg; in ov02k10_set_hdrae()
897 l_cg_mode = ae->long_cg_mode; in ov02k10_set_hdrae()
898 m_cg_mode = ae->middle_cg_mode; in ov02k10_set_hdrae()
899 s_cg_mode = ae->short_cg_mode; in ov02k10_set_hdrae()
900 dev_dbg(&ov02k10->client->dev, in ov02k10_set_hdrae()
905 if (ov02k10->cur_mode->hdr_mode == HDR_X2) { in ov02k10_set_hdrae()
914 ret = ov02k10_read_reg(ov02k10->client, OV02K10_REG_HCG_SWITCH, in ov02k10_set_hdrae()
917 if (ov02k10->long_hcg && l_cg_mode == GAIN_MODE_LCG) { in ov02k10_set_hdrae()
919 ov02k10->long_hcg = false; in ov02k10_set_hdrae()
921 } else if (!ov02k10->long_hcg && l_cg_mode == GAIN_MODE_HCG) { in ov02k10_set_hdrae()
923 ov02k10->long_hcg = true; in ov02k10_set_hdrae()
926 if (ov02k10->middle_hcg && m_cg_mode == GAIN_MODE_LCG) { in ov02k10_set_hdrae()
928 ov02k10->middle_hcg = false; in ov02k10_set_hdrae()
930 } else if (!ov02k10->middle_hcg && m_cg_mode == GAIN_MODE_HCG) { in ov02k10_set_hdrae()
932 ov02k10->middle_hcg = true; in ov02k10_set_hdrae()
944 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
948 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
952 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
956 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
960 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
964 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
969 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
973 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
977 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
981 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_hdrae()
992 struct i2c_client *client = ov02k10->client; in ov02k10_set_conversion_gain()
997 dev_dbg(&ov02k10->client->dev, "set conversion gain %d\n", cur_cg); in ov02k10_set_conversion_gain()
998 mutex_lock(&ov02k10->mutex); in ov02k10_set_conversion_gain()
1003 if (ov02k10->long_hcg && cur_cg == GAIN_MODE_LCG) { in ov02k10_set_conversion_gain()
1006 ov02k10->long_hcg = false; in ov02k10_set_conversion_gain()
1007 } else if (!ov02k10->long_hcg && cur_cg == GAIN_MODE_HCG) { in ov02k10_set_conversion_gain()
1010 ov02k10->long_hcg = true; in ov02k10_set_conversion_gain()
1030 mutex_unlock(&ov02k10->mutex); in ov02k10_set_conversion_gain()
1031 dev_dbg(&client->dev, "set conversion gain %d, (reg,val)=(0x%x,0x%x)\n", in ov02k10_set_conversion_gain()
1037 //ag: echo 0 > /sys/devices/platform/ff510000.i2c/i2c-1/1-0036-1/cam_s_cg
1070 for (i--; i >= 0 ; i--) in add_sysfs_interfaces()
1073 return -ENODEV; in add_sysfs_interfaces()
1092 w = ov02k10->cur_mode->width; in ov02k10_ioctl()
1093 h = ov02k10->cur_mode->height; in ov02k10_ioctl()
1094 for (i = 0; i < ov02k10->cfg_num; i++) { in ov02k10_ioctl()
1097 supported_modes[i].hdr_mode == hdr_cfg->hdr_mode) { in ov02k10_ioctl()
1098 ov02k10->cur_mode = &supported_modes[i]; in ov02k10_ioctl()
1102 if (i == ov02k10->cfg_num) { in ov02k10_ioctl()
1103 dev_err(&ov02k10->client->dev, in ov02k10_ioctl()
1105 hdr_cfg->hdr_mode, w, h); in ov02k10_ioctl()
1106 ret = -EINVAL; in ov02k10_ioctl()
1108 w = ov02k10->cur_mode->hts_def - ov02k10->cur_mode->width; in ov02k10_ioctl()
1109 h = ov02k10->cur_mode->vts_def - ov02k10->cur_mode->height; in ov02k10_ioctl()
1110 __v4l2_ctrl_modify_range(ov02k10->hblank, w, w, 1, w); in ov02k10_ioctl()
1111 __v4l2_ctrl_modify_range(ov02k10->vblank, h, in ov02k10_ioctl()
1112 OV02K10_VTS_MAX - ov02k10->cur_mode->height, in ov02k10_ioctl()
1114 if (ov02k10->cur_mode->hdr_mode == NO_HDR) { in ov02k10_ioctl()
1117 } else if (ov02k10->cur_mode->hdr_mode == HDR_X2) { in ov02k10_ioctl()
1122 __v4l2_ctrl_s_ctrl_int64(ov02k10->pixel_rate, in ov02k10_ioctl()
1124 __v4l2_ctrl_s_ctrl(ov02k10->link_freq, in ov02k10_ioctl()
1127 dev_info(&ov02k10->client->dev, in ov02k10_ioctl()
1129 ov02k10->cur_mode->hdr_mode); in ov02k10_ioctl()
1137 hdr_cfg->esp.mode = HDR_NORMAL_VC; in ov02k10_ioctl()
1138 hdr_cfg->hdr_mode = ov02k10->cur_mode->hdr_mode; in ov02k10_ioctl()
1148 ret = ov02k10_write_reg(ov02k10->client, OV02K10_REG_CTRL_MODE, in ov02k10_ioctl()
1151 ret = ov02k10_write_reg(ov02k10->client, OV02K10_REG_CTRL_MODE, in ov02k10_ioctl()
1155 ret = -ENOIOCTLCMD; in ov02k10_ioctl()
1179 ret = -ENOMEM; in ov02k10_compat_ioctl32()
1191 ret = -ENOMEM; in ov02k10_compat_ioctl32()
1203 ret = -ENOMEM; in ov02k10_compat_ioctl32()
1215 ret = -ENOMEM; in ov02k10_compat_ioctl32()
1227 ret = -ENOMEM; in ov02k10_compat_ioctl32()
1247 ret = -ENOIOCTLCMD; in ov02k10_compat_ioctl32()
1258 struct i2c_client *client = ov02k10->client; in ov02k10_init_conversion_gain()
1270 ov02k10->long_hcg = false; in ov02k10_init_conversion_gain()
1271 ov02k10->middle_hcg = false; in ov02k10_init_conversion_gain()
1272 ov02k10->short_hcg = false; in ov02k10_init_conversion_gain()
1280 ret = ov02k10_write_array(ov02k10->client, ov02k10_global_regs); in __ov02k10_start_stream()
1282 dev_err(&ov02k10->client->dev, in __ov02k10_start_stream()
1286 ret = ov02k10_write_array(ov02k10->client, ov02k10->cur_mode->reg_list); in __ov02k10_start_stream()
1293 ret = __v4l2_ctrl_handler_setup(&ov02k10->ctrl_handler); in __ov02k10_start_stream()
1296 if (ov02k10->has_init_exp && ov02k10->cur_mode->hdr_mode != NO_HDR) { in __ov02k10_start_stream()
1297 ret = ov02k10_ioctl(&ov02k10->subdev, in __ov02k10_start_stream()
1299 &ov02k10->init_hdrae_exp); in __ov02k10_start_stream()
1301 dev_err(&ov02k10->client->dev, in __ov02k10_start_stream()
1306 return ov02k10_write_reg(ov02k10->client, OV02K10_REG_CTRL_MODE, in __ov02k10_start_stream()
1312 ov02k10->has_init_exp = false; in __ov02k10_stop_stream()
1313 return ov02k10_write_reg(ov02k10->client, OV02K10_REG_CTRL_MODE, in __ov02k10_stop_stream()
1320 struct i2c_client *client = ov02k10->client; in ov02k10_s_stream()
1323 mutex_lock(&ov02k10->mutex); in ov02k10_s_stream()
1325 if (on == ov02k10->streaming) in ov02k10_s_stream()
1329 ret = pm_runtime_get_sync(&client->dev); in ov02k10_s_stream()
1331 pm_runtime_put_noidle(&client->dev); in ov02k10_s_stream()
1338 pm_runtime_put(&client->dev); in ov02k10_s_stream()
1343 pm_runtime_put(&client->dev); in ov02k10_s_stream()
1346 ov02k10->streaming = on; in ov02k10_s_stream()
1349 mutex_unlock(&ov02k10->mutex); in ov02k10_s_stream()
1357 struct i2c_client *client = ov02k10->client; in ov02k10_s_power()
1360 mutex_lock(&ov02k10->mutex); in ov02k10_s_power()
1362 /* If the power state is not modified - no work to do. */ in ov02k10_s_power()
1363 if (ov02k10->power_on == !!on) in ov02k10_s_power()
1367 ret = pm_runtime_get_sync(&client->dev); in ov02k10_s_power()
1369 pm_runtime_put_noidle(&client->dev); in ov02k10_s_power()
1373 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_s_power()
1379 ov02k10->power_on = true; in ov02k10_s_power()
1381 pm_runtime_put(&client->dev); in ov02k10_s_power()
1382 ov02k10->power_on = false; in ov02k10_s_power()
1386 mutex_unlock(&ov02k10->mutex); in ov02k10_s_power()
1401 struct device *dev = &ov02k10->client->dev; in __ov02k10_power_on()
1403 if (!IS_ERR_OR_NULL(ov02k10->pins_default)) { in __ov02k10_power_on()
1404 ret = pinctrl_select_state(ov02k10->pinctrl, in __ov02k10_power_on()
1405 ov02k10->pins_default); in __ov02k10_power_on()
1409 ret = clk_set_rate(ov02k10->xvclk, OV02K10_XVCLK_FREQ); in __ov02k10_power_on()
1412 if (clk_get_rate(ov02k10->xvclk) != OV02K10_XVCLK_FREQ) in __ov02k10_power_on()
1414 ret = clk_prepare_enable(ov02k10->xvclk); in __ov02k10_power_on()
1419 if (!IS_ERR(ov02k10->reset_gpio)) in __ov02k10_power_on()
1420 gpiod_set_value_cansleep(ov02k10->reset_gpio, 0); in __ov02k10_power_on()
1422 if (!IS_ERR(ov02k10->power_gpio)) { in __ov02k10_power_on()
1423 gpiod_set_value_cansleep(ov02k10->power_gpio, 1); in __ov02k10_power_on()
1427 ret = regulator_bulk_enable(OV02K10_NUM_SUPPLIES, ov02k10->supplies); in __ov02k10_power_on()
1433 if (!IS_ERR(ov02k10->reset_gpio)) in __ov02k10_power_on()
1434 gpiod_set_value_cansleep(ov02k10->reset_gpio, 1); in __ov02k10_power_on()
1437 if (!IS_ERR(ov02k10->pwdn_gpio)) in __ov02k10_power_on()
1438 gpiod_set_value_cansleep(ov02k10->pwdn_gpio, 1); in __ov02k10_power_on()
1447 clk_disable_unprepare(ov02k10->xvclk); in __ov02k10_power_on()
1455 struct device *dev = &ov02k10->client->dev; in __ov02k10_power_off()
1457 if (!IS_ERR(ov02k10->pwdn_gpio)) in __ov02k10_power_off()
1458 gpiod_set_value_cansleep(ov02k10->pwdn_gpio, 0); in __ov02k10_power_off()
1459 clk_disable_unprepare(ov02k10->xvclk); in __ov02k10_power_off()
1460 if (!IS_ERR(ov02k10->reset_gpio)) in __ov02k10_power_off()
1461 gpiod_set_value_cansleep(ov02k10->reset_gpio, 0); in __ov02k10_power_off()
1462 if (!IS_ERR_OR_NULL(ov02k10->pins_sleep)) { in __ov02k10_power_off()
1463 ret = pinctrl_select_state(ov02k10->pinctrl, in __ov02k10_power_off()
1464 ov02k10->pins_sleep); in __ov02k10_power_off()
1468 regulator_bulk_disable(OV02K10_NUM_SUPPLIES, ov02k10->supplies); in __ov02k10_power_off()
1496 v4l2_subdev_get_try_format(sd, fh->pad, 0); in ov02k10_open()
1499 mutex_lock(&ov02k10->mutex); in ov02k10_open()
1501 try_fmt->width = def_mode->width; in ov02k10_open()
1502 try_fmt->height = def_mode->height; in ov02k10_open()
1503 try_fmt->code = def_mode->bus_fmt; in ov02k10_open()
1504 try_fmt->field = V4L2_FIELD_NONE; in ov02k10_open()
1506 mutex_unlock(&ov02k10->mutex); in ov02k10_open()
1519 if (fie->index >= ov02k10->cfg_num) in ov02k10_enum_frame_interval()
1520 return -EINVAL; in ov02k10_enum_frame_interval()
1522 fie->code = supported_modes[fie->index].bus_fmt; in ov02k10_enum_frame_interval()
1523 fie->width = supported_modes[fie->index].width; in ov02k10_enum_frame_interval()
1524 fie->height = supported_modes[fie->index].height; in ov02k10_enum_frame_interval()
1525 fie->interval = supported_modes[fie->index].max_fps; in ov02k10_enum_frame_interval()
1534 if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) { in ov02k10_get_selection()
1535 sel->r.left = 0; in ov02k10_get_selection()
1536 sel->r.width = 1920; in ov02k10_get_selection()
1537 sel->r.top = 0; in ov02k10_get_selection()
1538 sel->r.height = 1080; in ov02k10_get_selection()
1541 return -EINVAL; in ov02k10_get_selection()
1586 struct ov02k10 *ov02k10 = container_of(ctrl->handler, in ov02k10_set_ctrl()
1588 struct i2c_client *client = ov02k10->client; in ov02k10_set_ctrl()
1595 switch (ctrl->id) { in ov02k10_set_ctrl()
1598 max = ov02k10->cur_mode->height + ctrl->val - 8; in ov02k10_set_ctrl()
1599 __v4l2_ctrl_modify_range(ov02k10->exposure, in ov02k10_set_ctrl()
1600 ov02k10->exposure->minimum, max, in ov02k10_set_ctrl()
1601 ov02k10->exposure->step, in ov02k10_set_ctrl()
1602 ov02k10->exposure->default_value); in ov02k10_set_ctrl()
1606 if (!pm_runtime_get_if_in_use(&client->dev)) in ov02k10_set_ctrl()
1609 switch (ctrl->id) { in ov02k10_set_ctrl()
1611 ret = ov02k10_write_reg(ov02k10->client, in ov02k10_set_ctrl()
1614 ctrl->val); in ov02k10_set_ctrl()
1615 dev_dbg(&client->dev, "set exposure 0x%x\n", in ov02k10_set_ctrl()
1616 ctrl->val); in ov02k10_set_ctrl()
1619 if (ctrl->val > 248) { in ov02k10_set_ctrl()
1620 dgain = ctrl->val * 1024 / 248; in ov02k10_set_ctrl()
1624 again = ctrl->val; in ov02k10_set_ctrl()
1626 ret = ov02k10_write_reg(ov02k10->client, in ov02k10_set_ctrl()
1630 ret |= ov02k10_write_reg(ov02k10->client, in ov02k10_set_ctrl()
1634 dev_dbg(&client->dev, "set analog gain 0x%x\n", in ov02k10_set_ctrl()
1635 ctrl->val); in ov02k10_set_ctrl()
1638 ret = ov02k10_write_reg(ov02k10->client, OV02K10_REG_VTS, in ov02k10_set_ctrl()
1640 ctrl->val + ov02k10->cur_mode->height); in ov02k10_set_ctrl()
1641 dev_dbg(&client->dev, "set vblank 0x%x\n", in ov02k10_set_ctrl()
1642 ctrl->val); in ov02k10_set_ctrl()
1645 ret = ov02k10_enable_test_pattern(ov02k10, ctrl->val); in ov02k10_set_ctrl()
1646 dev_dbg(&client->dev, "set test pattern 0x%x\n", in ov02k10_set_ctrl()
1647 ctrl->val); in ov02k10_set_ctrl()
1650 ret = ov02k10_read_reg(ov02k10->client, OV02K10_FLIP_REG, in ov02k10_set_ctrl()
1653 if (ctrl->val) in ov02k10_set_ctrl()
1657 ret = ov02k10_write_reg(ov02k10->client, OV02K10_FLIP_REG, in ov02k10_set_ctrl()
1661 ov02k10->flip = val; in ov02k10_set_ctrl()
1662 dev_dbg(&client->dev, "set hflip 0x%x\n", in ov02k10_set_ctrl()
1663 ctrl->val); in ov02k10_set_ctrl()
1666 ret = ov02k10_read_reg(ov02k10->client, OV02K10_FLIP_REG, in ov02k10_set_ctrl()
1669 if (ctrl->val) in ov02k10_set_ctrl()
1673 ret = ov02k10_write_reg(ov02k10->client, OV02K10_FLIP_REG, in ov02k10_set_ctrl()
1677 ov02k10->flip = val; in ov02k10_set_ctrl()
1678 dev_dbg(&client->dev, "set vflip 0x%x\n", in ov02k10_set_ctrl()
1679 ctrl->val); in ov02k10_set_ctrl()
1682 dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n", in ov02k10_set_ctrl()
1683 __func__, ctrl->id, ctrl->val); in ov02k10_set_ctrl()
1687 pm_runtime_put(&client->dev); in ov02k10_set_ctrl()
1706 handler = &ov02k10->ctrl_handler; in ov02k10_initialize_controls()
1707 mode = ov02k10->cur_mode; in ov02k10_initialize_controls()
1711 handler->lock = &ov02k10->mutex; in ov02k10_initialize_controls()
1713 ov02k10->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in ov02k10_initialize_controls()
1717 if (ov02k10->cur_mode->hdr_mode == NO_HDR) { in ov02k10_initialize_controls()
1725 ov02k10->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in ov02k10_initialize_controls()
1730 __v4l2_ctrl_s_ctrl(ov02k10->link_freq, in ov02k10_initialize_controls()
1733 h_blank = mode->hts_def - mode->width; in ov02k10_initialize_controls()
1734 ov02k10->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in ov02k10_initialize_controls()
1736 if (ov02k10->hblank) in ov02k10_initialize_controls()
1737 ov02k10->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov02k10_initialize_controls()
1739 vblank_def = mode->vts_def - mode->height; in ov02k10_initialize_controls()
1740 ov02k10->vblank = v4l2_ctrl_new_std(handler, &ov02k10_ctrl_ops, in ov02k10_initialize_controls()
1742 OV02K10_VTS_MAX - mode->height, in ov02k10_initialize_controls()
1745 exposure_max = mode->vts_def - 8; in ov02k10_initialize_controls()
1746 ov02k10->exposure = v4l2_ctrl_new_std(handler, &ov02k10_ctrl_ops, in ov02k10_initialize_controls()
1749 mode->exp_def); in ov02k10_initialize_controls()
1751 ov02k10->anal_gain = v4l2_ctrl_new_std(handler, &ov02k10_ctrl_ops, in ov02k10_initialize_controls()
1756 ov02k10->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in ov02k10_initialize_controls()
1758 ARRAY_SIZE(ov02k10_test_pattern_menu) - 1, in ov02k10_initialize_controls()
1760 ov02k10->h_flip = v4l2_ctrl_new_std(handler, &ov02k10_ctrl_ops, in ov02k10_initialize_controls()
1763 ov02k10->v_flip = v4l2_ctrl_new_std(handler, &ov02k10_ctrl_ops, in ov02k10_initialize_controls()
1765 ov02k10->flip = 0; in ov02k10_initialize_controls()
1766 if (handler->error) { in ov02k10_initialize_controls()
1767 ret = handler->error; in ov02k10_initialize_controls()
1768 dev_err(&ov02k10->client->dev, in ov02k10_initialize_controls()
1773 ov02k10->subdev.ctrl_handler = handler; in ov02k10_initialize_controls()
1774 ov02k10->has_init_exp = false; in ov02k10_initialize_controls()
1775 ov02k10->long_hcg = false; in ov02k10_initialize_controls()
1776 ov02k10->middle_hcg = false; in ov02k10_initialize_controls()
1777 ov02k10->short_hcg = false; in ov02k10_initialize_controls()
1790 struct device *dev = &ov02k10->client->dev; in ov02k10_check_sensor_id()
1799 return -ENODEV; in ov02k10_check_sensor_id()
1812 ov02k10->supplies[i].supply = ov02k10_supply_names[i]; in ov02k10_configure_regulators()
1814 return devm_regulator_bulk_get(&ov02k10->client->dev, in ov02k10_configure_regulators()
1816 ov02k10->supplies); in ov02k10_configure_regulators()
1822 struct device *dev = &client->dev; in ov02k10_probe()
1823 struct device_node *node = dev->of_node; in ov02k10_probe()
1837 return -ENOMEM; in ov02k10_probe()
1840 &ov02k10->module_index); in ov02k10_probe()
1842 &ov02k10->module_facing); in ov02k10_probe()
1844 &ov02k10->module_name); in ov02k10_probe()
1846 &ov02k10->len_name); in ov02k10_probe()
1849 return -EINVAL; in ov02k10_probe()
1859 ov02k10->cfg_num = ARRAY_SIZE(supported_modes); in ov02k10_probe()
1860 for (i = 0; i < ov02k10->cfg_num; i++) { in ov02k10_probe()
1862 ov02k10->cur_mode = &supported_modes[i]; in ov02k10_probe()
1866 ov02k10->client = client; in ov02k10_probe()
1868 ov02k10->xvclk = devm_clk_get(dev, "xvclk"); in ov02k10_probe()
1869 if (IS_ERR(ov02k10->xvclk)) { in ov02k10_probe()
1871 return -EINVAL; in ov02k10_probe()
1874 ov02k10->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in ov02k10_probe()
1875 if (IS_ERR(ov02k10->power_gpio)) in ov02k10_probe()
1876 dev_warn(dev, "Failed to get power-gpios\n"); in ov02k10_probe()
1878 ov02k10->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in ov02k10_probe()
1879 if (IS_ERR(ov02k10->reset_gpio)) in ov02k10_probe()
1880 dev_warn(dev, "Failed to get reset-gpios\n"); in ov02k10_probe()
1882 ov02k10->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in ov02k10_probe()
1883 if (IS_ERR(ov02k10->pwdn_gpio)) in ov02k10_probe()
1884 dev_warn(dev, "Failed to get pwdn-gpios\n"); in ov02k10_probe()
1886 ov02k10->pinctrl = devm_pinctrl_get(dev); in ov02k10_probe()
1887 if (!IS_ERR(ov02k10->pinctrl)) { in ov02k10_probe()
1888 ov02k10->pins_default = in ov02k10_probe()
1889 pinctrl_lookup_state(ov02k10->pinctrl, in ov02k10_probe()
1891 if (IS_ERR(ov02k10->pins_default)) in ov02k10_probe()
1894 ov02k10->pins_sleep = in ov02k10_probe()
1895 pinctrl_lookup_state(ov02k10->pinctrl, in ov02k10_probe()
1897 if (IS_ERR(ov02k10->pins_sleep)) in ov02k10_probe()
1909 mutex_init(&ov02k10->mutex); in ov02k10_probe()
1911 sd = &ov02k10->subdev; in ov02k10_probe()
1926 sd->internal_ops = &ov02k10_internal_ops; in ov02k10_probe()
1927 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in ov02k10_probe()
1930 ov02k10->pad.flags = MEDIA_PAD_FL_SOURCE; in ov02k10_probe()
1931 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov02k10_probe()
1932 ret = media_entity_pads_init(&sd->entity, 1, &ov02k10->pad); in ov02k10_probe()
1938 if (strcmp(ov02k10->module_facing, "back") == 0) in ov02k10_probe()
1943 snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s", in ov02k10_probe()
1944 ov02k10->module_index, facing, in ov02k10_probe()
1945 OV02K10_NAME, dev_name(sd->dev)); in ov02k10_probe()
1962 media_entity_cleanup(&sd->entity); in ov02k10_probe()
1967 v4l2_ctrl_handler_free(&ov02k10->ctrl_handler); in ov02k10_probe()
1969 mutex_destroy(&ov02k10->mutex); in ov02k10_probe()
1981 media_entity_cleanup(&sd->entity); in ov02k10_remove()
1983 v4l2_ctrl_handler_free(&ov02k10->ctrl_handler); in ov02k10_remove()
1984 mutex_destroy(&ov02k10->mutex); in ov02k10_remove()
1986 pm_runtime_disable(&client->dev); in ov02k10_remove()
1987 if (!pm_runtime_status_suspended(&client->dev)) in ov02k10_remove()
1989 pm_runtime_set_suspended(&client->dev); in ov02k10_remove()