Lines Matching refs:imx258
120 struct imx258 { struct
159 #define to_imx258(sd) container_of(sd, struct imx258, subdev) argument
829 struct imx258 *imx258 = to_imx258(sd); in imx258_set_fmt() local
833 mutex_lock(&imx258->mutex); in imx258_set_fmt()
844 mutex_unlock(&imx258->mutex); in imx258_set_fmt()
848 imx258->cur_mode = mode; in imx258_set_fmt()
850 __v4l2_ctrl_modify_range(imx258->hblank, h_blank, in imx258_set_fmt()
853 __v4l2_ctrl_modify_range(imx258->vblank, vblank_def, in imx258_set_fmt()
857 __v4l2_ctrl_s_ctrl(imx258->link_freq, in imx258_set_fmt()
859 __v4l2_ctrl_s_ctrl_int64(imx258->pixel_rate, in imx258_set_fmt()
862 __v4l2_ctrl_s_ctrl(imx258->link_freq, in imx258_set_fmt()
864 __v4l2_ctrl_s_ctrl_int64(imx258->pixel_rate, in imx258_set_fmt()
868 mutex_unlock(&imx258->mutex); in imx258_set_fmt()
877 struct imx258 *imx258 = to_imx258(sd); in imx258_get_fmt() local
878 const struct imx258_mode *mode = imx258->cur_mode; in imx258_get_fmt()
880 mutex_lock(&imx258->mutex); in imx258_get_fmt()
885 mutex_unlock(&imx258->mutex); in imx258_get_fmt()
894 if (fmt->pad == imx258->spd_id && mode->spd) { in imx258_get_fmt()
900 } else if (fmt->pad == imx258->ebd_id && mode->ebd) { in imx258_get_fmt()
908 mutex_unlock(&imx258->mutex); in imx258_get_fmt()
942 static int imx258_enable_test_pattern(struct imx258 *imx258, u32 pattern) in imx258_enable_test_pattern() argument
951 return imx258_write_reg(imx258->client, in imx258_enable_test_pattern()
960 struct imx258 *imx258 = to_imx258(sd); in imx258_g_frame_interval() local
961 const struct imx258_mode *mode = imx258->cur_mode; in imx258_g_frame_interval()
1030 static void imx258_get_module_inf(struct imx258 *imx258, in imx258_get_module_inf() argument
1033 struct imx258_otp_info *otp = imx258->otp; in imx258_get_module_inf()
1037 imx258->module_name, in imx258_get_module_inf()
1039 strscpy(inf->base.lens, imx258->len_name, sizeof(inf->base.lens)); in imx258_get_module_inf()
1044 static void imx258_set_awb_cfg(struct imx258 *imx258, in imx258_set_awb_cfg() argument
1047 mutex_lock(&imx258->mutex); in imx258_set_awb_cfg()
1048 memcpy(&imx258->awb_cfg, cfg, sizeof(*cfg)); in imx258_set_awb_cfg()
1049 mutex_unlock(&imx258->mutex); in imx258_set_awb_cfg()
1052 static void imx258_set_lsc_cfg(struct imx258 *imx258, in imx258_set_lsc_cfg() argument
1055 mutex_lock(&imx258->mutex); in imx258_set_lsc_cfg()
1056 memcpy(&imx258->lsc_cfg, cfg, sizeof(*cfg)); in imx258_set_lsc_cfg()
1057 mutex_unlock(&imx258->mutex); in imx258_set_lsc_cfg()
1062 struct imx258 *imx258 = to_imx258(sd); in imx258_ioctl() local
1070 imx258_get_module_inf(imx258, (struct rkmodule_inf *)arg); in imx258_ioctl()
1073 imx258_set_awb_cfg(imx258, (struct rkmodule_awb_cfg *)arg); in imx258_ioctl()
1076 imx258_set_lsc_cfg(imx258, (struct rkmodule_lsc_cfg *)arg); in imx258_ioctl()
1083 ret = imx258_write_reg(imx258->client, in imx258_ioctl()
1088 ret = imx258_write_reg(imx258->client, in imx258_ioctl()
1095 w = imx258->cur_mode->width; in imx258_ioctl()
1096 h = imx258->cur_mode->height; in imx258_ioctl()
1097 for (i = 0; i < imx258->cfg_num; i++) { in imx258_ioctl()
1101 imx258->cur_mode = &supported_modes[i]; in imx258_ioctl()
1105 if (i == imx258->cfg_num) { in imx258_ioctl()
1106 dev_err(&imx258->client->dev, in imx258_ioctl()
1111 w = imx258->cur_mode->hts_def - imx258->cur_mode->width; in imx258_ioctl()
1112 h = imx258->cur_mode->vts_def - imx258->cur_mode->height; in imx258_ioctl()
1113 __v4l2_ctrl_modify_range(imx258->hblank, w, w, 1, w); in imx258_ioctl()
1114 __v4l2_ctrl_modify_range(imx258->vblank, h, in imx258_ioctl()
1115 IMX258_VTS_MAX - imx258->cur_mode->height, in imx258_ioctl()
1117 dev_info(&imx258->client->dev, in imx258_ioctl()
1119 imx258->cur_mode->hdr_mode); in imx258_ioctl()
1125 hdr_cfg->hdr_mode = imx258->cur_mode->hdr_mode; in imx258_ioctl()
1240 static int imx258_apply_otp(struct imx258 *imx258) in imx258_apply_otp() argument
1243 struct i2c_client *client = imx258->client; in imx258_apply_otp()
1244 struct imx258_otp_info *otp_ptr = imx258->otp; in imx258_apply_otp()
1245 struct rkmodule_awb_cfg *awb_cfg = &imx258->awb_cfg; in imx258_apply_otp()
1246 struct rkmodule_lsc_cfg *lsc_cfg = &imx258->lsc_cfg; in imx258_apply_otp()
1345 static int __imx258_start_stream(struct imx258 *imx258) in __imx258_start_stream() argument
1349 ret = imx258_write_array(imx258->client, imx258->cur_mode->reg_list); in __imx258_start_stream()
1354 mutex_unlock(&imx258->mutex); in __imx258_start_stream()
1355 ret = v4l2_ctrl_handler_setup(&imx258->ctrl_handler); in __imx258_start_stream()
1356 mutex_lock(&imx258->mutex); in __imx258_start_stream()
1359 if (imx258->otp) { in __imx258_start_stream()
1360 ret = imx258_apply_otp(imx258); in __imx258_start_stream()
1364 if (imx258->cur_mode->width == 4208 && in __imx258_start_stream()
1365 imx258->cur_mode->height == 3120 && in __imx258_start_stream()
1366 imx258->cur_mode->spd != NULL && in __imx258_start_stream()
1367 imx258->spd_id < PAD_MAX) { in __imx258_start_stream()
1368 ret = imx258_write_array(imx258->client, imx258_4208_3120_spd_reg); in __imx258_start_stream()
1372 return imx258_write_reg(imx258->client, in __imx258_start_stream()
1378 static int __imx258_stop_stream(struct imx258 *imx258) in __imx258_stop_stream() argument
1380 return imx258_write_reg(imx258->client, in __imx258_stop_stream()
1388 struct imx258 *imx258 = to_imx258(sd); in imx258_s_stream() local
1389 struct i2c_client *client = imx258->client; in imx258_s_stream()
1392 mutex_lock(&imx258->mutex); in imx258_s_stream()
1394 if (on == imx258->streaming) in imx258_s_stream()
1404 ret = __imx258_start_stream(imx258); in imx258_s_stream()
1411 __imx258_stop_stream(imx258); in imx258_s_stream()
1415 imx258->streaming = on; in imx258_s_stream()
1418 mutex_unlock(&imx258->mutex); in imx258_s_stream()
1425 struct imx258 *imx258 = to_imx258(sd); in imx258_s_power() local
1426 struct i2c_client *client = imx258->client; in imx258_s_power()
1429 mutex_lock(&imx258->mutex); in imx258_s_power()
1432 if (imx258->power_on == !!on) in imx258_s_power()
1442 ret = imx258_write_array(imx258->client, imx258_global_regs); in imx258_s_power()
1449 imx258->power_on = true; in imx258_s_power()
1452 imx258->power_on = false; in imx258_s_power()
1456 mutex_unlock(&imx258->mutex); in imx258_s_power()
1467 static int __imx258_power_on(struct imx258 *imx258) in __imx258_power_on() argument
1471 struct device *dev = &imx258->client->dev; in __imx258_power_on()
1473 if (!IS_ERR_OR_NULL(imx258->pins_default)) { in __imx258_power_on()
1474 ret = pinctrl_select_state(imx258->pinctrl, in __imx258_power_on()
1475 imx258->pins_default); in __imx258_power_on()
1479 ret = clk_set_rate(imx258->xvclk, IMX258_XVCLK_FREQ); in __imx258_power_on()
1482 if (clk_get_rate(imx258->xvclk) != IMX258_XVCLK_FREQ) in __imx258_power_on()
1484 ret = clk_prepare_enable(imx258->xvclk); in __imx258_power_on()
1489 if (!IS_ERR(imx258->reset_gpio)) in __imx258_power_on()
1490 gpiod_set_value_cansleep(imx258->reset_gpio, 1); in __imx258_power_on()
1492 ret = regulator_bulk_enable(IMX258_NUM_SUPPLIES, imx258->supplies); in __imx258_power_on()
1498 if (!IS_ERR(imx258->reset_gpio)) in __imx258_power_on()
1499 gpiod_set_value_cansleep(imx258->reset_gpio, 0); in __imx258_power_on()
1502 if (!IS_ERR(imx258->pwdn_gpio)) in __imx258_power_on()
1503 gpiod_set_value_cansleep(imx258->pwdn_gpio, 0); in __imx258_power_on()
1512 clk_disable_unprepare(imx258->xvclk); in __imx258_power_on()
1517 static void __imx258_power_off(struct imx258 *imx258) in __imx258_power_off() argument
1521 if (!IS_ERR(imx258->pwdn_gpio)) in __imx258_power_off()
1522 gpiod_set_value_cansleep(imx258->pwdn_gpio, 1); in __imx258_power_off()
1523 clk_disable_unprepare(imx258->xvclk); in __imx258_power_off()
1524 if (!IS_ERR(imx258->reset_gpio)) in __imx258_power_off()
1525 gpiod_set_value_cansleep(imx258->reset_gpio, 1); in __imx258_power_off()
1526 if (!IS_ERR_OR_NULL(imx258->pins_sleep)) { in __imx258_power_off()
1527 ret = pinctrl_select_state(imx258->pinctrl, in __imx258_power_off()
1528 imx258->pins_sleep); in __imx258_power_off()
1530 dev_dbg(&imx258->client->dev, "could not set pins\n"); in __imx258_power_off()
1532 regulator_bulk_disable(IMX258_NUM_SUPPLIES, imx258->supplies); in __imx258_power_off()
1539 struct imx258 *imx258 = to_imx258(sd); in imx258_runtime_resume() local
1541 return __imx258_power_on(imx258); in imx258_runtime_resume()
1548 struct imx258 *imx258 = to_imx258(sd); in imx258_runtime_suspend() local
1550 __imx258_power_off(imx258); in imx258_runtime_suspend()
1558 struct imx258 *imx258 = to_imx258(sd); in imx258_open() local
1563 mutex_lock(&imx258->mutex); in imx258_open()
1570 mutex_unlock(&imx258->mutex); in imx258_open()
1645 static int imx258_set_gain_reg(struct imx258 *imx258, u32 a_gain) in imx258_set_gain_reg() argument
1654 ret = imx258_write_reg(imx258->client, in imx258_set_gain_reg()
1658 ret |= imx258_write_reg(imx258->client, in imx258_set_gain_reg()
1667 struct imx258 *imx258 = container_of(ctrl->handler, in imx258_set_ctrl() local
1668 struct imx258, ctrl_handler); in imx258_set_ctrl()
1669 struct i2c_client *client = imx258->client; in imx258_set_ctrl()
1677 max = imx258->cur_mode->height + ctrl->val - 4; in imx258_set_ctrl()
1678 __v4l2_ctrl_modify_range(imx258->exposure, in imx258_set_ctrl()
1679 imx258->exposure->minimum, max, in imx258_set_ctrl()
1680 imx258->exposure->step, in imx258_set_ctrl()
1681 imx258->exposure->default_value); in imx258_set_ctrl()
1691 ret = imx258_write_reg(imx258->client, in imx258_set_ctrl()
1697 ret = imx258_set_gain_reg(imx258, ctrl->val); in imx258_set_ctrl()
1700 ret = imx258_write_reg(imx258->client, in imx258_set_ctrl()
1703 ctrl->val + imx258->cur_mode->height); in imx258_set_ctrl()
1706 ret = imx258_enable_test_pattern(imx258, ctrl->val); in imx258_set_ctrl()
1723 static int imx258_initialize_controls(struct imx258 *imx258) in imx258_initialize_controls() argument
1731 handler = &imx258->ctrl_handler; in imx258_initialize_controls()
1732 mode = imx258->cur_mode; in imx258_initialize_controls()
1736 handler->lock = &imx258->mutex; in imx258_initialize_controls()
1738 imx258->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in imx258_initialize_controls()
1742 imx258->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in imx258_initialize_controls()
1747 imx258->hblank = v4l2_ctrl_new_std(handler, NULL, in imx258_initialize_controls()
1749 if (imx258->hblank) in imx258_initialize_controls()
1750 imx258->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx258_initialize_controls()
1753 imx258->vblank = v4l2_ctrl_new_std(handler, &imx258_ctrl_ops, in imx258_initialize_controls()
1759 imx258->exposure = v4l2_ctrl_new_std(handler, &imx258_ctrl_ops, in imx258_initialize_controls()
1764 imx258->anal_gain = v4l2_ctrl_new_std(handler, &imx258_ctrl_ops, in imx258_initialize_controls()
1769 imx258->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in imx258_initialize_controls()
1776 dev_err(&imx258->client->dev, in imx258_initialize_controls()
1781 imx258->subdev.ctrl_handler = handler; in imx258_initialize_controls()
1791 static int imx258_check_sensor_id(struct imx258 *imx258, in imx258_check_sensor_id() argument
1794 struct device *dev = &imx258->client->dev; in imx258_check_sensor_id()
1808 static int imx258_configure_regulators(struct imx258 *imx258) in imx258_configure_regulators() argument
1813 imx258->supplies[i].supply = imx258_supply_names[i]; in imx258_configure_regulators()
1815 return devm_regulator_bulk_get(&imx258->client->dev, in imx258_configure_regulators()
1817 imx258->supplies); in imx258_configure_regulators()
1825 struct imx258 *imx258; in imx258_probe() local
1839 imx258 = devm_kzalloc(dev, sizeof(*imx258), GFP_KERNEL); in imx258_probe()
1840 if (!imx258) in imx258_probe()
1844 &imx258->module_index); in imx258_probe()
1846 &imx258->module_facing); in imx258_probe()
1848 &imx258->module_name); in imx258_probe()
1850 &imx258->len_name); in imx258_probe()
1856 imx258->client = client; in imx258_probe()
1857 imx258->cfg_num = ARRAY_SIZE(supported_modes); in imx258_probe()
1858 imx258->cur_mode = &supported_modes[0]; in imx258_probe()
1860 imx258->xvclk = devm_clk_get(dev, "xvclk"); in imx258_probe()
1861 if (IS_ERR(imx258->xvclk)) { in imx258_probe()
1866 imx258->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx258_probe()
1867 if (IS_ERR(imx258->reset_gpio)) in imx258_probe()
1870 imx258->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx258_probe()
1871 if (IS_ERR(imx258->pwdn_gpio)) in imx258_probe()
1876 &imx258->spd_id); in imx258_probe()
1878 imx258->spd_id = PAD_MAX; in imx258_probe()
1884 &imx258->ebd_id); in imx258_probe()
1886 imx258->ebd_id = PAD_MAX; in imx258_probe()
1891 ret = imx258_configure_regulators(imx258); in imx258_probe()
1897 imx258->pinctrl = devm_pinctrl_get(dev); in imx258_probe()
1898 if (!IS_ERR(imx258->pinctrl)) { in imx258_probe()
1899 imx258->pins_default = in imx258_probe()
1900 pinctrl_lookup_state(imx258->pinctrl, in imx258_probe()
1902 if (IS_ERR(imx258->pins_default)) in imx258_probe()
1905 imx258->pins_sleep = in imx258_probe()
1906 pinctrl_lookup_state(imx258->pinctrl, in imx258_probe()
1908 if (IS_ERR(imx258->pins_sleep)) in imx258_probe()
1912 mutex_init(&imx258->mutex); in imx258_probe()
1914 sd = &imx258->subdev; in imx258_probe()
1916 ret = imx258_initialize_controls(imx258); in imx258_probe()
1920 ret = __imx258_power_on(imx258); in imx258_probe()
1924 ret = imx258_check_sensor_id(imx258, client); in imx258_probe()
1947 imx258->otp = otp_ptr; in imx258_probe()
1949 imx258->otp = NULL; in imx258_probe()
1963 imx258->pad.flags = MEDIA_PAD_FL_SOURCE; in imx258_probe()
1965 ret = media_entity_pads_init(&sd->entity, 1, &imx258->pad); in imx258_probe()
1971 if (strcmp(imx258->module_facing, "back") == 0) in imx258_probe()
1977 imx258->module_index, facing, in imx258_probe()
1996 __imx258_power_off(imx258); in imx258_probe()
1998 v4l2_ctrl_handler_free(&imx258->ctrl_handler); in imx258_probe()
2000 mutex_destroy(&imx258->mutex); in imx258_probe()
2008 struct imx258 *imx258 = to_imx258(sd); in imx258_remove() local
2014 v4l2_ctrl_handler_free(&imx258->ctrl_handler); in imx258_remove()
2015 mutex_destroy(&imx258->mutex); in imx258_remove()
2019 __imx258_power_off(imx258); in imx258_remove()