Lines Matching refs:imx334
162 struct imx334 { struct
199 #define to_imx334(sd) container_of(sd, struct imx334, subdev) argument
705 struct imx334 *imx334 = to_imx334(sd); in imx334_set_fmt() local
711 mutex_lock(&imx334->mutex); in imx334_set_fmt()
725 mutex_unlock(&imx334->mutex); in imx334_set_fmt()
729 imx334->cur_mode = mode; in imx334_set_fmt()
730 imx334->cur_vts = imx334->cur_mode->vts_def; in imx334_set_fmt()
732 __v4l2_ctrl_modify_range(imx334->hblank, h_blank, in imx334_set_fmt()
735 __v4l2_ctrl_modify_range(imx334->vblank, vblank_def, in imx334_set_fmt()
738 if (imx334->cur_vclk_freq != mode->vclk_freq) { in imx334_set_fmt()
739 clk_disable_unprepare(imx334->xvclk); in imx334_set_fmt()
740 ret = clk_set_rate(imx334->xvclk, mode->vclk_freq); in imx334_set_fmt()
741 ret |= clk_prepare_enable(imx334->xvclk); in imx334_set_fmt()
743 dev_err(&imx334->client->dev, "Failed to enable xvclk\n"); in imx334_set_fmt()
744 mutex_unlock(&imx334->mutex); in imx334_set_fmt()
747 imx334->cur_vclk_freq = mode->vclk_freq; in imx334_set_fmt()
749 if (imx334->cur_mipi_freq_idx != mode->mipi_freq_idx) { in imx334_set_fmt()
752 __v4l2_ctrl_s_ctrl_int64(imx334->pixel_rate, in imx334_set_fmt()
754 __v4l2_ctrl_s_ctrl(imx334->link_freq, in imx334_set_fmt()
756 imx334->cur_mipi_freq_idx = mode->mipi_freq_idx; in imx334_set_fmt()
759 mutex_unlock(&imx334->mutex); in imx334_set_fmt()
767 struct imx334 *imx334 = to_imx334(sd); in imx334_get_fmt() local
768 const struct imx334_mode *mode = imx334->cur_mode; in imx334_get_fmt()
770 mutex_lock(&imx334->mutex); in imx334_get_fmt()
775 mutex_unlock(&imx334->mutex); in imx334_get_fmt()
789 mutex_unlock(&imx334->mutex); in imx334_get_fmt()
798 struct imx334 *imx334 = to_imx334(sd); in imx334_enum_mbus_code() local
802 code->code = imx334->cur_mode->bus_fmt; in imx334_enum_mbus_code()
825 static int imx334_enable_test_pattern(struct imx334 *imx334, u32 pattern) in imx334_enable_test_pattern() argument
834 return imx334_write_reg(imx334->client, in imx334_enable_test_pattern()
843 struct imx334 *imx334 = to_imx334(sd); in imx334_g_frame_interval() local
844 const struct imx334_mode *mode = imx334->cur_mode; in imx334_g_frame_interval()
854 struct imx334 *imx334 = to_imx334(sd); in imx334_g_mbus_config() local
855 const struct imx334_mode *mode = imx334->cur_mode; in imx334_g_mbus_config()
867 static void imx334_get_module_inf(struct imx334 *imx334, in imx334_get_module_inf() argument
872 strlcpy(inf->base.module, imx334->module_name, in imx334_get_module_inf()
874 strlcpy(inf->base.lens, imx334->len_name, sizeof(inf->base.lens)); in imx334_get_module_inf()
877 static int imx334_set_hdrae(struct imx334 *imx334, in imx334_set_hdrae() argument
880 struct i2c_client *client = imx334->client; in imx334_set_hdrae()
890 u32 fsc = imx334->cur_vts; in imx334_set_hdrae()
892 if (!imx334->has_init_exp && !imx334->streaming) { in imx334_set_hdrae()
893 imx334->init_hdrae_exp = *ae; in imx334_set_hdrae()
894 imx334->has_init_exp = true; in imx334_set_hdrae()
895 dev_dbg(&imx334->client->dev, "imx334 don't stream, record exp for hdr!\n"); in imx334_set_hdrae()
910 if (imx334->cur_mode->hdr_mode == HDR_X2) { in imx334_set_hdrae()
1011 struct imx334 *imx334 = to_imx334(sd); in imx334_ioctl() local
1021 return imx334_set_hdrae(imx334, arg); in imx334_ioctl()
1023 imx334_get_module_inf(imx334, (struct rkmodule_inf *)arg); in imx334_ioctl()
1028 hdr->hdr_mode = imx334->cur_mode->hdr_mode; in imx334_ioctl()
1032 w = imx334->cur_mode->width; in imx334_ioctl()
1033 h = imx334->cur_mode->height; in imx334_ioctl()
1038 imx334->cur_mode = &supported_modes[i]; in imx334_ioctl()
1043 dev_err(&imx334->client->dev, in imx334_ioctl()
1048 mode = imx334->cur_mode; in imx334_ioctl()
1049 imx334->cur_vts = mode->vts_def; in imx334_ioctl()
1052 __v4l2_ctrl_modify_range(imx334->hblank, w, w, 1, w); in imx334_ioctl()
1053 __v4l2_ctrl_modify_range(imx334->vblank, h, in imx334_ioctl()
1057 if (imx334->cur_vclk_freq != mode->vclk_freq) { in imx334_ioctl()
1058 clk_disable_unprepare(imx334->xvclk); in imx334_ioctl()
1059 ret = clk_set_rate(imx334->xvclk, mode->vclk_freq); in imx334_ioctl()
1060 ret |= clk_prepare_enable(imx334->xvclk); in imx334_ioctl()
1062 dev_err(&imx334->client->dev, "Failed to enable xvclk\n"); in imx334_ioctl()
1065 imx334->cur_vclk_freq = mode->vclk_freq; in imx334_ioctl()
1067 if (imx334->cur_mipi_freq_idx != mode->mipi_freq_idx) { in imx334_ioctl()
1070 __v4l2_ctrl_s_ctrl_int64(imx334->pixel_rate, in imx334_ioctl()
1072 __v4l2_ctrl_s_ctrl(imx334->link_freq, in imx334_ioctl()
1074 imx334->cur_mipi_freq_idx = mode->mipi_freq_idx; in imx334_ioctl()
1083 ret = imx334_write_reg(imx334->client, IMX334_REG_CTRL_MODE, in imx334_ioctl()
1086 ret = imx334_write_reg(imx334->client, IMX334_REG_CTRL_MODE, in imx334_ioctl()
1184 static int __imx334_start_stream(struct imx334 *imx334) in __imx334_start_stream() argument
1188 ret = imx334_write_array(imx334->client, imx334->cur_mode->global_reg_list); in __imx334_start_stream()
1191 ret = imx334_write_array(imx334->client, imx334->cur_mode->reg_list); in __imx334_start_stream()
1195 if (imx334->has_init_exp && imx334->cur_mode->hdr_mode != NO_HDR) { in __imx334_start_stream()
1196 ret = imx334_ioctl(&imx334->subdev, PREISP_CMD_SET_HDRAE_EXP, in __imx334_start_stream()
1197 &imx334->init_hdrae_exp); in __imx334_start_stream()
1199 dev_err(&imx334->client->dev, in __imx334_start_stream()
1204 mutex_unlock(&imx334->mutex); in __imx334_start_stream()
1205 ret = v4l2_ctrl_handler_setup(&imx334->ctrl_handler); in __imx334_start_stream()
1206 mutex_lock(&imx334->mutex); in __imx334_start_stream()
1210 return imx334_write_reg(imx334->client, IMX334_REG_CTRL_MODE, in __imx334_start_stream()
1214 static int __imx334_stop_stream(struct imx334 *imx334) in __imx334_stop_stream() argument
1216 return imx334_write_reg(imx334->client, IMX334_REG_CTRL_MODE, in __imx334_stop_stream()
1222 struct imx334 *imx334 = to_imx334(sd); in imx334_s_stream() local
1223 struct i2c_client *client = imx334->client; in imx334_s_stream()
1226 mutex_lock(&imx334->mutex); in imx334_s_stream()
1228 if (on == imx334->streaming) in imx334_s_stream()
1238 ret = __imx334_start_stream(imx334); in imx334_s_stream()
1245 __imx334_stop_stream(imx334); in imx334_s_stream()
1249 imx334->streaming = on; in imx334_s_stream()
1252 mutex_unlock(&imx334->mutex); in imx334_s_stream()
1259 struct imx334 *imx334 = to_imx334(sd); in imx334_s_power() local
1260 struct i2c_client *client = imx334->client; in imx334_s_power()
1263 mutex_lock(&imx334->mutex); in imx334_s_power()
1266 if (imx334->power_on == !!on) in imx334_s_power()
1276 imx334->power_on = true; in imx334_s_power()
1279 imx334->power_on = false; in imx334_s_power()
1283 mutex_unlock(&imx334->mutex); in imx334_s_power()
1289 static inline u32 imx334_cal_delay(u32 cycles, struct imx334 *imx334) in imx334_cal_delay() argument
1291 if (imx334->cur_mode->vclk_freq == IMX334_XVCLK_FREQ_37) in imx334_cal_delay()
1297 static int __imx334_power_on(struct imx334 *imx334) in __imx334_power_on() argument
1302 struct device *dev = &imx334->client->dev; in __imx334_power_on()
1304 if (!IS_ERR_OR_NULL(imx334->pins_default)) { in __imx334_power_on()
1305 ret = pinctrl_select_state(imx334->pinctrl, in __imx334_power_on()
1306 imx334->pins_default); in __imx334_power_on()
1311 if (imx334->cur_mode->vclk_freq == IMX334_XVCLK_FREQ_37) in __imx334_power_on()
1316 ret = clk_set_rate(imx334->xvclk, vclk_freq); in __imx334_power_on()
1321 if (clk_get_rate(imx334->xvclk) != vclk_freq) in __imx334_power_on()
1323 ret = clk_prepare_enable(imx334->xvclk); in __imx334_power_on()
1329 if (!IS_ERR(imx334->reset_gpio)) in __imx334_power_on()
1330 gpiod_set_value_cansleep(imx334->reset_gpio, 0); in __imx334_power_on()
1332 ret = regulator_bulk_enable(IMX334_NUM_SUPPLIES, imx334->supplies); in __imx334_power_on()
1338 if (!IS_ERR(imx334->reset_gpio)) in __imx334_power_on()
1339 gpiod_set_value_cansleep(imx334->reset_gpio, 1); in __imx334_power_on()
1342 if (!IS_ERR(imx334->pwdn_gpio)) in __imx334_power_on()
1343 gpiod_set_value_cansleep(imx334->pwdn_gpio, 1); in __imx334_power_on()
1346 delay_us = imx334_cal_delay(8192, imx334); in __imx334_power_on()
1352 clk_disable_unprepare(imx334->xvclk); in __imx334_power_on()
1357 static void __imx334_power_off(struct imx334 *imx334) in __imx334_power_off() argument
1359 if (!IS_ERR(imx334->pwdn_gpio)) in __imx334_power_off()
1360 gpiod_set_value_cansleep(imx334->pwdn_gpio, 0); in __imx334_power_off()
1361 clk_disable_unprepare(imx334->xvclk); in __imx334_power_off()
1362 if (!IS_ERR(imx334->reset_gpio)) in __imx334_power_off()
1363 gpiod_set_value_cansleep(imx334->reset_gpio, 0); in __imx334_power_off()
1364 regulator_bulk_disable(IMX334_NUM_SUPPLIES, imx334->supplies); in __imx334_power_off()
1371 struct imx334 *imx334 = to_imx334(sd); in imx334_runtime_resume() local
1373 return __imx334_power_on(imx334); in imx334_runtime_resume()
1380 struct imx334 *imx334 = to_imx334(sd); in imx334_runtime_suspend() local
1382 __imx334_power_off(imx334); in imx334_runtime_suspend()
1390 struct imx334 *imx334 = to_imx334(sd); in imx334_open() local
1395 mutex_lock(&imx334->mutex); in imx334_open()
1402 mutex_unlock(&imx334->mutex); in imx334_open()
1433 struct imx334 *imx334 = to_imx334(sd); in imx334_get_selection() local
1436 sel->r.left = CROP_START(imx334->cur_mode->width, DST_WIDTH); in imx334_get_selection()
1438 sel->r.top = CROP_START(imx334->cur_mode->height, DST_HEIGHT); in imx334_get_selection()
1487 struct imx334 *imx334 = container_of(ctrl->handler, in imx334_set_ctrl() local
1488 struct imx334, ctrl_handler); in imx334_set_ctrl()
1489 struct i2c_client *client = imx334->client; in imx334_set_ctrl()
1500 max = imx334->cur_mode->height + ctrl->val - 4; in imx334_set_ctrl()
1501 __v4l2_ctrl_modify_range(imx334->exposure, in imx334_set_ctrl()
1502 imx334->exposure->minimum, max, in imx334_set_ctrl()
1503 imx334->exposure->step, in imx334_set_ctrl()
1504 imx334->exposure->default_value); in imx334_set_ctrl()
1513 shr0 = imx334->cur_vts - ctrl->val; in imx334_set_ctrl()
1515 ret = imx334_write_reg(imx334->client, in imx334_set_ctrl()
1519 ret |= imx334_write_reg(imx334->client, in imx334_set_ctrl()
1523 ret |= imx334_write_reg(imx334->client, in imx334_set_ctrl()
1529 ret = imx334_write_reg(imx334->client, in imx334_set_ctrl()
1534 vts = ctrl->val + imx334->cur_mode->height; in imx334_set_ctrl()
1539 if (imx334->cur_mode->hdr_mode == HDR_X2) { in imx334_set_ctrl()
1541 imx334->cur_vts = vts; in imx334_set_ctrl()
1544 imx334->cur_vts = vts; in imx334_set_ctrl()
1546 ret = imx334_write_reg(imx334->client, in imx334_set_ctrl()
1550 ret |= imx334_write_reg(imx334->client, in imx334_set_ctrl()
1554 ret |= imx334_write_reg(imx334->client, in imx334_set_ctrl()
1560 ret = imx334_enable_test_pattern(imx334, ctrl->val); in imx334_set_ctrl()
1563 ret = imx334_write_reg(imx334->client, IMX334_HREVERSE_REG, in imx334_set_ctrl()
1569 ret = imx334_write_reg(imx334->client, IMX334_VREVERSE_REG, in imx334_set_ctrl()
1571 ret |= imx334_write_reg(imx334->client, 0x3080, in imx334_set_ctrl()
1573 ret |= imx334_write_reg(imx334->client, 0x309b, in imx334_set_ctrl()
1576 ret = imx334_write_reg(imx334->client, IMX334_VREVERSE_REG, in imx334_set_ctrl()
1578 ret |= imx334_write_reg(imx334->client, 0x3080, in imx334_set_ctrl()
1580 ret |= imx334_write_reg(imx334->client, 0x309b, in imx334_set_ctrl()
1599 static int imx334_initialize_controls(struct imx334 *imx334) in imx334_initialize_controls() argument
1608 handler = &imx334->ctrl_handler; in imx334_initialize_controls()
1609 mode = imx334->cur_mode; in imx334_initialize_controls()
1613 handler->lock = &imx334->mutex; in imx334_initialize_controls()
1615 imx334->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in imx334_initialize_controls()
1622 imx334->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in imx334_initialize_controls()
1626 v4l2_ctrl_s_ctrl(imx334->link_freq, in imx334_initialize_controls()
1628 imx334->cur_mipi_freq_idx = mode->mipi_freq_idx; in imx334_initialize_controls()
1629 imx334->cur_vclk_freq = mode->vclk_freq; in imx334_initialize_controls()
1632 imx334->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx334_initialize_controls()
1634 if (imx334->hblank) in imx334_initialize_controls()
1635 imx334->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx334_initialize_controls()
1638 imx334->vblank = v4l2_ctrl_new_std(handler, &imx334_ctrl_ops, in imx334_initialize_controls()
1642 imx334->cur_vts = mode->vts_def; in imx334_initialize_controls()
1644 imx334->exposure = v4l2_ctrl_new_std(handler, &imx334_ctrl_ops, in imx334_initialize_controls()
1651 imx334->anal_gain = v4l2_ctrl_new_std(handler, &imx334_ctrl_ops, in imx334_initialize_controls()
1658 imx334->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in imx334_initialize_controls()
1669 dev_err(&imx334->client->dev, in imx334_initialize_controls()
1674 imx334->subdev.ctrl_handler = handler; in imx334_initialize_controls()
1675 imx334->has_init_exp = false; in imx334_initialize_controls()
1684 static int imx334_check_sensor_id(struct imx334 *imx334, in imx334_check_sensor_id() argument
1687 struct device *dev = &imx334->client->dev; in imx334_check_sensor_id()
1709 static int imx334_configure_regulators(struct imx334 *imx334) in imx334_configure_regulators() argument
1714 imx334->supplies[i].supply = imx334_supply_names[i]; in imx334_configure_regulators()
1716 return devm_regulator_bulk_get(&imx334->client->dev, in imx334_configure_regulators()
1718 imx334->supplies); in imx334_configure_regulators()
1726 struct imx334 *imx334; in imx334_probe() local
1737 imx334 = devm_kzalloc(dev, sizeof(*imx334), GFP_KERNEL); in imx334_probe()
1738 if (!imx334) in imx334_probe()
1743 &imx334->module_index); in imx334_probe()
1745 &imx334->module_facing); in imx334_probe()
1747 &imx334->module_name); in imx334_probe()
1749 &imx334->len_name); in imx334_probe()
1755 imx334->client = client; in imx334_probe()
1758 imx334->cur_mode = &supported_modes[i]; in imx334_probe()
1763 imx334->cur_mode = &supported_modes[0]; in imx334_probe()
1765 imx334->xvclk = devm_clk_get(dev, "xvclk"); in imx334_probe()
1766 if (IS_ERR(imx334->xvclk)) { in imx334_probe()
1771 imx334->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx334_probe()
1772 if (IS_ERR(imx334->reset_gpio)) in imx334_probe()
1775 imx334->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx334_probe()
1776 if (IS_ERR(imx334->pwdn_gpio)) in imx334_probe()
1779 imx334->pinctrl = devm_pinctrl_get(dev); in imx334_probe()
1780 if (!IS_ERR(imx334->pinctrl)) { in imx334_probe()
1781 imx334->pins_default = in imx334_probe()
1782 pinctrl_lookup_state(imx334->pinctrl, in imx334_probe()
1784 if (IS_ERR(imx334->pins_default)) in imx334_probe()
1787 imx334->pins_sleep = in imx334_probe()
1788 pinctrl_lookup_state(imx334->pinctrl, in imx334_probe()
1790 if (IS_ERR(imx334->pins_sleep)) in imx334_probe()
1796 ret = imx334_configure_regulators(imx334); in imx334_probe()
1802 mutex_init(&imx334->mutex); in imx334_probe()
1804 sd = &imx334->subdev; in imx334_probe()
1807 ret = imx334_initialize_controls(imx334); in imx334_probe()
1811 ret = __imx334_power_on(imx334); in imx334_probe()
1815 ret = imx334_check_sensor_id(imx334, client); in imx334_probe()
1824 imx334->pad.flags = MEDIA_PAD_FL_SOURCE; in imx334_probe()
1826 ret = media_entity_pads_init(&sd->entity, 1, &imx334->pad); in imx334_probe()
1832 if (strcmp(imx334->module_facing, "back") == 0) in imx334_probe()
1838 imx334->module_index, facing, in imx334_probe()
1857 __imx334_power_off(imx334); in imx334_probe()
1859 v4l2_ctrl_handler_free(&imx334->ctrl_handler); in imx334_probe()
1861 mutex_destroy(&imx334->mutex); in imx334_probe()
1869 struct imx334 *imx334 = to_imx334(sd); in imx334_remove() local
1875 v4l2_ctrl_handler_free(&imx334->ctrl_handler); in imx334_remove()
1876 mutex_destroy(&imx334->mutex); in imx334_remove()
1880 __imx334_power_off(imx334); in imx334_remove()