Lines Matching refs:ov12d2q

138 struct ov12d2q {  struct
177 #define to_ov12d2q(sd) container_of(sd, struct ov12d2q, subdev) argument
1977 static int __ov12d2q_power_on(struct ov12d2q *ov12d2q);
2066 ov12d2q_find_best_fit(struct ov12d2q *ov12d2q, struct v4l2_subdev_format *fmt) in ov12d2q_find_best_fit() argument
2074 for (i = 0; i < ov12d2q->cfg_num; i++) { in ov12d2q_find_best_fit()
2090 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_set_fmt() local
2096 mutex_lock(&ov12d2q->mutex); in ov12d2q_set_fmt()
2098 mode = ov12d2q_find_best_fit(ov12d2q, fmt); in ov12d2q_set_fmt()
2107 mutex_unlock(&ov12d2q->mutex); in ov12d2q_set_fmt()
2111 ov12d2q->cur_mode = mode; in ov12d2q_set_fmt()
2113 __v4l2_ctrl_modify_range(ov12d2q->hblank, h_blank, in ov12d2q_set_fmt()
2116 __v4l2_ctrl_modify_range(ov12d2q->vblank, vblank_def, in ov12d2q_set_fmt()
2123 __v4l2_ctrl_s_ctrl_int64(ov12d2q->pixel_rate, in ov12d2q_set_fmt()
2125 __v4l2_ctrl_s_ctrl(ov12d2q->link_freq, in ov12d2q_set_fmt()
2129 mutex_unlock(&ov12d2q->mutex); in ov12d2q_set_fmt()
2138 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_get_fmt() local
2139 const struct ov12d2q_mode *mode = ov12d2q->cur_mode; in ov12d2q_get_fmt()
2141 mutex_lock(&ov12d2q->mutex); in ov12d2q_get_fmt()
2146 mutex_unlock(&ov12d2q->mutex); in ov12d2q_get_fmt()
2159 mutex_unlock(&ov12d2q->mutex); in ov12d2q_get_fmt()
2168 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_enum_mbus_code() local
2172 code->code = ov12d2q->cur_mode->bus_fmt; in ov12d2q_enum_mbus_code()
2181 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_enum_frame_sizes() local
2183 if (fse->index >= ov12d2q->cfg_num) in ov12d2q_enum_frame_sizes()
2197 static int ov12d2q_enable_test_pattern(struct ov12d2q *ov12d2q, u32 pattern) in ov12d2q_enable_test_pattern() argument
2207 ret = ov12d2q_write_reg(ov12d2q->client, OV12D2Q_REG_TEST_PATTERN, in ov12d2q_enable_test_pattern()
2216 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_g_frame_interval() local
2217 const struct ov12d2q_mode *mode = ov12d2q->cur_mode; in ov12d2q_g_frame_interval()
2227 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_g_mbus_config() local
2228 const struct ov12d2q_mode *mode = ov12d2q->cur_mode; in ov12d2q_g_mbus_config()
2247 static void ov12d2q_get_module_inf(struct ov12d2q *ov12d2q, in ov12d2q_get_module_inf() argument
2252 strlcpy(inf->base.module, ov12d2q->module_name, in ov12d2q_get_module_inf()
2254 strlcpy(inf->base.lens, ov12d2q->len_name, sizeof(inf->base.lens)); in ov12d2q_get_module_inf()
2259 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_ioctl() local
2270 w = ov12d2q->cur_mode->width; in ov12d2q_ioctl()
2271 h = ov12d2q->cur_mode->height; in ov12d2q_ioctl()
2272 for (i = 0; i < ov12d2q->cfg_num; i++) { in ov12d2q_ioctl()
2276 ov12d2q->cur_mode = &supported_modes[i]; in ov12d2q_ioctl()
2280 if (i == ov12d2q->cfg_num) { in ov12d2q_ioctl()
2281 dev_err(&ov12d2q->client->dev, in ov12d2q_ioctl()
2286 w = ov12d2q->cur_mode->hts_def - ov12d2q->cur_mode->width; in ov12d2q_ioctl()
2287 h = ov12d2q->cur_mode->vts_def - ov12d2q->cur_mode->height; in ov12d2q_ioctl()
2288 __v4l2_ctrl_modify_range(ov12d2q->hblank, w, w, 1, w); in ov12d2q_ioctl()
2289 __v4l2_ctrl_modify_range(ov12d2q->vblank, h, in ov12d2q_ioctl()
2290 OV12D2Q_VTS_MAX - ov12d2q->cur_mode->height, in ov12d2q_ioctl()
2292 dev_info(&ov12d2q->client->dev, in ov12d2q_ioctl()
2294 ov12d2q->cur_mode->hdr_mode); in ov12d2q_ioctl()
2298 ov12d2q_get_module_inf(ov12d2q, (struct rkmodule_inf *)arg); in ov12d2q_ioctl()
2303 hdr_cfg->hdr_mode = ov12d2q->cur_mode->hdr_mode; in ov12d2q_ioctl()
2309 ret = ov12d2q_write_reg(ov12d2q->client, OV12D2Q_REG_CTRL_MODE, in ov12d2q_ioctl()
2312 ret = ov12d2q_write_reg(ov12d2q->client, OV12D2Q_REG_CTRL_MODE, in ov12d2q_ioctl()
2416 static int __ov12d2q_start_stream(struct ov12d2q *ov12d2q) in __ov12d2q_start_stream() argument
2420 if (!ov12d2q->is_thunderboot) { in __ov12d2q_start_stream()
2421 ret = ov12d2q_write_array(ov12d2q->client, ov12d2q_global_regs); in __ov12d2q_start_stream()
2423 dev_err(&ov12d2q->client->dev, in __ov12d2q_start_stream()
2428 ret = ov12d2q_write_array(ov12d2q->client, ov12d2q->cur_mode->reg_list); in __ov12d2q_start_stream()
2434 ret = __v4l2_ctrl_handler_setup(&ov12d2q->ctrl_handler); in __ov12d2q_start_stream()
2438 return ov12d2q_write_reg(ov12d2q->client, OV12D2Q_REG_CTRL_MODE, in __ov12d2q_start_stream()
2442 static int __ov12d2q_stop_stream(struct ov12d2q *ov12d2q) in __ov12d2q_stop_stream() argument
2444 if (ov12d2q->is_thunderboot) in __ov12d2q_stop_stream()
2445 ov12d2q->is_first_streamoff = true; in __ov12d2q_stop_stream()
2446 return ov12d2q_write_reg(ov12d2q->client, OV12D2Q_REG_CTRL_MODE, in __ov12d2q_stop_stream()
2452 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_s_stream() local
2453 struct i2c_client *client = ov12d2q->client; in ov12d2q_s_stream()
2456 mutex_lock(&ov12d2q->mutex); in ov12d2q_s_stream()
2458 if (on == ov12d2q->streaming) in ov12d2q_s_stream()
2462 if (ov12d2q->is_thunderboot && rkisp_tb_get_state() == RKISP_TB_NG) { in ov12d2q_s_stream()
2463 ov12d2q->is_thunderboot = false; in ov12d2q_s_stream()
2464 __ov12d2q_power_on(ov12d2q); in ov12d2q_s_stream()
2472 ret = __ov12d2q_start_stream(ov12d2q); in ov12d2q_s_stream()
2479 __ov12d2q_stop_stream(ov12d2q); in ov12d2q_s_stream()
2483 ov12d2q->streaming = on; in ov12d2q_s_stream()
2486 mutex_unlock(&ov12d2q->mutex); in ov12d2q_s_stream()
2493 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_s_power() local
2494 struct i2c_client *client = ov12d2q->client; in ov12d2q_s_power()
2497 mutex_lock(&ov12d2q->mutex); in ov12d2q_s_power()
2500 if (ov12d2q->power_on == !!on) in ov12d2q_s_power()
2510 if (!ov12d2q->is_thunderboot) { in ov12d2q_s_power()
2511 ret |= ov12d2q_write_reg(ov12d2q->client, in ov12d2q_s_power()
2523 ov12d2q->power_on = true; in ov12d2q_s_power()
2526 ov12d2q->power_on = false; in ov12d2q_s_power()
2530 mutex_unlock(&ov12d2q->mutex); in ov12d2q_s_power()
2541 static int __ov12d2q_power_on(struct ov12d2q *ov12d2q) in __ov12d2q_power_on() argument
2545 struct device *dev = &ov12d2q->client->dev; in __ov12d2q_power_on()
2547 if (ov12d2q->is_thunderboot) in __ov12d2q_power_on()
2550 if (!IS_ERR_OR_NULL(ov12d2q->pins_default)) { in __ov12d2q_power_on()
2551 ret = pinctrl_select_state(ov12d2q->pinctrl, in __ov12d2q_power_on()
2552 ov12d2q->pins_default); in __ov12d2q_power_on()
2556 ret = clk_set_rate(ov12d2q->xvclk, OV12D2Q_XVCLK_FREQ); in __ov12d2q_power_on()
2559 if (clk_get_rate(ov12d2q->xvclk) != OV12D2Q_XVCLK_FREQ) in __ov12d2q_power_on()
2561 ret = clk_prepare_enable(ov12d2q->xvclk); in __ov12d2q_power_on()
2566 if (!IS_ERR(ov12d2q->reset_gpio)) in __ov12d2q_power_on()
2567 gpiod_direction_output(ov12d2q->reset_gpio, 1); in __ov12d2q_power_on()
2569 ret = regulator_bulk_enable(OV12D2Q_NUM_SUPPLIES, ov12d2q->supplies); in __ov12d2q_power_on()
2575 if (!IS_ERR(ov12d2q->reset_gpio)) in __ov12d2q_power_on()
2576 gpiod_direction_output(ov12d2q->reset_gpio, 0); in __ov12d2q_power_on()
2579 if (!IS_ERR(ov12d2q->pwdn_gpio)) in __ov12d2q_power_on()
2580 gpiod_direction_output(ov12d2q->pwdn_gpio, 1); in __ov12d2q_power_on()
2585 if (!IS_ERR(ov12d2q->reset_gpio)) in __ov12d2q_power_on()
2597 clk_disable_unprepare(ov12d2q->xvclk); in __ov12d2q_power_on()
2602 static void __ov12d2q_power_off(struct ov12d2q *ov12d2q) in __ov12d2q_power_off() argument
2605 struct device *dev = &ov12d2q->client->dev; in __ov12d2q_power_off()
2607 if (ov12d2q->is_thunderboot) { in __ov12d2q_power_off()
2608 if (ov12d2q->is_first_streamoff) { in __ov12d2q_power_off()
2609 ov12d2q->is_thunderboot = false; in __ov12d2q_power_off()
2610 ov12d2q->is_first_streamoff = false; in __ov12d2q_power_off()
2616 if (!IS_ERR(ov12d2q->pwdn_gpio)) in __ov12d2q_power_off()
2617 gpiod_direction_output(ov12d2q->pwdn_gpio, 0); in __ov12d2q_power_off()
2619 clk_disable_unprepare(ov12d2q->xvclk); in __ov12d2q_power_off()
2621 if (!IS_ERR(ov12d2q->reset_gpio)) in __ov12d2q_power_off()
2622 gpiod_direction_output(ov12d2q->reset_gpio, 0); in __ov12d2q_power_off()
2623 if (!IS_ERR_OR_NULL(ov12d2q->pins_sleep)) { in __ov12d2q_power_off()
2624 ret = pinctrl_select_state(ov12d2q->pinctrl, in __ov12d2q_power_off()
2625 ov12d2q->pins_sleep); in __ov12d2q_power_off()
2630 if (ov12d2q->is_thunderboot_ng) { in __ov12d2q_power_off()
2631 ov12d2q->is_thunderboot_ng = false; in __ov12d2q_power_off()
2632 regulator_bulk_disable(OV12D2Q_NUM_SUPPLIES, ov12d2q->supplies); in __ov12d2q_power_off()
2640 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_runtime_resume() local
2642 return __ov12d2q_power_on(ov12d2q); in ov12d2q_runtime_resume()
2649 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_runtime_suspend() local
2651 __ov12d2q_power_off(ov12d2q); in ov12d2q_runtime_suspend()
2659 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_open() local
2664 mutex_lock(&ov12d2q->mutex); in ov12d2q_open()
2671 mutex_unlock(&ov12d2q->mutex); in ov12d2q_open()
2682 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_enum_frame_interval() local
2684 if (fie->index >= ov12d2q->cfg_num) in ov12d2q_enum_frame_interval()
2736 struct ov12d2q *ov12d2q = container_of(ctrl->handler, in ov12d2q_set_ctrl() local
2737 struct ov12d2q, ctrl_handler); in ov12d2q_set_ctrl()
2738 struct i2c_client *client = ov12d2q->client; in ov12d2q_set_ctrl()
2748 max = ov12d2q->cur_mode->height + ctrl->val - 16; in ov12d2q_set_ctrl()
2749 __v4l2_ctrl_modify_range(ov12d2q->exposure, in ov12d2q_set_ctrl()
2750 ov12d2q->exposure->minimum, max, in ov12d2q_set_ctrl()
2751 ov12d2q->exposure->step, in ov12d2q_set_ctrl()
2752 ov12d2q->exposure->default_value); in ov12d2q_set_ctrl()
2761 if (ov12d2q->cur_mode->hdr_mode != NO_HDR) in ov12d2q_set_ctrl()
2763 ret = ov12d2q_write_reg(ov12d2q->client, in ov12d2q_set_ctrl()
2771 if (ov12d2q->cur_mode->hdr_mode != NO_HDR) in ov12d2q_set_ctrl()
2780 ret |= ov12d2q_write_reg(ov12d2q->client, in ov12d2q_set_ctrl()
2785 ret |= ov12d2q_write_reg(ov12d2q->client, in ov12d2q_set_ctrl()
2794 ret = ov12d2q_write_reg(ov12d2q->client, OV12D2Q_REG_VTS, in ov12d2q_set_ctrl()
2796 ctrl->val + ov12d2q->cur_mode->height); in ov12d2q_set_ctrl()
2801 ret = ov12d2q_enable_test_pattern(ov12d2q, ctrl->val); in ov12d2q_set_ctrl()
2804 ret = ov12d2q_read_reg(ov12d2q->client, OV12D2Q_MIRROR_REG, in ov12d2q_set_ctrl()
2812 ret |= ov12d2q_read_reg(ov12d2q->client, OV12D2Q_REG_ISP_X_WIN, in ov12d2q_set_ctrl()
2822 ret |= ov12d2q_write_reg(ov12d2q->client, in ov12d2q_set_ctrl()
2827 ret |= ov12d2q_write_reg(ov12d2q->client, OV12D2Q_MIRROR_REG, in ov12d2q_set_ctrl()
2830 ret |= ov12d2q_write_reg(ov12d2q->client, OV12D2Q_REG_ISP_X_WIN, in ov12d2q_set_ctrl()
2834 ret |= ov12d2q_write_reg(ov12d2q->client, in ov12d2q_set_ctrl()
2838 ret |= ov12d2q_write_reg(ov12d2q->client, in ov12d2q_set_ctrl()
2844 ret = ov12d2q_read_reg(ov12d2q->client, OV12D2Q_FLIP_REG, in ov12d2q_set_ctrl()
2852 ret |= ov12d2q_read_reg(ov12d2q->client, OV12D2Q_REG_ISP_Y_WIN, in ov12d2q_set_ctrl()
2862 ret |= ov12d2q_write_reg(ov12d2q->client, in ov12d2q_set_ctrl()
2867 ret |= ov12d2q_write_reg(ov12d2q->client, OV12D2Q_FLIP_REG, in ov12d2q_set_ctrl()
2870 ret |= ov12d2q_write_reg(ov12d2q->client, OV12D2Q_REG_ISP_Y_WIN, in ov12d2q_set_ctrl()
2874 ret |= ov12d2q_write_reg(ov12d2q->client, in ov12d2q_set_ctrl()
2878 ret |= ov12d2q_write_reg(ov12d2q->client, in ov12d2q_set_ctrl()
2899 static int ov12d2q_initialize_controls(struct ov12d2q *ov12d2q) in ov12d2q_initialize_controls() argument
2909 handler = &ov12d2q->ctrl_handler; in ov12d2q_initialize_controls()
2910 mode = ov12d2q->cur_mode; in ov12d2q_initialize_controls()
2914 handler->lock = &ov12d2q->mutex; in ov12d2q_initialize_controls()
2916 ov12d2q->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in ov12d2q_initialize_controls()
2920 if (ov12d2q->cur_mode->bus_fmt == MEDIA_BUS_FMT_SBGGR10_1X10) { in ov12d2q_initialize_controls()
2925 ov12d2q->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in ov12d2q_initialize_controls()
2930 __v4l2_ctrl_s_ctrl(ov12d2q->link_freq, in ov12d2q_initialize_controls()
2934 ov12d2q->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in ov12d2q_initialize_controls()
2936 if (ov12d2q->hblank) in ov12d2q_initialize_controls()
2937 ov12d2q->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov12d2q_initialize_controls()
2940 ov12d2q->vblank = v4l2_ctrl_new_std(handler, &ov12d2q_ctrl_ops, in ov12d2q_initialize_controls()
2946 ov12d2q->exposure = v4l2_ctrl_new_std(handler, &ov12d2q_ctrl_ops, in ov12d2q_initialize_controls()
2951 ov12d2q->anal_gain = v4l2_ctrl_new_std(handler, &ov12d2q_ctrl_ops, in ov12d2q_initialize_controls()
2956 ov12d2q->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in ov12d2q_initialize_controls()
2961 ov12d2q->h_flip = v4l2_ctrl_new_std(handler, &ov12d2q_ctrl_ops, in ov12d2q_initialize_controls()
2964 ov12d2q->v_flip = v4l2_ctrl_new_std(handler, &ov12d2q_ctrl_ops, in ov12d2q_initialize_controls()
2969 dev_err(&ov12d2q->client->dev, in ov12d2q_initialize_controls()
2974 ov12d2q->subdev.ctrl_handler = handler; in ov12d2q_initialize_controls()
2984 static int ov12d2q_check_sensor_id(struct ov12d2q *ov12d2q, in ov12d2q_check_sensor_id() argument
2987 struct device *dev = &ov12d2q->client->dev; in ov12d2q_check_sensor_id()
2991 if (ov12d2q->is_thunderboot) { in ov12d2q_check_sensor_id()
3008 static int ov12d2q_configure_regulators(struct ov12d2q *ov12d2q) in ov12d2q_configure_regulators() argument
3013 ov12d2q->supplies[i].supply = ov12d2q_supply_names[i]; in ov12d2q_configure_regulators()
3015 return devm_regulator_bulk_get(&ov12d2q->client->dev, in ov12d2q_configure_regulators()
3017 ov12d2q->supplies); in ov12d2q_configure_regulators()
3025 struct ov12d2q *ov12d2q; in ov12d2q_probe() local
3036 ov12d2q = devm_kzalloc(dev, sizeof(*ov12d2q), GFP_KERNEL); in ov12d2q_probe()
3037 if (!ov12d2q) in ov12d2q_probe()
3041 &ov12d2q->module_index); in ov12d2q_probe()
3043 &ov12d2q->module_facing); in ov12d2q_probe()
3045 &ov12d2q->module_name); in ov12d2q_probe()
3047 &ov12d2q->len_name); in ov12d2q_probe()
3053 ov12d2q->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); in ov12d2q_probe()
3060 ov12d2q->cfg_num = ARRAY_SIZE(supported_modes); in ov12d2q_probe()
3061 for (i = 0; i < ov12d2q->cfg_num; i++) { in ov12d2q_probe()
3063 ov12d2q->cur_mode = &supported_modes[i]; in ov12d2q_probe()
3067 ov12d2q->client = client; in ov12d2q_probe()
3069 ov12d2q->xvclk = devm_clk_get(dev, "xvclk"); in ov12d2q_probe()
3070 if (IS_ERR(ov12d2q->xvclk)) { in ov12d2q_probe()
3075 ov12d2q->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS); in ov12d2q_probe()
3076 if (IS_ERR(ov12d2q->reset_gpio)) in ov12d2q_probe()
3079 ov12d2q->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_ASIS); in ov12d2q_probe()
3080 if (IS_ERR(ov12d2q->pwdn_gpio)) in ov12d2q_probe()
3083 ov12d2q->pinctrl = devm_pinctrl_get(dev); in ov12d2q_probe()
3084 if (!IS_ERR(ov12d2q->pinctrl)) { in ov12d2q_probe()
3085 ov12d2q->pins_default = in ov12d2q_probe()
3086 pinctrl_lookup_state(ov12d2q->pinctrl, in ov12d2q_probe()
3088 if (IS_ERR(ov12d2q->pins_default)) in ov12d2q_probe()
3091 ov12d2q->pins_sleep = in ov12d2q_probe()
3092 pinctrl_lookup_state(ov12d2q->pinctrl, in ov12d2q_probe()
3094 if (IS_ERR(ov12d2q->pins_sleep)) in ov12d2q_probe()
3100 ret = ov12d2q_configure_regulators(ov12d2q); in ov12d2q_probe()
3106 mutex_init(&ov12d2q->mutex); in ov12d2q_probe()
3108 sd = &ov12d2q->subdev; in ov12d2q_probe()
3110 ret = ov12d2q_initialize_controls(ov12d2q); in ov12d2q_probe()
3114 ret = __ov12d2q_power_on(ov12d2q); in ov12d2q_probe()
3118 ret = ov12d2q_check_sensor_id(ov12d2q, client); in ov12d2q_probe()
3127 ov12d2q->pad.flags = MEDIA_PAD_FL_SOURCE; in ov12d2q_probe()
3129 ret = media_entity_pads_init(&sd->entity, 1, &ov12d2q->pad); in ov12d2q_probe()
3135 if (strcmp(ov12d2q->module_facing, "back") == 0) in ov12d2q_probe()
3141 ov12d2q->module_index, facing, in ov12d2q_probe()
3160 __ov12d2q_power_off(ov12d2q); in ov12d2q_probe()
3162 v4l2_ctrl_handler_free(&ov12d2q->ctrl_handler); in ov12d2q_probe()
3164 mutex_destroy(&ov12d2q->mutex); in ov12d2q_probe()
3172 struct ov12d2q *ov12d2q = to_ov12d2q(sd); in ov12d2q_remove() local
3178 v4l2_ctrl_handler_free(&ov12d2q->ctrl_handler); in ov12d2q_remove()
3179 mutex_destroy(&ov12d2q->mutex); in ov12d2q_remove()
3183 __ov12d2q_power_off(ov12d2q); in ov12d2q_remove()