Lines Matching refs:imx214
122 struct imx214 { struct
162 #define to_imx214(sd) container_of(sd, struct imx214, subdev) argument
732 imx214_find_best_fit(struct imx214 *imx214, struct v4l2_subdev_format *fmt) in imx214_find_best_fit() argument
740 for (i = 0; i < imx214->cfg_num; i++) { in imx214_find_best_fit()
741 dist = imx214_get_reso_dist(&imx214->support_modes[i], framefmt); in imx214_find_best_fit()
748 return &imx214->support_modes[cur_best_fit]; in imx214_find_best_fit()
755 struct imx214 *imx214 = to_imx214(sd); in imx214_set_fmt() local
759 u32 lane_num = imx214->bus_cfg.bus.mipi_csi2.num_data_lanes; in imx214_set_fmt()
761 mutex_lock(&imx214->mutex); in imx214_set_fmt()
763 mode = imx214_find_best_fit(imx214, fmt); in imx214_set_fmt()
772 mutex_unlock(&imx214->mutex); in imx214_set_fmt()
776 imx214->cur_mode = mode; in imx214_set_fmt()
778 __v4l2_ctrl_modify_range(imx214->hblank, h_blank, in imx214_set_fmt()
781 __v4l2_ctrl_modify_range(imx214->vblank, vblank_def, in imx214_set_fmt()
786 __v4l2_ctrl_s_ctrl_int64(imx214->pixel_rate, in imx214_set_fmt()
788 __v4l2_ctrl_s_ctrl(imx214->link_freq, in imx214_set_fmt()
792 mutex_unlock(&imx214->mutex); in imx214_set_fmt()
801 struct imx214 *imx214 = to_imx214(sd); in imx214_get_fmt() local
802 const struct imx214_mode *mode = imx214->cur_mode; in imx214_get_fmt()
804 mutex_lock(&imx214->mutex); in imx214_get_fmt()
809 mutex_unlock(&imx214->mutex); in imx214_get_fmt()
818 mutex_unlock(&imx214->mutex); in imx214_get_fmt()
838 struct imx214 *imx214 = to_imx214(sd); in imx214_enum_frame_sizes() local
840 if (fse->index >= imx214->cfg_num) in imx214_enum_frame_sizes()
846 fse->min_width = imx214->support_modes[fse->index].width; in imx214_enum_frame_sizes()
847 fse->max_width = imx214->support_modes[fse->index].width; in imx214_enum_frame_sizes()
848 fse->max_height = imx214->support_modes[fse->index].height; in imx214_enum_frame_sizes()
849 fse->min_height = imx214->support_modes[fse->index].height; in imx214_enum_frame_sizes()
854 static int imx214_enable_test_pattern(struct imx214 *imx214, u32 pattern) in imx214_enable_test_pattern() argument
863 return imx214_write_reg(imx214->client, in imx214_enable_test_pattern()
872 struct imx214 *imx214 = to_imx214(sd); in imx214_g_frame_interval() local
873 const struct imx214_mode *mode = imx214->cur_mode; in imx214_g_frame_interval()
941 static void imx214_get_module_inf(struct imx214 *imx214, in imx214_get_module_inf() argument
944 struct imx214_otp_info *otp = imx214->otp; in imx214_get_module_inf()
948 strscpy(inf->base.module, imx214->module_name, in imx214_get_module_inf()
950 strscpy(inf->base.lens, imx214->len_name, sizeof(inf->base.lens)); in imx214_get_module_inf()
955 static void imx214_set_awb_cfg(struct imx214 *imx214, in imx214_set_awb_cfg() argument
958 mutex_lock(&imx214->mutex); in imx214_set_awb_cfg()
959 memcpy(&imx214->awb_cfg, cfg, sizeof(*cfg)); in imx214_set_awb_cfg()
960 mutex_unlock(&imx214->mutex); in imx214_set_awb_cfg()
963 static void imx214_set_lsc_cfg(struct imx214 *imx214, in imx214_set_lsc_cfg() argument
966 mutex_lock(&imx214->mutex); in imx214_set_lsc_cfg()
967 memcpy(&imx214->lsc_cfg, cfg, sizeof(*cfg)); in imx214_set_lsc_cfg()
968 mutex_unlock(&imx214->mutex); in imx214_set_lsc_cfg()
973 struct imx214 *imx214 = to_imx214(sd); in imx214_ioctl() local
979 imx214_get_module_inf(imx214, (struct rkmodule_inf *)arg); in imx214_ioctl()
982 imx214_set_awb_cfg(imx214, (struct rkmodule_awb_cfg *)arg); in imx214_ioctl()
985 imx214_set_lsc_cfg(imx214, (struct rkmodule_lsc_cfg *)arg); in imx214_ioctl()
992 ret = imx214_write_reg(imx214->client, in imx214_ioctl()
997 ret = imx214_write_reg(imx214->client, in imx214_ioctl()
1081 static int imx214_apply_otp(struct imx214 *imx214) in imx214_apply_otp() argument
1084 struct i2c_client *client = imx214->client; in imx214_apply_otp()
1085 struct imx214_otp_info *otp_ptr = imx214->otp; in imx214_apply_otp()
1086 struct rkmodule_awb_cfg *awb_cfg = &imx214->awb_cfg; in imx214_apply_otp()
1087 struct rkmodule_lsc_cfg *lsc_cfg = &imx214->lsc_cfg; in imx214_apply_otp()
1196 static int __imx214_start_stream(struct imx214 *imx214) in __imx214_start_stream() argument
1200 ret = imx214_write_array(imx214->client, imx214->cur_mode->reg_list); in __imx214_start_stream()
1205 mutex_unlock(&imx214->mutex); in __imx214_start_stream()
1206 ret = v4l2_ctrl_handler_setup(&imx214->ctrl_handler); in __imx214_start_stream()
1207 mutex_lock(&imx214->mutex); in __imx214_start_stream()
1211 ret = imx214_apply_otp(imx214); in __imx214_start_stream()
1215 return imx214_write_reg(imx214->client, in __imx214_start_stream()
1221 static int __imx214_stop_stream(struct imx214 *imx214) in __imx214_stop_stream() argument
1223 return imx214_write_reg(imx214->client, in __imx214_stop_stream()
1231 struct imx214 *imx214 = to_imx214(sd); in imx214_s_stream() local
1232 struct i2c_client *client = imx214->client; in imx214_s_stream()
1236 imx214->cur_mode->width, in imx214_s_stream()
1237 imx214->cur_mode->height, in imx214_s_stream()
1238 DIV_ROUND_CLOSEST(imx214->cur_mode->max_fps.denominator, in imx214_s_stream()
1239 imx214->cur_mode->max_fps.numerator)); in imx214_s_stream()
1242 mutex_lock(&imx214->mutex); in imx214_s_stream()
1244 if (on == imx214->streaming) in imx214_s_stream()
1254 ret = __imx214_start_stream(imx214); in imx214_s_stream()
1261 __imx214_stop_stream(imx214); in imx214_s_stream()
1265 imx214->streaming = on; in imx214_s_stream()
1268 mutex_unlock(&imx214->mutex); in imx214_s_stream()
1275 struct imx214 *imx214 = to_imx214(sd); in imx214_s_power() local
1276 struct i2c_client *client = imx214->client; in imx214_s_power()
1279 mutex_lock(&imx214->mutex); in imx214_s_power()
1282 if (imx214->power_on == !!on) in imx214_s_power()
1292 ret = imx214_write_array(imx214->client, imx214_global_regs); in imx214_s_power()
1299 imx214->power_on = true; in imx214_s_power()
1302 imx214->power_on = false; in imx214_s_power()
1306 mutex_unlock(&imx214->mutex); in imx214_s_power()
1317 static int __imx214_power_on(struct imx214 *imx214) in __imx214_power_on() argument
1321 struct device *dev = &imx214->client->dev; in __imx214_power_on()
1323 if (!IS_ERR(imx214->power_gpio)) in __imx214_power_on()
1324 gpiod_set_value_cansleep(imx214->power_gpio, 1); in __imx214_power_on()
1328 if (!IS_ERR_OR_NULL(imx214->pins_default)) { in __imx214_power_on()
1329 ret = pinctrl_select_state(imx214->pinctrl, in __imx214_power_on()
1330 imx214->pins_default); in __imx214_power_on()
1334 ret = clk_set_rate(imx214->xvclk, IMX214_XVCLK_FREQ); in __imx214_power_on()
1337 if (clk_get_rate(imx214->xvclk) != IMX214_XVCLK_FREQ) in __imx214_power_on()
1339 ret = clk_prepare_enable(imx214->xvclk); in __imx214_power_on()
1344 if (!IS_ERR(imx214->reset_gpio)) in __imx214_power_on()
1345 gpiod_set_value_cansleep(imx214->reset_gpio, 0); in __imx214_power_on()
1347 ret = regulator_bulk_enable(IMX214_NUM_SUPPLIES, imx214->supplies); in __imx214_power_on()
1353 if (!IS_ERR(imx214->reset_gpio)) in __imx214_power_on()
1354 gpiod_set_value_cansleep(imx214->reset_gpio, 1); in __imx214_power_on()
1357 if (!IS_ERR(imx214->pwdn_gpio)) in __imx214_power_on()
1358 gpiod_set_value_cansleep(imx214->pwdn_gpio, 1); in __imx214_power_on()
1367 clk_disable_unprepare(imx214->xvclk); in __imx214_power_on()
1372 static void __imx214_power_off(struct imx214 *imx214) in __imx214_power_off() argument
1375 struct device *dev = &imx214->client->dev; in __imx214_power_off()
1377 if (!IS_ERR(imx214->pwdn_gpio)) in __imx214_power_off()
1378 gpiod_set_value_cansleep(imx214->pwdn_gpio, 0); in __imx214_power_off()
1379 clk_disable_unprepare(imx214->xvclk); in __imx214_power_off()
1380 if (!IS_ERR(imx214->reset_gpio)) in __imx214_power_off()
1381 gpiod_set_value_cansleep(imx214->reset_gpio, 0); in __imx214_power_off()
1383 if (!IS_ERR_OR_NULL(imx214->pins_sleep)) { in __imx214_power_off()
1384 ret = pinctrl_select_state(imx214->pinctrl, in __imx214_power_off()
1385 imx214->pins_sleep); in __imx214_power_off()
1389 if (!IS_ERR(imx214->power_gpio)) in __imx214_power_off()
1390 gpiod_set_value_cansleep(imx214->power_gpio, 0); in __imx214_power_off()
1392 regulator_bulk_disable(IMX214_NUM_SUPPLIES, imx214->supplies); in __imx214_power_off()
1399 struct imx214 *imx214 = to_imx214(sd); in imx214_runtime_resume() local
1401 return __imx214_power_on(imx214); in imx214_runtime_resume()
1408 struct imx214 *imx214 = to_imx214(sd); in imx214_runtime_suspend() local
1410 __imx214_power_off(imx214); in imx214_runtime_suspend()
1418 struct imx214 *imx214 = to_imx214(sd); in imx214_open() local
1421 const struct imx214_mode *def_mode = &imx214->support_modes[0]; in imx214_open()
1423 mutex_lock(&imx214->mutex); in imx214_open()
1430 mutex_unlock(&imx214->mutex); in imx214_open()
1441 struct imx214 *imx214 = to_imx214(sd); in imx214_enum_frame_interval() local
1443 if (fie->index >= imx214->cfg_num) in imx214_enum_frame_interval()
1447 fie->width = imx214->support_modes[fie->index].width; in imx214_enum_frame_interval()
1448 fie->height = imx214->support_modes[fie->index].height; in imx214_enum_frame_interval()
1449 fie->interval = imx214->support_modes[fie->index].max_fps; in imx214_enum_frame_interval()
1457 struct imx214 *imx214 = to_imx214(sd); in imx214_g_mbus_config() local
1458 u32 lane_num = imx214->bus_cfg.bus.mipi_csi2.num_data_lanes; in imx214_g_mbus_config()
1479 struct imx214 *imx214 = to_imx214(sd); in imx214_get_selection() local
1482 if (imx214->cur_mode->width == 2104) { in imx214_get_selection()
1483 sel->r.left = CROP_START(imx214->cur_mode->width, DST_WIDTH_2096); in imx214_get_selection()
1485 sel->r.top = CROP_START(imx214->cur_mode->height, DST_HEIGHT_1560); in imx214_get_selection()
1488 sel->r.left = CROP_START(imx214->cur_mode->width, in imx214_get_selection()
1489 imx214->cur_mode->width); in imx214_get_selection()
1490 sel->r.width = imx214->cur_mode->width; in imx214_get_selection()
1491 sel->r.top = CROP_START(imx214->cur_mode->height, in imx214_get_selection()
1492 imx214->cur_mode->height); in imx214_get_selection()
1493 sel->r.height = imx214->cur_mode->height; in imx214_get_selection()
1541 static int imx214_set_gain_reg(struct imx214 *imx214, u32 a_gain) in imx214_set_gain_reg() argument
1550 ret = imx214_write_reg(imx214->client, in imx214_set_gain_reg()
1554 ret |= imx214_write_reg(imx214->client, in imx214_set_gain_reg()
1563 struct imx214 *imx214 = container_of(ctrl->handler, in imx214_set_ctrl() local
1564 struct imx214, ctrl_handler); in imx214_set_ctrl()
1565 struct i2c_client *client = imx214->client; in imx214_set_ctrl()
1573 max = imx214->cur_mode->height + ctrl->val - 4; in imx214_set_ctrl()
1574 __v4l2_ctrl_modify_range(imx214->exposure, in imx214_set_ctrl()
1575 imx214->exposure->minimum, max, in imx214_set_ctrl()
1576 imx214->exposure->step, in imx214_set_ctrl()
1577 imx214->exposure->default_value); in imx214_set_ctrl()
1587 ret = imx214_write_reg(imx214->client, in imx214_set_ctrl()
1593 ret = imx214_set_gain_reg(imx214, ctrl->val); in imx214_set_ctrl()
1596 ret = imx214_write_reg(imx214->client, in imx214_set_ctrl()
1599 ctrl->val + imx214->cur_mode->height); in imx214_set_ctrl()
1602 ret = imx214_enable_test_pattern(imx214, ctrl->val); in imx214_set_ctrl()
1619 static int imx214_initialize_controls(struct imx214 *imx214) in imx214_initialize_controls() argument
1627 u32 lane_num = imx214->bus_cfg.bus.mipi_csi2.num_data_lanes; in imx214_initialize_controls()
1629 handler = &imx214->ctrl_handler; in imx214_initialize_controls()
1630 mode = imx214->cur_mode; in imx214_initialize_controls()
1634 handler->lock = &imx214->mutex; in imx214_initialize_controls()
1636 imx214->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in imx214_initialize_controls()
1642 imx214->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in imx214_initialize_controls()
1647 __v4l2_ctrl_s_ctrl(imx214->link_freq, in imx214_initialize_controls()
1651 imx214->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx214_initialize_controls()
1653 if (imx214->hblank) in imx214_initialize_controls()
1654 imx214->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx214_initialize_controls()
1657 imx214->vblank = v4l2_ctrl_new_std(handler, &imx214_ctrl_ops, in imx214_initialize_controls()
1663 imx214->exposure = v4l2_ctrl_new_std(handler, &imx214_ctrl_ops, in imx214_initialize_controls()
1668 imx214->anal_gain = v4l2_ctrl_new_std(handler, &imx214_ctrl_ops, in imx214_initialize_controls()
1673 imx214->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in imx214_initialize_controls()
1680 dev_err(&imx214->client->dev, in imx214_initialize_controls()
1685 imx214->subdev.ctrl_handler = handler; in imx214_initialize_controls()
1695 static int imx214_check_sensor_id(struct imx214 *imx214, in imx214_check_sensor_id() argument
1698 struct device *dev = &imx214->client->dev; in imx214_check_sensor_id()
1714 static int imx214_configure_regulators(struct imx214 *imx214) in imx214_configure_regulators() argument
1719 imx214->supplies[i].supply = imx214_supply_names[i]; in imx214_configure_regulators()
1721 return devm_regulator_bulk_get(&imx214->client->dev, in imx214_configure_regulators()
1723 imx214->supplies); in imx214_configure_regulators()
1731 struct imx214 *imx214; in imx214_probe() local
1746 imx214 = devm_kzalloc(dev, sizeof(*imx214), GFP_KERNEL); in imx214_probe()
1747 if (!imx214) in imx214_probe()
1751 &imx214->module_index); in imx214_probe()
1753 &imx214->module_facing); in imx214_probe()
1755 &imx214->module_name); in imx214_probe()
1757 &imx214->len_name); in imx214_probe()
1763 imx214->client = client; in imx214_probe()
1770 &imx214->bus_cfg); in imx214_probe()
1775 if (imx214->bus_cfg.bus.mipi_csi2.num_data_lanes == 4) { in imx214_probe()
1776 imx214->support_modes = supported_modes_4lane; in imx214_probe()
1777 imx214->cfg_num = ARRAY_SIZE(supported_modes_4lane); in imx214_probe()
1779 imx214->support_modes = supported_modes_2lane; in imx214_probe()
1780 imx214->cfg_num = ARRAY_SIZE(supported_modes_2lane); in imx214_probe()
1782 imx214->cur_mode = &imx214->support_modes[0]; in imx214_probe()
1784 imx214->xvclk = devm_clk_get(dev, "xvclk"); in imx214_probe()
1785 if (IS_ERR(imx214->xvclk)) { in imx214_probe()
1790 imx214->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in imx214_probe()
1791 if (IS_ERR(imx214->power_gpio)) in imx214_probe()
1794 imx214->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx214_probe()
1795 if (IS_ERR(imx214->reset_gpio)) in imx214_probe()
1798 imx214->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx214_probe()
1799 if (IS_ERR(imx214->pwdn_gpio)) in imx214_probe()
1802 ret = imx214_configure_regulators(imx214); in imx214_probe()
1808 imx214->pinctrl = devm_pinctrl_get(dev); in imx214_probe()
1809 if (!IS_ERR(imx214->pinctrl)) { in imx214_probe()
1810 imx214->pins_default = in imx214_probe()
1811 pinctrl_lookup_state(imx214->pinctrl, in imx214_probe()
1813 if (IS_ERR(imx214->pins_default)) in imx214_probe()
1816 imx214->pins_sleep = in imx214_probe()
1817 pinctrl_lookup_state(imx214->pinctrl, in imx214_probe()
1819 if (IS_ERR(imx214->pins_sleep)) in imx214_probe()
1823 mutex_init(&imx214->mutex); in imx214_probe()
1825 sd = &imx214->subdev; in imx214_probe()
1827 ret = imx214_initialize_controls(imx214); in imx214_probe()
1831 ret = __imx214_power_on(imx214); in imx214_probe()
1835 ret = imx214_check_sensor_id(imx214, client); in imx214_probe()
1859 imx214->otp = otp_ptr; in imx214_probe()
1861 imx214->otp = NULL; in imx214_probe()
1874 imx214->pad.flags = MEDIA_PAD_FL_SOURCE; in imx214_probe()
1876 ret = media_entity_pads_init(&sd->entity, 1, &imx214->pad); in imx214_probe()
1882 if (strcmp(imx214->module_facing, "back") == 0) in imx214_probe()
1888 imx214->module_index, facing, in imx214_probe()
1907 __imx214_power_off(imx214); in imx214_probe()
1909 v4l2_ctrl_handler_free(&imx214->ctrl_handler); in imx214_probe()
1911 mutex_destroy(&imx214->mutex); in imx214_probe()
1919 struct imx214 *imx214 = to_imx214(sd); in imx214_remove() local
1925 v4l2_ctrl_handler_free(&imx214->ctrl_handler); in imx214_remove()
1926 mutex_destroy(&imx214->mutex); in imx214_remove()
1930 __imx214_power_off(imx214); in imx214_remove()