Lines Matching refs:imx335
180 struct imx335 { struct
214 #define to_imx335(sd) container_of(sd, struct imx335, subdev) argument
685 imx335_find_best_fit(struct imx335 *imx335, struct v4l2_subdev_format *fmt) in imx335_find_best_fit() argument
693 for (i = 0; i < imx335->cfg_num; i++) { in imx335_find_best_fit()
705 static void imx335_change_mode(struct imx335 *imx335, const struct imx335_mode *mode) in imx335_change_mode() argument
707 imx335->cur_mode = mode; in imx335_change_mode()
708 imx335->cur_vts = imx335->cur_mode->vts_def; in imx335_change_mode()
709 dev_dbg(&imx335->client->dev, "set fmt: cur_mode: %dx%d, hdr: %d\n", in imx335_change_mode()
717 struct imx335 *imx335 = to_imx335(sd); in imx335_set_fmt() local
721 mutex_lock(&imx335->mutex); in imx335_set_fmt()
723 mode = imx335_find_best_fit(imx335, fmt); in imx335_set_fmt()
732 imx335_change_mode(imx335, mode); in imx335_set_fmt()
734 __v4l2_ctrl_modify_range(imx335->hblank, h_blank, in imx335_set_fmt()
737 __v4l2_ctrl_modify_range(imx335->vblank, vblank_def, in imx335_set_fmt()
742 mutex_unlock(&imx335->mutex); in imx335_set_fmt()
751 struct imx335 *imx335 = to_imx335(sd); in imx335_get_fmt() local
752 const struct imx335_mode *mode = imx335->cur_mode; in imx335_get_fmt()
754 mutex_lock(&imx335->mutex); in imx335_get_fmt()
767 mutex_unlock(&imx335->mutex); in imx335_get_fmt()
776 struct imx335 *imx335 = to_imx335(sd); in imx335_enum_mbus_code() local
780 code->code = imx335->cur_mode->bus_fmt; in imx335_enum_mbus_code()
789 struct imx335 *imx335 = to_imx335(sd); in imx335_enum_frame_sizes() local
791 if (fse->index >= imx335->cfg_num) in imx335_enum_frame_sizes()
808 struct imx335 *imx335 = to_imx335(sd); in imx335_g_frame_interval() local
809 const struct imx335_mode *mode = imx335->cur_mode; in imx335_g_frame_interval()
820 struct imx335 *imx335 = to_imx335(sd); in imx335_g_mbus_config() local
821 const struct imx335_mode *mode = imx335->cur_mode; in imx335_g_mbus_config()
836 static void imx335_get_module_inf(struct imx335 *imx335, in imx335_get_module_inf() argument
841 strlcpy(inf->base.module, imx335->module_name, in imx335_get_module_inf()
843 strlcpy(inf->base.lens, imx335->len_name, sizeof(inf->base.lens)); in imx335_get_module_inf()
846 static int imx335_set_hdrae(struct imx335 *imx335, in imx335_set_hdrae() argument
849 struct i2c_client *client = imx335->client; in imx335_set_hdrae()
857 if (!imx335->has_init_exp && !imx335->streaming) { in imx335_set_hdrae()
858 imx335->init_hdrae_exp = *ae; in imx335_set_hdrae()
859 imx335->has_init_exp = true; in imx335_set_hdrae()
860 dev_dbg(&imx335->client->dev, "imx335 is not streaming, save hdr ae!\n"); in imx335_set_hdrae()
873 if (imx335->cur_mode->hdr_mode == HDR_X2) { in imx335_set_hdrae()
912 fsc = imx335->cur_vts; in imx335_set_hdrae()
1005 static int imx335_set_hdrae_3frame(struct imx335 *imx335, in imx335_set_hdrae_3frame() argument
1008 struct i2c_client *client = imx335->client; in imx335_set_hdrae_3frame()
1020 if (!imx335->has_init_exp && !imx335->streaming) { in imx335_set_hdrae_3frame()
1021 imx335->init_hdrae_exp = *ae; in imx335_set_hdrae_3frame()
1022 imx335->has_init_exp = true; in imx335_set_hdrae_3frame()
1023 dev_dbg(&imx335->client->dev, "imx335 is not streaming, save hdr ae!\n"); in imx335_set_hdrae_3frame()
1085 fsc = imx335->cur_vts; in imx335_set_hdrae_3frame()
1253 struct imx335 *imx335 = to_imx335(sd); in imx335_ioctl() local
1261 if (imx335->cur_mode->hdr_mode == HDR_X2) in imx335_ioctl()
1262 ret = imx335_set_hdrae(imx335, arg); in imx335_ioctl()
1263 else if (imx335->cur_mode->hdr_mode == HDR_X3) in imx335_ioctl()
1264 ret = imx335_set_hdrae_3frame(imx335, arg); in imx335_ioctl()
1267 imx335_get_module_inf(imx335, (struct rkmodule_inf *)arg); in imx335_ioctl()
1272 hdr->hdr_mode = imx335->cur_mode->hdr_mode; in imx335_ioctl()
1276 w = imx335->cur_mode->width; in imx335_ioctl()
1277 h = imx335->cur_mode->height; in imx335_ioctl()
1278 for (i = 0; i < imx335->cfg_num; i++) { in imx335_ioctl()
1282 imx335_change_mode(imx335, &supported_modes[i]); in imx335_ioctl()
1286 if (i == imx335->cfg_num) { in imx335_ioctl()
1287 dev_err(&imx335->client->dev, in imx335_ioctl()
1292 w = imx335->cur_mode->hts_def - imx335->cur_mode->width; in imx335_ioctl()
1293 h = imx335->cur_mode->vts_def - imx335->cur_mode->height; in imx335_ioctl()
1294 __v4l2_ctrl_modify_range(imx335->hblank, w, w, 1, w); in imx335_ioctl()
1295 __v4l2_ctrl_modify_range(imx335->vblank, h, in imx335_ioctl()
1296 IMX335_VTS_MAX - imx335->cur_mode->height, in imx335_ioctl()
1305 imx335_write_reg(imx335->client, IMX335_REG_CTRL_MODE, in imx335_ioctl()
1308 imx335_write_reg(imx335->client, IMX335_REG_CTRL_MODE, in imx335_ioctl()
1406 static int __imx335_start_stream(struct imx335 *imx335) in __imx335_start_stream() argument
1410 ret = imx335_write_array(imx335->client, imx335->cur_mode->reg_list); in __imx335_start_stream()
1415 ret = __v4l2_ctrl_handler_setup(&imx335->ctrl_handler); in __imx335_start_stream()
1419 if (imx335->has_init_exp && imx335->cur_mode->hdr_mode != NO_HDR) { in __imx335_start_stream()
1420 ret = imx335_ioctl(&imx335->subdev, PREISP_CMD_SET_HDRAE_EXP, in __imx335_start_stream()
1421 &imx335->init_hdrae_exp); in __imx335_start_stream()
1423 dev_err(&imx335->client->dev, in __imx335_start_stream()
1428 return imx335_write_reg(imx335->client, IMX335_REG_CTRL_MODE, in __imx335_start_stream()
1432 static int __imx335_stop_stream(struct imx335 *imx335) in __imx335_stop_stream() argument
1434 imx335->has_init_exp = false; in __imx335_stop_stream()
1435 return imx335_write_reg(imx335->client, IMX335_REG_CTRL_MODE, in __imx335_stop_stream()
1441 struct imx335 *imx335 = to_imx335(sd); in imx335_s_stream() local
1442 struct i2c_client *client = imx335->client; in imx335_s_stream()
1445 dev_dbg(&imx335->client->dev, "s_stream: %d. %dx%d, hdr: %d, bpp: %d\n", in imx335_s_stream()
1446 on, imx335->cur_mode->width, imx335->cur_mode->height, in imx335_s_stream()
1447 imx335->cur_mode->hdr_mode, imx335->cur_mode->bpp); in imx335_s_stream()
1449 mutex_lock(&imx335->mutex); in imx335_s_stream()
1451 if (on == imx335->streaming) in imx335_s_stream()
1461 ret = __imx335_start_stream(imx335); in imx335_s_stream()
1468 __imx335_stop_stream(imx335); in imx335_s_stream()
1472 imx335->streaming = on; in imx335_s_stream()
1475 mutex_unlock(&imx335->mutex); in imx335_s_stream()
1482 struct imx335 *imx335 = to_imx335(sd); in imx335_s_power() local
1483 struct i2c_client *client = imx335->client; in imx335_s_power()
1486 mutex_lock(&imx335->mutex); in imx335_s_power()
1488 if (imx335->power_on == !!on) in imx335_s_power()
1497 imx335->power_on = true; in imx335_s_power()
1500 imx335->power_on = false; in imx335_s_power()
1504 mutex_unlock(&imx335->mutex); in imx335_s_power()
1509 static int __imx335_power_on(struct imx335 *imx335) in __imx335_power_on() argument
1512 struct device *dev = &imx335->client->dev; in __imx335_power_on()
1514 if (!IS_ERR_OR_NULL(imx335->pins_default)) { in __imx335_power_on()
1515 ret = pinctrl_select_state(imx335->pinctrl, in __imx335_power_on()
1516 imx335->pins_default); in __imx335_power_on()
1521 ret = regulator_bulk_enable(IMX335_NUM_SUPPLIES, imx335->supplies); in __imx335_power_on()
1527 if (!IS_ERR(imx335->reset_gpio)) in __imx335_power_on()
1528 gpiod_set_value_cansleep(imx335->reset_gpio, 1); in __imx335_power_on()
1532 if (!IS_ERR(imx335->reset_gpio)) in __imx335_power_on()
1533 gpiod_set_value_cansleep(imx335->reset_gpio, 0); in __imx335_power_on()
1535 ret = clk_set_rate(imx335->xvclk, IMX335_XVCLK_FREQ_37M); in __imx335_power_on()
1538 if (clk_get_rate(imx335->xvclk) != IMX335_XVCLK_FREQ_37M) in __imx335_power_on()
1540 ret = clk_prepare_enable(imx335->xvclk); in __imx335_power_on()
1552 if (!IS_ERR(imx335->reset_gpio)) in __imx335_power_on()
1553 gpiod_set_value_cansleep(imx335->reset_gpio, 1); in __imx335_power_on()
1554 regulator_bulk_disable(IMX335_NUM_SUPPLIES, imx335->supplies); in __imx335_power_on()
1557 if (!IS_ERR_OR_NULL(imx335->pins_sleep)) in __imx335_power_on()
1558 pinctrl_select_state(imx335->pinctrl, imx335->pins_sleep); in __imx335_power_on()
1563 static void __imx335_power_off(struct imx335 *imx335) in __imx335_power_off() argument
1566 struct device *dev = &imx335->client->dev; in __imx335_power_off()
1568 if (!IS_ERR(imx335->reset_gpio)) in __imx335_power_off()
1569 gpiod_set_value_cansleep(imx335->reset_gpio, 1); in __imx335_power_off()
1570 clk_disable_unprepare(imx335->xvclk); in __imx335_power_off()
1571 if (!IS_ERR_OR_NULL(imx335->pins_sleep)) { in __imx335_power_off()
1572 ret = pinctrl_select_state(imx335->pinctrl, in __imx335_power_off()
1573 imx335->pins_sleep); in __imx335_power_off()
1577 regulator_bulk_disable(IMX335_NUM_SUPPLIES, imx335->supplies); in __imx335_power_off()
1584 struct imx335 *imx335 = to_imx335(sd); in imx335_runtime_resume() local
1586 return __imx335_power_on(imx335); in imx335_runtime_resume()
1593 struct imx335 *imx335 = to_imx335(sd); in imx335_runtime_suspend() local
1595 __imx335_power_off(imx335); in imx335_runtime_suspend()
1602 struct imx335 *imx335 = to_imx335(sd); in imx335_open() local
1607 mutex_lock(&imx335->mutex); in imx335_open()
1614 mutex_unlock(&imx335->mutex); in imx335_open()
1624 struct imx335 *imx335 = to_imx335(sd); in imx335_enum_frame_interval() local
1626 if (fie->index >= imx335->cfg_num) in imx335_enum_frame_interval()
1707 struct imx335 *imx335 = container_of(ctrl->handler, in imx335_set_ctrl() local
1708 struct imx335, ctrl_handler); in imx335_set_ctrl()
1709 struct i2c_client *client = imx335->client; in imx335_set_ctrl()
1718 if (imx335->cur_mode->hdr_mode == NO_HDR) { in imx335_set_ctrl()
1720 max = imx335->cur_mode->height + ctrl->val - SHR0_MIN; in imx335_set_ctrl()
1721 __v4l2_ctrl_modify_range(imx335->exposure, in imx335_set_ctrl()
1722 imx335->exposure->minimum, max, in imx335_set_ctrl()
1723 imx335->exposure->step, in imx335_set_ctrl()
1724 imx335->exposure->default_value); in imx335_set_ctrl()
1734 if (imx335->cur_mode->hdr_mode != NO_HDR) in imx335_set_ctrl()
1736 shr0 = imx335->cur_vts - ctrl->val; in imx335_set_ctrl()
1737 ret = imx335_write_reg(imx335->client, IMX335_LF_EXPO_REG_L, in imx335_set_ctrl()
1740 ret |= imx335_write_reg(imx335->client, IMX335_LF_EXPO_REG_M, in imx335_set_ctrl()
1743 ret |= imx335_write_reg(imx335->client, IMX335_LF_EXPO_REG_H, in imx335_set_ctrl()
1747 shr0, imx335->cur_vts, ctrl->val); in imx335_set_ctrl()
1750 if (imx335->cur_mode->hdr_mode != NO_HDR) in imx335_set_ctrl()
1752 ret = imx335_write_reg(imx335->client, IMX335_LF_GAIN_REG_H, in imx335_set_ctrl()
1755 ret |= imx335_write_reg(imx335->client, IMX335_LF_GAIN_REG_L, in imx335_set_ctrl()
1761 vts = ctrl->val + imx335->cur_mode->height; in imx335_set_ctrl()
1766 if (imx335->cur_mode->hdr_mode == HDR_X2) { in imx335_set_ctrl()
1768 imx335->cur_vts = vts; in imx335_set_ctrl()
1770 } else if (imx335->cur_mode->hdr_mode == HDR_X3) { in imx335_set_ctrl()
1772 imx335->cur_vts = vts; in imx335_set_ctrl()
1775 imx335->cur_vts = vts; in imx335_set_ctrl()
1777 ret = imx335_write_reg(imx335->client, IMX335_VTS_REG_L, in imx335_set_ctrl()
1780 ret |= imx335_write_reg(imx335->client, IMX335_VTS_REG_M, in imx335_set_ctrl()
1783 ret |= imx335_write_reg(imx335->client, IMX335_VTS_REG_H, in imx335_set_ctrl()
1789 ret = imx335_write_reg(imx335->client, IMX335_HREVERSE_REG, in imx335_set_ctrl()
1794 ret = imx335_write_reg(imx335->client, IMX335_VREVERSE_REG, in imx335_set_ctrl()
1796 ret |= imx335_write_reg(imx335->client, 0x3081, in imx335_set_ctrl()
1798 ret |= imx335_write_reg(imx335->client, 0x3083, in imx335_set_ctrl()
1800 ret |= imx335_write_reg(imx335->client, 0x30b6, in imx335_set_ctrl()
1802 ret |= imx335_write_reg(imx335->client, 0x30b7, in imx335_set_ctrl()
1804 ret |= imx335_write_reg(imx335->client, 0x3116, in imx335_set_ctrl()
1806 ret |= imx335_write_reg(imx335->client, 0x3117, in imx335_set_ctrl()
1809 ret = imx335_write_reg(imx335->client, IMX335_VREVERSE_REG, in imx335_set_ctrl()
1811 ret |= imx335_write_reg(imx335->client, 0x3081, in imx335_set_ctrl()
1813 ret |= imx335_write_reg(imx335->client, 0x3083, in imx335_set_ctrl()
1815 ret |= imx335_write_reg(imx335->client, 0x30b6, in imx335_set_ctrl()
1817 ret |= imx335_write_reg(imx335->client, 0x30b7, in imx335_set_ctrl()
1819 ret |= imx335_write_reg(imx335->client, 0x3116, in imx335_set_ctrl()
1821 ret |= imx335_write_reg(imx335->client, 0x3117, in imx335_set_ctrl()
1841 static int imx335_initialize_controls(struct imx335 *imx335) in imx335_initialize_controls() argument
1850 handler = &imx335->ctrl_handler; in imx335_initialize_controls()
1851 mode = imx335->cur_mode; in imx335_initialize_controls()
1855 handler->lock = &imx335->mutex; in imx335_initialize_controls()
1857 imx335->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in imx335_initialize_controls()
1864 imx335->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in imx335_initialize_controls()
1868 imx335->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx335_initialize_controls()
1870 if (imx335->hblank) in imx335_initialize_controls()
1871 imx335->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx335_initialize_controls()
1874 imx335->vblank = v4l2_ctrl_new_std(handler, &imx335_ctrl_ops, in imx335_initialize_controls()
1878 imx335->cur_vts = mode->vts_def; in imx335_initialize_controls()
1881 imx335->exposure = v4l2_ctrl_new_std(handler, &imx335_ctrl_ops, in imx335_initialize_controls()
1886 imx335->anal_a_gain = v4l2_ctrl_new_std(handler, &imx335_ctrl_ops, in imx335_initialize_controls()
1896 dev_err(&imx335->client->dev, in imx335_initialize_controls()
1901 imx335->subdev.ctrl_handler = handler; in imx335_initialize_controls()
1902 imx335->has_init_exp = false; in imx335_initialize_controls()
1912 static int imx335_check_sensor_id(struct imx335 *imx335, in imx335_check_sensor_id() argument
1915 struct device *dev = &imx335->client->dev; in imx335_check_sensor_id()
1931 static int imx335_configure_regulators(struct imx335 *imx335) in imx335_configure_regulators() argument
1936 imx335->supplies[i].supply = imx335_supply_names[i]; in imx335_configure_regulators()
1938 return devm_regulator_bulk_get(&imx335->client->dev, in imx335_configure_regulators()
1940 imx335->supplies); in imx335_configure_regulators()
1948 struct imx335 *imx335; in imx335_probe() local
1959 imx335 = devm_kzalloc(dev, sizeof(*imx335), GFP_KERNEL); in imx335_probe()
1960 if (!imx335) in imx335_probe()
1964 &imx335->module_index); in imx335_probe()
1966 &imx335->module_facing); in imx335_probe()
1968 &imx335->module_name); in imx335_probe()
1970 &imx335->len_name); in imx335_probe()
1981 imx335->client = client; in imx335_probe()
1982 imx335->cfg_num = ARRAY_SIZE(supported_modes); in imx335_probe()
1983 for (i = 0; i < imx335->cfg_num; i++) { in imx335_probe()
1985 imx335->cur_mode = &supported_modes[i]; in imx335_probe()
1990 imx335->xvclk = devm_clk_get(dev, "xvclk"); in imx335_probe()
1991 if (IS_ERR(imx335->xvclk)) { in imx335_probe()
1996 imx335->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx335_probe()
1997 if (IS_ERR(imx335->reset_gpio)) in imx335_probe()
2000 imx335->pinctrl = devm_pinctrl_get(dev); in imx335_probe()
2001 if (!IS_ERR(imx335->pinctrl)) { in imx335_probe()
2002 imx335->pins_default = in imx335_probe()
2003 pinctrl_lookup_state(imx335->pinctrl, in imx335_probe()
2005 if (IS_ERR(imx335->pins_default)) in imx335_probe()
2008 imx335->pins_sleep = in imx335_probe()
2009 pinctrl_lookup_state(imx335->pinctrl, in imx335_probe()
2011 if (IS_ERR(imx335->pins_sleep)) in imx335_probe()
2017 ret = imx335_configure_regulators(imx335); in imx335_probe()
2023 mutex_init(&imx335->mutex); in imx335_probe()
2025 sd = &imx335->subdev; in imx335_probe()
2027 ret = imx335_initialize_controls(imx335); in imx335_probe()
2031 ret = __imx335_power_on(imx335); in imx335_probe()
2035 ret = imx335_check_sensor_id(imx335, client); in imx335_probe()
2044 imx335->pad.flags = MEDIA_PAD_FL_SOURCE; in imx335_probe()
2046 ret = media_entity_pads_init(&sd->entity, 1, &imx335->pad); in imx335_probe()
2052 if (strcmp(imx335->module_facing, "back") == 0) in imx335_probe()
2058 imx335->module_index, facing, in imx335_probe()
2077 __imx335_power_off(imx335); in imx335_probe()
2079 v4l2_ctrl_handler_free(&imx335->ctrl_handler); in imx335_probe()
2081 mutex_destroy(&imx335->mutex); in imx335_probe()
2089 struct imx335 *imx335 = to_imx335(sd); in imx335_remove() local
2095 v4l2_ctrl_handler_free(&imx335->ctrl_handler); in imx335_remove()
2096 mutex_destroy(&imx335->mutex); in imx335_remove()
2100 __imx335_power_off(imx335); in imx335_remove()