Lines Matching refs:IMX464
185 struct IMX464 { struct
225 #define to_IMX464(sd) container_of(sd, struct IMX464, subdev) argument
1554 IMX464_find_best_fit(struct IMX464 *IMX464, struct v4l2_subdev_format *fmt) in IMX464_find_best_fit() argument
1562 for (i = 0; i < IMX464->cfg_num; i++) { in IMX464_find_best_fit()
1563 dist = IMX464_get_reso_dist(&IMX464->support_modes[i], framefmt); in IMX464_find_best_fit()
1565 IMX464->support_modes[i].bus_fmt == framefmt->code) { in IMX464_find_best_fit()
1571 return &IMX464->support_modes[cur_best_fit]; in IMX464_find_best_fit()
1578 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_set_fmt() local
1583 mutex_lock(&IMX464->mutex); in IMX464_set_fmt()
1585 mode = IMX464_find_best_fit(IMX464, fmt); in IMX464_set_fmt()
1594 mutex_unlock(&IMX464->mutex); in IMX464_set_fmt()
1598 IMX464->cur_mode = mode; in IMX464_set_fmt()
1600 __v4l2_ctrl_modify_range(IMX464->hblank, h_blank, in IMX464_set_fmt()
1603 __v4l2_ctrl_modify_range(IMX464->vblank, vblank_def, in IMX464_set_fmt()
1606 IMX464->cur_vts = IMX464->cur_mode->vts_def; in IMX464_set_fmt()
1608 IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes; in IMX464_set_fmt()
1609 __v4l2_ctrl_s_ctrl_int64(IMX464->pixel_rate, in IMX464_set_fmt()
1611 __v4l2_ctrl_s_ctrl(IMX464->link_freq, in IMX464_set_fmt()
1615 mutex_unlock(&IMX464->mutex); in IMX464_set_fmt()
1624 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_get_fmt() local
1625 const struct IMX464_mode *mode = IMX464->cur_mode; in IMX464_get_fmt()
1627 mutex_lock(&IMX464->mutex); in IMX464_get_fmt()
1632 mutex_unlock(&IMX464->mutex); in IMX464_get_fmt()
1645 mutex_unlock(&IMX464->mutex); in IMX464_get_fmt()
1654 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_enum_mbus_code() local
1658 code->code = IMX464->cur_mode->bus_fmt; in IMX464_enum_mbus_code()
1667 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_enum_frame_sizes() local
1669 if (fse->index >= IMX464->cfg_num) in IMX464_enum_frame_sizes()
1672 if (fse->code != IMX464->support_modes[fse->index].bus_fmt) in IMX464_enum_frame_sizes()
1675 fse->min_width = IMX464->support_modes[fse->index].width; in IMX464_enum_frame_sizes()
1676 fse->max_width = IMX464->support_modes[fse->index].width; in IMX464_enum_frame_sizes()
1677 fse->max_height = IMX464->support_modes[fse->index].height; in IMX464_enum_frame_sizes()
1678 fse->min_height = IMX464->support_modes[fse->index].height; in IMX464_enum_frame_sizes()
1686 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_g_frame_interval() local
1687 const struct IMX464_mode *mode = IMX464->cur_mode; in IMX464_g_frame_interval()
1697 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_g_mbus_config() local
1698 const struct IMX464_mode *mode = IMX464->cur_mode; in IMX464_g_mbus_config()
1700 u32 lane_num = IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes; in IMX464_g_mbus_config()
1725 static void IMX464_get_module_inf(struct IMX464 *IMX464, in IMX464_get_module_inf() argument
1730 strscpy(inf->base.module, IMX464->module_name, in IMX464_get_module_inf()
1732 strscpy(inf->base.lens, IMX464->len_name, sizeof(inf->base.lens)); in IMX464_get_module_inf()
1735 static int IMX464_set_hdrae(struct IMX464 *IMX464, in IMX464_set_hdrae() argument
1738 struct i2c_client *client = IMX464->client; in IMX464_set_hdrae()
1749 u32 fsc = IMX464->cur_vts; in IMX464_set_hdrae()
1752 if (!IMX464->has_init_exp && !IMX464->streaming) { in IMX464_set_hdrae()
1753 IMX464->init_hdrae_exp = *ae; in IMX464_set_hdrae()
1754 IMX464->has_init_exp = true; in IMX464_set_hdrae()
1755 dev_dbg(&IMX464->client->dev, "IMX464 don't stream, record exp for hdr!\n"); in IMX464_set_hdrae()
1769 if (IMX464->cur_mode->hdr_mode == HDR_X2) { in IMX464_set_hdrae()
1775 if (!IMX464->isHCG && cg_mode == GAIN_MODE_HCG) { in IMX464_set_hdrae()
1777 IMX464->isHCG = true; in IMX464_set_hdrae()
1778 } else if (IMX464->isHCG && cg_mode == GAIN_MODE_LCG) { in IMX464_set_hdrae()
1780 IMX464->isHCG = false; in IMX464_set_hdrae()
1928 static int IMX464_set_hdrae_3frame(struct IMX464 *IMX464, in IMX464_set_hdrae_3frame() argument
1931 struct i2c_client *client = IMX464->client; in IMX464_set_hdrae_3frame()
1945 if (!IMX464->has_init_exp && !IMX464->streaming) { in IMX464_set_hdrae_3frame()
1946 IMX464->init_hdrae_exp = *ae; in IMX464_set_hdrae_3frame()
1947 IMX464->has_init_exp = true; in IMX464_set_hdrae_3frame()
1948 dev_dbg(&IMX464->client->dev, "IMX464 is not streaming, save hdr ae!\n"); in IMX464_set_hdrae_3frame()
1958 if (IMX464->cur_mode->hdr_mode == HDR_X3) { in IMX464_set_hdrae_3frame()
1962 if (!IMX464->isHCG && cg_mode == GAIN_MODE_HCG) { in IMX464_set_hdrae_3frame()
1964 IMX464->isHCG = true; in IMX464_set_hdrae_3frame()
1965 } else if (IMX464->isHCG && cg_mode == GAIN_MODE_LCG) { in IMX464_set_hdrae_3frame()
1967 IMX464->isHCG = false; in IMX464_set_hdrae_3frame()
2028 fsc = IMX464->cur_vts; in IMX464_set_hdrae_3frame()
2197 static int IMX464_set_conversion_gain(struct IMX464 *IMX464, u32 *cg) in IMX464_set_conversion_gain() argument
2200 struct i2c_client *client = IMX464->client; in IMX464_set_conversion_gain()
2204 if (IMX464->isHCG && cur_cg == GAIN_MODE_LCG) { in IMX464_set_conversion_gain()
2206 IMX464->isHCG = false; in IMX464_set_conversion_gain()
2207 } else if (!IMX464->isHCG && cur_cg == GAIN_MODE_HCG) { in IMX464_set_conversion_gain()
2209 IMX464->isHCG = true; in IMX464_set_conversion_gain()
2236 struct IMX464 *IMX464 = to_IMX464(sd); in set_conversion_gain_status() local
2242 IMX464_set_conversion_gain(IMX464, &status); in set_conversion_gain_status()
2277 static int IMX464_get_channel_info(struct IMX464 *IMX464, struct rkmodule_channel_info *ch_info) in IMX464_get_channel_info() argument
2281 ch_info->vc = IMX464->cur_mode->vc[ch_info->index]; in IMX464_get_channel_info()
2282 ch_info->width = IMX464->cur_mode->width; in IMX464_get_channel_info()
2283 ch_info->height = IMX464->cur_mode->height; in IMX464_get_channel_info()
2284 ch_info->bus_fmt = IMX464->cur_mode->bus_fmt; in IMX464_get_channel_info()
2290 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_ioctl() local
2300 if (IMX464->cur_mode->hdr_mode == HDR_X2) in IMX464_ioctl()
2301 ret = IMX464_set_hdrae(IMX464, arg); in IMX464_ioctl()
2302 else if (IMX464->cur_mode->hdr_mode == HDR_X3) in IMX464_ioctl()
2303 ret = IMX464_set_hdrae_3frame(IMX464, arg); in IMX464_ioctl()
2306 IMX464_get_module_inf(IMX464, (struct rkmodule_inf *)arg); in IMX464_ioctl()
2311 hdr->hdr_mode = IMX464->cur_mode->hdr_mode; in IMX464_ioctl()
2315 w = IMX464->cur_mode->width; in IMX464_ioctl()
2316 h = IMX464->cur_mode->height; in IMX464_ioctl()
2317 for (i = 0; i < IMX464->cfg_num; i++) { in IMX464_ioctl()
2318 if (w == IMX464->support_modes[i].width && in IMX464_ioctl()
2319 h == IMX464->support_modes[i].height && in IMX464_ioctl()
2320 IMX464->support_modes[i].hdr_mode == hdr->hdr_mode) { in IMX464_ioctl()
2321 IMX464->cur_mode = &IMX464->support_modes[i]; in IMX464_ioctl()
2325 if (i == IMX464->cfg_num) { in IMX464_ioctl()
2326 dev_err(&IMX464->client->dev, in IMX464_ioctl()
2331 w = IMX464->cur_mode->hts_def - IMX464->cur_mode->width; in IMX464_ioctl()
2332 h = IMX464->cur_mode->vts_def - IMX464->cur_mode->height; in IMX464_ioctl()
2333 __v4l2_ctrl_modify_range(IMX464->hblank, w, w, 1, w); in IMX464_ioctl()
2334 __v4l2_ctrl_modify_range(IMX464->vblank, h, in IMX464_ioctl()
2335 IMX464_VTS_MAX - IMX464->cur_mode->height, in IMX464_ioctl()
2337 IMX464->cur_vts = IMX464->cur_mode->vts_def; in IMX464_ioctl()
2338 …pixel_rate = (u32)link_freq_menu_items[IMX464->cur_mode->mipi_freq_idx] / IMX464->cur_mode->bpp * … in IMX464_ioctl()
2339 IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes; in IMX464_ioctl()
2340 __v4l2_ctrl_s_ctrl_int64(IMX464->pixel_rate, in IMX464_ioctl()
2342 __v4l2_ctrl_s_ctrl(IMX464->link_freq, in IMX464_ioctl()
2343 IMX464->cur_mode->mipi_freq_idx); in IMX464_ioctl()
2347 ret = IMX464_set_conversion_gain(IMX464, (u32 *)arg); in IMX464_ioctl()
2354 ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, in IMX464_ioctl()
2357 ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, in IMX464_ioctl()
2363 ret = IMX464_get_channel_info(IMX464, ch_info); in IMX464_ioctl()
2367 *sync_mode = IMX464->sync_mode; in IMX464_ioctl()
2371 IMX464->sync_mode = *sync_mode; in IMX464_ioctl()
2523 static int IMX464_init_conversion_gain(struct IMX464 *IMX464, bool isHCG) in IMX464_init_conversion_gain() argument
2525 struct i2c_client *client = IMX464->client; in IMX464_init_conversion_gain()
2540 static int __IMX464_start_stream(struct IMX464 *IMX464) in __IMX464_start_stream() argument
2544 ret = IMX464_write_array(IMX464->client, IMX464->cur_mode->reg_list); in __IMX464_start_stream()
2547 ret = IMX464_init_conversion_gain(IMX464, IMX464->isHCG); in __IMX464_start_stream()
2551 ret = __v4l2_ctrl_handler_setup(&IMX464->ctrl_handler); in __IMX464_start_stream()
2554 if (IMX464->has_init_exp && IMX464->cur_mode->hdr_mode != NO_HDR) { in __IMX464_start_stream()
2555 ret = IMX464_ioctl(&IMX464->subdev, PREISP_CMD_SET_HDRAE_EXP, in __IMX464_start_stream()
2556 &IMX464->init_hdrae_exp); in __IMX464_start_stream()
2558 dev_err(&IMX464->client->dev, in __IMX464_start_stream()
2564 if (IMX464->sync_mode == EXTERNAL_MASTER_MODE) { in __IMX464_start_stream()
2565 ret |= IMX464_write_array(IMX464->client, IMX464_external_sync_master_start_regs); in __IMX464_start_stream()
2566 v4l2_err(&IMX464->subdev, "cur externam master mode\n"); in __IMX464_start_stream()
2567 } else if (IMX464->sync_mode == INTERNAL_MASTER_MODE) { in __IMX464_start_stream()
2568 ret |= IMX464_write_array(IMX464->client, IMX464_interal_sync_master_start_regs); in __IMX464_start_stream()
2569 v4l2_err(&IMX464->subdev, "cur intertal master\n"); in __IMX464_start_stream()
2570 } else if (IMX464->sync_mode == SLAVE_MODE) { in __IMX464_start_stream()
2571 ret |= IMX464_write_array(IMX464->client, IMX464_slave_start_regs); in __IMX464_start_stream()
2572 v4l2_err(&IMX464->subdev, "cur slave mode\n"); in __IMX464_start_stream()
2574 if (IMX464->sync_mode == NO_SYNC_MODE) { in __IMX464_start_stream()
2575 ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, in __IMX464_start_stream()
2578 ret |= imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE, in __IMX464_start_stream()
2581 ret |= imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE, in __IMX464_start_stream()
2587 static int __IMX464_stop_stream(struct IMX464 *IMX464) in __IMX464_stop_stream() argument
2591 IMX464->has_init_exp = false; in __IMX464_stop_stream()
2592 ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE, in __IMX464_stop_stream()
2595 if (IMX464->sync_mode == EXTERNAL_MASTER_MODE) in __IMX464_stop_stream()
2596 ret |= IMX464_write_array(IMX464->client, IMX464_external_sync_master_stop_regs); in __IMX464_stop_stream()
2597 else if (IMX464->sync_mode == INTERNAL_MASTER_MODE) in __IMX464_stop_stream()
2598 ret |= IMX464_write_array(IMX464->client, IMX464_interal_sync_master_stop_regs); in __IMX464_stop_stream()
2604 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_s_stream() local
2605 struct i2c_client *client = IMX464->client; in IMX464_s_stream()
2608 mutex_lock(&IMX464->mutex); in IMX464_s_stream()
2610 if (on == IMX464->streaming) in IMX464_s_stream()
2620 ret = __IMX464_start_stream(IMX464); in IMX464_s_stream()
2627 __IMX464_stop_stream(IMX464); in IMX464_s_stream()
2631 IMX464->streaming = on; in IMX464_s_stream()
2634 mutex_unlock(&IMX464->mutex); in IMX464_s_stream()
2641 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_s_power() local
2642 struct i2c_client *client = IMX464->client; in IMX464_s_power()
2645 mutex_lock(&IMX464->mutex); in IMX464_s_power()
2648 if (IMX464->power_on == !!on) in IMX464_s_power()
2658 ret = IMX464_write_array(IMX464->client, IMX464_global_regs); in IMX464_s_power()
2665 IMX464->power_on = true; in IMX464_s_power()
2668 IMX464->power_on = false; in IMX464_s_power()
2672 mutex_unlock(&IMX464->mutex); in IMX464_s_power()
2683 static int __IMX464_power_on(struct IMX464 *IMX464) in __IMX464_power_on() argument
2687 struct device *dev = &IMX464->client->dev; in __IMX464_power_on()
2689 if (!IS_ERR_OR_NULL(IMX464->pins_default)) { in __IMX464_power_on()
2690 ret = pinctrl_select_state(IMX464->pinctrl, in __IMX464_power_on()
2691 IMX464->pins_default); in __IMX464_power_on()
2696 ret = clk_set_rate(IMX464->xvclk, IMX464->cur_mode->mclk); in __IMX464_power_on()
2699 if (clk_get_rate(IMX464->xvclk) != IMX464->cur_mode->mclk) in __IMX464_power_on()
2700 dev_warn(dev, "xvclk mismatched, %lu\n", clk_get_rate(IMX464->xvclk)); in __IMX464_power_on()
2702 IMX464->cur_mclk = IMX464->cur_mode->mclk; in __IMX464_power_on()
2703 ret = clk_prepare_enable(IMX464->xvclk); in __IMX464_power_on()
2708 if (!IS_ERR(IMX464->reset_gpio)) in __IMX464_power_on()
2709 gpiod_set_value_cansleep(IMX464->reset_gpio, 0); in __IMX464_power_on()
2711 ret = regulator_bulk_enable(IMX464_NUM_SUPPLIES, IMX464->supplies); in __IMX464_power_on()
2717 if (!IS_ERR(IMX464->reset_gpio)) in __IMX464_power_on()
2718 gpiod_set_value_cansleep(IMX464->reset_gpio, 1); in __IMX464_power_on()
2721 if (!IS_ERR(IMX464->pwdn_gpio)) in __IMX464_power_on()
2722 gpiod_set_value_cansleep(IMX464->pwdn_gpio, 1); in __IMX464_power_on()
2731 clk_disable_unprepare(IMX464->xvclk); in __IMX464_power_on()
2736 static void __IMX464_power_off(struct IMX464 *IMX464) in __IMX464_power_off() argument
2739 struct device *dev = &IMX464->client->dev; in __IMX464_power_off()
2741 if (!IS_ERR(IMX464->pwdn_gpio)) in __IMX464_power_off()
2742 gpiod_set_value_cansleep(IMX464->pwdn_gpio, 0); in __IMX464_power_off()
2743 clk_disable_unprepare(IMX464->xvclk); in __IMX464_power_off()
2744 if (!IS_ERR(IMX464->reset_gpio)) in __IMX464_power_off()
2745 gpiod_set_value_cansleep(IMX464->reset_gpio, 0); in __IMX464_power_off()
2746 if (!IS_ERR_OR_NULL(IMX464->pins_sleep)) { in __IMX464_power_off()
2747 ret = pinctrl_select_state(IMX464->pinctrl, in __IMX464_power_off()
2748 IMX464->pins_sleep); in __IMX464_power_off()
2752 regulator_bulk_disable(IMX464_NUM_SUPPLIES, IMX464->supplies); in __IMX464_power_off()
2760 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_runtime_resume() local
2762 return __IMX464_power_on(IMX464); in IMX464_runtime_resume()
2769 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_runtime_suspend() local
2771 __IMX464_power_off(IMX464); in IMX464_runtime_suspend()
2779 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_open() local
2782 const struct IMX464_mode *def_mode = &IMX464->support_modes[0]; in IMX464_open()
2784 mutex_lock(&IMX464->mutex); in IMX464_open()
2791 mutex_unlock(&IMX464->mutex); in IMX464_open()
2802 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_enum_frame_interval() local
2804 if (fie->index >= IMX464->cfg_num) in IMX464_enum_frame_interval()
2807 fie->code = IMX464->support_modes[fie->index].bus_fmt; in IMX464_enum_frame_interval()
2808 fie->width = IMX464->support_modes[fie->index].width; in IMX464_enum_frame_interval()
2809 fie->height = IMX464->support_modes[fie->index].height; in IMX464_enum_frame_interval()
2810 fie->interval = IMX464->support_modes[fie->index].max_fps; in IMX464_enum_frame_interval()
2811 fie->reserved[0] = IMX464->support_modes[fie->index].hdr_mode; in IMX464_enum_frame_interval()
2832 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_get_selection() local
2835 sel->r.left = CROP_START(IMX464->cur_mode->width, DST_WIDTH); in IMX464_get_selection()
2837 sel->r.top = CROP_START(IMX464->cur_mode->height, DST_HEIGHT); in IMX464_get_selection()
2886 struct IMX464 *IMX464 = container_of(ctrl->handler, in IMX464_set_ctrl() local
2887 struct IMX464, ctrl_handler); in IMX464_set_ctrl()
2888 struct i2c_client *client = IMX464->client; in IMX464_set_ctrl()
2889 const struct IMX464_mode *mode = IMX464->cur_mode; in IMX464_set_ctrl()
2901 max = IMX464->cur_mode->height + ctrl->val - 3; in IMX464_set_ctrl()
2902 __v4l2_ctrl_modify_range(IMX464->exposure, in IMX464_set_ctrl()
2903 IMX464->exposure->minimum, max, in IMX464_set_ctrl()
2904 IMX464->exposure->step, in IMX464_set_ctrl()
2905 IMX464->exposure->default_value); in IMX464_set_ctrl()
2916 shr0 = IMX464->cur_vts - ctrl->val; in IMX464_set_ctrl()
2917 ret = imx464_write_reg(IMX464->client, IMX464_LF_EXPO_REG_L, in IMX464_set_ctrl()
2920 ret |= imx464_write_reg(IMX464->client, IMX464_LF_EXPO_REG_M, in IMX464_set_ctrl()
2923 ret |= imx464_write_reg(IMX464->client, IMX464_LF_EXPO_REG_H, in IMX464_set_ctrl()
2932 ret = imx464_write_reg(IMX464->client, IMX464_LF_GAIN_REG_H, in IMX464_set_ctrl()
2935 ret |= imx464_write_reg(IMX464->client, IMX464_LF_GAIN_REG_L, in IMX464_set_ctrl()
2943 vts = ctrl->val + IMX464->cur_mode->height; in IMX464_set_ctrl()
2947 IMX464->cur_vts = vts; in IMX464_set_ctrl()
2951 IMX464->cur_vts = vts; in IMX464_set_ctrl()
2954 IMX464->cur_vts = vts; in IMX464_set_ctrl()
2956 ret = imx464_write_reg(IMX464->client, IMX464_VTS_REG_L, in IMX464_set_ctrl()
2959 ret |= imx464_write_reg(IMX464->client, IMX464_VTS_REG_M, in IMX464_set_ctrl()
2962 ret |= imx464_write_reg(IMX464->client, IMX464_VTS_REG_H, in IMX464_set_ctrl()
2974 ret |= imx464_write_reg(IMX464->client, IMX464_HREVERSE_REG, in IMX464_set_ctrl()
2987 ret |= imx464_write_reg(IMX464->client, IMX464_VREVERSE_REG, in IMX464_set_ctrl()
2990 ret |= imx464_write_reg(IMX464->client, 0x3074, in IMX464_set_ctrl()
2992 ret |= imx464_write_reg(IMX464->client, 0x3075, in IMX464_set_ctrl()
2994 ret |= imx464_write_reg(IMX464->client, 0x3080, in IMX464_set_ctrl()
2996 ret |= imx464_write_reg(IMX464->client, 0x30ad, in IMX464_set_ctrl()
2998 ret |= imx464_write_reg(IMX464->client, 0x30b6, in IMX464_set_ctrl()
3000 ret |= imx464_write_reg(IMX464->client, 0x30b7, in IMX464_set_ctrl()
3002 ret |= imx464_write_reg(IMX464->client, 0x30d8, in IMX464_set_ctrl()
3004 ret |= imx464_write_reg(IMX464->client, 0x3114, in IMX464_set_ctrl()
3007 ret |= imx464_write_reg(IMX464->client, 0x3074, in IMX464_set_ctrl()
3009 ret |= imx464_write_reg(IMX464->client, 0x3075, in IMX464_set_ctrl()
3011 ret |= imx464_write_reg(IMX464->client, 0x3080, in IMX464_set_ctrl()
3013 ret |= imx464_write_reg(IMX464->client, 0x30ad, in IMX464_set_ctrl()
3015 ret |= imx464_write_reg(IMX464->client, 0x30b6, in IMX464_set_ctrl()
3017 ret |= imx464_write_reg(IMX464->client, 0x30b7, in IMX464_set_ctrl()
3019 ret |= imx464_write_reg(IMX464->client, 0x30d8, in IMX464_set_ctrl()
3021 ret |= imx464_write_reg(IMX464->client, 0x3114, in IMX464_set_ctrl()
3044 static int IMX464_initialize_controls(struct IMX464 *IMX464) in IMX464_initialize_controls() argument
3053 handler = &IMX464->ctrl_handler; in IMX464_initialize_controls()
3054 mode = IMX464->cur_mode; in IMX464_initialize_controls()
3058 handler->lock = &IMX464->mutex; in IMX464_initialize_controls()
3060 IMX464->link_freq = v4l2_ctrl_new_int_menu(handler, in IMX464_initialize_controls()
3063 __v4l2_ctrl_s_ctrl(IMX464->link_freq, in IMX464_initialize_controls()
3064 IMX464->cur_mode->mipi_freq_idx); in IMX464_initialize_controls()
3066 IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes; in IMX464_initialize_controls()
3067 IMX464->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in IMX464_initialize_controls()
3072 IMX464->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in IMX464_initialize_controls()
3074 if (IMX464->hblank) in IMX464_initialize_controls()
3075 IMX464->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in IMX464_initialize_controls()
3078 IMX464->vblank = v4l2_ctrl_new_std(handler, &IMX464_ctrl_ops, in IMX464_initialize_controls()
3082 IMX464->cur_vts = mode->vts_def; in IMX464_initialize_controls()
3085 IMX464->exposure = v4l2_ctrl_new_std(handler, &IMX464_ctrl_ops, in IMX464_initialize_controls()
3090 IMX464->anal_a_gain = v4l2_ctrl_new_std(handler, &IMX464_ctrl_ops, in IMX464_initialize_controls()
3099 dev_err(&IMX464->client->dev, in IMX464_initialize_controls()
3104 IMX464->subdev.ctrl_handler = handler; in IMX464_initialize_controls()
3105 IMX464->has_init_exp = false; in IMX464_initialize_controls()
3106 IMX464->isHCG = false; in IMX464_initialize_controls()
3116 static int IMX464_check_sensor_id(struct IMX464 *IMX464, in IMX464_check_sensor_id() argument
3119 struct device *dev = &IMX464->client->dev; in IMX464_check_sensor_id()
3135 static int IMX464_configure_regulators(struct IMX464 *IMX464) in IMX464_configure_regulators() argument
3140 IMX464->supplies[i].supply = IMX464_supply_names[i]; in IMX464_configure_regulators()
3142 return devm_regulator_bulk_get(&IMX464->client->dev, in IMX464_configure_regulators()
3144 IMX464->supplies); in IMX464_configure_regulators()
3152 struct IMX464 *IMX464; in IMX464_probe() local
3166 IMX464 = devm_kzalloc(dev, sizeof(*IMX464), GFP_KERNEL); in IMX464_probe()
3167 if (!IMX464) in IMX464_probe()
3171 &IMX464->module_index); in IMX464_probe()
3173 &IMX464->module_facing); in IMX464_probe()
3175 &IMX464->module_name); in IMX464_probe()
3177 &IMX464->len_name); in IMX464_probe()
3186 IMX464->sync_mode = NO_SYNC_MODE; in IMX464_probe()
3190 IMX464->sync_mode = EXTERNAL_MASTER_MODE; in IMX464_probe()
3192 IMX464->sync_mode = INTERNAL_MASTER_MODE; in IMX464_probe()
3194 IMX464->sync_mode = SLAVE_MODE; in IMX464_probe()
3203 IMX464->client = client; in IMX464_probe()
3210 &IMX464->bus_cfg); in IMX464_probe()
3215 if (IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes == 4) { in IMX464_probe()
3216 IMX464->support_modes = supported_modes; in IMX464_probe()
3217 IMX464->cfg_num = ARRAY_SIZE(supported_modes); in IMX464_probe()
3219 IMX464->support_modes = supported_modes_2lane; in IMX464_probe()
3220 IMX464->cfg_num = ARRAY_SIZE(supported_modes_2lane); in IMX464_probe()
3223 for (i = 0; i < IMX464->cfg_num; i++) { in IMX464_probe()
3224 if (hdr_mode == IMX464->support_modes[i].hdr_mode) { in IMX464_probe()
3225 IMX464->cur_mode = &IMX464->support_modes[i]; in IMX464_probe()
3229 IMX464->cur_mode = &IMX464->support_modes[0]; in IMX464_probe()
3230 IMX464->xvclk = devm_clk_get(dev, "xvclk"); in IMX464_probe()
3231 if (IS_ERR(IMX464->xvclk)) { in IMX464_probe()
3236 IMX464->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in IMX464_probe()
3237 if (IS_ERR(IMX464->reset_gpio)) in IMX464_probe()
3240 IMX464->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in IMX464_probe()
3241 if (IS_ERR(IMX464->pwdn_gpio)) in IMX464_probe()
3244 IMX464->pinctrl = devm_pinctrl_get(dev); in IMX464_probe()
3245 if (!IS_ERR(IMX464->pinctrl)) { in IMX464_probe()
3246 IMX464->pins_default = in IMX464_probe()
3247 pinctrl_lookup_state(IMX464->pinctrl, in IMX464_probe()
3249 if (IS_ERR(IMX464->pins_default)) in IMX464_probe()
3252 IMX464->pins_sleep = in IMX464_probe()
3253 pinctrl_lookup_state(IMX464->pinctrl, in IMX464_probe()
3255 if (IS_ERR(IMX464->pins_sleep)) in IMX464_probe()
3261 ret = IMX464_configure_regulators(IMX464); in IMX464_probe()
3267 mutex_init(&IMX464->mutex); in IMX464_probe()
3269 sd = &IMX464->subdev; in IMX464_probe()
3271 ret = IMX464_initialize_controls(IMX464); in IMX464_probe()
3275 ret = __IMX464_power_on(IMX464); in IMX464_probe()
3279 ret = IMX464_check_sensor_id(IMX464, client); in IMX464_probe()
3289 IMX464->pad.flags = MEDIA_PAD_FL_SOURCE; in IMX464_probe()
3291 ret = media_entity_pads_init(&sd->entity, 1, &IMX464->pad); in IMX464_probe()
3297 if (strcmp(IMX464->module_facing, "back") == 0) in IMX464_probe()
3303 IMX464->module_index, facing, in IMX464_probe()
3325 __IMX464_power_off(IMX464); in IMX464_probe()
3327 v4l2_ctrl_handler_free(&IMX464->ctrl_handler); in IMX464_probe()
3329 mutex_destroy(&IMX464->mutex); in IMX464_probe()
3337 struct IMX464 *IMX464 = to_IMX464(sd); in IMX464_remove() local
3343 v4l2_ctrl_handler_free(&IMX464->ctrl_handler); in IMX464_remove()
3344 mutex_destroy(&IMX464->mutex); in IMX464_remove()
3348 __IMX464_power_off(IMX464); in IMX464_remove()