Lines Matching refs:imx327
147 struct imx327 { struct
190 #define to_imx327(sd) container_of(sd, struct imx327, subdev) argument
715 struct imx327 *imx327 = to_imx327(sd); in imx327_set_fmt() local
721 mutex_lock(&imx327->mutex); in imx327_set_fmt()
723 mode = v4l2_find_nearest_size(imx327->support_modes, in imx327_set_fmt()
724 imx327->support_modes_num, in imx327_set_fmt()
735 mutex_unlock(&imx327->mutex); in imx327_set_fmt()
739 imx327->cur_mode = mode; in imx327_set_fmt()
741 __v4l2_ctrl_modify_range(imx327->hblank, h_blank, in imx327_set_fmt()
744 __v4l2_ctrl_modify_range(imx327->vblank, vblank_def, in imx327_set_fmt()
747 if (imx327->cur_mode->hdr_mode == NO_HDR) { in imx327_set_fmt()
754 __v4l2_ctrl_s_ctrl_int64(imx327->pixel_rate, in imx327_set_fmt()
756 __v4l2_ctrl_s_ctrl(imx327->link_freq, in imx327_set_fmt()
758 imx327->cur_vts = mode->vts_def; in imx327_set_fmt()
761 mutex_unlock(&imx327->mutex); in imx327_set_fmt()
770 struct imx327 *imx327 = to_imx327(sd); in imx327_get_fmt() local
771 const struct imx327_mode *mode = imx327->cur_mode; in imx327_get_fmt()
773 mutex_lock(&imx327->mutex); in imx327_get_fmt()
778 mutex_unlock(&imx327->mutex); in imx327_get_fmt()
787 mutex_unlock(&imx327->mutex); in imx327_get_fmt()
795 struct imx327 *imx327 = to_imx327(sd); in imx327_enum_mbus_code() local
796 const struct imx327_mode *mode = imx327->cur_mode; in imx327_enum_mbus_code()
809 struct imx327 *imx327 = to_imx327(sd); in imx327_enum_frame_sizes() local
811 if (fse->index >= imx327->support_modes_num) in imx327_enum_frame_sizes()
814 if (fse->code != imx327->support_modes[fse->index].bus_fmt) in imx327_enum_frame_sizes()
817 fse->min_width = imx327->support_modes[fse->index].width; in imx327_enum_frame_sizes()
818 fse->max_width = imx327->support_modes[fse->index].width; in imx327_enum_frame_sizes()
819 fse->max_height = imx327->support_modes[fse->index].height; in imx327_enum_frame_sizes()
820 fse->min_height = imx327->support_modes[fse->index].height; in imx327_enum_frame_sizes()
826 static int imx327_enable_test_pattern(struct imx327 *imx327, u32 pattern) in imx327_enable_test_pattern() argument
830 imx327_read_reg(imx327->client, in imx327_enable_test_pattern()
836 imx327_write_reg(imx327->client, in imx327_enable_test_pattern()
840 imx327_write_reg(imx327->client, in imx327_enable_test_pattern()
846 imx327_write_reg(imx327->client, in imx327_enable_test_pattern()
850 imx327_write_reg(imx327->client, in imx327_enable_test_pattern()
855 return imx327_write_reg(imx327->client, in imx327_enable_test_pattern()
865 struct imx327 *imx327 = to_imx327(sd); in imx327_g_frame_interval() local
866 const struct imx327_mode *mode = imx327->cur_mode; in imx327_g_frame_interval()
876 struct imx327 *imx327 = to_imx327(sd); in imx327_g_mbus_config() local
882 config->type = imx327->bus_cfg.bus_type; in imx327_g_mbus_config()
888 static int imx327_set_hdrae(struct imx327 *imx327, in imx327_set_hdrae() argument
897 u32 fsc = imx327->cur_vts;//The HDR mode vts is double by default to workaround T-line in imx327_set_hdrae()
899 if (!imx327->has_init_exp && !imx327->streaming) { in imx327_set_hdrae()
900 imx327->init_hdrae_exp = *ae; in imx327_set_hdrae()
901 imx327->has_init_exp = true; in imx327_set_hdrae()
902 dev_dbg(&imx327->client->dev, "imx327 don't stream, record exp for hdr!\n"); in imx327_set_hdrae()
913 if (imx327->cur_mode->hdr_mode == HDR_X2) { in imx327_set_hdrae()
919 dev_dbg(&imx327->client->dev, in imx327_set_hdrae()
923 ret = imx327_read_reg(imx327->client, IMX327_GAIN_SWITCH_REG, in imx327_set_hdrae()
945 ret |= imx327_write_reg(imx327->client, IMX327_REG_SHS1_L, in imx327_set_hdrae()
948 ret |= imx327_write_reg(imx327->client, IMX327_REG_SHS1_M, in imx327_set_hdrae()
951 ret |= imx327_write_reg(imx327->client, IMX327_REG_SHS1_H, in imx327_set_hdrae()
954 ret |= imx327_write_reg(imx327->client, IMX327_REG_SHS2_L, in imx327_set_hdrae()
957 ret |= imx327_write_reg(imx327->client, IMX327_REG_SHS2_M, in imx327_set_hdrae()
960 ret |= imx327_write_reg(imx327->client, IMX327_REG_SHS2_H, in imx327_set_hdrae()
964 ret |= imx327_write_reg(imx327->client, IMX327_REG_LF_GAIN, in imx327_set_hdrae()
967 ret |= imx327_write_reg(imx327->client, IMX327_REG_SF_GAIN, in imx327_set_hdrae()
971 ret |= imx327_write_reg(imx327->client, in imx327_set_hdrae()
975 ret |= imx327_write_reg(imx327->client, IMX327_GAIN_SWITCH_REG, in imx327_set_hdrae()
977 ret |= imx327_write_reg(imx327->client, in imx327_set_hdrae()
982 dev_dbg(&imx327->client->dev, in imx327_set_hdrae()
988 static void imx327_get_module_inf(struct imx327 *imx327, in imx327_get_module_inf() argument
993 strlcpy(inf->base.module, imx327->module_name, in imx327_get_module_inf()
995 strlcpy(inf->base.lens, imx327->len_name, sizeof(inf->base.lens)); in imx327_get_module_inf()
998 static int imx327_set_conversion_gain(struct imx327 *imx327, u32 *cg) in imx327_set_conversion_gain() argument
1001 struct i2c_client *client = imx327->client; in imx327_set_conversion_gain()
1046 struct imx327 *imx327 = to_imx327(sd); in set_conversion_gain_status() local
1052 imx327_set_conversion_gain(imx327, &status); in set_conversion_gain_status()
1080 struct imx327 *imx327 = to_imx327(sd); in imx327_ioctl() local
1091 imx327_get_module_inf(imx327, (struct rkmodule_inf *)arg); in imx327_ioctl()
1094 ret = imx327_set_hdrae(imx327, arg); in imx327_ioctl()
1098 if (imx327->cur_mode->hdr_mode == NO_HDR) in imx327_ioctl()
1102 hdr->hdr_mode = imx327->cur_mode->hdr_mode; in imx327_ioctl()
1106 for (i = 0; i < imx327->support_modes_num; i++) { in imx327_ioctl()
1107 if (imx327->support_modes[i].hdr_mode == hdr->hdr_mode) { in imx327_ioctl()
1108 imx327->cur_mode = &imx327->support_modes[i]; in imx327_ioctl()
1112 if (i == imx327->support_modes_num) { in imx327_ioctl()
1113 dev_err(&imx327->client->dev, in imx327_ioctl()
1118 w = imx327->cur_mode->hts_def - imx327->cur_mode->width; in imx327_ioctl()
1119 h = imx327->cur_mode->vts_def - imx327->cur_mode->height; in imx327_ioctl()
1120 __v4l2_ctrl_modify_range(imx327->hblank, w, w, 1, w); in imx327_ioctl()
1121 __v4l2_ctrl_modify_range(imx327->vblank, h, in imx327_ioctl()
1122 IMX327_VTS_MAX - imx327->cur_mode->height, in imx327_ioctl()
1124 if (imx327->cur_mode->hdr_mode == NO_HDR) { in imx327_ioctl()
1131 __v4l2_ctrl_s_ctrl_int64(imx327->pixel_rate, in imx327_ioctl()
1133 __v4l2_ctrl_s_ctrl(imx327->link_freq, in imx327_ioctl()
1135 imx327->cur_vts = imx327->cur_mode->vts_def; in imx327_ioctl()
1139 ret = imx327_set_conversion_gain(imx327, (u32 *)arg); in imx327_ioctl()
1143 if (imx327->bus_cfg.bus_type == V4L2_MBUS_CCP2) in imx327_ioctl()
1144 memcpy(lvds_cfg, &imx327->cur_mode->lvds_cfg, in imx327_ioctl()
1154 ret = imx327_write_reg(imx327->client, in imx327_ioctl()
1159 ret = imx327_write_reg(imx327->client, in imx327_ioctl()
1263 static int imx327_init_conversion_gain(struct imx327 *imx327) in imx327_init_conversion_gain() argument
1266 struct i2c_client *client = imx327->client; in imx327_init_conversion_gain()
1283 static int __imx327_start_stream(struct imx327 *imx327) in __imx327_start_stream() argument
1287 ret = imx327_write_array(imx327->client, imx327->cur_mode->reg_list); in __imx327_start_stream()
1290 ret = imx327_init_conversion_gain(imx327); in __imx327_start_stream()
1294 ret = __v4l2_ctrl_handler_setup(&imx327->ctrl_handler); in __imx327_start_stream()
1295 if (imx327->has_init_exp && imx327->cur_mode->hdr_mode != NO_HDR) { in __imx327_start_stream()
1296 ret = imx327_ioctl(&imx327->subdev, PREISP_CMD_SET_HDRAE_EXP, in __imx327_start_stream()
1297 &imx327->init_hdrae_exp); in __imx327_start_stream()
1299 dev_err(&imx327->client->dev, in __imx327_start_stream()
1305 ret = imx327_write_reg(imx327->client, in __imx327_start_stream()
1312 static int __imx327_stop_stream(struct imx327 *imx327) in __imx327_stop_stream() argument
1314 return imx327_write_reg(imx327->client, in __imx327_stop_stream()
1322 struct imx327 *imx327 = to_imx327(sd); in imx327_s_stream() local
1323 struct i2c_client *client = imx327->client; in imx327_s_stream()
1326 mutex_lock(&imx327->mutex); in imx327_s_stream()
1328 if (on == imx327->streaming) in imx327_s_stream()
1338 ret = __imx327_start_stream(imx327); in imx327_s_stream()
1345 __imx327_stop_stream(imx327); in imx327_s_stream()
1349 imx327->streaming = on; in imx327_s_stream()
1352 mutex_unlock(&imx327->mutex); in imx327_s_stream()
1359 struct imx327 *imx327 = to_imx327(sd); in imx327_s_power() local
1360 struct i2c_client *client = imx327->client; in imx327_s_power()
1363 mutex_lock(&imx327->mutex); in imx327_s_power()
1366 if (imx327->power_on == !!on) in imx327_s_power()
1376 ret = imx327_write_array(imx327->client, imx327_global_regs); in imx327_s_power()
1383 imx327->power_on = true; in imx327_s_power()
1386 imx327->power_on = false; in imx327_s_power()
1390 mutex_unlock(&imx327->mutex); in imx327_s_power()
1401 static int __imx327_power_on(struct imx327 *imx327) in __imx327_power_on() argument
1405 struct device *dev = &imx327->client->dev; in __imx327_power_on()
1407 if (!IS_ERR_OR_NULL(imx327->pins_default)) { in __imx327_power_on()
1408 ret = pinctrl_select_state(imx327->pinctrl, in __imx327_power_on()
1409 imx327->pins_default); in __imx327_power_on()
1414 ret = clk_set_rate(imx327->xvclk, IMX327_XVCLK_FREQ); in __imx327_power_on()
1418 if (clk_get_rate(imx327->xvclk) != IMX327_XVCLK_FREQ) in __imx327_power_on()
1421 ret = clk_prepare_enable(imx327->xvclk); in __imx327_power_on()
1428 ret = regulator_bulk_enable(IMX327_NUM_SUPPLIES, imx327->supplies); in __imx327_power_on()
1434 if (!IS_ERR(imx327->reset_gpio)) in __imx327_power_on()
1435 gpiod_set_value_cansleep(imx327->reset_gpio, 0); in __imx327_power_on()
1437 if (!IS_ERR(imx327->reset_gpio)) in __imx327_power_on()
1438 gpiod_set_value_cansleep(imx327->reset_gpio, 1); in __imx327_power_on()
1440 if (!IS_ERR(imx327->pwdn_gpio)) in __imx327_power_on()
1441 gpiod_set_value_cansleep(imx327->pwdn_gpio, 1); in __imx327_power_on()
1450 clk_disable_unprepare(imx327->xvclk); in __imx327_power_on()
1455 static void __imx327_power_off(struct imx327 *imx327) in __imx327_power_off() argument
1458 struct device *dev = &imx327->client->dev; in __imx327_power_off()
1460 if (!IS_ERR(imx327->pwdn_gpio)) in __imx327_power_off()
1461 gpiod_set_value_cansleep(imx327->pwdn_gpio, 0); in __imx327_power_off()
1462 clk_disable_unprepare(imx327->xvclk); in __imx327_power_off()
1463 if (!IS_ERR(imx327->reset_gpio)) in __imx327_power_off()
1464 gpiod_set_value_cansleep(imx327->reset_gpio, 0); in __imx327_power_off()
1465 if (!IS_ERR_OR_NULL(imx327->pins_sleep)) { in __imx327_power_off()
1466 ret = pinctrl_select_state(imx327->pinctrl, in __imx327_power_off()
1467 imx327->pins_sleep); in __imx327_power_off()
1471 regulator_bulk_disable(IMX327_NUM_SUPPLIES, imx327->supplies); in __imx327_power_off()
1478 struct imx327 *imx327 = to_imx327(sd); in imx327_runtime_resume() local
1480 return __imx327_power_on(imx327); in imx327_runtime_resume()
1487 struct imx327 *imx327 = to_imx327(sd); in imx327_runtime_suspend() local
1489 __imx327_power_off(imx327); in imx327_runtime_suspend()
1497 struct imx327 *imx327 = to_imx327(sd); in imx327_open() local
1500 const struct imx327_mode *def_mode = &imx327->support_modes[0]; in imx327_open()
1502 mutex_lock(&imx327->mutex); in imx327_open()
1509 mutex_unlock(&imx327->mutex); in imx327_open()
1520 struct imx327 *imx327 = to_imx327(sd); in imx327_enum_frame_interval() local
1522 if (fie->index >= imx327->support_modes_num) in imx327_enum_frame_interval()
1525 fie->code = imx327->support_modes[fie->index].bus_fmt; in imx327_enum_frame_interval()
1526 fie->width = imx327->support_modes[fie->index].width; in imx327_enum_frame_interval()
1527 fie->height = imx327->support_modes[fie->index].height; in imx327_enum_frame_interval()
1528 fie->interval = imx327->support_modes[fie->index].max_fps; in imx327_enum_frame_interval()
1529 fie->reserved[0] = imx327->support_modes[fie->index].hdr_mode; in imx327_enum_frame_interval()
1551 struct imx327 *imx327 = to_imx327(sd); in imx327_get_selection() local
1554 sel->r.left = CROP_START(imx327->cur_mode->width, DST_WIDTH); in imx327_get_selection()
1556 if (imx327->bus_cfg.bus_type == V4L2_MBUS_CCP2) { in imx327_get_selection()
1557 if (imx327->cur_mode->hdr_mode == NO_HDR) in imx327_get_selection()
1562 sel->r.top = CROP_START(imx327->cur_mode->height, DST_HEIGHT); in imx327_get_selection()
1612 struct imx327 *imx327 = container_of(ctrl->handler, in imx327_set_ctrl() local
1613 struct imx327, ctrl_handler); in imx327_set_ctrl()
1614 struct i2c_client *client = imx327->client; in imx327_set_ctrl()
1625 max = imx327->cur_mode->height + ctrl->val - 2; in imx327_set_ctrl()
1626 __v4l2_ctrl_modify_range(imx327->exposure, in imx327_set_ctrl()
1627 imx327->exposure->minimum, max, in imx327_set_ctrl()
1628 imx327->exposure->step, in imx327_set_ctrl()
1629 imx327->exposure->default_value); in imx327_set_ctrl()
1638 if (imx327->cur_mode->hdr_mode == NO_HDR) { in imx327_set_ctrl()
1639 shs1 = imx327->cur_vts - ctrl->val - 1; in imx327_set_ctrl()
1640 ret = imx327_write_reg(imx327->client, in imx327_set_ctrl()
1644 ret |= imx327_write_reg(imx327->client, in imx327_set_ctrl()
1648 ret |= imx327_write_reg(imx327->client, in imx327_set_ctrl()
1653 ctrl->val, imx327->cur_vts, shs1); in imx327_set_ctrl()
1657 if (imx327->cur_mode->hdr_mode == NO_HDR) { in imx327_set_ctrl()
1658 ret = imx327_write_reg(imx327->client, in imx327_set_ctrl()
1667 vts = ctrl->val + imx327->cur_mode->height; in imx327_set_ctrl()
1668 imx327->cur_vts = vts; in imx327_set_ctrl()
1669 if (imx327->cur_mode->hdr_mode == HDR_X2) in imx327_set_ctrl()
1671 ret = imx327_write_reg(imx327->client, in imx327_set_ctrl()
1675 ret |= imx327_write_reg(imx327->client, in imx327_set_ctrl()
1679 ret |= imx327_write_reg(imx327->client, in imx327_set_ctrl()
1688 ret = imx327_enable_test_pattern(imx327, ctrl->val); in imx327_set_ctrl()
1705 imx327->flip = val; in imx327_set_ctrl()
1721 imx327->flip = val; in imx327_set_ctrl()
1738 static int imx327_initialize_controls(struct imx327 *imx327) in imx327_initialize_controls() argument
1748 handler = &imx327->ctrl_handler; in imx327_initialize_controls()
1749 mode = imx327->cur_mode; in imx327_initialize_controls()
1753 handler->lock = &imx327->mutex; in imx327_initialize_controls()
1755 imx327->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ, in imx327_initialize_controls()
1758 if (imx327->cur_mode->hdr_mode == NO_HDR) { in imx327_initialize_controls()
1765 __v4l2_ctrl_s_ctrl(imx327->link_freq, in imx327_initialize_controls()
1767 imx327->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE, in imx327_initialize_controls()
1772 imx327->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx327_initialize_controls()
1774 if (imx327->hblank) in imx327_initialize_controls()
1775 imx327->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx327_initialize_controls()
1778 imx327->cur_vts = mode->vts_def; in imx327_initialize_controls()
1779 imx327->vblank = v4l2_ctrl_new_std(handler, &imx327_ctrl_ops, in imx327_initialize_controls()
1786 imx327->exposure = v4l2_ctrl_new_std(handler, &imx327_ctrl_ops, in imx327_initialize_controls()
1791 imx327->anal_gain = v4l2_ctrl_new_std(handler, &imx327_ctrl_ops, in imx327_initialize_controls()
1797 imx327->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in imx327_initialize_controls()
1802 imx327->h_flip = v4l2_ctrl_new_std(handler, &imx327_ctrl_ops, in imx327_initialize_controls()
1805 imx327->v_flip = v4l2_ctrl_new_std(handler, &imx327_ctrl_ops, in imx327_initialize_controls()
1807 imx327->flip = 0; in imx327_initialize_controls()
1810 dev_err(&imx327->client->dev, in imx327_initialize_controls()
1815 imx327->subdev.ctrl_handler = handler; in imx327_initialize_controls()
1816 imx327->has_init_exp = false; in imx327_initialize_controls()
1826 static int imx327_check_sensor_id(struct imx327 *imx327, in imx327_check_sensor_id() argument
1829 struct device *dev = &imx327->client->dev; in imx327_check_sensor_id()
1843 static int imx327_configure_regulators(struct imx327 *imx327) in imx327_configure_regulators() argument
1848 imx327->supplies[i].supply = imx327_supply_names[i]; in imx327_configure_regulators()
1850 return devm_regulator_bulk_get(&imx327->client->dev, in imx327_configure_regulators()
1852 imx327->supplies); in imx327_configure_regulators()
1860 struct imx327 *imx327; in imx327_probe() local
1871 imx327 = devm_kzalloc(dev, sizeof(*imx327), GFP_KERNEL); in imx327_probe()
1872 if (!imx327) in imx327_probe()
1876 &imx327->module_index); in imx327_probe()
1878 &imx327->module_facing); in imx327_probe()
1880 &imx327->module_name); in imx327_probe()
1882 &imx327->len_name); in imx327_probe()
1894 &imx327->bus_cfg); in imx327_probe()
1895 if (imx327->bus_cfg.bus_type == V4L2_MBUS_CCP2) { in imx327_probe()
1896 imx327->support_modes = lvds_supported_modes; in imx327_probe()
1897 imx327->support_modes_num = ARRAY_SIZE(lvds_supported_modes); in imx327_probe()
1899 imx327->support_modes = mipi_supported_modes; in imx327_probe()
1900 imx327->support_modes_num = ARRAY_SIZE(mipi_supported_modes); in imx327_probe()
1902 imx327->client = client; in imx327_probe()
1903 imx327->cur_mode = &imx327->support_modes[0]; in imx327_probe()
1905 imx327->xvclk = devm_clk_get(dev, "xvclk"); in imx327_probe()
1906 if (IS_ERR(imx327->xvclk)) { in imx327_probe()
1911 imx327->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx327_probe()
1912 if (IS_ERR(imx327->reset_gpio)) in imx327_probe()
1915 imx327->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx327_probe()
1916 if (IS_ERR(imx327->pwdn_gpio)) in imx327_probe()
1919 ret = imx327_configure_regulators(imx327); in imx327_probe()
1925 imx327->pinctrl = devm_pinctrl_get(dev); in imx327_probe()
1926 if (!IS_ERR(imx327->pinctrl)) { in imx327_probe()
1927 imx327->pins_default = in imx327_probe()
1928 pinctrl_lookup_state(imx327->pinctrl, in imx327_probe()
1930 if (IS_ERR(imx327->pins_default)) in imx327_probe()
1933 imx327->pins_sleep = in imx327_probe()
1934 pinctrl_lookup_state(imx327->pinctrl, in imx327_probe()
1936 if (IS_ERR(imx327->pins_sleep)) in imx327_probe()
1940 mutex_init(&imx327->mutex); in imx327_probe()
1942 sd = &imx327->subdev; in imx327_probe()
1944 ret = imx327_initialize_controls(imx327); in imx327_probe()
1948 ret = __imx327_power_on(imx327); in imx327_probe()
1952 ret = imx327_check_sensor_id(imx327, client); in imx327_probe()
1964 imx327->pad.flags = MEDIA_PAD_FL_SOURCE; in imx327_probe()
1966 ret = media_entity_pads_init(&sd->entity, 1, &imx327->pad); in imx327_probe()
1972 if (strcmp(imx327->module_facing, "back") == 0) in imx327_probe()
1978 imx327->module_index, facing, in imx327_probe()
2001 __imx327_power_off(imx327); in imx327_probe()
2003 v4l2_ctrl_handler_free(&imx327->ctrl_handler); in imx327_probe()
2005 mutex_destroy(&imx327->mutex); in imx327_probe()
2013 struct imx327 *imx327 = to_imx327(sd); in imx327_remove() local
2019 v4l2_ctrl_handler_free(&imx327->ctrl_handler); in imx327_remove()
2020 mutex_destroy(&imx327->mutex); in imx327_remove()
2024 __imx327_power_off(imx327); in imx327_remove()