Lines Matching refs:imx378

148 struct imx378 {  struct
189 #define to_imx378(sd) container_of(sd, struct imx378, subdev) argument
1922 imx378_find_best_fit(struct imx378 *imx378, struct v4l2_subdev_format *fmt) in imx378_find_best_fit() argument
1930 for (i = 0; i < imx378->cfg_num; i++) { in imx378_find_best_fit()
1945 struct imx378 *imx378 = to_imx378(sd); in imx378_set_fmt() local
1949 mutex_lock(&imx378->mutex); in imx378_set_fmt()
1951 mode = imx378_find_best_fit(imx378, fmt); in imx378_set_fmt()
1960 mutex_unlock(&imx378->mutex); in imx378_set_fmt()
1964 imx378->cur_mode = mode; in imx378_set_fmt()
1966 __v4l2_ctrl_modify_range(imx378->hblank, h_blank, in imx378_set_fmt()
1969 __v4l2_ctrl_modify_range(imx378->vblank, vblank_def, in imx378_set_fmt()
1973 if (imx378->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) { in imx378_set_fmt()
1974 imx378->cur_link_freq = 0; in imx378_set_fmt()
1975 imx378->cur_pixel_rate = PIXEL_RATE_WITH_848M_10BIT; in imx378_set_fmt()
1976 } else if (imx378->cur_mode->bus_fmt == in imx378_set_fmt()
1978 imx378->cur_link_freq = 0; in imx378_set_fmt()
1979 imx378->cur_pixel_rate = PIXEL_RATE_WITH_848M_12BIT; in imx378_set_fmt()
1982 __v4l2_ctrl_s_ctrl_int64(imx378->pixel_rate, in imx378_set_fmt()
1983 imx378->cur_pixel_rate); in imx378_set_fmt()
1984 __v4l2_ctrl_s_ctrl(imx378->link_freq, in imx378_set_fmt()
1985 imx378->cur_link_freq); in imx378_set_fmt()
1988 mutex_unlock(&imx378->mutex); in imx378_set_fmt()
1997 struct imx378 *imx378 = to_imx378(sd); in imx378_get_fmt() local
1998 const struct imx378_mode *mode = imx378->cur_mode; in imx378_get_fmt()
2000 mutex_lock(&imx378->mutex); in imx378_get_fmt()
2005 mutex_unlock(&imx378->mutex); in imx378_get_fmt()
2011 if (imx378->flip & IMX378_MIRROR_BIT_MASK) { in imx378_get_fmt()
2013 if (imx378->flip & IMX378_FLIP_BIT_MASK) in imx378_get_fmt()
2015 } else if (imx378->flip & IMX378_FLIP_BIT_MASK) { in imx378_get_fmt()
2027 mutex_unlock(&imx378->mutex); in imx378_get_fmt()
2036 struct imx378 *imx378 = to_imx378(sd); in imx378_enum_mbus_code() local
2040 code->code = imx378->cur_mode->bus_fmt; in imx378_enum_mbus_code()
2049 struct imx378 *imx378 = to_imx378(sd); in imx378_enum_frame_sizes() local
2051 if (fse->index >= imx378->cfg_num) in imx378_enum_frame_sizes()
2065 static int imx378_enable_test_pattern(struct imx378 *imx378, u32 pattern) in imx378_enable_test_pattern() argument
2074 return imx378_write_reg(imx378->client, in imx378_enable_test_pattern()
2083 struct imx378 *imx378 = to_imx378(sd); in imx378_g_frame_interval() local
2084 const struct imx378_mode *mode = imx378->cur_mode; in imx378_g_frame_interval()
2094 struct imx378 *imx378 = to_imx378(sd); in imx378_g_mbus_config() local
2095 const struct imx378_mode *mode = imx378->cur_mode; in imx378_g_mbus_config()
2115 static void imx378_get_module_inf(struct imx378 *imx378, in imx378_get_module_inf() argument
2120 strlcpy(inf->base.module, imx378->module_name, in imx378_get_module_inf()
2122 strlcpy(inf->base.lens, imx378->len_name, sizeof(inf->base.lens)); in imx378_get_module_inf()
2127 struct imx378 *imx378 = to_imx378(sd); in imx378_ioctl() local
2137 imx378_get_module_inf(imx378, (struct rkmodule_inf *)arg); in imx378_ioctl()
2142 hdr->hdr_mode = imx378->cur_mode->hdr_mode; in imx378_ioctl()
2146 w = imx378->cur_mode->width; in imx378_ioctl()
2147 h = imx378->cur_mode->height; in imx378_ioctl()
2148 for (i = 0; i < imx378->cfg_num; i++) { in imx378_ioctl()
2152 imx378->cur_mode = &supported_modes[i]; in imx378_ioctl()
2156 if (i == imx378->cfg_num) { in imx378_ioctl()
2157 dev_err(&imx378->client->dev, in imx378_ioctl()
2162 w = imx378->cur_mode->hts_def - in imx378_ioctl()
2163 imx378->cur_mode->width; in imx378_ioctl()
2164 h = imx378->cur_mode->vts_def - in imx378_ioctl()
2165 imx378->cur_mode->height; in imx378_ioctl()
2166 __v4l2_ctrl_modify_range(imx378->hblank, w, w, 1, w); in imx378_ioctl()
2167 __v4l2_ctrl_modify_range(imx378->vblank, h, in imx378_ioctl()
2169 imx378->cur_mode->height, in imx378_ioctl()
2172 if (imx378->cur_mode->bus_fmt == in imx378_ioctl()
2174 imx378->cur_link_freq = 0; in imx378_ioctl()
2175 imx378->cur_pixel_rate = in imx378_ioctl()
2177 } else if (imx378->cur_mode->bus_fmt == in imx378_ioctl()
2179 imx378->cur_link_freq = 0; in imx378_ioctl()
2180 imx378->cur_pixel_rate = in imx378_ioctl()
2184 __v4l2_ctrl_s_ctrl_int64(imx378->pixel_rate, in imx378_ioctl()
2185 imx378->cur_pixel_rate); in imx378_ioctl()
2186 __v4l2_ctrl_s_ctrl(imx378->link_freq, in imx378_ioctl()
2187 imx378->cur_link_freq); in imx378_ioctl()
2195 ret = imx378_write_reg(imx378->client, IMX378_REG_CTRL_MODE, in imx378_ioctl()
2198 ret = imx378_write_reg(imx378->client, IMX378_REG_CTRL_MODE, in imx378_ioctl()
2296 static int imx378_set_flip(struct imx378 *imx378) in imx378_set_flip() argument
2301 ret = imx378_read_reg(imx378->client, IMX378_FLIP_MIRROR_REG, in imx378_set_flip()
2303 if (imx378->flip & IMX378_MIRROR_BIT_MASK) in imx378_set_flip()
2307 if (imx378->flip & IMX378_FLIP_BIT_MASK) in imx378_set_flip()
2311 ret |= imx378_write_reg(imx378->client, IMX378_FLIP_MIRROR_REG, in imx378_set_flip()
2317 static int __imx378_start_stream(struct imx378 *imx378) in __imx378_start_stream() argument
2321 ret = imx378_write_array(imx378->client, imx378->cur_mode->reg_list); in __imx378_start_stream()
2324 imx378->cur_vts = imx378->cur_mode->vts_def; in __imx378_start_stream()
2326 ret = __v4l2_ctrl_handler_setup(&imx378->ctrl_handler); in __imx378_start_stream()
2329 if (imx378->has_init_exp && imx378->cur_mode->hdr_mode != NO_HDR) { in __imx378_start_stream()
2330 ret = imx378_ioctl(&imx378->subdev, PREISP_CMD_SET_HDRAE_EXP, in __imx378_start_stream()
2331 &imx378->init_hdrae_exp); in __imx378_start_stream()
2333 dev_err(&imx378->client->dev, in __imx378_start_stream()
2339 imx378_set_flip(imx378); in __imx378_start_stream()
2341 return imx378_write_reg(imx378->client, IMX378_REG_CTRL_MODE, in __imx378_start_stream()
2345 static int __imx378_stop_stream(struct imx378 *imx378) in __imx378_stop_stream() argument
2347 return imx378_write_reg(imx378->client, IMX378_REG_CTRL_MODE, in __imx378_stop_stream()
2353 struct imx378 *imx378 = to_imx378(sd); in imx378_s_stream() local
2354 struct i2c_client *client = imx378->client; in imx378_s_stream()
2357 mutex_lock(&imx378->mutex); in imx378_s_stream()
2359 if (on == imx378->streaming) in imx378_s_stream()
2369 ret = __imx378_start_stream(imx378); in imx378_s_stream()
2376 __imx378_stop_stream(imx378); in imx378_s_stream()
2380 imx378->streaming = on; in imx378_s_stream()
2383 mutex_unlock(&imx378->mutex); in imx378_s_stream()
2390 struct imx378 *imx378 = to_imx378(sd); in imx378_s_power() local
2391 struct i2c_client *client = imx378->client; in imx378_s_power()
2394 mutex_lock(&imx378->mutex); in imx378_s_power()
2397 if (imx378->power_on == !!on) in imx378_s_power()
2407 imx378->power_on = true; in imx378_s_power()
2410 imx378->power_on = false; in imx378_s_power()
2414 mutex_unlock(&imx378->mutex); in imx378_s_power()
2425 static int __imx378_power_on(struct imx378 *imx378) in __imx378_power_on() argument
2429 struct device *dev = &imx378->client->dev; in __imx378_power_on()
2431 ret = clk_set_rate(imx378->xvclk, IMX378_XVCLK_FREQ); in __imx378_power_on()
2436 if (clk_get_rate(imx378->xvclk) != IMX378_XVCLK_FREQ) in __imx378_power_on()
2438 ret = clk_prepare_enable(imx378->xvclk); in __imx378_power_on()
2444 if (!IS_ERR(imx378->reset_gpio)) in __imx378_power_on()
2445 gpiod_set_value_cansleep(imx378->reset_gpio, 0); in __imx378_power_on()
2447 ret = regulator_bulk_enable(IMX378_NUM_SUPPLIES, imx378->supplies); in __imx378_power_on()
2453 if (!IS_ERR(imx378->reset_gpio)) in __imx378_power_on()
2454 gpiod_set_value_cansleep(imx378->reset_gpio, 1); in __imx378_power_on()
2457 if (!IS_ERR(imx378->pwdn_gpio)) in __imx378_power_on()
2458 gpiod_set_value_cansleep(imx378->pwdn_gpio, 1); in __imx378_power_on()
2467 clk_disable_unprepare(imx378->xvclk); in __imx378_power_on()
2472 static void __imx378_power_off(struct imx378 *imx378) in __imx378_power_off() argument
2474 if (!IS_ERR(imx378->pwdn_gpio)) in __imx378_power_off()
2475 gpiod_set_value_cansleep(imx378->pwdn_gpio, 0); in __imx378_power_off()
2476 clk_disable_unprepare(imx378->xvclk); in __imx378_power_off()
2477 if (!IS_ERR(imx378->reset_gpio)) in __imx378_power_off()
2478 gpiod_set_value_cansleep(imx378->reset_gpio, 0); in __imx378_power_off()
2479 regulator_bulk_disable(IMX378_NUM_SUPPLIES, imx378->supplies); in __imx378_power_off()
2486 struct imx378 *imx378 = to_imx378(sd); in imx378_runtime_resume() local
2488 return __imx378_power_on(imx378); in imx378_runtime_resume()
2495 struct imx378 *imx378 = to_imx378(sd); in imx378_runtime_suspend() local
2497 __imx378_power_off(imx378); in imx378_runtime_suspend()
2505 struct imx378 *imx378 = to_imx378(sd); in imx378_open() local
2510 mutex_lock(&imx378->mutex); in imx378_open()
2517 mutex_unlock(&imx378->mutex); in imx378_open()
2528 struct imx378 *imx378 = to_imx378(sd); in imx378_enum_frame_interval() local
2530 if (fie->index >= imx378->cfg_num) in imx378_enum_frame_interval()
2582 struct imx378 *imx378 = container_of(ctrl->handler, in imx378_set_ctrl() local
2583 struct imx378, ctrl_handler); in imx378_set_ctrl()
2584 struct i2c_client *client = imx378->client; in imx378_set_ctrl()
2594 max = imx378->cur_mode->height + ctrl->val - 4; in imx378_set_ctrl()
2595 __v4l2_ctrl_modify_range(imx378->exposure, in imx378_set_ctrl()
2596 imx378->exposure->minimum, max, in imx378_set_ctrl()
2597 imx378->exposure->step, in imx378_set_ctrl()
2598 imx378->exposure->default_value); in imx378_set_ctrl()
2608 ret = imx378_write_reg(imx378->client, in imx378_set_ctrl()
2612 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2620 ret = imx378_write_reg(imx378->client, IMX378_REG_GAIN_H, in imx378_set_ctrl()
2623 ret |= imx378_write_reg(imx378->client, IMX378_REG_GAIN_L, in imx378_set_ctrl()
2626 ret |= imx378_write_reg(imx378->client, IMX378_REG_DGAIN, in imx378_set_ctrl()
2630 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2634 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2639 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2643 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2647 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2651 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2655 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2659 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2663 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2667 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2674 ret = imx378_write_reg(imx378->client, in imx378_set_ctrl()
2677 (ctrl->val + imx378->cur_mode->height) in imx378_set_ctrl()
2679 ret |= imx378_write_reg(imx378->client, in imx378_set_ctrl()
2682 (ctrl->val + imx378->cur_mode->height) in imx378_set_ctrl()
2684 imx378->cur_vts = ctrl->val + imx378->cur_mode->height; in imx378_set_ctrl()
2688 imx378->flip |= IMX378_MIRROR_BIT_MASK; in imx378_set_ctrl()
2690 imx378->flip &= ~IMX378_MIRROR_BIT_MASK; in imx378_set_ctrl()
2694 imx378->flip |= IMX378_FLIP_BIT_MASK; in imx378_set_ctrl()
2696 imx378->flip &= ~IMX378_FLIP_BIT_MASK; in imx378_set_ctrl()
2699 ret = imx378_enable_test_pattern(imx378, ctrl->val); in imx378_set_ctrl()
2716 static int imx378_initialize_controls(struct imx378 *imx378) in imx378_initialize_controls() argument
2724 handler = &imx378->ctrl_handler; in imx378_initialize_controls()
2725 mode = imx378->cur_mode; in imx378_initialize_controls()
2729 handler->lock = &imx378->mutex; in imx378_initialize_controls()
2731 imx378->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in imx378_initialize_controls()
2735 if (imx378->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) { in imx378_initialize_controls()
2736 imx378->cur_link_freq = 0; in imx378_initialize_controls()
2737 imx378->cur_pixel_rate = PIXEL_RATE_WITH_848M_10BIT; in imx378_initialize_controls()
2738 } else if (imx378->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB12_1X12) { in imx378_initialize_controls()
2739 imx378->cur_link_freq = 0; in imx378_initialize_controls()
2740 imx378->cur_pixel_rate = PIXEL_RATE_WITH_848M_12BIT; in imx378_initialize_controls()
2743 imx378->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in imx378_initialize_controls()
2746 1, imx378->cur_pixel_rate); in imx378_initialize_controls()
2747 v4l2_ctrl_s_ctrl(imx378->link_freq, in imx378_initialize_controls()
2748 imx378->cur_link_freq); in imx378_initialize_controls()
2751 imx378->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx378_initialize_controls()
2753 if (imx378->hblank) in imx378_initialize_controls()
2754 imx378->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx378_initialize_controls()
2757 imx378->vblank = v4l2_ctrl_new_std(handler, &imx378_ctrl_ops, in imx378_initialize_controls()
2761 imx378->cur_vts = mode->vts_def; in imx378_initialize_controls()
2763 imx378->exposure = v4l2_ctrl_new_std(handler, &imx378_ctrl_ops, in imx378_initialize_controls()
2769 imx378->anal_gain = v4l2_ctrl_new_std(handler, &imx378_ctrl_ops, in imx378_initialize_controls()
2775 imx378->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in imx378_initialize_controls()
2781 imx378->h_flip = v4l2_ctrl_new_std(handler, &imx378_ctrl_ops, in imx378_initialize_controls()
2784 imx378->v_flip = v4l2_ctrl_new_std(handler, &imx378_ctrl_ops, in imx378_initialize_controls()
2786 imx378->flip = 0; in imx378_initialize_controls()
2790 dev_err(&imx378->client->dev, in imx378_initialize_controls()
2795 imx378->subdev.ctrl_handler = handler; in imx378_initialize_controls()
2796 imx378->has_init_exp = false; in imx378_initialize_controls()
2805 static int imx378_check_sensor_id(struct imx378 *imx378, in imx378_check_sensor_id() argument
2808 struct device *dev = &imx378->client->dev; in imx378_check_sensor_id()
2827 static int imx378_configure_regulators(struct imx378 *imx378) in imx378_configure_regulators() argument
2832 imx378->supplies[i].supply = imx378_supply_names[i]; in imx378_configure_regulators()
2834 return devm_regulator_bulk_get(&imx378->client->dev, in imx378_configure_regulators()
2836 imx378->supplies); in imx378_configure_regulators()
2844 struct imx378 *imx378; in imx378_probe() local
2855 imx378 = devm_kzalloc(dev, sizeof(*imx378), GFP_KERNEL); in imx378_probe()
2856 if (!imx378) in imx378_probe()
2860 &imx378->module_index); in imx378_probe()
2862 &imx378->module_facing); in imx378_probe()
2864 &imx378->module_name); in imx378_probe()
2866 &imx378->len_name); in imx378_probe()
2878 imx378->client = client; in imx378_probe()
2879 imx378->cfg_num = ARRAY_SIZE(supported_modes); in imx378_probe()
2880 for (i = 0; i < imx378->cfg_num; i++) { in imx378_probe()
2882 imx378->cur_mode = &supported_modes[i]; in imx378_probe()
2887 if (i == imx378->cfg_num) in imx378_probe()
2888 imx378->cur_mode = &supported_modes[0]; in imx378_probe()
2890 imx378->xvclk = devm_clk_get(dev, "xvclk"); in imx378_probe()
2891 if (IS_ERR(imx378->xvclk)) { in imx378_probe()
2896 imx378->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx378_probe()
2897 if (IS_ERR(imx378->reset_gpio)) in imx378_probe()
2900 imx378->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx378_probe()
2901 if (IS_ERR(imx378->pwdn_gpio)) in imx378_probe()
2904 ret = imx378_configure_regulators(imx378); in imx378_probe()
2910 mutex_init(&imx378->mutex); in imx378_probe()
2912 sd = &imx378->subdev; in imx378_probe()
2915 ret = imx378_initialize_controls(imx378); in imx378_probe()
2919 ret = __imx378_power_on(imx378); in imx378_probe()
2923 ret = imx378_check_sensor_id(imx378, client); in imx378_probe()
2932 imx378->pad.flags = MEDIA_PAD_FL_SOURCE; in imx378_probe()
2934 ret = media_entity_pads_init(&sd->entity, 1, &imx378->pad); in imx378_probe()
2940 if (strcmp(imx378->module_facing, "back") == 0) in imx378_probe()
2946 imx378->module_index, facing, in imx378_probe()
2965 __imx378_power_off(imx378); in imx378_probe()
2967 v4l2_ctrl_handler_free(&imx378->ctrl_handler); in imx378_probe()
2969 mutex_destroy(&imx378->mutex); in imx378_probe()
2977 struct imx378 *imx378 = to_imx378(sd); in imx378_remove() local
2983 v4l2_ctrl_handler_free(&imx378->ctrl_handler); in imx378_remove()
2984 mutex_destroy(&imx378->mutex); in imx378_remove()
2988 __imx378_power_off(imx378); in imx378_remove()