Lines Matching +full:llp +full:- +full:based
1 // SPDX-License-Identifier: GPL-2.0
9 #include <media/v4l2-ctrls.h>
10 #include <media/v4l2-device.h>
11 #include <media/v4l2-event.h>
12 #include <media/v4l2-fwnode.h>
34 * +-----------------+------------------+
36 * +-----------------+------------------+
38 * --------------------------------------
94 /* V-timing */
98 /* H-timing */
99 u32 llp; member
110 s64 *link_freqs; /* CSI-2 link frequencies */
132 s64 link_def_freq; /* CSI-2 link default frequency */
1669 .llp = 3968,
1681 .llp = 3968,
1693 .llp = 3968,
1705 .llp = 3968,
1717 .llp = 2500,
1729 .llp = 2500,
1741 .llp = 2500,
1753 .llp = 2500,
1767 /* Get bayer order based on flip setting. */
1780 lockdep_assert_held(&imx319->mutex); in imx319_get_format_code()
1781 code = codes[imx319->vflip->val][imx319->hflip->val]; in imx319_get_format_code()
1789 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_read_reg()
1796 return -EINVAL; in imx319_read_reg()
1800 msgs[0].addr = client->addr; in imx319_read_reg()
1806 msgs[1].addr = client->addr; in imx319_read_reg()
1809 msgs[1].buf = &data_buf[4 - len]; in imx319_read_reg()
1811 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in imx319_read_reg()
1813 return -EIO; in imx319_read_reg()
1823 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_write_reg()
1827 return -EINVAL; in imx319_write_reg()
1830 put_unaligned_be32(val << (8 * (4 - len)), buf + 2); in imx319_write_reg()
1832 return -EIO; in imx319_write_reg()
1841 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_write_regs()
1848 dev_err_ratelimited(&client->dev, in imx319_write_regs()
1858 /* Open sub-device */
1863 v4l2_subdev_get_try_format(sd, fh->pad, 0); in imx319_open()
1865 mutex_lock(&imx319->mutex); in imx319_open()
1868 try_fmt->width = imx319->cur_mode->width; in imx319_open()
1869 try_fmt->height = imx319->cur_mode->height; in imx319_open()
1870 try_fmt->code = imx319_get_format_code(imx319); in imx319_open()
1871 try_fmt->field = V4L2_FIELD_NONE; in imx319_open()
1873 mutex_unlock(&imx319->mutex); in imx319_open()
1880 struct imx319 *imx319 = container_of(ctrl->handler, in imx319_set_ctrl()
1882 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_set_ctrl()
1887 switch (ctrl->id) { in imx319_set_ctrl()
1890 max = imx319->cur_mode->height + ctrl->val - 18; in imx319_set_ctrl()
1891 __v4l2_ctrl_modify_range(imx319->exposure, in imx319_set_ctrl()
1892 imx319->exposure->minimum, in imx319_set_ctrl()
1893 max, imx319->exposure->step, max); in imx319_set_ctrl()
1901 if (!pm_runtime_get_if_in_use(&client->dev)) in imx319_set_ctrl()
1904 switch (ctrl->id) { in imx319_set_ctrl()
1906 /* Analog gain = 1024/(1024 - ctrl->val) times */ in imx319_set_ctrl()
1908 ctrl->val); in imx319_set_ctrl()
1912 ctrl->val); in imx319_set_ctrl()
1916 ctrl->val); in imx319_set_ctrl()
1921 imx319->cur_mode->height + ctrl->val); in imx319_set_ctrl()
1925 2, ctrl->val); in imx319_set_ctrl()
1930 imx319->hflip->val | in imx319_set_ctrl()
1931 imx319->vflip->val << 1); in imx319_set_ctrl()
1934 ret = -EINVAL; in imx319_set_ctrl()
1935 dev_info(&client->dev, "ctrl(id:0x%x,val:0x%x) is not handled", in imx319_set_ctrl()
1936 ctrl->id, ctrl->val); in imx319_set_ctrl()
1940 pm_runtime_put(&client->dev); in imx319_set_ctrl()
1955 if (code->index > 0) in imx319_enum_mbus_code()
1956 return -EINVAL; in imx319_enum_mbus_code()
1958 mutex_lock(&imx319->mutex); in imx319_enum_mbus_code()
1959 code->code = imx319_get_format_code(imx319); in imx319_enum_mbus_code()
1960 mutex_unlock(&imx319->mutex); in imx319_enum_mbus_code()
1971 if (fse->index >= ARRAY_SIZE(supported_modes)) in imx319_enum_frame_size()
1972 return -EINVAL; in imx319_enum_frame_size()
1974 mutex_lock(&imx319->mutex); in imx319_enum_frame_size()
1975 if (fse->code != imx319_get_format_code(imx319)) { in imx319_enum_frame_size()
1976 mutex_unlock(&imx319->mutex); in imx319_enum_frame_size()
1977 return -EINVAL; in imx319_enum_frame_size()
1979 mutex_unlock(&imx319->mutex); in imx319_enum_frame_size()
1981 fse->min_width = supported_modes[fse->index].width; in imx319_enum_frame_size()
1982 fse->max_width = fse->min_width; in imx319_enum_frame_size()
1983 fse->min_height = supported_modes[fse->index].height; in imx319_enum_frame_size()
1984 fse->max_height = fse->min_height; in imx319_enum_frame_size()
1993 fmt->format.width = mode->width; in imx319_update_pad_format()
1994 fmt->format.height = mode->height; in imx319_update_pad_format()
1995 fmt->format.code = imx319_get_format_code(imx319); in imx319_update_pad_format()
1996 fmt->format.field = V4L2_FIELD_NONE; in imx319_update_pad_format()
2004 struct v4l2_subdev *sd = &imx319->sd; in imx319_do_get_pad_format()
2006 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in imx319_do_get_pad_format()
2007 framefmt = v4l2_subdev_get_try_format(sd, cfg, fmt->pad); in imx319_do_get_pad_format()
2008 fmt->format = *framefmt; in imx319_do_get_pad_format()
2010 imx319_update_pad_format(imx319, imx319->cur_mode, fmt); in imx319_do_get_pad_format()
2023 mutex_lock(&imx319->mutex); in imx319_get_pad_format()
2025 mutex_unlock(&imx319->mutex); in imx319_get_pad_format()
2044 mutex_lock(&imx319->mutex); in imx319_set_pad_format()
2050 fmt->format.code = imx319_get_format_code(imx319); in imx319_set_pad_format()
2055 fmt->format.width, fmt->format.height); in imx319_set_pad_format()
2057 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in imx319_set_pad_format()
2058 framefmt = v4l2_subdev_get_try_format(sd, cfg, fmt->pad); in imx319_set_pad_format()
2059 *framefmt = fmt->format; in imx319_set_pad_format()
2061 imx319->cur_mode = mode; in imx319_set_pad_format()
2062 pixel_rate = imx319->link_def_freq * 2 * 4; in imx319_set_pad_format()
2064 __v4l2_ctrl_s_ctrl_int64(imx319->pixel_rate, pixel_rate); in imx319_set_pad_format()
2066 height = imx319->cur_mode->height; in imx319_set_pad_format()
2067 vblank_def = imx319->cur_mode->fll_def - height; in imx319_set_pad_format()
2068 vblank_min = imx319->cur_mode->fll_min - height; in imx319_set_pad_format()
2069 height = IMX319_FLL_MAX - height; in imx319_set_pad_format()
2070 __v4l2_ctrl_modify_range(imx319->vblank, vblank_min, height, 1, in imx319_set_pad_format()
2072 __v4l2_ctrl_s_ctrl(imx319->vblank, vblank_def); in imx319_set_pad_format()
2073 h_blank = mode->llp - imx319->cur_mode->width; in imx319_set_pad_format()
2078 __v4l2_ctrl_modify_range(imx319->hblank, h_blank, in imx319_set_pad_format()
2082 mutex_unlock(&imx319->mutex); in imx319_set_pad_format()
2090 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_start_streaming()
2096 ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs); in imx319_start_streaming()
2098 dev_err(&client->dev, "failed to set global settings"); in imx319_start_streaming()
2103 reg_list = &imx319->cur_mode->reg_list; in imx319_start_streaming()
2104 ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs); in imx319_start_streaming()
2106 dev_err(&client->dev, "failed to set mode"); in imx319_start_streaming()
2116 ret = __v4l2_ctrl_handler_setup(imx319->sd.ctrl_handler); in imx319_start_streaming()
2137 mutex_lock(&imx319->mutex); in imx319_set_stream()
2138 if (imx319->streaming == enable) { in imx319_set_stream()
2139 mutex_unlock(&imx319->mutex); in imx319_set_stream()
2144 ret = pm_runtime_get_sync(&client->dev); in imx319_set_stream()
2146 pm_runtime_put_noidle(&client->dev); in imx319_set_stream()
2159 pm_runtime_put(&client->dev); in imx319_set_stream()
2162 imx319->streaming = enable; in imx319_set_stream()
2165 __v4l2_ctrl_grab(imx319->vflip, enable); in imx319_set_stream()
2166 __v4l2_ctrl_grab(imx319->hflip, enable); in imx319_set_stream()
2168 mutex_unlock(&imx319->mutex); in imx319_set_stream()
2173 pm_runtime_put(&client->dev); in imx319_set_stream()
2175 mutex_unlock(&imx319->mutex); in imx319_set_stream()
2186 if (imx319->streaming) in imx319_suspend()
2199 if (imx319->streaming) { in imx319_resume()
2209 imx319->streaming = 0; in imx319_resume()
2216 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_identify_module()
2225 dev_err(&client->dev, "chip id mismatch: %x!=%x", in imx319_identify_module()
2227 return -EIO; in imx319_identify_module()
2266 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); in imx319_init_controls()
2277 ctrl_hdlr = &imx319->ctrl_handler; in imx319_init_controls()
2282 ctrl_hdlr->lock = &imx319->mutex; in imx319_init_controls()
2283 max = ARRAY_SIZE(link_freq_menu_items) - 1; in imx319_init_controls()
2284 imx319->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2287 if (imx319->link_freq) in imx319_init_controls()
2288 imx319->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx319_init_controls()
2291 pixel_rate = imx319->link_def_freq * 2 * 4; in imx319_init_controls()
2294 imx319->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2298 /* Initial vblank/hblank/exposure parameters based on current mode */ in imx319_init_controls()
2299 mode = imx319->cur_mode; in imx319_init_controls()
2300 vblank_def = mode->fll_def - mode->height; in imx319_init_controls()
2301 vblank_min = mode->fll_min - mode->height; in imx319_init_controls()
2302 imx319->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2304 IMX319_FLL_MAX - mode->height, in imx319_init_controls()
2307 hblank = mode->llp - mode->width; in imx319_init_controls()
2308 imx319->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2311 if (imx319->hblank) in imx319_init_controls()
2312 imx319->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx319_init_controls()
2315 exposure_max = mode->fll_def - 18; in imx319_init_controls()
2316 imx319->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2322 imx319->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2324 imx319->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, in imx319_init_controls()
2338 ARRAY_SIZE(imx319_test_pattern_menu) - 1, in imx319_init_controls()
2340 if (ctrl_hdlr->error) { in imx319_init_controls()
2341 ret = ctrl_hdlr->error; in imx319_init_controls()
2342 dev_err(&client->dev, "control init failed: %d", ret); in imx319_init_controls()
2346 imx319->sd.ctrl_handler = ctrl_hdlr; in imx319_init_controls()
2382 ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency", in imx319_get_hwcfg()
2383 &cfg->ext_clk); in imx319_get_hwcfg()
2389 dev_dbg(dev, "ext clk: %d", cfg->ext_clk); in imx319_get_hwcfg()
2390 if (cfg->ext_clk != IMX319_EXT_CLK) { in imx319_get_hwcfg()
2392 cfg->ext_clk); in imx319_get_hwcfg()
2402 cfg->nr_of_link_freqs = bus_cfg.nr_of_link_frequencies; in imx319_get_hwcfg()
2403 cfg->link_freqs = devm_kcalloc(dev, in imx319_get_hwcfg()
2405 sizeof(*cfg->link_freqs), GFP_KERNEL); in imx319_get_hwcfg()
2406 if (!cfg->link_freqs) in imx319_get_hwcfg()
2410 cfg->link_freqs[i] = bus_cfg.link_frequencies[i]; in imx319_get_hwcfg()
2411 dev_dbg(dev, "link_freq[%d] = %lld", i, cfg->link_freqs[i]); in imx319_get_hwcfg()
2430 imx319 = devm_kzalloc(&client->dev, sizeof(*imx319), GFP_KERNEL); in imx319_probe()
2432 return -ENOMEM; in imx319_probe()
2434 mutex_init(&imx319->mutex); in imx319_probe()
2437 v4l2_i2c_subdev_init(&imx319->sd, client, &imx319_subdev_ops); in imx319_probe()
2442 dev_err(&client->dev, "failed to find sensor: %d", ret); in imx319_probe()
2446 imx319->hwcfg = imx319_get_hwcfg(&client->dev); in imx319_probe()
2447 if (!imx319->hwcfg) { in imx319_probe()
2448 dev_err(&client->dev, "failed to get hwcfg"); in imx319_probe()
2449 ret = -ENODEV; in imx319_probe()
2453 imx319->link_def_freq = link_freq_menu_items[IMX319_LINK_FREQ_INDEX]; in imx319_probe()
2454 for (i = 0; i < imx319->hwcfg->nr_of_link_freqs; i++) { in imx319_probe()
2455 if (imx319->hwcfg->link_freqs[i] == imx319->link_def_freq) { in imx319_probe()
2456 dev_dbg(&client->dev, "link freq index %d matched", i); in imx319_probe()
2461 if (i == imx319->hwcfg->nr_of_link_freqs) { in imx319_probe()
2462 dev_err(&client->dev, "no link frequency supported"); in imx319_probe()
2463 ret = -EINVAL; in imx319_probe()
2468 imx319->cur_mode = &supported_modes[0]; in imx319_probe()
2472 dev_err(&client->dev, "failed to init controls: %d", ret); in imx319_probe()
2477 imx319->sd.internal_ops = &imx319_internal_ops; in imx319_probe()
2478 imx319->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in imx319_probe()
2480 imx319->sd.entity.ops = &imx319_subdev_entity_ops; in imx319_probe()
2481 imx319->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx319_probe()
2484 imx319->pad.flags = MEDIA_PAD_FL_SOURCE; in imx319_probe()
2485 ret = media_entity_pads_init(&imx319->sd.entity, 1, &imx319->pad); in imx319_probe()
2487 dev_err(&client->dev, "failed to init entity pads: %d", ret); in imx319_probe()
2491 ret = v4l2_async_register_subdev_sensor_common(&imx319->sd); in imx319_probe()
2496 * Device is already turned on by i2c-core with ACPI domain PM. in imx319_probe()
2499 pm_runtime_set_active(&client->dev); in imx319_probe()
2500 pm_runtime_enable(&client->dev); in imx319_probe()
2501 pm_runtime_idle(&client->dev); in imx319_probe()
2506 media_entity_cleanup(&imx319->sd.entity); in imx319_probe()
2509 v4l2_ctrl_handler_free(imx319->sd.ctrl_handler); in imx319_probe()
2512 mutex_destroy(&imx319->mutex); in imx319_probe()
2523 media_entity_cleanup(&sd->entity); in imx319_remove()
2524 v4l2_ctrl_handler_free(sd->ctrl_handler); in imx319_remove()
2526 pm_runtime_disable(&client->dev); in imx319_remove()
2527 pm_runtime_set_suspended(&client->dev); in imx319_remove()
2529 mutex_destroy(&imx319->mutex); in imx319_remove()