Lines Matching refs:imx492
137 struct imx492 { struct
177 #define to_IMX492(sd) container_of(sd, struct imx492, subdev) argument
803 imx492_find_best_fit(struct imx492 *imx492, struct v4l2_subdev_format *fmt) in imx492_find_best_fit() argument
811 for (i = 0; i < imx492->cfg_num; i++) { in imx492_find_best_fit()
812 dist = imx492_get_reso_dist(&imx492->support_modes[i], framefmt); in imx492_find_best_fit()
814 imx492->support_modes[i].bus_fmt == framefmt->code) { in imx492_find_best_fit()
820 return &imx492->support_modes[cur_best_fit]; in imx492_find_best_fit()
827 struct imx492 *imx492 = to_IMX492(sd); in imx492_set_fmt() local
832 mutex_lock(&imx492->mutex); in imx492_set_fmt()
834 mode = imx492_find_best_fit(imx492, fmt); in imx492_set_fmt()
843 mutex_unlock(&imx492->mutex); in imx492_set_fmt()
847 imx492->cur_mode = mode; in imx492_set_fmt()
849 __v4l2_ctrl_modify_range(imx492->hblank, h_blank, in imx492_set_fmt()
852 __v4l2_ctrl_modify_range(imx492->vblank, vblank_def, in imx492_set_fmt()
855 imx492->cur_vts = imx492->cur_mode->vts_def; in imx492_set_fmt()
858 __v4l2_ctrl_s_ctrl_int64(imx492->pixel_rate, pixel_rate); in imx492_set_fmt()
859 __v4l2_ctrl_s_ctrl(imx492->link_freq, mode->mipi_freq_idx); in imx492_set_fmt()
862 mutex_unlock(&imx492->mutex); in imx492_set_fmt()
871 struct imx492 *imx492 = to_IMX492(sd); in imx492_get_fmt() local
872 const struct imx492_mode *mode = imx492->cur_mode; in imx492_get_fmt()
874 mutex_lock(&imx492->mutex); in imx492_get_fmt()
879 mutex_unlock(&imx492->mutex); in imx492_get_fmt()
892 mutex_unlock(&imx492->mutex); in imx492_get_fmt()
901 struct imx492 *imx492 = to_IMX492(sd); in imx492_enum_mbus_code() local
905 code->code = imx492->cur_mode->bus_fmt; in imx492_enum_mbus_code()
914 struct imx492 *imx492 = to_IMX492(sd); in imx492_enum_frame_sizes() local
916 if (fse->index >= imx492->cfg_num) in imx492_enum_frame_sizes()
919 if (fse->code != imx492->support_modes[fse->index].bus_fmt) in imx492_enum_frame_sizes()
922 fse->min_width = imx492->support_modes[fse->index].width; in imx492_enum_frame_sizes()
923 fse->max_width = imx492->support_modes[fse->index].width; in imx492_enum_frame_sizes()
924 fse->max_height = imx492->support_modes[fse->index].height; in imx492_enum_frame_sizes()
925 fse->min_height = imx492->support_modes[fse->index].height; in imx492_enum_frame_sizes()
933 struct imx492 *imx492 = to_IMX492(sd); in imx492_g_frame_interval() local
934 const struct imx492_mode *mode = imx492->cur_mode; in imx492_g_frame_interval()
944 struct imx492 *imx492 = to_IMX492(sd); in imx492_g_mbus_config() local
945 const struct imx492_mode *mode = imx492->cur_mode; in imx492_g_mbus_config()
947 u32 lane_num = imx492->bus_cfg.bus.mipi_csi2.num_data_lanes; in imx492_g_mbus_config()
972 static void imx492_get_module_inf(struct imx492 *imx492, in imx492_get_module_inf() argument
977 strscpy(inf->base.module, imx492->module_name, sizeof(inf->base.module)); in imx492_get_module_inf()
978 strscpy(inf->base.lens, imx492->len_name, sizeof(inf->base.lens)); in imx492_get_module_inf()
982 static int imx492_get_channel_info(struct imx492 *imx492, in imx492_get_channel_info() argument
987 ch_info->vc = imx492->cur_mode->vc[ch_info->index]; in imx492_get_channel_info()
988 ch_info->width = imx492->cur_mode->width; in imx492_get_channel_info()
989 ch_info->height = imx492->cur_mode->height; in imx492_get_channel_info()
990 ch_info->bus_fmt = imx492->cur_mode->bus_fmt; in imx492_get_channel_info()
996 struct imx492 *imx492 = to_IMX492(sd); in imx492_ioctl() local
1008 imx492_get_module_inf(imx492, (struct rkmodule_inf *)arg); in imx492_ioctl()
1013 hdr->hdr_mode = imx492->cur_mode->hdr_mode; in imx492_ioctl()
1017 w = imx492->cur_mode->width; in imx492_ioctl()
1018 h = imx492->cur_mode->height; in imx492_ioctl()
1019 for (i = 0; i < imx492->cfg_num; i++) { in imx492_ioctl()
1020 if (w == imx492->support_modes[i].width && in imx492_ioctl()
1021 h == imx492->support_modes[i].height && in imx492_ioctl()
1022 imx492->support_modes[i].hdr_mode == hdr->hdr_mode) { in imx492_ioctl()
1023 imx492->cur_mode = &imx492->support_modes[i]; in imx492_ioctl()
1027 if (i == imx492->cfg_num) { in imx492_ioctl()
1028 dev_err(&imx492->client->dev, in imx492_ioctl()
1033 w = imx492->cur_mode->hts_def - imx492->cur_mode->width; in imx492_ioctl()
1034 h = imx492->cur_mode->vts_def - imx492->cur_mode->height; in imx492_ioctl()
1035 __v4l2_ctrl_modify_range(imx492->hblank, w, w, 1, w); in imx492_ioctl()
1036 __v4l2_ctrl_modify_range(imx492->vblank, h, in imx492_ioctl()
1037 IMX492_VTS_MAX - imx492->cur_mode->height, in imx492_ioctl()
1039 imx492->cur_vts = imx492->cur_mode->vts_def; in imx492_ioctl()
1040 pixel_rate = (u32)link_freq_menu_items[imx492->cur_mode->mipi_freq_idx] in imx492_ioctl()
1041 / imx492->cur_mode->bpp * 2 * in imx492_ioctl()
1042 imx492->bus_cfg.bus.mipi_csi2.num_data_lanes; in imx492_ioctl()
1043 __v4l2_ctrl_s_ctrl_int64(imx492->pixel_rate, in imx492_ioctl()
1045 __v4l2_ctrl_s_ctrl(imx492->link_freq, in imx492_ioctl()
1046 imx492->cur_mode->mipi_freq_idx); in imx492_ioctl()
1053 ret |= imx492_write_reg(imx492->client, IMX492_REG_CTRL_STANDBY, in imx492_ioctl()
1056 ret |= imx492_write_reg(imx492->client, IMX492_REG_CTRL_STANDBY, in imx492_ioctl()
1062 ret = imx492_get_channel_info(imx492, ch_info); in imx492_ioctl()
1066 *sync_mode = imx492->sync_mode; in imx492_ioctl()
1070 imx492->sync_mode = *sync_mode; in imx492_ioctl()
1223 static int __imx492_start_stream(struct imx492 *imx492) in __imx492_start_stream() argument
1227 ret = imx492_write_array(imx492->client, imx492->cur_mode->reg_list); in __imx492_start_stream()
1231 ret = __v4l2_ctrl_handler_setup(&imx492->ctrl_handler); in __imx492_start_stream()
1234 if (imx492->has_init_exp && imx492->cur_mode->hdr_mode != NO_HDR) { in __imx492_start_stream()
1235 ret = imx492_ioctl(&imx492->subdev, PREISP_CMD_SET_HDRAE_EXP, in __imx492_start_stream()
1236 &imx492->init_hdrae_exp); in __imx492_start_stream()
1238 dev_err(&imx492->client->dev, in __imx492_start_stream()
1243 ret |= imx492_write_reg(imx492->client, IMX492_REG_CTRL_STANDBY, in __imx492_start_stream()
1246 ret |= imx492_write_reg(imx492->client, IMX492_REG_CTRL_XMSTA, in __imx492_start_stream()
1248 ret |= imx492_write_reg(imx492->client, IMX492_REG_CTRL_SYNCDRV, in __imx492_start_stream()
1254 static int __imx492_stop_stream(struct imx492 *imx492) in __imx492_stop_stream() argument
1258 imx492->has_init_exp = false; in __imx492_stop_stream()
1259 ret = imx492_write_reg(imx492->client, IMX492_REG_CTRL_STANDBY, in __imx492_stop_stream()
1266 struct imx492 *imx492 = to_IMX492(sd); in imx492_s_stream() local
1267 struct i2c_client *client = imx492->client; in imx492_s_stream()
1270 mutex_lock(&imx492->mutex); in imx492_s_stream()
1272 if (on == imx492->streaming) in imx492_s_stream()
1282 ret = __imx492_start_stream(imx492); in imx492_s_stream()
1289 __imx492_stop_stream(imx492); in imx492_s_stream()
1293 imx492->streaming = on; in imx492_s_stream()
1296 mutex_unlock(&imx492->mutex); in imx492_s_stream()
1303 struct imx492 *imx492 = to_IMX492(sd); in imx492_s_power() local
1304 struct i2c_client *client = imx492->client; in imx492_s_power()
1307 mutex_lock(&imx492->mutex); in imx492_s_power()
1310 if (imx492->power_on == !!on) in imx492_s_power()
1319 imx492->power_on = true; in imx492_s_power()
1322 imx492->power_on = false; in imx492_s_power()
1326 mutex_unlock(&imx492->mutex); in imx492_s_power()
1333 static int __imx492_power_on(struct imx492 *imx492) in __imx492_power_on() argument
1336 struct device *dev = &imx492->client->dev; in __imx492_power_on()
1338 if (!IS_ERR_OR_NULL(imx492->pins_default)) { in __imx492_power_on()
1339 ret = pinctrl_select_state(imx492->pinctrl, in __imx492_power_on()
1340 imx492->pins_default); in __imx492_power_on()
1345 ret = clk_set_rate(imx492->xvclk, imx492->cur_mode->mclk); in __imx492_power_on()
1348 if (clk_get_rate(imx492->xvclk) != imx492->cur_mode->mclk) in __imx492_power_on()
1349 dev_warn(dev, "xvclk mismatched, %lu\n", clk_get_rate(imx492->xvclk)); in __imx492_power_on()
1351 imx492->cur_mclk = imx492->cur_mode->mclk; in __imx492_power_on()
1352 ret = clk_prepare_enable(imx492->xvclk); in __imx492_power_on()
1358 ret = regulator_bulk_enable(IMX492_NUM_SUPPLIES, imx492->supplies); in __imx492_power_on()
1363 if (!IS_ERR(imx492->pwdn_gpio)) in __imx492_power_on()
1364 gpiod_set_value_cansleep(imx492->pwdn_gpio, 0); in __imx492_power_on()
1365 if (!IS_ERR(imx492->reset_gpio)) in __imx492_power_on()
1366 gpiod_set_value_cansleep(imx492->reset_gpio, 0); in __imx492_power_on()
1372 clk_disable_unprepare(imx492->xvclk); in __imx492_power_on()
1377 static void __imx492_power_off(struct imx492 *imx492) in __imx492_power_off() argument
1380 struct device *dev = &imx492->client->dev; in __imx492_power_off()
1382 if (!IS_ERR(imx492->pwdn_gpio)) in __imx492_power_off()
1383 gpiod_set_value_cansleep(imx492->pwdn_gpio, 1); in __imx492_power_off()
1384 clk_disable_unprepare(imx492->xvclk); in __imx492_power_off()
1385 if (!IS_ERR(imx492->reset_gpio)) in __imx492_power_off()
1386 gpiod_set_value_cansleep(imx492->reset_gpio, 1); in __imx492_power_off()
1387 if (!IS_ERR_OR_NULL(imx492->pins_sleep)) { in __imx492_power_off()
1388 ret = pinctrl_select_state(imx492->pinctrl, imx492->pins_sleep); in __imx492_power_off()
1392 regulator_bulk_disable(IMX492_NUM_SUPPLIES, imx492->supplies); in __imx492_power_off()
1400 struct imx492 *imx492 = to_IMX492(sd); in imx492_runtime_resume() local
1402 return __imx492_power_on(imx492); in imx492_runtime_resume()
1409 struct imx492 *imx492 = to_IMX492(sd); in imx492_runtime_suspend() local
1411 __imx492_power_off(imx492); in imx492_runtime_suspend()
1419 struct imx492 *imx492 = to_IMX492(sd); in imx492_open() local
1422 const struct imx492_mode *def_mode = &imx492->support_modes[0]; in imx492_open()
1424 mutex_lock(&imx492->mutex); in imx492_open()
1431 mutex_unlock(&imx492->mutex); in imx492_open()
1442 struct imx492 *imx492 = to_IMX492(sd); in imx492_enum_frame_interval() local
1444 if (fie->index >= imx492->cfg_num) in imx492_enum_frame_interval()
1447 fie->code = imx492->support_modes[fie->index].bus_fmt; in imx492_enum_frame_interval()
1448 fie->width = imx492->support_modes[fie->index].width; in imx492_enum_frame_interval()
1449 fie->height = imx492->support_modes[fie->index].height; in imx492_enum_frame_interval()
1450 fie->interval = imx492->support_modes[fie->index].max_fps; in imx492_enum_frame_interval()
1451 fie->reserved[0] = imx492->support_modes[fie->index].hdr_mode; in imx492_enum_frame_interval()
1475 struct imx492 *imx492 = to_IMX492(sd); in imx492_get_selection() local
1480 sel->r.top = CROP_START(imx492->cur_mode->height, DST_HEIGHT_4320); in imx492_get_selection()
1482 dev_info(&imx492->client->dev, "sel->r.left %d sel->r.top %d\n", in imx492_get_selection()
1531 struct imx492 *imx492 = container_of(ctrl->handler, in imx492_set_ctrl() local
1532 struct imx492, ctrl_handler); in imx492_set_ctrl()
1533 struct i2c_client *client = imx492->client; in imx492_set_ctrl()
1534 const struct imx492_mode *mode = imx492->cur_mode; in imx492_set_ctrl()
1547 max = imx492->cur_mode->height + ctrl->val - 3; in imx492_set_ctrl()
1548 __v4l2_ctrl_modify_range(imx492->exposure, in imx492_set_ctrl()
1549 imx492->exposure->minimum, max, in imx492_set_ctrl()
1550 imx492->exposure->step, in imx492_set_ctrl()
1551 imx492->exposure->default_value); in imx492_set_ctrl()
1563 ret |= imx492_write_reg(imx492->client, IMX492_EXPO_REG_L, in imx492_set_ctrl()
1566 ret |= imx492_write_reg(imx492->client, IMX492_EXPO_REG_H, in imx492_set_ctrl()
1577 ret |= imx492_write_reg(imx492->client, IMX492_AGAIN_REG_H, in imx492_set_ctrl()
1580 ret |= imx492_write_reg(imx492->client, IMX492_AGAIN_REG_L, in imx492_set_ctrl()
1583 ret |= imx492_write_reg(imx492->client, IMX492_DGAIN_REG, in imx492_set_ctrl()
1587 ret |= imx492_write_reg(imx492->client, IMX492_AGAIN_REG_H, in imx492_set_ctrl()
1590 ret |= imx492_write_reg(imx492->client, IMX492_AGAIN_REG_L, in imx492_set_ctrl()
1593 ret |= imx492_write_reg(imx492->client, IMX492_DGAIN_REG, in imx492_set_ctrl()
1597 ret |= imx492_write_reg(imx492->client, IMX492_AGAIN_REG_H, in imx492_set_ctrl()
1600 ret |= imx492_write_reg(imx492->client, IMX492_AGAIN_REG_L, in imx492_set_ctrl()
1603 ret |= imx492_write_reg(imx492->client, IMX492_DGAIN_REG, in imx492_set_ctrl()
1607 ret |= imx492_write_reg(imx492->client, IMX492_AGAIN_REG_H, in imx492_set_ctrl()
1610 ret |= imx492_write_reg(imx492->client, IMX492_AGAIN_REG_L, in imx492_set_ctrl()
1613 ret |= imx492_write_reg(imx492->client, IMX492_DGAIN_REG, in imx492_set_ctrl()
1621 vts = ctrl->val + imx492->cur_mode->height; in imx492_set_ctrl()
1623 imx492->cur_vts = vts; in imx492_set_ctrl()
1624 ret |= imx492_write_reg(imx492->client, IMX492_VTS_REG_L, in imx492_set_ctrl()
1627 ret |= imx492_write_reg(imx492->client, IMX492_VTS_REG_M, in imx492_set_ctrl()
1630 ret |= imx492_write_reg(imx492->client, IMX492_VTS_REG_H, in imx492_set_ctrl()
1656 static int imx492_initialize_controls(struct imx492 *imx492) in imx492_initialize_controls() argument
1665 handler = &imx492->ctrl_handler; in imx492_initialize_controls()
1666 mode = imx492->cur_mode; in imx492_initialize_controls()
1670 handler->lock = &imx492->mutex; in imx492_initialize_controls()
1672 imx492->link_freq = v4l2_ctrl_new_int_menu(handler, in imx492_initialize_controls()
1675 __v4l2_ctrl_s_ctrl(imx492->link_freq, imx492->cur_mode->mipi_freq_idx); in imx492_initialize_controls()
1677 * 2 * imx492->bus_cfg.bus.mipi_csi2.num_data_lanes; in imx492_initialize_controls()
1678 imx492->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE, in imx492_initialize_controls()
1683 imx492->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx492_initialize_controls()
1685 if (imx492->hblank) in imx492_initialize_controls()
1686 imx492->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx492_initialize_controls()
1689 imx492->vblank = v4l2_ctrl_new_std(handler, &imx492_ctrl_ops, in imx492_initialize_controls()
1693 imx492->cur_vts = mode->vts_def; in imx492_initialize_controls()
1696 imx492->exposure = v4l2_ctrl_new_std(handler, &imx492_ctrl_ops, in imx492_initialize_controls()
1701 imx492->anal_a_gain = v4l2_ctrl_new_std(handler, &imx492_ctrl_ops, in imx492_initialize_controls()
1710 dev_err(&imx492->client->dev, "Failed to init controls(%d)\n", ret); in imx492_initialize_controls()
1714 imx492->subdev.ctrl_handler = handler; in imx492_initialize_controls()
1715 imx492->has_init_exp = false; in imx492_initialize_controls()
1716 imx492->isHCG = false; in imx492_initialize_controls()
1726 static int imx492_check_sensor_id(struct imx492 *imx492, in imx492_check_sensor_id() argument
1729 struct device *dev = &imx492->client->dev; in imx492_check_sensor_id()
1745 static int imx492_configure_regulators(struct imx492 *imx492) in imx492_configure_regulators() argument
1750 imx492->supplies[i].supply = imx492_supply_names[i]; in imx492_configure_regulators()
1752 return devm_regulator_bulk_get(&imx492->client->dev, in imx492_configure_regulators()
1754 imx492->supplies); in imx492_configure_regulators()
1762 struct imx492 *imx492; in imx492_probe() local
1777 imx492 = devm_kzalloc(dev, sizeof(*imx492), GFP_KERNEL); in imx492_probe()
1778 if (!imx492) in imx492_probe()
1782 &imx492->module_index); in imx492_probe()
1784 &imx492->module_facing); in imx492_probe()
1786 &imx492->module_name); in imx492_probe()
1788 &imx492->len_name); in imx492_probe()
1797 imx492->sync_mode = NO_SYNC_MODE; in imx492_probe()
1801 imx492->sync_mode = EXTERNAL_MASTER_MODE; in imx492_probe()
1803 imx492->sync_mode = INTERNAL_MASTER_MODE; in imx492_probe()
1805 imx492->sync_mode = SLAVE_MODE; in imx492_probe()
1813 imx492->client = client; in imx492_probe()
1820 &imx492->bus_cfg); in imx492_probe()
1825 imx492->support_modes = supported_modes; in imx492_probe()
1826 imx492->cfg_num = ARRAY_SIZE(supported_modes); in imx492_probe()
1828 for (i = 0; i < imx492->cfg_num; i++) { in imx492_probe()
1829 if (hdr_mode == imx492->support_modes[i].hdr_mode) { in imx492_probe()
1830 imx492->cur_mode = &imx492->support_modes[i]; in imx492_probe()
1834 imx492->xvclk = devm_clk_get(dev, "xvclk"); in imx492_probe()
1835 if (IS_ERR(imx492->xvclk)) { in imx492_probe()
1840 imx492->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx492_probe()
1841 if (IS_ERR(imx492->reset_gpio)) in imx492_probe()
1844 imx492->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx492_probe()
1845 if (IS_ERR(imx492->pwdn_gpio)) in imx492_probe()
1848 imx492->pinctrl = devm_pinctrl_get(dev); in imx492_probe()
1849 if (!IS_ERR(imx492->pinctrl)) { in imx492_probe()
1850 imx492->pins_default = in imx492_probe()
1851 pinctrl_lookup_state(imx492->pinctrl, in imx492_probe()
1853 if (IS_ERR(imx492->pins_default)) in imx492_probe()
1856 imx492->pins_sleep = in imx492_probe()
1857 pinctrl_lookup_state(imx492->pinctrl, in imx492_probe()
1859 if (IS_ERR(imx492->pins_sleep)) in imx492_probe()
1865 ret = imx492_configure_regulators(imx492); in imx492_probe()
1871 mutex_init(&imx492->mutex); in imx492_probe()
1873 sd = &imx492->subdev; in imx492_probe()
1875 ret = imx492_initialize_controls(imx492); in imx492_probe()
1879 ret = __imx492_power_on(imx492); in imx492_probe()
1883 ret = imx492_check_sensor_id(imx492, client); in imx492_probe()
1892 imx492->pad.flags = MEDIA_PAD_FL_SOURCE; in imx492_probe()
1894 ret = media_entity_pads_init(&sd->entity, 1, &imx492->pad); in imx492_probe()
1900 if (strcmp(imx492->module_facing, "back") == 0) in imx492_probe()
1906 imx492->module_index, facing, in imx492_probe()
1925 __imx492_power_off(imx492); in imx492_probe()
1927 v4l2_ctrl_handler_free(&imx492->ctrl_handler); in imx492_probe()
1929 mutex_destroy(&imx492->mutex); in imx492_probe()
1937 struct imx492 *imx492 = to_IMX492(sd); in imx492_remove() local
1943 v4l2_ctrl_handler_free(&imx492->ctrl_handler); in imx492_remove()
1944 mutex_destroy(&imx492->mutex); in imx492_remove()
1948 __imx492_power_off(imx492); in imx492_remove()