Lines Matching +full:conversion +full:- +full:start +full:- +full:gpios

1 // SPDX-License-Identifier: GPL-2.0
8 * V0.0X01.0X01 support conversion gain switch.
9 * V0.0X01.0X02 add debug interface for conversion gain switch.
25 #include <linux/rk-camera-module.h>
26 #include <media/media-entity.h>
27 #include <media/v4l2-async.h>
28 #include <media/v4l2-ctrls.h>
29 #include <media/v4l2-subdev.h>
31 #include <linux/rk-preisp.h>
46 #define OF_CAMERA_HDR_MODE "rockchip,camera-hdr-mode"
3999 ….hts_def = 0x4330,//for linear mode, hblank is 4*LINE_LENGTH_PCK_-WIDTH,so hts is 4*LINE_LENGTH_PC…
4016 ….hts_def = 0x4330,//for linear mode, hblank is 4*LINE_LENGTH_PCK_-WIDTH,so hts is 4*LINE_LENGTH_PC…
4041 .vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0
4043 .vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr2
4055 .hts_def = 0x0B98*4-3840,//
4063 .vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr0
4064 .vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr2
4076 ….hts_def = 0x3430,//for HDR, hblank is 4*LINE_LENGTH_PCK_-WIDTH*2, so hts is 4*LINE_LENGTH_PCK_-WI…
4083 .vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr0
4111 return -EINVAL; in ar0822_write_reg()
4119 val_i = 4 - len; in ar0822_write_reg()
4125 return -EIO; in ar0822_write_reg()
4159 return -EINVAL; in ar0822_read_reg()
4163 msgs[0].addr = client->addr; in ar0822_read_reg()
4169 msgs[1].addr = client->addr; in ar0822_read_reg()
4172 msgs[1].buf = &data_be_p[4 - len]; in ar0822_read_reg()
4174 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in ar0822_read_reg()
4176 return -EIO; in ar0822_read_reg()
4186 return abs(mode->width - framefmt->width) + in ar0822_get_reso_dist()
4187 abs(mode->height - framefmt->height); in ar0822_get_reso_dist()
4193 struct v4l2_mbus_framefmt *framefmt = &fmt->format; in ar0822_find_best_fit()
4196 int cur_best_fit_dist = -1; in ar0822_find_best_fit()
4199 for (i = 0; i < ar0822->cfg_num; i++) { in ar0822_find_best_fit()
4201 if ((cur_best_fit_dist == -1 || dist < cur_best_fit_dist) && in ar0822_find_best_fit()
4202 (supported_modes[i].bus_fmt == framefmt->code)) { in ar0822_find_best_fit()
4212 const struct ar0822_mode *mode = ar0822->cur_mode; in ar0822_set_rates()
4216 h_blank = mode->hts_def - mode->width; in ar0822_set_rates()
4217 dev_err(&ar0822->client->dev, in ar0822_set_rates()
4219 h_blank, mode->mipi_freq,mode->mipi_rate); in ar0822_set_rates()
4220 __v4l2_ctrl_modify_range(ar0822->hblank, h_blank, in ar0822_set_rates()
4222 vblank_def = mode->vts_def - mode->height; in ar0822_set_rates()
4223 __v4l2_ctrl_modify_range(ar0822->vblank, vblank_def, in ar0822_set_rates()
4224 AR0822_VTS_MAX - mode->height, in ar0822_set_rates()
4227 __v4l2_ctrl_s_ctrl_int64(ar0822->pixel_rate, in ar0822_set_rates()
4228 mode->mipi_rate); in ar0822_set_rates()
4229 __v4l2_ctrl_s_ctrl(ar0822->link_freq, in ar0822_set_rates()
4230 mode->mipi_freq); in ar0822_set_rates()
4242 mutex_lock(&ar0822->mutex); in ar0822_set_fmt()
4245 fmt->format.code = mode->bus_fmt; in ar0822_set_fmt()
4246 fmt->format.width = mode->width; in ar0822_set_fmt()
4247 fmt->format.height = mode->height; in ar0822_set_fmt()
4248 fmt->format.field = V4L2_FIELD_NONE; in ar0822_set_fmt()
4249 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in ar0822_set_fmt()
4251 *v4l2_subdev_get_try_format(sd, cfg, fmt->pad) = fmt->format; in ar0822_set_fmt()
4253 mutex_unlock(&ar0822->mutex); in ar0822_set_fmt()
4254 return -ENOTTY; in ar0822_set_fmt()
4257 ar0822->cur_mode = mode; in ar0822_set_fmt()
4261 mutex_unlock(&ar0822->mutex); in ar0822_set_fmt()
4271 const struct ar0822_mode *mode = ar0822->cur_mode; in ar0822_get_fmt()
4273 mutex_lock(&ar0822->mutex); in ar0822_get_fmt()
4274 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in ar0822_get_fmt()
4276 fmt->format = *v4l2_subdev_get_try_format(sd, cfg, fmt->pad); in ar0822_get_fmt()
4278 mutex_unlock(&ar0822->mutex); in ar0822_get_fmt()
4279 return -ENOTTY; in ar0822_get_fmt()
4282 fmt->format.width = mode->width; in ar0822_get_fmt()
4283 fmt->format.height = mode->height; in ar0822_get_fmt()
4284 fmt->format.code = mode->bus_fmt; in ar0822_get_fmt()
4285 fmt->format.field = V4L2_FIELD_NONE; in ar0822_get_fmt()
4286 if (fmt->pad < PAD_MAX && mode->hdr_mode != NO_HDR) in ar0822_get_fmt()
4287 fmt->reserved[0] = mode->vc[fmt->pad]; in ar0822_get_fmt()
4289 fmt->reserved[0] = mode->vc[PAD0]; in ar0822_get_fmt()
4291 mutex_unlock(&ar0822->mutex); in ar0822_get_fmt()
4302 if (code->index >= ar0822->cfg_num) in ar0822_enum_mbus_code()
4303 return -EINVAL; in ar0822_enum_mbus_code()
4304 code->code = supported_modes[code->index].bus_fmt; in ar0822_enum_mbus_code()
4315 if (fse->index >= ar0822->cfg_num) in ar0822_enum_frame_sizes()
4316 return -EINVAL; in ar0822_enum_frame_sizes()
4318 if (fse->code != supported_modes[fse->index].bus_fmt) in ar0822_enum_frame_sizes()
4319 return -EINVAL; in ar0822_enum_frame_sizes()
4321 fse->min_width = supported_modes[fse->index].width; in ar0822_enum_frame_sizes()
4322 fse->max_width = supported_modes[fse->index].width; in ar0822_enum_frame_sizes()
4323 fse->max_height = supported_modes[fse->index].height; in ar0822_enum_frame_sizes()
4324 fse->min_height = supported_modes[fse->index].height; in ar0822_enum_frame_sizes()
4340 const struct ar0822_mode *mode = ar0822->cur_mode; in ar0822_g_frame_interval()
4342 mutex_lock(&ar0822->mutex); in ar0822_g_frame_interval()
4343 fi->interval = mode->max_fps; in ar0822_g_frame_interval()
4344 mutex_unlock(&ar0822->mutex); in ar0822_g_frame_interval()
4353 const struct ar0822_mode *mode = ar0822->cur_mode; in ar0822_g_mbus_config()
4356 val = 1 << (AR0822_LANES - 1) | in ar0822_g_mbus_config()
4359 if (mode->hdr_mode != NO_HDR) in ar0822_g_mbus_config()
4361 if (mode->hdr_mode == HDR_X3) in ar0822_g_mbus_config()
4364 config->type = V4L2_MBUS_CSI2_DPHY; in ar0822_g_mbus_config()
4365 config->flags = val; in ar0822_g_mbus_config()
4375 strlcpy(inf->base.sensor, AR0822_NAME, sizeof(inf->base.sensor)); in ar0822_get_module_inf()
4376 strlcpy(inf->base.module, ar0822->module_name, in ar0822_get_module_inf()
4377 sizeof(inf->base.module)); in ar0822_get_module_inf()
4378 strlcpy(inf->base.lens, ar0822->len_name, sizeof(inf->base.lens)); in ar0822_get_module_inf()
4392 if (!ar0822->has_init_exp && !ar0822->streaming) { in ar0822_set_hdrae()
4393 ar0822->init_hdrae_exp = *ae; in ar0822_set_hdrae()
4394 ar0822->has_init_exp = true; in ar0822_set_hdrae()
4395 dev_err(&ar0822->client->dev, "ar0822 don't stream, record exp for hdr!\n"); in ar0822_set_hdrae()
4398 l_exp_time = ae->long_exp_reg; in ar0822_set_hdrae()
4399 m_exp_time = ae->middle_exp_reg; in ar0822_set_hdrae()
4400 s_exp_time = ae->short_exp_reg; in ar0822_set_hdrae()
4401 l_a_gain = ae->long_gain_reg; in ar0822_set_hdrae()
4402 m_a_gain = ae->middle_gain_reg; in ar0822_set_hdrae()
4403 s_a_gain = ae->short_gain_reg; in ar0822_set_hdrae()
4404 l_cg_mode = ae->long_cg_mode; in ar0822_set_hdrae()
4405 m_cg_mode = ae->middle_cg_mode; in ar0822_set_hdrae()
4406 s_cg_mode = ae->short_cg_mode; in ar0822_set_hdrae()
4407 dev_dbg(&ar0822->client->dev, in ar0822_set_hdrae()
4408 "Li-HDR irev exp req: L_exp: 0x%x, 0x%x, M_exp: 0x%x, 0x%x S_exp: 0x%x, 0x%x\n", in ar0822_set_hdrae()
4413 if (ar0822->cur_mode->hdr_mode == HDR_X2) { in ar0822_set_hdrae()
4431 ret |= ar0822_write_reg(ar0822->client, in ar0822_set_hdrae()
4436 ret |= ar0822_write_reg(ar0822->client, in ar0822_set_hdrae()
4441 ret |= ar0822_write_reg(ar0822->client, in ar0822_set_hdrae()
4445 if (ar0822->cur_mode->hdr_mode == HDR_X3) { in ar0822_set_hdrae()
4447 ret |= ar0822_write_reg(ar0822->client, in ar0822_set_hdrae()
4451 ret |= ar0822_write_reg(ar0822->client, in ar0822_set_hdrae()
4456 ret |= ar0822_write_reg(ar0822->client, in ar0822_set_hdrae()
4461 dev_dbg(&ar0822->client->dev, "ar0822_set_hdrae exp 0x%x\n",l_exp_time); in ar0822_set_hdrae()
4473 //ag: echo 0 > /sys/devices/platform/ff510000.i2c/i2c-1/1-0036-1/cam_s_cg
4506 for (i--; i >= 0 ; i--) in add_sysfs_interfaces()
4509 return -ENODEV; in add_sysfs_interfaces()
4515 if (ch_info->index < PAD0 || ch_info->index >= PAD_MAX) in ar0822_get_channel_info()
4516 return -EINVAL; in ar0822_get_channel_info()
4517 ch_info->vc = ar0822->cur_mode->vc[ch_info->index]; in ar0822_get_channel_info()
4518 ch_info->width = ar0822->cur_mode->width; in ar0822_get_channel_info()
4519 ch_info->height = ar0822->cur_mode->height; in ar0822_get_channel_info()
4520 ch_info->bus_fmt = ar0822->cur_mode->bus_fmt; in ar0822_get_channel_info()
4539 w = ar0822->cur_mode->width; in ar0822_ioctl()
4540 h = ar0822->cur_mode->height; in ar0822_ioctl()
4541 for (i = 0; i < ar0822->cfg_num; i++) { in ar0822_ioctl()
4544 supported_modes[i].hdr_mode == hdr_cfg->hdr_mode) { in ar0822_ioctl()
4545 ar0822->cur_mode = &supported_modes[i]; in ar0822_ioctl()
4549 if (i == ar0822->cfg_num) { in ar0822_ioctl()
4550 dev_err(&ar0822->client->dev, in ar0822_ioctl()
4552 hdr_cfg->hdr_mode, w, h); in ar0822_ioctl()
4553 ret = -EINVAL; in ar0822_ioctl()
4555 w = ar0822->cur_mode->hts_def - ar0822->cur_mode->width; in ar0822_ioctl()
4556 h = ar0822->cur_mode->vts_def - ar0822->cur_mode->height; in ar0822_ioctl()
4557 dev_info(&ar0822->client->dev, in ar0822_ioctl()
4559 __v4l2_ctrl_modify_range(ar0822->hblank, w, w, 1, w); in ar0822_ioctl()
4560 __v4l2_ctrl_modify_range(ar0822->vblank, h, in ar0822_ioctl()
4561 AR0822_VTS_MAX - ar0822->cur_mode->height, in ar0822_ioctl()
4563 dev_info(&ar0822->client->dev, in ar0822_ioctl()
4565 ar0822->cur_mode->hdr_mode); in ar0822_ioctl()
4574 hdr_cfg->esp.mode = HDR_NORMAL_VC; in ar0822_ioctl()
4575 hdr_cfg->hdr_mode = ar0822->cur_mode->hdr_mode; in ar0822_ioctl()
4585 ret = ar0822_write_reg(ar0822->client, AR0822_REG_CTRL_MODE, in ar0822_ioctl()
4588 ret = ar0822_write_reg(ar0822->client, AR0822_REG_CTRL_MODE, in ar0822_ioctl()
4596 ret = -ENOIOCTLCMD; in ar0822_ioctl()
4621 ret = -ENOMEM; in ar0822_compat_ioctl32()
4633 ret = -ENOMEM; in ar0822_compat_ioctl32()
4645 ret = -ENOMEM; in ar0822_compat_ioctl32()
4657 ret = -ENOMEM; in ar0822_compat_ioctl32()
4669 ret = -ENOMEM; in ar0822_compat_ioctl32()
4691 ret = -ENOMEM; in ar0822_compat_ioctl32()
4699 ret = -EFAULT; in ar0822_compat_ioctl32()
4704 ret = -ENOIOCTLCMD; in ar0822_compat_ioctl32()
4716 if (!ar0822->is_thunderboot) { in __ar0822_start_stream()
4717 ret = ar0822_write_reg(ar0822->client, in __ar0822_start_stream()
4722 ret = ar0822_write_array(ar0822->client, ar0822->cur_mode->reg_list); in __ar0822_start_stream()
4728 ret = __v4l2_ctrl_handler_setup(&ar0822->ctrl_handler); in __ar0822_start_stream()
4731 if (ar0822->has_init_exp && ar0822->cur_mode->hdr_mode != NO_HDR) { in __ar0822_start_stream()
4732 ret = ar0822_ioctl(&ar0822->subdev, PREISP_CMD_SET_HDRAE_EXP, &ar0822->init_hdrae_exp); in __ar0822_start_stream()
4734 dev_err(&ar0822->client->dev, in __ar0822_start_stream()
4738 dev_err(&ar0822->client->dev, in __ar0822_start_stream()
4741 return ar0822_write_reg(ar0822->client, AR0822_REG_CTRL_MODE, in __ar0822_start_stream()
4747 ar0822->has_init_exp = false; in __ar0822_stop_stream()
4748 if (ar0822->is_thunderboot) in __ar0822_stop_stream()
4749 ar0822->is_first_streamoff = true; in __ar0822_stop_stream()
4750 return ar0822_write_reg(ar0822->client, AR0822_REG_CTRL_MODE, in __ar0822_stop_stream()
4757 struct i2c_client *client = ar0822->client; in ar0822_s_stream()
4760 mutex_lock(&ar0822->mutex); in ar0822_s_stream()
4762 if (on == ar0822->streaming) in ar0822_s_stream()
4765 if (ar0822->is_thunderboot && rkisp_tb_get_state() == RKISP_TB_NG) { in ar0822_s_stream()
4766 ar0822->is_thunderboot = false; in ar0822_s_stream()
4769 ret = pm_runtime_get_sync(&client->dev); in ar0822_s_stream()
4771 pm_runtime_put_noidle(&client->dev); in ar0822_s_stream()
4777 v4l2_err(sd, "start stream failed while write regs\n"); in ar0822_s_stream()
4778 pm_runtime_put(&client->dev); in ar0822_s_stream()
4783 pm_runtime_put(&client->dev); in ar0822_s_stream()
4785 ar0822->streaming = on; in ar0822_s_stream()
4789 mutex_unlock(&ar0822->mutex); in ar0822_s_stream()
4797 struct i2c_client *client = ar0822->client; in ar0822_s_power()
4800 mutex_lock(&ar0822->mutex); in ar0822_s_power()
4801 /* If the power state is not modified - no work to do. */ in ar0822_s_power()
4802 if (ar0822->power_on == !!on) in ar0822_s_power()
4806 ret = pm_runtime_get_sync(&client->dev); in ar0822_s_power()
4808 pm_runtime_put_noidle(&client->dev); in ar0822_s_power()
4812 if (!ar0822->is_thunderboot) { in ar0822_s_power()
4813 ret |= ar0822_write_reg(ar0822->client, in ar0822_s_power()
4820 ar0822->power_on = true; in ar0822_s_power()
4822 pm_runtime_put(&client->dev); in ar0822_s_power()
4823 ar0822->power_on = false; in ar0822_s_power()
4827 mutex_unlock(&ar0822->mutex); in ar0822_s_power()
4842 struct device *dev = &ar0822->client->dev; in __ar0822_power_on()
4844 if (ar0822->is_thunderboot) in __ar0822_power_on()
4847 if (!IS_ERR_OR_NULL(ar0822->pins_default)) { in __ar0822_power_on()
4848 ret = pinctrl_select_state(ar0822->pinctrl, in __ar0822_power_on()
4849 ar0822->pins_default); in __ar0822_power_on()
4853 ret = clk_set_rate(ar0822->xvclk, AR0822_XVCLK_FREQ); in __ar0822_power_on()
4856 if (clk_get_rate(ar0822->xvclk) != AR0822_XVCLK_FREQ) in __ar0822_power_on()
4858 ret = clk_prepare_enable(ar0822->xvclk); in __ar0822_power_on()
4863 if (!IS_ERR(ar0822->reset_gpio)) in __ar0822_power_on()
4864 gpiod_direction_output(ar0822->reset_gpio, 1); in __ar0822_power_on()
4866 ret = regulator_bulk_enable(AR0822_NUM_SUPPLIES, ar0822->supplies); in __ar0822_power_on()
4872 if (!IS_ERR(ar0822->reset_gpio)) in __ar0822_power_on()
4873 gpiod_direction_output(ar0822->reset_gpio, 0); in __ar0822_power_on()
4876 if (!IS_ERR(ar0822->pwdn_gpio)) in __ar0822_power_on()
4877 gpiod_direction_output(ar0822->pwdn_gpio, 1); in __ar0822_power_on()
4882 if (!IS_ERR(ar0822->reset_gpio)) in __ar0822_power_on()
4894 clk_disable_unprepare(ar0822->xvclk); in __ar0822_power_on()
4902 struct device *dev = &ar0822->client->dev; in __ar0822_power_off()
4904 if (ar0822->is_thunderboot) { in __ar0822_power_off()
4905 if (ar0822->is_first_streamoff) { in __ar0822_power_off()
4906 ar0822->is_thunderboot = false; in __ar0822_power_off()
4907 ar0822->is_first_streamoff = false; in __ar0822_power_off()
4913 if (!IS_ERR(ar0822->pwdn_gpio)) in __ar0822_power_off()
4914 gpiod_direction_output(ar0822->pwdn_gpio, 0); in __ar0822_power_off()
4916 clk_disable_unprepare(ar0822->xvclk); in __ar0822_power_off()
4918 if (!IS_ERR(ar0822->reset_gpio)) in __ar0822_power_off()
4919 gpiod_direction_output(ar0822->reset_gpio, 0); in __ar0822_power_off()
4920 if (!IS_ERR_OR_NULL(ar0822->pins_sleep)) { in __ar0822_power_off()
4921 ret = pinctrl_select_state(ar0822->pinctrl, in __ar0822_power_off()
4922 ar0822->pins_sleep); in __ar0822_power_off()
4927 if (ar0822->is_thunderboot_ng) { in __ar0822_power_off()
4928 ar0822->is_thunderboot_ng = false; in __ar0822_power_off()
4929 regulator_bulk_disable(AR0822_NUM_SUPPLIES, ar0822->supplies); in __ar0822_power_off()
4958 v4l2_subdev_get_try_format(sd, fh->pad, 0); in ar0822_open()
4960 mutex_lock(&ar0822->mutex); in ar0822_open()
4962 try_fmt->width = def_mode->width; in ar0822_open()
4963 try_fmt->height = def_mode->height; in ar0822_open()
4964 try_fmt->code = def_mode->bus_fmt; in ar0822_open()
4965 try_fmt->field = V4L2_FIELD_NONE; in ar0822_open()
4967 mutex_unlock(&ar0822->mutex); in ar0822_open()
4980 if (fie->index >= ar0822->cfg_num) in ar0822_enum_frame_interval()
4981 return -EINVAL; in ar0822_enum_frame_interval()
4982 fie->code = supported_modes[fie->index].bus_fmt; in ar0822_enum_frame_interval()
4983 fie->width = supported_modes[fie->index].width; in ar0822_enum_frame_interval()
4984 fie->height = supported_modes[fie->index].height; in ar0822_enum_frame_interval()
4985 fie->interval = supported_modes[fie->index].max_fps; in ar0822_enum_frame_interval()
4986 fie->reserved[0] = supported_modes[fie->index].hdr_mode; in ar0822_enum_frame_interval()
5032 struct ar0822 *ar0822 = container_of(ctrl->handler, in ar0822_set_ctrl()
5034 struct i2c_client *client = ar0822->client; in ar0822_set_ctrl()
5041 switch (ctrl->id) { in ar0822_set_ctrl()
5044 max = ar0822->cur_mode->height + ctrl->val - 4; in ar0822_set_ctrl()
5045 __v4l2_ctrl_modify_range(ar0822->exposure, in ar0822_set_ctrl()
5046 ar0822->exposure->minimum, max, in ar0822_set_ctrl()
5047 ar0822->exposure->step, in ar0822_set_ctrl()
5048 ar0822->exposure->default_value); in ar0822_set_ctrl()
5052 if (!pm_runtime_get_if_in_use(&client->dev)) in ar0822_set_ctrl()
5055 switch (ctrl->id) { in ar0822_set_ctrl()
5057 if (ar0822->cur_mode->hdr_mode != NO_HDR) in ar0822_set_ctrl()
5059 ret = ar0822_write_reg(ar0822->client, in ar0822_set_ctrl()
5062 ctrl->val); in ar0822_set_ctrl()
5064 dev_dbg(&client->dev, "set exposure 0x%x\n", in ar0822_set_ctrl()
5065 ctrl->val); in ar0822_set_ctrl()
5068 if (ar0822->cur_mode->hdr_mode != NO_HDR) in ar0822_set_ctrl()
5070 if (ctrl->val > AR0822_GAIN_MAX) { in ar0822_set_ctrl()
5073 again = ctrl->val; in ar0822_set_ctrl()
5075 if (ctrl->val < AR0822_GAIN_MIN) { in ar0822_set_ctrl()
5078 again = ctrl->val; in ar0822_set_ctrl()
5082 ret = ar0822_write_reg(ar0822->client, in ar0822_set_ctrl()
5087 dev_dbg(&client->dev, "Corn set analog gain 0x%x\n", in ar0822_set_ctrl()
5088 ctrl->val); in ar0822_set_ctrl()
5091 //ret = ar0822_write_reg(ar0822->client, AR0822_REG_VTS, in ar0822_set_ctrl()
5093 // ctrl->val + ar0822->cur_mode->height); in ar0822_set_ctrl()
5094 dev_dbg(&client->dev, "set vblank 0x%x\n", in ar0822_set_ctrl()
5095 ctrl->val); in ar0822_set_ctrl()
5098 ret = ar0822_enable_test_pattern(ar0822, ctrl->val); in ar0822_set_ctrl()
5101 ret = ar0822_read_reg(ar0822->client, AR0822_FLIP_REG, in ar0822_set_ctrl()
5104 if (ctrl->val) in ar0822_set_ctrl()
5108 ret = ar0822_write_reg(ar0822->client, AR0822_FLIP_REG, in ar0822_set_ctrl()
5112 ar0822->flip = val; in ar0822_set_ctrl()
5115 ret = ar0822_read_reg(ar0822->client, AR0822_FLIP_REG, in ar0822_set_ctrl()
5118 if (ctrl->val) in ar0822_set_ctrl()
5122 ret = ar0822_write_reg(ar0822->client, AR0822_FLIP_REG, in ar0822_set_ctrl()
5126 ar0822->flip = val; in ar0822_set_ctrl()
5129 dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n", in ar0822_set_ctrl()
5130 __func__, ctrl->id, ctrl->val); in ar0822_set_ctrl()
5136 pm_runtime_put(&client->dev); in ar0822_set_ctrl()
5155 handler = &ar0822->ctrl_handler; in ar0822_initialize_controls()
5156 mode = ar0822->cur_mode; in ar0822_initialize_controls()
5160 handler->lock = &ar0822->mutex; in ar0822_initialize_controls()
5161 ar0822->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in ar0822_initialize_controls()
5165 dst_link_freq = mode->mipi_freq; in ar0822_initialize_controls()
5166 dst_pixel_rate = mode->mipi_rate; in ar0822_initialize_controls()
5168 ar0822->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in ar0822_initialize_controls()
5172 __v4l2_ctrl_s_ctrl(ar0822->link_freq, in ar0822_initialize_controls()
5175 h_blank = mode->hts_def - mode->width; in ar0822_initialize_controls()
5176 ar0822->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in ar0822_initialize_controls()
5178 if (ar0822->hblank) in ar0822_initialize_controls()
5179 ar0822->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ar0822_initialize_controls()
5181 vblank_def = mode->vts_def - mode->height; in ar0822_initialize_controls()
5182 ar0822->vblank = v4l2_ctrl_new_std(handler, &ar0822_ctrl_ops, in ar0822_initialize_controls()
5184 AR0822_VTS_MAX - mode->height, in ar0822_initialize_controls()
5187 exposure_max = mode->vts_def - 4; in ar0822_initialize_controls()
5188 ar0822->exposure = v4l2_ctrl_new_std(handler, &ar0822_ctrl_ops, in ar0822_initialize_controls()
5191 mode->exp_def); in ar0822_initialize_controls()
5193 ar0822->anal_gain = v4l2_ctrl_new_std(handler, &ar0822_ctrl_ops, in ar0822_initialize_controls()
5198 ar0822->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in ar0822_initialize_controls()
5200 ARRAY_SIZE(ar0822_test_pattern_menu) - 1, in ar0822_initialize_controls()
5203 ar0822->h_flip = v4l2_ctrl_new_std(handler, &ar0822_ctrl_ops, in ar0822_initialize_controls()
5206 ar0822->v_flip = v4l2_ctrl_new_std(handler, &ar0822_ctrl_ops, in ar0822_initialize_controls()
5208 ar0822->flip = 0; in ar0822_initialize_controls()
5209 if (handler->error) { in ar0822_initialize_controls()
5210 ret = handler->error; in ar0822_initialize_controls()
5211 dev_err(&ar0822->client->dev, in ar0822_initialize_controls()
5216 ar0822->subdev.ctrl_handler = handler; in ar0822_initialize_controls()
5217 ar0822->has_init_exp = false; in ar0822_initialize_controls()
5218 ar0822->long_hcg = false; in ar0822_initialize_controls()
5219 ar0822->middle_hcg = false; in ar0822_initialize_controls()
5220 ar0822->short_hcg = false; in ar0822_initialize_controls()
5233 struct device *dev = &ar0822->client->dev; in ar0822_check_sensor_id()
5237 if (ar0822->is_thunderboot) { in ar0822_check_sensor_id()
5246 return -ENODEV; in ar0822_check_sensor_id()
5259 ar0822->supplies[i].supply = ar0822_supply_names[i]; in ar0822_configure_regulators()
5261 return devm_regulator_bulk_get(&ar0822->client->dev, in ar0822_configure_regulators()
5263 ar0822->supplies); in ar0822_configure_regulators()
5269 struct device *dev = &client->dev; in ar0822_probe()
5270 struct device_node *node = dev->of_node; in ar0822_probe()
5284 return -ENOMEM; in ar0822_probe()
5287 &ar0822->module_index); in ar0822_probe()
5289 &ar0822->module_facing); in ar0822_probe()
5291 &ar0822->module_name); in ar0822_probe()
5293 &ar0822->len_name); in ar0822_probe()
5296 return -EINVAL; in ar0822_probe()
5299 ar0822->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); in ar0822_probe()
5306 ar0822->cfg_num = ARRAY_SIZE(supported_modes); in ar0822_probe()
5307 if(ar0822->cfg_num == 0){ in ar0822_probe()
5309 return -EINVAL; in ar0822_probe()
5311 ar0822->cur_mode = &supported_modes[0];//initialize. in ar0822_probe()
5312 for (i = 0; i < ar0822->cfg_num; i++) { in ar0822_probe()
5314 ar0822->cur_mode = &supported_modes[i]; in ar0822_probe()
5318 ar0822->client = client; in ar0822_probe()
5320 ar0822->xvclk = devm_clk_get(dev, "xvclk"); in ar0822_probe()
5321 if (IS_ERR(ar0822->xvclk)) { in ar0822_probe()
5323 return -EINVAL; in ar0822_probe()
5326 ar0822->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS); in ar0822_probe()
5327 if (IS_ERR(ar0822->reset_gpio)) in ar0822_probe()
5328 dev_warn(dev, "Failed to get reset-gpios\n"); in ar0822_probe()
5330 ar0822->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_ASIS); in ar0822_probe()
5331 if (IS_ERR(ar0822->pwdn_gpio)) in ar0822_probe()
5332 dev_warn(dev, "Failed to get pwdn-gpios\n"); in ar0822_probe()
5334 ar0822->pinctrl = devm_pinctrl_get(dev); in ar0822_probe()
5335 if (!IS_ERR(ar0822->pinctrl)) { in ar0822_probe()
5336 ar0822->pins_default = in ar0822_probe()
5337 pinctrl_lookup_state(ar0822->pinctrl, in ar0822_probe()
5339 if (IS_ERR(ar0822->pins_default)) in ar0822_probe()
5342 ar0822->pins_sleep = in ar0822_probe()
5343 pinctrl_lookup_state(ar0822->pinctrl, in ar0822_probe()
5345 if (IS_ERR(ar0822->pins_sleep)) in ar0822_probe()
5357 mutex_init(&ar0822->mutex); in ar0822_probe()
5359 sd = &ar0822->subdev; in ar0822_probe()
5374 sd->internal_ops = &ar0822_internal_ops; in ar0822_probe()
5375 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in ar0822_probe()
5378 ar0822->pad.flags = MEDIA_PAD_FL_SOURCE; in ar0822_probe()
5379 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in ar0822_probe()
5380 ret = media_entity_pads_init(&sd->entity, 1, &ar0822->pad); in ar0822_probe()
5386 if (strcmp(ar0822->module_facing, "back") == 0) in ar0822_probe()
5391 snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s", in ar0822_probe()
5392 ar0822->module_index, facing, in ar0822_probe()
5393 AR0822_NAME, dev_name(sd->dev)); in ar0822_probe()
5410 media_entity_cleanup(&sd->entity); in ar0822_probe()
5415 v4l2_ctrl_handler_free(&ar0822->ctrl_handler); in ar0822_probe()
5417 mutex_destroy(&ar0822->mutex); in ar0822_probe()
5429 media_entity_cleanup(&sd->entity); in ar0822_remove()
5431 v4l2_ctrl_handler_free(&ar0822->ctrl_handler); in ar0822_remove()
5432 mutex_destroy(&ar0822->mutex); in ar0822_remove()
5434 pm_runtime_disable(&client->dev); in ar0822_remove()
5435 if (!pm_runtime_status_suspended(&client->dev)) in ar0822_remove()
5437 pm_runtime_set_suspended(&client->dev); in ar0822_remove()