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>
80 /* V-timing */
84 /* H-timing */
85 u32 llp; member
96 s64 *link_freqs; /* CSI-2 link frequencies */
118 s64 link_def_freq; /* CSI-2 link default frequency */
897 .llp = 3672,
909 .llp = 3672,
921 .llp = 3672,
933 .llp = 3672,
945 .llp = 3672,
957 .llp = 3672,
969 .llp = 3672,
981 .llp = 1836,
993 .llp = 1836,
1005 .llp = 1836,
1017 .llp = 1836,
1029 .llp = 1836,
1041 .llp = 1836,
1053 .llp = 3672,
1067 /* Get bayer order based on flip setting. */
1080 lockdep_assert_held(&imx355->mutex); in imx355_get_format_code()
1081 code = codes[imx355->vflip->val][imx355->hflip->val]; in imx355_get_format_code()
1089 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); in imx355_read_reg()
1096 return -EINVAL; in imx355_read_reg()
1100 msgs[0].addr = client->addr; in imx355_read_reg()
1106 msgs[1].addr = client->addr; in imx355_read_reg()
1109 msgs[1].buf = &data_buf[4 - len]; in imx355_read_reg()
1111 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in imx355_read_reg()
1113 return -EIO; in imx355_read_reg()
1123 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); in imx355_write_reg()
1127 return -EINVAL; in imx355_write_reg()
1130 put_unaligned_be32(val << (8 * (4 - len)), buf + 2); in imx355_write_reg()
1132 return -EIO; in imx355_write_reg()
1141 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); in imx355_write_regs()
1148 dev_err_ratelimited(&client->dev, in imx355_write_regs()
1159 /* Open sub-device */
1164 v4l2_subdev_get_try_format(sd, fh->state, 0); in imx355_open()
1166 mutex_lock(&imx355->mutex); in imx355_open()
1169 try_fmt->width = imx355->cur_mode->width; in imx355_open()
1170 try_fmt->height = imx355->cur_mode->height; in imx355_open()
1171 try_fmt->code = imx355_get_format_code(imx355); in imx355_open()
1172 try_fmt->field = V4L2_FIELD_NONE; in imx355_open()
1174 mutex_unlock(&imx355->mutex); in imx355_open()
1181 struct imx355 *imx355 = container_of(ctrl->handler, in imx355_set_ctrl()
1183 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); in imx355_set_ctrl()
1188 switch (ctrl->id) { in imx355_set_ctrl()
1191 max = imx355->cur_mode->height + ctrl->val - 10; in imx355_set_ctrl()
1192 __v4l2_ctrl_modify_range(imx355->exposure, in imx355_set_ctrl()
1193 imx355->exposure->minimum, in imx355_set_ctrl()
1194 max, imx355->exposure->step, max); in imx355_set_ctrl()
1202 if (!pm_runtime_get_if_in_use(&client->dev)) in imx355_set_ctrl()
1205 switch (ctrl->id) { in imx355_set_ctrl()
1207 /* Analog gain = 1024/(1024 - ctrl->val) times */ in imx355_set_ctrl()
1209 ctrl->val); in imx355_set_ctrl()
1213 ctrl->val); in imx355_set_ctrl()
1217 ctrl->val); in imx355_set_ctrl()
1222 imx355->cur_mode->height + ctrl->val); in imx355_set_ctrl()
1226 2, ctrl->val); in imx355_set_ctrl()
1231 imx355->hflip->val | in imx355_set_ctrl()
1232 imx355->vflip->val << 1); in imx355_set_ctrl()
1235 ret = -EINVAL; in imx355_set_ctrl()
1236 dev_info(&client->dev, "ctrl(id:0x%x,val:0x%x) is not handled", in imx355_set_ctrl()
1237 ctrl->id, ctrl->val); in imx355_set_ctrl()
1241 pm_runtime_put(&client->dev); in imx355_set_ctrl()
1256 if (code->index > 0) in imx355_enum_mbus_code()
1257 return -EINVAL; in imx355_enum_mbus_code()
1259 mutex_lock(&imx355->mutex); in imx355_enum_mbus_code()
1260 code->code = imx355_get_format_code(imx355); in imx355_enum_mbus_code()
1261 mutex_unlock(&imx355->mutex); in imx355_enum_mbus_code()
1272 if (fse->index >= ARRAY_SIZE(supported_modes)) in imx355_enum_frame_size()
1273 return -EINVAL; in imx355_enum_frame_size()
1275 mutex_lock(&imx355->mutex); in imx355_enum_frame_size()
1276 if (fse->code != imx355_get_format_code(imx355)) { in imx355_enum_frame_size()
1277 mutex_unlock(&imx355->mutex); in imx355_enum_frame_size()
1278 return -EINVAL; in imx355_enum_frame_size()
1280 mutex_unlock(&imx355->mutex); in imx355_enum_frame_size()
1282 fse->min_width = supported_modes[fse->index].width; in imx355_enum_frame_size()
1283 fse->max_width = fse->min_width; in imx355_enum_frame_size()
1284 fse->min_height = supported_modes[fse->index].height; in imx355_enum_frame_size()
1285 fse->max_height = fse->min_height; in imx355_enum_frame_size()
1294 fmt->format.width = mode->width; in imx355_update_pad_format()
1295 fmt->format.height = mode->height; in imx355_update_pad_format()
1296 fmt->format.code = imx355_get_format_code(imx355); in imx355_update_pad_format()
1297 fmt->format.field = V4L2_FIELD_NONE; in imx355_update_pad_format()
1305 struct v4l2_subdev *sd = &imx355->sd; in imx355_do_get_pad_format()
1307 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in imx355_do_get_pad_format()
1308 framefmt = v4l2_subdev_get_try_format(sd, sd_state, fmt->pad); in imx355_do_get_pad_format()
1309 fmt->format = *framefmt; in imx355_do_get_pad_format()
1311 imx355_update_pad_format(imx355, imx355->cur_mode, fmt); in imx355_do_get_pad_format()
1324 mutex_lock(&imx355->mutex); in imx355_get_pad_format()
1326 mutex_unlock(&imx355->mutex); in imx355_get_pad_format()
1345 mutex_lock(&imx355->mutex); in imx355_set_pad_format()
1351 fmt->format.code = imx355_get_format_code(imx355); in imx355_set_pad_format()
1356 fmt->format.width, fmt->format.height); in imx355_set_pad_format()
1358 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in imx355_set_pad_format()
1359 framefmt = v4l2_subdev_get_try_format(sd, sd_state, fmt->pad); in imx355_set_pad_format()
1360 *framefmt = fmt->format; in imx355_set_pad_format()
1362 imx355->cur_mode = mode; in imx355_set_pad_format()
1363 pixel_rate = imx355->link_def_freq * 2 * 4; in imx355_set_pad_format()
1365 __v4l2_ctrl_s_ctrl_int64(imx355->pixel_rate, pixel_rate); in imx355_set_pad_format()
1367 height = imx355->cur_mode->height; in imx355_set_pad_format()
1368 vblank_def = imx355->cur_mode->fll_def - height; in imx355_set_pad_format()
1369 vblank_min = imx355->cur_mode->fll_min - height; in imx355_set_pad_format()
1370 height = IMX355_FLL_MAX - height; in imx355_set_pad_format()
1371 __v4l2_ctrl_modify_range(imx355->vblank, vblank_min, height, 1, in imx355_set_pad_format()
1373 __v4l2_ctrl_s_ctrl(imx355->vblank, vblank_def); in imx355_set_pad_format()
1374 h_blank = mode->llp - imx355->cur_mode->width; in imx355_set_pad_format()
1379 __v4l2_ctrl_modify_range(imx355->hblank, h_blank, in imx355_set_pad_format()
1383 mutex_unlock(&imx355->mutex); in imx355_set_pad_format()
1391 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); in imx355_start_streaming()
1397 ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs); in imx355_start_streaming()
1399 dev_err(&client->dev, "failed to set global settings"); in imx355_start_streaming()
1404 reg_list = &imx355->cur_mode->reg_list; in imx355_start_streaming()
1405 ret = imx355_write_regs(imx355, reg_list->regs, reg_list->num_of_regs); in imx355_start_streaming()
1407 dev_err(&client->dev, "failed to set mode"); in imx355_start_streaming()
1417 ret = __v4l2_ctrl_handler_setup(imx355->sd.ctrl_handler); in imx355_start_streaming()
1438 mutex_lock(&imx355->mutex); in imx355_set_stream()
1439 if (imx355->streaming == enable) { in imx355_set_stream()
1440 mutex_unlock(&imx355->mutex); in imx355_set_stream()
1445 ret = pm_runtime_resume_and_get(&client->dev); in imx355_set_stream()
1458 pm_runtime_put(&client->dev); in imx355_set_stream()
1461 imx355->streaming = enable; in imx355_set_stream()
1464 __v4l2_ctrl_grab(imx355->vflip, enable); in imx355_set_stream()
1465 __v4l2_ctrl_grab(imx355->hflip, enable); in imx355_set_stream()
1467 mutex_unlock(&imx355->mutex); in imx355_set_stream()
1472 pm_runtime_put(&client->dev); in imx355_set_stream()
1474 mutex_unlock(&imx355->mutex); in imx355_set_stream()
1484 if (imx355->streaming) in imx355_suspend()
1496 if (imx355->streaming) { in imx355_resume()
1506 imx355->streaming = 0; in imx355_resume()
1513 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); in imx355_identify_module()
1522 dev_err(&client->dev, "chip id mismatch: %x!=%x", in imx355_identify_module()
1524 return -EIO; in imx355_identify_module()
1562 struct i2c_client *client = v4l2_get_subdevdata(&imx355->sd); in imx355_init_controls()
1573 ctrl_hdlr = &imx355->ctrl_handler; in imx355_init_controls()
1578 ctrl_hdlr->lock = &imx355->mutex; in imx355_init_controls()
1579 max = ARRAY_SIZE(link_freq_menu_items) - 1; in imx355_init_controls()
1580 imx355->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx355_ctrl_ops, in imx355_init_controls()
1583 if (imx355->link_freq) in imx355_init_controls()
1584 imx355->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx355_init_controls()
1587 pixel_rate = imx355->link_def_freq * 2 * 4; in imx355_init_controls()
1590 imx355->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, in imx355_init_controls()
1594 /* Initialize vblank/hblank/exposure parameters based on current mode */ in imx355_init_controls()
1595 mode = imx355->cur_mode; in imx355_init_controls()
1596 vblank_def = mode->fll_def - mode->height; in imx355_init_controls()
1597 vblank_min = mode->fll_min - mode->height; in imx355_init_controls()
1598 imx355->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, in imx355_init_controls()
1600 IMX355_FLL_MAX - mode->height, in imx355_init_controls()
1603 hblank = mode->llp - mode->width; in imx355_init_controls()
1604 imx355->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, in imx355_init_controls()
1607 if (imx355->hblank) in imx355_init_controls()
1608 imx355->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx355_init_controls()
1611 exposure_max = mode->fll_def - 10; in imx355_init_controls()
1612 imx355->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, in imx355_init_controls()
1618 imx355->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, in imx355_init_controls()
1620 if (imx355->hflip) in imx355_init_controls()
1621 imx355->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT; in imx355_init_controls()
1622 imx355->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx355_ctrl_ops, in imx355_init_controls()
1624 if (imx355->vflip) in imx355_init_controls()
1625 imx355->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT; in imx355_init_controls()
1638 ARRAY_SIZE(imx355_test_pattern_menu) - 1, in imx355_init_controls()
1640 if (ctrl_hdlr->error) { in imx355_init_controls()
1641 ret = ctrl_hdlr->error; in imx355_init_controls()
1642 dev_err(&client->dev, "control init failed: %d", ret); in imx355_init_controls()
1646 imx355->sd.ctrl_handler = ctrl_hdlr; in imx355_init_controls()
1682 ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency", in imx355_get_hwcfg()
1683 &cfg->ext_clk); in imx355_get_hwcfg()
1689 dev_dbg(dev, "ext clk: %d", cfg->ext_clk); in imx355_get_hwcfg()
1690 if (cfg->ext_clk != IMX355_EXT_CLK) { in imx355_get_hwcfg()
1692 cfg->ext_clk); in imx355_get_hwcfg()
1702 cfg->nr_of_link_freqs = bus_cfg.nr_of_link_frequencies; in imx355_get_hwcfg()
1703 cfg->link_freqs = devm_kcalloc(dev, in imx355_get_hwcfg()
1705 sizeof(*cfg->link_freqs), GFP_KERNEL); in imx355_get_hwcfg()
1706 if (!cfg->link_freqs) in imx355_get_hwcfg()
1710 cfg->link_freqs[i] = bus_cfg.link_frequencies[i]; in imx355_get_hwcfg()
1711 dev_dbg(dev, "link_freq[%d] = %lld", i, cfg->link_freqs[i]); in imx355_get_hwcfg()
1730 imx355 = devm_kzalloc(&client->dev, sizeof(*imx355), GFP_KERNEL); in imx355_probe()
1732 return -ENOMEM; in imx355_probe()
1734 mutex_init(&imx355->mutex); in imx355_probe()
1737 v4l2_i2c_subdev_init(&imx355->sd, client, &imx355_subdev_ops); in imx355_probe()
1742 dev_err(&client->dev, "failed to find sensor: %d", ret); in imx355_probe()
1746 imx355->hwcfg = imx355_get_hwcfg(&client->dev); in imx355_probe()
1747 if (!imx355->hwcfg) { in imx355_probe()
1748 dev_err(&client->dev, "failed to get hwcfg"); in imx355_probe()
1749 ret = -ENODEV; in imx355_probe()
1753 imx355->link_def_freq = link_freq_menu_items[IMX355_LINK_FREQ_INDEX]; in imx355_probe()
1754 for (i = 0; i < imx355->hwcfg->nr_of_link_freqs; i++) { in imx355_probe()
1755 if (imx355->hwcfg->link_freqs[i] == imx355->link_def_freq) { in imx355_probe()
1756 dev_dbg(&client->dev, "link freq index %d matched", i); in imx355_probe()
1761 if (i == imx355->hwcfg->nr_of_link_freqs) { in imx355_probe()
1762 dev_err(&client->dev, "no link frequency supported"); in imx355_probe()
1763 ret = -EINVAL; in imx355_probe()
1768 imx355->cur_mode = &supported_modes[0]; in imx355_probe()
1772 dev_err(&client->dev, "failed to init controls: %d", ret); in imx355_probe()
1777 imx355->sd.internal_ops = &imx355_internal_ops; in imx355_probe()
1778 imx355->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in imx355_probe()
1780 imx355->sd.entity.ops = &imx355_subdev_entity_ops; in imx355_probe()
1781 imx355->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx355_probe()
1784 imx355->pad.flags = MEDIA_PAD_FL_SOURCE; in imx355_probe()
1785 ret = media_entity_pads_init(&imx355->sd.entity, 1, &imx355->pad); in imx355_probe()
1787 dev_err(&client->dev, "failed to init entity pads: %d", ret); in imx355_probe()
1792 * Device is already turned on by i2c-core with ACPI domain PM. in imx355_probe()
1795 pm_runtime_set_active(&client->dev); in imx355_probe()
1796 pm_runtime_enable(&client->dev); in imx355_probe()
1797 pm_runtime_idle(&client->dev); in imx355_probe()
1799 ret = v4l2_async_register_subdev_sensor(&imx355->sd); in imx355_probe()
1806 pm_runtime_disable(&client->dev); in imx355_probe()
1807 pm_runtime_set_suspended(&client->dev); in imx355_probe()
1808 media_entity_cleanup(&imx355->sd.entity); in imx355_probe()
1811 v4l2_ctrl_handler_free(imx355->sd.ctrl_handler); in imx355_probe()
1814 mutex_destroy(&imx355->mutex); in imx355_probe()
1825 media_entity_cleanup(&sd->entity); in imx355_remove()
1826 v4l2_ctrl_handler_free(sd->ctrl_handler); in imx355_remove()
1828 pm_runtime_disable(&client->dev); in imx355_remove()
1829 pm_runtime_set_suspended(&client->dev); in imx355_remove()
1831 mutex_destroy(&imx355->mutex); in imx355_remove()