Lines Matching refs:imx586
160 struct imx586 { struct
203 #define to_imx586(sd) container_of(sd, struct imx586, subdev) argument
976 imx586_find_best_fit(struct imx586 *imx586, struct v4l2_subdev_format *fmt) in imx586_find_best_fit() argument
984 for (i = 0; i < imx586->cfg_num; i++) { in imx586_find_best_fit()
999 struct imx586 *imx586 = to_imx586(sd); in imx586_set_fmt() local
1004 mutex_lock(&imx586->mutex); in imx586_set_fmt()
1006 mode = imx586_find_best_fit(imx586, fmt); in imx586_set_fmt()
1015 mutex_unlock(&imx586->mutex); in imx586_set_fmt()
1019 imx586->cur_mode = mode; in imx586_set_fmt()
1021 __v4l2_ctrl_modify_range(imx586->hblank, h_blank, in imx586_set_fmt()
1024 __v4l2_ctrl_modify_range(imx586->vblank, vblank_def, in imx586_set_fmt()
1028 __v4l2_ctrl_s_ctrl(imx586->vblank, vblank_def); in imx586_set_fmt()
1029 __v4l2_ctrl_s_ctrl(imx586->link_freq, mode->mipi_freq_idx); in imx586_set_fmt()
1031 __v4l2_ctrl_s_ctrl_int64(imx586->pixel_rate, in imx586_set_fmt()
1035 dev_info(&imx586->client->dev, "%s: mode->mipi_freq_idx(%d)", in imx586_set_fmt()
1038 mutex_unlock(&imx586->mutex); in imx586_set_fmt()
1047 struct imx586 *imx586 = to_imx586(sd); in imx586_get_fmt() local
1048 const struct imx586_mode *mode = imx586->cur_mode; in imx586_get_fmt()
1050 mutex_lock(&imx586->mutex); in imx586_get_fmt()
1055 mutex_unlock(&imx586->mutex); in imx586_get_fmt()
1061 if (imx586->flip & IMX586_MIRROR_BIT_MASK) { in imx586_get_fmt()
1063 if (imx586->flip & IMX586_FLIP_BIT_MASK) in imx586_get_fmt()
1065 } else if (imx586->flip & IMX586_FLIP_BIT_MASK) { in imx586_get_fmt()
1077 mutex_unlock(&imx586->mutex); in imx586_get_fmt()
1086 struct imx586 *imx586 = to_imx586(sd); in imx586_enum_mbus_code() local
1090 code->code = imx586->cur_mode->bus_fmt; in imx586_enum_mbus_code()
1099 struct imx586 *imx586 = to_imx586(sd); in imx586_enum_frame_sizes() local
1101 if (fse->index >= imx586->cfg_num) in imx586_enum_frame_sizes()
1115 static int imx586_enable_test_pattern(struct imx586 *imx586, u32 pattern) in imx586_enable_test_pattern() argument
1124 return imx586_write_reg(imx586->client, in imx586_enable_test_pattern()
1133 struct imx586 *imx586 = to_imx586(sd); in imx586_g_frame_interval() local
1134 const struct imx586_mode *mode = imx586->cur_mode; in imx586_g_frame_interval()
1144 struct imx586 *imx586 = to_imx586(sd); in imx586_g_mbus_config() local
1145 const struct imx586_mode *mode = imx586->cur_mode; in imx586_g_mbus_config()
1244 static void imx586_get_module_inf(struct imx586 *imx586, in imx586_get_module_inf() argument
1247 struct otp_info *otp = imx586->otp; in imx586_get_module_inf()
1251 strscpy(inf->base.module, imx586->module_name, in imx586_get_module_inf()
1253 strscpy(inf->base.lens, imx586->len_name, sizeof(inf->base.lens)); in imx586_get_module_inf()
1259 static int imx586_get_channel_info(struct imx586 *imx586, struct rkmodule_channel_info *ch_info) in imx586_get_channel_info() argument
1261 const struct imx586_mode *mode = imx586->cur_mode; in imx586_get_channel_info()
1266 if (ch_info->index == imx586->spd_id && mode->spd) { in imx586_get_channel_info()
1274 ch_info->vc = imx586->cur_mode->vc[ch_info->index]; in imx586_get_channel_info()
1275 ch_info->width = imx586->cur_mode->width; in imx586_get_channel_info()
1276 ch_info->height = imx586->cur_mode->height; in imx586_get_channel_info()
1277 ch_info->bus_fmt = imx586->cur_mode->bus_fmt; in imx586_get_channel_info()
1284 struct imx586 *imx586 = to_imx586(sd); in imx586_ioctl() local
1295 imx586_get_module_inf(imx586, (struct rkmodule_inf *)arg); in imx586_ioctl()
1300 hdr->hdr_mode = imx586->cur_mode->hdr_mode; in imx586_ioctl()
1304 w = imx586->cur_mode->width; in imx586_ioctl()
1305 h = imx586->cur_mode->height; in imx586_ioctl()
1306 for (i = 0; i < imx586->cfg_num; i++) { in imx586_ioctl()
1310 imx586->cur_mode = &supported_modes[i]; in imx586_ioctl()
1314 if (i == imx586->cfg_num) { in imx586_ioctl()
1315 dev_err(&imx586->client->dev, in imx586_ioctl()
1320 w = imx586->cur_mode->hts_def - in imx586_ioctl()
1321 imx586->cur_mode->width; in imx586_ioctl()
1322 h = imx586->cur_mode->vts_def - in imx586_ioctl()
1323 imx586->cur_mode->height; in imx586_ioctl()
1324 __v4l2_ctrl_modify_range(imx586->hblank, w, w, 1, w); in imx586_ioctl()
1325 __v4l2_ctrl_modify_range(imx586->vblank, h, in imx586_ioctl()
1327 imx586->cur_mode->height, in imx586_ioctl()
1330 if (imx586->cur_mode->bus_fmt == in imx586_ioctl()
1332 imx586->cur_link_freq = 0; in imx586_ioctl()
1333 imx586->cur_pixel_rate = in imx586_ioctl()
1335 } else if (imx586->cur_mode->bus_fmt == in imx586_ioctl()
1337 imx586->cur_link_freq = 0; in imx586_ioctl()
1338 imx586->cur_pixel_rate = in imx586_ioctl()
1342 __v4l2_ctrl_s_ctrl_int64(imx586->pixel_rate, in imx586_ioctl()
1343 imx586->cur_pixel_rate); in imx586_ioctl()
1344 __v4l2_ctrl_s_ctrl(imx586->link_freq, in imx586_ioctl()
1345 imx586->cur_link_freq); in imx586_ioctl()
1353 ret = imx586_write_reg(imx586->client, IMX586_REG_CTRL_MODE, in imx586_ioctl()
1356 ret = imx586_write_reg(imx586->client, IMX586_REG_CTRL_MODE, in imx586_ioctl()
1361 ret = imx586_get_channel_info(imx586, ch_info); in imx586_ioctl()
1485 static int imx586_set_flip(struct imx586 *imx586) in imx586_set_flip() argument
1490 ret = imx586_read_reg(imx586->client, IMX586_FLIP_MIRROR_REG, in imx586_set_flip()
1492 if (imx586->flip & IMX586_MIRROR_BIT_MASK) in imx586_set_flip()
1496 if (imx586->flip & IMX586_FLIP_BIT_MASK) in imx586_set_flip()
1500 ret |= imx586_write_reg(imx586->client, IMX586_FLIP_MIRROR_REG, in imx586_set_flip()
1506 static int __imx586_start_stream(struct imx586 *imx586) in __imx586_start_stream() argument
1510 ret = imx586_write_array(imx586->client, imx586->cur_mode->global_reg_list); in __imx586_start_stream()
1514 ret = imx586_write_array(imx586->client, imx586->cur_mode->reg_list); in __imx586_start_stream()
1517 imx586->cur_vts = imx586->cur_mode->vts_def; in __imx586_start_stream()
1519 ret = __v4l2_ctrl_handler_setup(&imx586->ctrl_handler); in __imx586_start_stream()
1522 if (imx586->has_init_exp && imx586->cur_mode->hdr_mode != NO_HDR) { in __imx586_start_stream()
1523 ret = imx586_ioctl(&imx586->subdev, PREISP_CMD_SET_HDRAE_EXP, in __imx586_start_stream()
1524 &imx586->init_hdrae_exp); in __imx586_start_stream()
1526 dev_err(&imx586->client->dev, in __imx586_start_stream()
1532 imx586_set_flip(imx586); in __imx586_start_stream()
1534 return imx586_write_reg(imx586->client, IMX586_REG_CTRL_MODE, in __imx586_start_stream()
1538 static int __imx586_stop_stream(struct imx586 *imx586) in __imx586_stop_stream() argument
1540 return imx586_write_reg(imx586->client, IMX586_REG_CTRL_MODE, in __imx586_stop_stream()
1546 struct imx586 *imx586 = to_imx586(sd); in imx586_s_stream() local
1547 struct i2c_client *client = imx586->client; in imx586_s_stream()
1551 imx586->cur_mode->width, in imx586_s_stream()
1552 imx586->cur_mode->height, in imx586_s_stream()
1553 DIV_ROUND_CLOSEST(imx586->cur_mode->max_fps.denominator, in imx586_s_stream()
1554 imx586->cur_mode->max_fps.numerator)); in imx586_s_stream()
1556 mutex_lock(&imx586->mutex); in imx586_s_stream()
1558 if (on == imx586->streaming) in imx586_s_stream()
1568 ret = __imx586_start_stream(imx586); in imx586_s_stream()
1575 __imx586_stop_stream(imx586); in imx586_s_stream()
1579 imx586->streaming = on; in imx586_s_stream()
1582 mutex_unlock(&imx586->mutex); in imx586_s_stream()
1589 struct imx586 *imx586 = to_imx586(sd); in imx586_s_power() local
1590 struct i2c_client *client = imx586->client; in imx586_s_power()
1593 mutex_lock(&imx586->mutex); in imx586_s_power()
1596 if (imx586->power_on == !!on) in imx586_s_power()
1606 imx586->power_on = true; in imx586_s_power()
1609 imx586->power_on = false; in imx586_s_power()
1613 mutex_unlock(&imx586->mutex); in imx586_s_power()
1624 static int __imx586_power_on(struct imx586 *imx586) in __imx586_power_on() argument
1628 struct device *dev = &imx586->client->dev; in __imx586_power_on()
1630 ret = clk_set_rate(imx586->xvclk, IMX586_XVCLK_FREQ); in __imx586_power_on()
1635 if (clk_get_rate(imx586->xvclk) != IMX586_XVCLK_FREQ) in __imx586_power_on()
1637 ret = clk_prepare_enable(imx586->xvclk); in __imx586_power_on()
1643 if (!IS_ERR(imx586->reset_gpio)) in __imx586_power_on()
1644 gpiod_set_value_cansleep(imx586->reset_gpio, 0); in __imx586_power_on()
1646 ret = regulator_bulk_enable(IMX586_NUM_SUPPLIES, imx586->supplies); in __imx586_power_on()
1652 if (!IS_ERR(imx586->reset_gpio)) in __imx586_power_on()
1653 gpiod_set_value_cansleep(imx586->reset_gpio, 1); in __imx586_power_on()
1658 if (!IS_ERR(imx586->pwdn_gpio)) in __imx586_power_on()
1659 gpiod_set_value_cansleep(imx586->pwdn_gpio, 1); in __imx586_power_on()
1668 clk_disable_unprepare(imx586->xvclk); in __imx586_power_on()
1673 static void __imx586_power_off(struct imx586 *imx586) in __imx586_power_off() argument
1676 if (!IS_ERR(imx586->pwdn_gpio)) in __imx586_power_off()
1677 gpiod_set_value_cansleep(imx586->pwdn_gpio, 0); in __imx586_power_off()
1678 clk_disable_unprepare(imx586->xvclk); in __imx586_power_off()
1679 if (!IS_ERR(imx586->reset_gpio)) in __imx586_power_off()
1680 gpiod_set_value_cansleep(imx586->reset_gpio, 0); in __imx586_power_off()
1681 regulator_bulk_disable(IMX586_NUM_SUPPLIES, imx586->supplies); in __imx586_power_off()
1688 struct imx586 *imx586 = to_imx586(sd); in imx586_runtime_resume() local
1690 return __imx586_power_on(imx586); in imx586_runtime_resume()
1697 struct imx586 *imx586 = to_imx586(sd); in imx586_runtime_suspend() local
1699 __imx586_power_off(imx586); in imx586_runtime_suspend()
1707 struct imx586 *imx586 = to_imx586(sd); in imx586_open() local
1712 mutex_lock(&imx586->mutex); in imx586_open()
1719 mutex_unlock(&imx586->mutex); in imx586_open()
1730 struct imx586 *imx586 = to_imx586(sd); in imx586_enum_frame_interval() local
1732 if (fie->index >= imx586->cfg_num) in imx586_enum_frame_interval()
1784 struct imx586 *imx586 = container_of(ctrl->handler, in imx586_set_ctrl() local
1785 struct imx586, ctrl_handler); in imx586_set_ctrl()
1786 struct i2c_client *client = imx586->client; in imx586_set_ctrl()
1795 max = imx586->cur_mode->height + ctrl->val - 4; in imx586_set_ctrl()
1796 __v4l2_ctrl_modify_range(imx586->exposure, in imx586_set_ctrl()
1797 imx586->exposure->minimum, max, in imx586_set_ctrl()
1798 imx586->exposure->step, in imx586_set_ctrl()
1799 imx586->exposure->default_value); in imx586_set_ctrl()
1809 ret = imx586_write_reg(imx586->client, in imx586_set_ctrl()
1813 ret |= imx586_write_reg(imx586->client, in imx586_set_ctrl()
1832 ret = imx586_write_reg(imx586->client, IMX586_REG_GAIN_H, in imx586_set_ctrl()
1835 ret |= imx586_write_reg(imx586->client, IMX586_REG_GAIN_L, in imx586_set_ctrl()
1843 ret = imx586_write_reg(imx586->client, in imx586_set_ctrl()
1846 (ctrl->val + imx586->cur_mode->height) in imx586_set_ctrl()
1848 ret |= imx586_write_reg(imx586->client, in imx586_set_ctrl()
1851 (ctrl->val + imx586->cur_mode->height) in imx586_set_ctrl()
1853 imx586->cur_vts = ctrl->val + imx586->cur_mode->height; in imx586_set_ctrl()
1860 imx586->flip |= IMX586_MIRROR_BIT_MASK; in imx586_set_ctrl()
1862 imx586->flip &= ~IMX586_MIRROR_BIT_MASK; in imx586_set_ctrl()
1868 imx586->flip |= IMX586_FLIP_BIT_MASK; in imx586_set_ctrl()
1870 imx586->flip &= ~IMX586_FLIP_BIT_MASK; in imx586_set_ctrl()
1877 ret = imx586_enable_test_pattern(imx586, ctrl->val); in imx586_set_ctrl()
1894 static int imx586_initialize_controls(struct imx586 *imx586) in imx586_initialize_controls() argument
1902 handler = &imx586->ctrl_handler; in imx586_initialize_controls()
1903 mode = imx586->cur_mode; in imx586_initialize_controls()
1907 handler->lock = &imx586->mutex; in imx586_initialize_controls()
1909 imx586->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in imx586_initialize_controls()
1914 if (imx586->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) { in imx586_initialize_controls()
1915 imx586->cur_link_freq = 0; in imx586_initialize_controls()
1916 imx586->cur_pixel_rate = PIXEL_RATE_WITH_848M_10BIT; in imx586_initialize_controls()
1917 } else if (imx586->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB12_1X12) { in imx586_initialize_controls()
1918 imx586->cur_link_freq = 0; in imx586_initialize_controls()
1919 imx586->cur_pixel_rate = PIXEL_RATE_WITH_848M_12BIT; in imx586_initialize_controls()
1922 imx586->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in imx586_initialize_controls()
1925 1, imx586->cur_pixel_rate); in imx586_initialize_controls()
1926 v4l2_ctrl_s_ctrl(imx586->link_freq, in imx586_initialize_controls()
1927 imx586->cur_link_freq); in imx586_initialize_controls()
1930 imx586->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx586_initialize_controls()
1932 if (imx586->hblank) in imx586_initialize_controls()
1933 imx586->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx586_initialize_controls()
1936 imx586->vblank = v4l2_ctrl_new_std(handler, &imx586_ctrl_ops, in imx586_initialize_controls()
1940 imx586->cur_vts = mode->vts_def; in imx586_initialize_controls()
1942 imx586->exposure = v4l2_ctrl_new_std(handler, &imx586_ctrl_ops, in imx586_initialize_controls()
1948 imx586->anal_gain = v4l2_ctrl_new_std(handler, &imx586_ctrl_ops, in imx586_initialize_controls()
1954 imx586->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in imx586_initialize_controls()
1960 imx586->h_flip = v4l2_ctrl_new_std(handler, &imx586_ctrl_ops, in imx586_initialize_controls()
1963 imx586->v_flip = v4l2_ctrl_new_std(handler, &imx586_ctrl_ops, in imx586_initialize_controls()
1965 imx586->flip = 0; in imx586_initialize_controls()
1969 dev_err(&imx586->client->dev, in imx586_initialize_controls()
1974 imx586->subdev.ctrl_handler = handler; in imx586_initialize_controls()
1975 imx586->has_init_exp = false; in imx586_initialize_controls()
1984 static int imx586_check_sensor_id(struct imx586 *imx586, in imx586_check_sensor_id() argument
1987 struct device *dev = &imx586->client->dev; in imx586_check_sensor_id()
2006 static int imx586_configure_regulators(struct imx586 *imx586) in imx586_configure_regulators() argument
2011 imx586->supplies[i].supply = imx586_supply_names[i]; in imx586_configure_regulators()
2013 return devm_regulator_bulk_get(&imx586->client->dev, in imx586_configure_regulators()
2015 imx586->supplies); in imx586_configure_regulators()
2023 struct imx586 *imx586; in imx586_probe() local
2038 imx586 = devm_kzalloc(dev, sizeof(*imx586), GFP_KERNEL); in imx586_probe()
2039 if (!imx586) in imx586_probe()
2043 &imx586->module_index); in imx586_probe()
2045 &imx586->module_facing); in imx586_probe()
2047 &imx586->module_name); in imx586_probe()
2049 &imx586->len_name); in imx586_probe()
2061 imx586->client = client; in imx586_probe()
2062 imx586->cfg_num = ARRAY_SIZE(supported_modes); in imx586_probe()
2063 for (i = 0; i < imx586->cfg_num; i++) { in imx586_probe()
2065 imx586->cur_mode = &supported_modes[i]; in imx586_probe()
2070 if (i == imx586->cfg_num) in imx586_probe()
2071 imx586->cur_mode = &supported_modes[0]; in imx586_probe()
2073 imx586->xvclk = devm_clk_get(dev, "xvclk"); in imx586_probe()
2074 if (IS_ERR(imx586->xvclk)) { in imx586_probe()
2079 imx586->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx586_probe()
2080 if (IS_ERR(imx586->reset_gpio)) in imx586_probe()
2083 imx586->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx586_probe()
2084 if (IS_ERR(imx586->pwdn_gpio)) in imx586_probe()
2089 &imx586->spd_id); in imx586_probe()
2091 imx586->spd_id = PAD_MAX; in imx586_probe()
2096 ret = imx586_configure_regulators(imx586); in imx586_probe()
2102 mutex_init(&imx586->mutex); in imx586_probe()
2104 sd = &imx586->subdev; in imx586_probe()
2107 ret = imx586_initialize_controls(imx586); in imx586_probe()
2111 ret = __imx586_power_on(imx586); in imx586_probe()
2115 ret = imx586_check_sensor_id(imx586, client); in imx586_probe()
2137 imx586->otp = otp_ptr; in imx586_probe()
2139 imx586->otp = NULL; in imx586_probe()
2151 imx586->pad.flags = MEDIA_PAD_FL_SOURCE; in imx586_probe()
2153 ret = media_entity_pads_init(&sd->entity, 1, &imx586->pad); in imx586_probe()
2159 if (strcmp(imx586->module_facing, "back") == 0) in imx586_probe()
2165 imx586->module_index, facing, in imx586_probe()
2184 __imx586_power_off(imx586); in imx586_probe()
2186 v4l2_ctrl_handler_free(&imx586->ctrl_handler); in imx586_probe()
2188 mutex_destroy(&imx586->mutex); in imx586_probe()
2196 struct imx586 *imx586 = to_imx586(sd); in imx586_remove() local
2202 v4l2_ctrl_handler_free(&imx586->ctrl_handler); in imx586_remove()
2203 mutex_destroy(&imx586->mutex); in imx586_remove()
2207 __imx586_power_off(imx586); in imx586_remove()