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;
1670 .llp = 3968,
1682 .llp = 3968,
1694 .llp = 3968,
1706 .llp = 3968,
1718 .llp = 2500,
1730 .llp = 2500,
1742 .llp = 2500,
1754 .llp = 2500,
1768 /* Get bayer order based on flip setting. */
1781 lockdep_assert_held(&imx319->mutex);
1782 code = codes[imx319->vflip->val][imx319->hflip->val];
1790 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
1797 return -EINVAL;
1801 msgs[0].addr = client->addr;
1807 msgs[1].addr = client->addr;
1810 msgs[1].buf = &data_buf[4 - len];
1812 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
1814 return -EIO;
1824 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
1828 return -EINVAL;
1831 put_unaligned_be32(val << (8 * (4 - len)), buf + 2);
1833 return -EIO;
1842 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
1849 dev_err_ratelimited(&client->dev,
1859 /* Open sub-device */
1864 v4l2_subdev_state_get_format(fh->state, 0);
1866 mutex_lock(&imx319->mutex);
1869 try_fmt->width = imx319->cur_mode->width;
1870 try_fmt->height = imx319->cur_mode->height;
1871 try_fmt->code = imx319_get_format_code(imx319);
1872 try_fmt->field = V4L2_FIELD_NONE;
1874 mutex_unlock(&imx319->mutex);
1881 struct imx319 *imx319 = container_of(ctrl->handler,
1883 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
1888 switch (ctrl->id) {
1891 max = imx319->cur_mode->height + ctrl->val - 18;
1892 __v4l2_ctrl_modify_range(imx319->exposure,
1893 imx319->exposure->minimum,
1894 max, imx319->exposure->step, max);
1902 if (!pm_runtime_get_if_in_use(&client->dev))
1905 switch (ctrl->id) {
1907 /* Analog gain = 1024/(1024 - ctrl->val) times */
1909 ctrl->val);
1913 ctrl->val);
1917 ctrl->val);
1922 imx319->cur_mode->height + ctrl->val);
1926 2, ctrl->val);
1931 imx319->hflip->val |
1932 imx319->vflip->val << 1);
1935 ret = -EINVAL;
1936 dev_info(&client->dev, "ctrl(id:0x%x,val:0x%x) is not handled",
1937 ctrl->id, ctrl->val);
1941 pm_runtime_put(&client->dev);
1956 if (code->index > 0)
1957 return -EINVAL;
1959 mutex_lock(&imx319->mutex);
1960 code->code = imx319_get_format_code(imx319);
1961 mutex_unlock(&imx319->mutex);
1972 if (fse->index >= ARRAY_SIZE(supported_modes))
1973 return -EINVAL;
1975 mutex_lock(&imx319->mutex);
1976 if (fse->code != imx319_get_format_code(imx319)) {
1977 mutex_unlock(&imx319->mutex);
1978 return -EINVAL;
1980 mutex_unlock(&imx319->mutex);
1982 fse->min_width = supported_modes[fse->index].width;
1983 fse->max_width = fse->min_width;
1984 fse->min_height = supported_modes[fse->index].height;
1985 fse->max_height = fse->min_height;
1994 fmt->format.width = mode->width;
1995 fmt->format.height = mode->height;
1996 fmt->format.code = imx319_get_format_code(imx319);
1997 fmt->format.field = V4L2_FIELD_NONE;
2006 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
2007 framefmt = v4l2_subdev_state_get_format(sd_state, fmt->pad);
2008 fmt->format = *framefmt;
2010 imx319_update_pad_format(imx319, imx319->cur_mode, fmt);
2023 mutex_lock(&imx319->mutex);
2025 mutex_unlock(&imx319->mutex);
2044 mutex_lock(&imx319->mutex);
2050 fmt->format.code = imx319_get_format_code(imx319);
2055 fmt->format.width, fmt->format.height);
2057 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
2058 framefmt = v4l2_subdev_state_get_format(sd_state, fmt->pad);
2059 *framefmt = fmt->format;
2061 imx319->cur_mode = mode;
2064 __v4l2_ctrl_s_ctrl_int64(imx319->pixel_rate, pixel_rate);
2066 height = imx319->cur_mode->height;
2067 vblank_def = imx319->cur_mode->fll_def - height;
2068 vblank_min = imx319->cur_mode->fll_min - height;
2069 height = IMX319_FLL_MAX - height;
2070 __v4l2_ctrl_modify_range(imx319->vblank, vblank_min, height, 1,
2072 __v4l2_ctrl_s_ctrl(imx319->vblank, vblank_def);
2073 h_blank = mode->llp - imx319->cur_mode->width;
2078 __v4l2_ctrl_modify_range(imx319->hblank, h_blank,
2082 mutex_unlock(&imx319->mutex);
2090 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
2094 if (imx319->identified)
2102 dev_err(&client->dev, "chip id mismatch: %x!=%x",
2104 return -EIO;
2107 imx319->identified = true;
2115 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
2125 ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs);
2127 dev_err(&client->dev, "failed to set global settings");
2132 reg_list = &imx319->cur_mode->reg_list;
2133 ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs);
2135 dev_err(&client->dev, "failed to set mode");
2145 ret = __v4l2_ctrl_handler_setup(imx319->sd.ctrl_handler);
2166 mutex_lock(&imx319->mutex);
2169 ret = pm_runtime_resume_and_get(&client->dev);
2182 pm_runtime_put(&client->dev);
2186 __v4l2_ctrl_grab(imx319->vflip, enable);
2187 __v4l2_ctrl_grab(imx319->hflip, enable);
2189 mutex_unlock(&imx319->mutex);
2194 pm_runtime_put(&client->dev);
2196 mutex_unlock(&imx319->mutex);
2234 struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
2245 ctrl_hdlr = &imx319->ctrl_handler;
2250 ctrl_hdlr->lock = &imx319->mutex;
2251 max = ARRAY_SIZE(link_freq_menu_items) - 1;
2252 imx319->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx319_ctrl_ops,
2255 if (imx319->link_freq)
2256 imx319->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2262 imx319->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2266 /* Initial vblank/hblank/exposure parameters based on current mode */
2267 mode = imx319->cur_mode;
2268 vblank_def = mode->fll_def - mode->height;
2269 vblank_min = mode->fll_min - mode->height;
2270 imx319->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2272 IMX319_FLL_MAX - mode->height,
2275 hblank = mode->llp - mode->width;
2276 imx319->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2279 if (imx319->hblank)
2280 imx319->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2283 exposure_max = mode->fll_def - 18;
2284 imx319->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2290 imx319->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2292 if (imx319->hflip)
2293 imx319->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
2294 imx319->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
2296 if (imx319->vflip)
2297 imx319->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
2310 ARRAY_SIZE(imx319_test_pattern_menu) - 1,
2312 if (ctrl_hdlr->error) {
2313 ret = ctrl_hdlr->error;
2314 dev_err(&client->dev, "control init failed: %d", ret);
2318 imx319->sd.ctrl_handler = ctrl_hdlr;
2353 ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
2354 &cfg->ext_clk);
2360 dev_dbg(dev, "ext clk: %d", cfg->ext_clk);
2361 if (cfg->ext_clk != IMX319_EXT_CLK) {
2363 cfg->ext_clk);
2371 &cfg->link_freq_bitmap);
2391 imx319 = devm_kzalloc(&client->dev, sizeof(*imx319), GFP_KERNEL);
2393 return -ENOMEM;
2395 mutex_init(&imx319->mutex);
2398 v4l2_i2c_subdev_init(&imx319->sd, client, &imx319_subdev_ops);
2400 full_power = acpi_dev_state_d0(&client->dev);
2405 dev_err(&client->dev, "failed to find sensor: %d", ret);
2410 imx319->hwcfg = imx319_get_hwcfg(&client->dev);
2411 if (!imx319->hwcfg) {
2412 dev_err(&client->dev, "failed to get hwcfg");
2413 ret = -ENODEV;
2418 imx319->cur_mode = &supported_modes[0];
2422 dev_err(&client->dev, "failed to init controls: %d", ret);
2427 imx319->sd.internal_ops = &imx319_internal_ops;
2428 imx319->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
2430 imx319->sd.entity.ops = &imx319_subdev_entity_ops;
2431 imx319->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
2434 imx319->pad.flags = MEDIA_PAD_FL_SOURCE;
2435 ret = media_entity_pads_init(&imx319->sd.entity, 1, &imx319->pad);
2437 dev_err(&client->dev, "failed to init entity pads: %d", ret);
2443 pm_runtime_set_active(&client->dev);
2444 pm_runtime_enable(&client->dev);
2446 ret = v4l2_async_register_subdev_sensor(&imx319->sd);
2450 pm_runtime_idle(&client->dev);
2455 pm_runtime_disable(&client->dev);
2457 pm_runtime_set_suspended(&client->dev);
2458 media_entity_cleanup(&imx319->sd.entity);
2461 v4l2_ctrl_handler_free(imx319->sd.ctrl_handler);
2464 mutex_destroy(&imx319->mutex);
2475 media_entity_cleanup(&sd->entity);
2476 v4l2_ctrl_handler_free(sd->ctrl_handler);
2478 pm_runtime_disable(&client->dev);
2479 if (!pm_runtime_status_suspended(&client->dev))
2480 pm_runtime_set_suspended(&client->dev);
2482 mutex_destroy(&imx319->mutex);