Lines Matching refs:ov8858

164 struct ov8858 {  struct
205 #define to_ov8858(sd) container_of(sd, struct ov8858, subdev) argument
1998 ov8858_find_best_fit(struct ov8858 *ov8858, in ov8858_find_best_fit() argument
2007 for (i = 0; i < ov8858->cfg_num; i++) { in ov8858_find_best_fit()
2022 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_set_fmt() local
2026 mutex_lock(&ov8858->mutex); in ov8858_set_fmt()
2028 mode = ov8858_find_best_fit(ov8858, fmt); in ov8858_set_fmt()
2037 mutex_unlock(&ov8858->mutex); in ov8858_set_fmt()
2041 ov8858->cur_mode = mode; in ov8858_set_fmt()
2043 __v4l2_ctrl_modify_range(ov8858->hblank, h_blank, in ov8858_set_fmt()
2046 __v4l2_ctrl_modify_range(ov8858->vblank, vblank_def, in ov8858_set_fmt()
2051 mutex_unlock(&ov8858->mutex); in ov8858_set_fmt()
2060 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_get_fmt() local
2061 const struct ov8858_mode *mode = ov8858->cur_mode; in ov8858_get_fmt()
2063 mutex_lock(&ov8858->mutex); in ov8858_get_fmt()
2068 mutex_unlock(&ov8858->mutex); in ov8858_get_fmt()
2077 mutex_unlock(&ov8858->mutex); in ov8858_get_fmt()
2097 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_enum_frame_sizes() local
2099 if (fse->index >= ov8858->cfg_num) in ov8858_enum_frame_sizes()
2113 static int ov8858_enable_test_pattern(struct ov8858 *ov8858, u32 pattern) in ov8858_enable_test_pattern() argument
2122 return ov8858_write_reg(ov8858->client, in ov8858_enable_test_pattern()
2131 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_g_frame_interval() local
2132 const struct ov8858_mode *mode = ov8858->cur_mode; in ov8858_g_frame_interval()
2291 static void ov8858_get_module_inf(struct ov8858 *ov8858, in ov8858_get_module_inf() argument
2294 struct ov8858_otp_info_r1a *otp_r1a = ov8858->otp_r1a; in ov8858_get_module_inf()
2295 struct ov8858_otp_info_r2a *otp_r2a = ov8858->otp_r2a; in ov8858_get_module_inf()
2298 strlcpy(inf->base.module, ov8858->module_name, sizeof(inf->base.module)); in ov8858_get_module_inf()
2299 strlcpy(inf->base.lens, ov8858->len_name, sizeof(inf->base.lens)); in ov8858_get_module_inf()
2301 if (ov8858->is_r2a) { in ov8858_get_module_inf()
2310 static void ov8858_set_awb_cfg(struct ov8858 *ov8858, in ov8858_set_awb_cfg() argument
2313 mutex_lock(&ov8858->mutex); in ov8858_set_awb_cfg()
2314 memcpy(&ov8858->awb_cfg, cfg, sizeof(*cfg)); in ov8858_set_awb_cfg()
2315 mutex_unlock(&ov8858->mutex); in ov8858_set_awb_cfg()
2318 static void ov8858_set_lsc_cfg(struct ov8858 *ov8858, in ov8858_set_lsc_cfg() argument
2321 mutex_lock(&ov8858->mutex); in ov8858_set_lsc_cfg()
2322 memcpy(&ov8858->lsc_cfg, cfg, sizeof(*cfg)); in ov8858_set_lsc_cfg()
2323 mutex_unlock(&ov8858->mutex); in ov8858_set_lsc_cfg()
2328 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_ioctl() local
2334 ov8858_get_module_inf(ov8858, (struct rkmodule_inf *)arg); in ov8858_ioctl()
2337 ov8858_set_awb_cfg(ov8858, (struct rkmodule_awb_cfg *)arg); in ov8858_ioctl()
2340 ov8858_set_lsc_cfg(ov8858, (struct rkmodule_lsc_cfg *)arg); in ov8858_ioctl()
2347 ret = ov8858_write_reg(ov8858->client, in ov8858_ioctl()
2352 ret = ov8858_write_reg(ov8858->client, in ov8858_ioctl()
2428 static int ov8858_apply_otp_r1a(struct ov8858 *ov8858) in ov8858_apply_otp_r1a() argument
2431 struct i2c_client *client = ov8858->client; in ov8858_apply_otp_r1a()
2432 struct ov8858_otp_info_r1a *otp_ptr = ov8858->otp_r1a; in ov8858_apply_otp_r1a()
2433 struct rkmodule_awb_cfg *awb_cfg = &ov8858->awb_cfg; in ov8858_apply_otp_r1a()
2434 struct rkmodule_lsc_cfg *lsc_cfg = &ov8858->lsc_cfg; in ov8858_apply_otp_r1a()
2519 static int ov8858_apply_otp_r2a(struct ov8858 *ov8858) in ov8858_apply_otp_r2a() argument
2522 struct i2c_client *client = ov8858->client; in ov8858_apply_otp_r2a()
2523 struct ov8858_otp_info_r2a *otp_ptr = ov8858->otp_r2a; in ov8858_apply_otp_r2a()
2524 struct rkmodule_awb_cfg *awb_cfg = &ov8858->awb_cfg; in ov8858_apply_otp_r2a()
2525 struct rkmodule_lsc_cfg *lsc_cfg = &ov8858->lsc_cfg; in ov8858_apply_otp_r2a()
2592 static int ov8858_apply_otp(struct ov8858 *ov8858) in ov8858_apply_otp() argument
2596 if (ov8858->is_r2a && ov8858->otp_r2a) in ov8858_apply_otp()
2597 ret = ov8858_apply_otp_r2a(ov8858); in ov8858_apply_otp()
2598 else if (ov8858->otp_r1a) in ov8858_apply_otp()
2599 ret = ov8858_apply_otp_r1a(ov8858); in ov8858_apply_otp()
2604 static int __ov8858_start_stream(struct ov8858 *ov8858) in __ov8858_start_stream() argument
2608 ret = ov8858_write_array(ov8858->client, ov8858->cur_mode->reg_list); in __ov8858_start_stream()
2613 mutex_unlock(&ov8858->mutex); in __ov8858_start_stream()
2614 ret = v4l2_ctrl_handler_setup(&ov8858->ctrl_handler); in __ov8858_start_stream()
2615 mutex_lock(&ov8858->mutex); in __ov8858_start_stream()
2619 ret = ov8858_apply_otp(ov8858); in __ov8858_start_stream()
2623 return ov8858_write_reg(ov8858->client, in __ov8858_start_stream()
2629 static int __ov8858_stop_stream(struct ov8858 *ov8858) in __ov8858_stop_stream() argument
2631 return ov8858_write_reg(ov8858->client, in __ov8858_stop_stream()
2639 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_s_stream() local
2640 struct i2c_client *client = ov8858->client; in ov8858_s_stream()
2644 ov8858->cur_mode->width, in ov8858_s_stream()
2645 ov8858->cur_mode->height, in ov8858_s_stream()
2646 DIV_ROUND_CLOSEST(ov8858->cur_mode->max_fps.denominator, in ov8858_s_stream()
2647 ov8858->cur_mode->max_fps.numerator)); in ov8858_s_stream()
2649 mutex_lock(&ov8858->mutex); in ov8858_s_stream()
2651 if (on == ov8858->streaming) in ov8858_s_stream()
2661 ret = __ov8858_start_stream(ov8858); in ov8858_s_stream()
2668 __ov8858_stop_stream(ov8858); in ov8858_s_stream()
2672 ov8858->streaming = on; in ov8858_s_stream()
2675 mutex_unlock(&ov8858->mutex); in ov8858_s_stream()
2682 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_s_power() local
2683 struct i2c_client *client = ov8858->client; in ov8858_s_power()
2686 mutex_lock(&ov8858->mutex); in ov8858_s_power()
2689 if (ov8858->power_on == !!on) in ov8858_s_power()
2699 ret = ov8858_write_array(ov8858->client, ov8858_global_regs); in ov8858_s_power()
2706 ov8858->power_on = true; in ov8858_s_power()
2709 ov8858->power_on = false; in ov8858_s_power()
2713 mutex_unlock(&ov8858->mutex); in ov8858_s_power()
2724 static int __ov8858_power_on(struct ov8858 *ov8858) in __ov8858_power_on() argument
2728 struct device *dev = &ov8858->client->dev; in __ov8858_power_on()
2730 if (!IS_ERR(ov8858->power_gpio)) in __ov8858_power_on()
2731 gpiod_set_value_cansleep(ov8858->power_gpio, 1); in __ov8858_power_on()
2735 if (!IS_ERR_OR_NULL(ov8858->pins_default)) { in __ov8858_power_on()
2736 ret = pinctrl_select_state(ov8858->pinctrl, in __ov8858_power_on()
2737 ov8858->pins_default); in __ov8858_power_on()
2742 ret = clk_set_rate(ov8858->xvclk, OV8858_XVCLK_FREQ); in __ov8858_power_on()
2745 if (clk_get_rate(ov8858->xvclk) != OV8858_XVCLK_FREQ) in __ov8858_power_on()
2747 ret = clk_prepare_enable(ov8858->xvclk); in __ov8858_power_on()
2753 if (!IS_ERR(ov8858->reset_gpio)) in __ov8858_power_on()
2754 gpiod_set_value_cansleep(ov8858->reset_gpio, 0); in __ov8858_power_on()
2756 ret = regulator_bulk_enable(OV8858_NUM_SUPPLIES, ov8858->supplies); in __ov8858_power_on()
2762 if (!IS_ERR(ov8858->reset_gpio)) in __ov8858_power_on()
2763 gpiod_set_value_cansleep(ov8858->reset_gpio, 1); in __ov8858_power_on()
2766 if (!IS_ERR(ov8858->pwdn_gpio)) in __ov8858_power_on()
2767 gpiod_set_value_cansleep(ov8858->pwdn_gpio, 1); in __ov8858_power_on()
2776 clk_disable_unprepare(ov8858->xvclk); in __ov8858_power_on()
2781 static void __ov8858_power_off(struct ov8858 *ov8858) in __ov8858_power_off() argument
2784 struct device *dev = &ov8858->client->dev; in __ov8858_power_off()
2786 if (!IS_ERR(ov8858->pwdn_gpio)) in __ov8858_power_off()
2787 gpiod_set_value_cansleep(ov8858->pwdn_gpio, 0); in __ov8858_power_off()
2788 clk_disable_unprepare(ov8858->xvclk); in __ov8858_power_off()
2789 if (!IS_ERR(ov8858->reset_gpio)) in __ov8858_power_off()
2790 gpiod_set_value_cansleep(ov8858->reset_gpio, 0); in __ov8858_power_off()
2791 if (!IS_ERR_OR_NULL(ov8858->pins_sleep)) { in __ov8858_power_off()
2792 ret = pinctrl_select_state(ov8858->pinctrl, in __ov8858_power_off()
2793 ov8858->pins_sleep); in __ov8858_power_off()
2801 regulator_bulk_disable(OV8858_NUM_SUPPLIES, ov8858->supplies); in __ov8858_power_off()
2808 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_runtime_resume() local
2810 return __ov8858_power_on(ov8858); in ov8858_runtime_resume()
2817 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_runtime_suspend() local
2819 __ov8858_power_off(ov8858); in ov8858_runtime_suspend()
2827 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_open() local
2832 mutex_lock(&ov8858->mutex); in ov8858_open()
2839 mutex_unlock(&ov8858->mutex); in ov8858_open()
2850 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_enum_frame_interval() local
2852 if (fie->index >= ov8858->cfg_num) in ov8858_enum_frame_interval()
2865 struct ov8858 *sensor = to_ov8858 (sd); in ov8858_g_mbus_config()
2928 struct ov8858 *ov8858 = container_of(ctrl->handler, in ov8858_set_ctrl() local
2929 struct ov8858, ctrl_handler); in ov8858_set_ctrl()
2930 struct i2c_client *client = ov8858->client; in ov8858_set_ctrl()
2938 max = ov8858->cur_mode->height + ctrl->val - 4; in ov8858_set_ctrl()
2939 __v4l2_ctrl_modify_range(ov8858->exposure, in ov8858_set_ctrl()
2940 ov8858->exposure->minimum, max, in ov8858_set_ctrl()
2941 ov8858->exposure->step, in ov8858_set_ctrl()
2942 ov8858->exposure->default_value); in ov8858_set_ctrl()
2953 ret = ov8858_write_reg(ov8858->client, in ov8858_set_ctrl()
2960 ret = ov8858_write_reg(ov8858->client, in ov8858_set_ctrl()
2965 ret |= ov8858_write_reg(ov8858->client, in ov8858_set_ctrl()
2972 ret = ov8858_write_reg(ov8858->client, in ov8858_set_ctrl()
2975 ctrl->val + ov8858->cur_mode->height); in ov8858_set_ctrl()
2978 ret = ov8858_enable_test_pattern(ov8858, ctrl->val); in ov8858_set_ctrl()
2995 static int ov8858_initialize_controls(struct ov8858 *ov8858) in ov8858_initialize_controls() argument
3004 handler = &ov8858->ctrl_handler; in ov8858_initialize_controls()
3005 mode = ov8858->cur_mode; in ov8858_initialize_controls()
3009 handler->lock = &ov8858->mutex; in ov8858_initialize_controls()
3017 0, ov8858->pixel_rate, 1, ov8858->pixel_rate); in ov8858_initialize_controls()
3020 ov8858->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in ov8858_initialize_controls()
3022 if (ov8858->hblank) in ov8858_initialize_controls()
3023 ov8858->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov8858_initialize_controls()
3026 ov8858->vblank = v4l2_ctrl_new_std(handler, &ov8858_ctrl_ops, in ov8858_initialize_controls()
3032 ov8858->exposure = v4l2_ctrl_new_std(handler, &ov8858_ctrl_ops, in ov8858_initialize_controls()
3037 ov8858->anal_gain = v4l2_ctrl_new_std(handler, &ov8858_ctrl_ops, in ov8858_initialize_controls()
3042 ov8858->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in ov8858_initialize_controls()
3049 dev_err(&ov8858->client->dev, in ov8858_initialize_controls()
3054 ov8858->subdev.ctrl_handler = handler; in ov8858_initialize_controls()
3064 static int ov8858_otp_read_r1a(struct ov8858 *ov8858) in ov8858_otp_read_r1a() argument
3068 struct device *dev = &ov8858->client->dev; in ov8858_otp_read_r1a()
3069 struct i2c_client *client = ov8858->client; in ov8858_otp_read_r1a()
3180 ov8858->otp_r1a = otp_ptr; in ov8858_otp_read_r1a()
3182 ov8858->otp_r1a = NULL; in ov8858_otp_read_r1a()
3190 static int ov8858_otp_read_r2a(struct ov8858 *ov8858) in ov8858_otp_read_r2a() argument
3194 struct device *dev = &ov8858->client->dev; in ov8858_otp_read_r2a()
3195 struct i2c_client *client = ov8858->client; in ov8858_otp_read_r2a()
3284 ov8858->otp_r2a = otp_ptr; in ov8858_otp_read_r2a()
3286 ov8858->otp_r2a = NULL; in ov8858_otp_read_r2a()
3294 static int ov8858_otp_read(struct ov8858 *ov8858) in ov8858_otp_read() argument
3298 struct i2c_client *client = ov8858->client; in ov8858_otp_read()
3312 if (ov8858->is_r2a) { in ov8858_otp_read()
3322 if (ov8858->is_r2a) in ov8858_otp_read()
3323 ret = ov8858_otp_read_r2a(ov8858); in ov8858_otp_read()
3325 ret = ov8858_otp_read_r1a(ov8858); in ov8858_otp_read()
3339 static int ov8858_check_sensor_id(struct ov8858 *ov8858, in ov8858_check_sensor_id() argument
3342 struct device *dev = &ov8858->client->dev; in ov8858_check_sensor_id()
3362 if (4 == ov8858->lane_num) { in ov8858_check_sensor_id()
3364 ov8858->cur_mode = &supported_modes_r2a_4lane[0]; in ov8858_check_sensor_id()
3366 ov8858->cfg_num = ARRAY_SIZE(supported_modes_r2a_4lane); in ov8858_check_sensor_id()
3369 ov8858->cur_mode = &supported_modes_r2a_2lane[0]; in ov8858_check_sensor_id()
3371 ov8858->cfg_num = ARRAY_SIZE(supported_modes_r2a_2lane); in ov8858_check_sensor_id()
3374 ov8858->is_r2a = true; in ov8858_check_sensor_id()
3376 if (4 == ov8858->lane_num) { in ov8858_check_sensor_id()
3378 ov8858->cur_mode = &supported_modes_r1a_4lane[0]; in ov8858_check_sensor_id()
3380 ov8858->cfg_num = ARRAY_SIZE(supported_modes_r1a_4lane); in ov8858_check_sensor_id()
3383 ov8858->cur_mode = &supported_modes_r1a_2lane[0]; in ov8858_check_sensor_id()
3385 ov8858->cfg_num = ARRAY_SIZE(supported_modes_r1a_2lane); in ov8858_check_sensor_id()
3388 ov8858->is_r2a = false; in ov8858_check_sensor_id()
3395 static int ov8858_configure_regulators(struct ov8858 *ov8858) in ov8858_configure_regulators() argument
3400 ov8858->supplies[i].supply = ov8858_supply_names[i]; in ov8858_configure_regulators()
3402 return devm_regulator_bulk_get(&ov8858->client->dev, in ov8858_configure_regulators()
3404 ov8858->supplies); in ov8858_configure_regulators()
3407 static int ov8858_parse_of(struct ov8858 *ov8858) in ov8858_parse_of() argument
3409 struct device *dev = &ov8858->client->dev; in ov8858_parse_of()
3426 ov8858->lane_num = rval; in ov8858_parse_of()
3427 if (4 == ov8858->lane_num) { in ov8858_parse_of()
3428 ov8858->cur_mode = &supported_modes_r2a_4lane[0]; in ov8858_parse_of()
3430 ov8858->cfg_num = ARRAY_SIZE(supported_modes_r2a_4lane); in ov8858_parse_of()
3433 ov8858->pixel_rate = MIPI_FREQ * 2U * ov8858->lane_num / 10U; in ov8858_parse_of()
3435 ov8858->lane_num, ov8858->pixel_rate); in ov8858_parse_of()
3437 ov8858->cur_mode = &supported_modes_r2a_2lane[0]; in ov8858_parse_of()
3439 ov8858->cfg_num = ARRAY_SIZE(supported_modes_r2a_2lane); in ov8858_parse_of()
3442 ov8858->pixel_rate = MIPI_FREQ * 2U * (ov8858->lane_num) / 10U; in ov8858_parse_of()
3444 ov8858->lane_num, ov8858->pixel_rate); in ov8858_parse_of()
3454 struct ov8858 *ov8858; in ov8858_probe() local
3464 ov8858 = devm_kzalloc(dev, sizeof(*ov8858), GFP_KERNEL); in ov8858_probe()
3465 if (!ov8858) in ov8858_probe()
3468 ov8858->client = client; in ov8858_probe()
3470 &ov8858->module_index); in ov8858_probe()
3472 &ov8858->module_facing); in ov8858_probe()
3474 &ov8858->module_name); in ov8858_probe()
3476 &ov8858->len_name); in ov8858_probe()
3483 ov8858->xvclk = devm_clk_get(dev, "xvclk"); in ov8858_probe()
3484 if (IS_ERR(ov8858->xvclk)) { in ov8858_probe()
3489 ov8858->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in ov8858_probe()
3490 if (IS_ERR(ov8858->power_gpio)) in ov8858_probe()
3493 ov8858->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in ov8858_probe()
3494 if (IS_ERR(ov8858->reset_gpio)) in ov8858_probe()
3497 ov8858->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in ov8858_probe()
3498 if (IS_ERR(ov8858->pwdn_gpio)) in ov8858_probe()
3501 ret = ov8858_configure_regulators(ov8858); in ov8858_probe()
3507 ret = ov8858_parse_of(ov8858); in ov8858_probe()
3511 ov8858->pinctrl = devm_pinctrl_get(dev); in ov8858_probe()
3512 if (!IS_ERR(ov8858->pinctrl)) { in ov8858_probe()
3513 ov8858->pins_default = in ov8858_probe()
3514 pinctrl_lookup_state(ov8858->pinctrl, in ov8858_probe()
3516 if (IS_ERR(ov8858->pins_default)) in ov8858_probe()
3519 ov8858->pins_sleep = in ov8858_probe()
3520 pinctrl_lookup_state(ov8858->pinctrl, in ov8858_probe()
3522 if (IS_ERR(ov8858->pins_sleep)) in ov8858_probe()
3526 mutex_init(&ov8858->mutex); in ov8858_probe()
3528 sd = &ov8858->subdev; in ov8858_probe()
3530 ret = ov8858_initialize_controls(ov8858); in ov8858_probe()
3534 ret = __ov8858_power_on(ov8858); in ov8858_probe()
3538 ret = ov8858_check_sensor_id(ov8858, client); in ov8858_probe()
3542 ov8858_otp_read(ov8858); in ov8858_probe()
3550 ov8858->pad.flags = MEDIA_PAD_FL_SOURCE; in ov8858_probe()
3552 ret = media_entity_pads_init(&sd->entity, 1, &ov8858->pad); in ov8858_probe()
3558 if (strcmp(ov8858->module_facing, "back") == 0) in ov8858_probe()
3564 ov8858->module_index, facing, in ov8858_probe()
3583 __ov8858_power_off(ov8858); in ov8858_probe()
3585 v4l2_ctrl_handler_free(&ov8858->ctrl_handler); in ov8858_probe()
3587 mutex_destroy(&ov8858->mutex); in ov8858_probe()
3595 struct ov8858 *ov8858 = to_ov8858(sd); in ov8858_remove() local
3601 v4l2_ctrl_handler_free(&ov8858->ctrl_handler); in ov8858_remove()
3602 if (ov8858->otp_r2a) in ov8858_remove()
3603 kfree(ov8858->otp_r2a); in ov8858_remove()
3604 if (ov8858->otp_r1a) in ov8858_remove()
3605 kfree(ov8858->otp_r1a); in ov8858_remove()
3606 mutex_destroy(&ov8858->mutex); in ov8858_remove()
3610 __ov8858_power_off(ov8858); in ov8858_remove()