Lines Matching refs:imx317
118 struct imx317 { struct
153 #define to_imx317(sd) container_of(sd, struct imx317, subdev) argument
722 imx317_find_best_fit(struct imx317 *imx317, in imx317_find_best_fit() argument
731 for (i = 0; i < imx317->cfg_num; i++) { in imx317_find_best_fit()
746 struct imx317 *imx317 = to_imx317(sd); in imx317_set_fmt() local
750 mutex_lock(&imx317->mutex); in imx317_set_fmt()
752 mode = imx317_find_best_fit(imx317, fmt); in imx317_set_fmt()
761 mutex_unlock(&imx317->mutex); in imx317_set_fmt()
765 imx317->cur_mode = mode; in imx317_set_fmt()
767 __v4l2_ctrl_modify_range(imx317->hblank, h_blank, in imx317_set_fmt()
770 __v4l2_ctrl_modify_range(imx317->vblank, vblank_def, in imx317_set_fmt()
775 mutex_unlock(&imx317->mutex); in imx317_set_fmt()
784 struct imx317 *imx317 = to_imx317(sd); in imx317_get_fmt() local
785 const struct imx317_mode *mode = imx317->cur_mode; in imx317_get_fmt()
787 mutex_lock(&imx317->mutex); in imx317_get_fmt()
792 mutex_unlock(&imx317->mutex); in imx317_get_fmt()
801 mutex_unlock(&imx317->mutex); in imx317_get_fmt()
821 struct imx317 *imx317 = to_imx317(sd); in imx317_enum_frame_sizes() local
823 if (fse->index >= imx317->cfg_num) in imx317_enum_frame_sizes()
837 static int imx317_enable_test_pattern(struct imx317 *imx317, u32 pattern) in imx317_enable_test_pattern() argument
845 struct imx317 *imx317 = to_imx317(sd); in imx317_g_frame_interval() local
846 const struct imx317_mode *mode = imx317->cur_mode; in imx317_g_frame_interval()
853 static void imx317_get_module_inf(struct imx317 *imx317, in imx317_get_module_inf() argument
858 strlcpy(inf->base.module, imx317->module_name, in imx317_get_module_inf()
860 strlcpy(inf->base.lens, imx317->len_name, sizeof(inf->base.lens)); in imx317_get_module_inf()
865 struct imx317 *imx317 = to_imx317(sd); in imx317_ioctl() local
871 imx317_get_module_inf(imx317, (struct rkmodule_inf *)arg); in imx317_ioctl()
878 imx317_write_reg(imx317->client, IMX317_REG_CTRL_MODE, in imx317_ioctl()
881 imx317_write_reg(imx317->client, IMX317_REG_CTRL_MODE, in imx317_ioctl()
941 static int __imx317_start_stream(struct imx317 *imx317) in __imx317_start_stream() argument
945 ret = imx317_write_array(imx317->client, imx317->cur_mode->reg_list); in __imx317_start_stream()
950 mutex_unlock(&imx317->mutex); in __imx317_start_stream()
951 ret = v4l2_ctrl_handler_setup(&imx317->ctrl_handler); in __imx317_start_stream()
952 mutex_lock(&imx317->mutex); in __imx317_start_stream()
956 return imx317_write_reg(imx317->client, IMX317_REG_CTRL_MODE, in __imx317_start_stream()
960 static int __imx317_stop_stream(struct imx317 *imx317) in __imx317_stop_stream() argument
962 return imx317_write_reg(imx317->client, IMX317_REG_CTRL_MODE, in __imx317_stop_stream()
968 struct imx317 *imx317 = to_imx317(sd); in imx317_s_stream() local
969 struct i2c_client *client = imx317->client; in imx317_s_stream()
973 imx317->cur_mode->width, in imx317_s_stream()
974 imx317->cur_mode->height, in imx317_s_stream()
975 DIV_ROUND_CLOSEST(imx317->cur_mode->max_fps.denominator, in imx317_s_stream()
976 imx317->cur_mode->max_fps.numerator)); in imx317_s_stream()
978 mutex_lock(&imx317->mutex); in imx317_s_stream()
980 if (on == imx317->streaming) in imx317_s_stream()
990 ret = __imx317_start_stream(imx317); in imx317_s_stream()
997 __imx317_stop_stream(imx317); in imx317_s_stream()
1001 imx317->streaming = on; in imx317_s_stream()
1004 mutex_unlock(&imx317->mutex); in imx317_s_stream()
1011 struct imx317 *imx317 = to_imx317(sd); in imx317_s_power() local
1012 struct i2c_client *client = imx317->client; in imx317_s_power()
1015 mutex_lock(&imx317->mutex); in imx317_s_power()
1018 if (imx317->power_on == !!on) in imx317_s_power()
1028 ret = imx317_write_array(imx317->client, imx317_global_regs); in imx317_s_power()
1035 imx317->power_on = true; in imx317_s_power()
1038 imx317->power_on = false; in imx317_s_power()
1042 mutex_unlock(&imx317->mutex); in imx317_s_power()
1053 static int __imx317_power_on(struct imx317 *imx317) in __imx317_power_on() argument
1057 struct device *dev = &imx317->client->dev; in __imx317_power_on()
1059 if (!IS_ERR(imx317->power_gpio)) in __imx317_power_on()
1060 gpiod_set_value_cansleep(imx317->power_gpio, 1); in __imx317_power_on()
1063 if (!IS_ERR_OR_NULL(imx317->pins_default)) { in __imx317_power_on()
1064 ret = pinctrl_select_state(imx317->pinctrl, in __imx317_power_on()
1065 imx317->pins_default); in __imx317_power_on()
1069 ret = clk_set_rate(imx317->xvclk, IMX317_XVCLK_FREQ); in __imx317_power_on()
1072 if (clk_get_rate(imx317->xvclk) != IMX317_XVCLK_FREQ) in __imx317_power_on()
1074 ret = clk_prepare_enable(imx317->xvclk); in __imx317_power_on()
1079 if (!IS_ERR(imx317->reset_gpio)) in __imx317_power_on()
1080 gpiod_set_value_cansleep(imx317->reset_gpio, 0); in __imx317_power_on()
1082 ret = regulator_bulk_enable(IMX317_NUM_SUPPLIES, imx317->supplies); in __imx317_power_on()
1088 if (!IS_ERR(imx317->reset_gpio)) in __imx317_power_on()
1089 gpiod_set_value_cansleep(imx317->reset_gpio, 1); in __imx317_power_on()
1092 if (!IS_ERR(imx317->pwdn_gpio)) in __imx317_power_on()
1093 gpiod_set_value_cansleep(imx317->pwdn_gpio, 1); in __imx317_power_on()
1102 clk_disable_unprepare(imx317->xvclk); in __imx317_power_on()
1107 static void __imx317_power_off(struct imx317 *imx317) in __imx317_power_off() argument
1110 struct device *dev = &imx317->client->dev; in __imx317_power_off()
1112 if (!IS_ERR(imx317->pwdn_gpio)) in __imx317_power_off()
1113 gpiod_set_value_cansleep(imx317->pwdn_gpio, 0); in __imx317_power_off()
1114 clk_disable_unprepare(imx317->xvclk); in __imx317_power_off()
1115 if (!IS_ERR(imx317->reset_gpio)) in __imx317_power_off()
1116 gpiod_set_value_cansleep(imx317->reset_gpio, 0); in __imx317_power_off()
1117 if (!IS_ERR_OR_NULL(imx317->pins_sleep)) { in __imx317_power_off()
1118 ret = pinctrl_select_state(imx317->pinctrl, in __imx317_power_off()
1119 imx317->pins_sleep); in __imx317_power_off()
1123 if (!IS_ERR(imx317->power_gpio)) in __imx317_power_off()
1124 gpiod_set_value_cansleep(imx317->power_gpio, 0); in __imx317_power_off()
1125 regulator_bulk_disable(IMX317_NUM_SUPPLIES, imx317->supplies); in __imx317_power_off()
1132 struct imx317 *imx317 = to_imx317(sd); in imx317_runtime_resume() local
1134 return __imx317_power_on(imx317); in imx317_runtime_resume()
1141 struct imx317 *imx317 = to_imx317(sd); in imx317_runtime_suspend() local
1143 __imx317_power_off(imx317); in imx317_runtime_suspend()
1151 struct imx317 *imx317 = to_imx317(sd); in imx317_open() local
1156 mutex_lock(&imx317->mutex); in imx317_open()
1163 mutex_unlock(&imx317->mutex); in imx317_open()
1174 struct imx317 *imx317 = to_imx317(sd); in imx317_enum_frame_interval() local
1176 if (fie->index >= imx317->cfg_num) in imx317_enum_frame_interval()
1190 struct imx317 *imx317 = to_imx317(sd); in imx317_g_mbus_config() local
1192 val = 1 << (imx317->lane_num - 1) | in imx317_g_mbus_config()
1242 struct imx317 *imx317 = container_of(ctrl->handler, in imx317_set_ctrl() local
1243 struct imx317, ctrl_handler); in imx317_set_ctrl()
1244 struct i2c_client *client = imx317->client; in imx317_set_ctrl()
1254 max = imx317->cur_mode->height + ctrl->val - 4; in imx317_set_ctrl()
1255 __v4l2_ctrl_modify_range(imx317->exposure, in imx317_set_ctrl()
1256 imx317->exposure->minimum, max, in imx317_set_ctrl()
1257 imx317->exposure->step, in imx317_set_ctrl()
1258 imx317->exposure->default_value); in imx317_set_ctrl()
1269 ret = imx317_read_reg(imx317->client, IMX317_REG_VTS_H, in imx317_set_ctrl()
1272 ret |= imx317_read_reg(imx317->client, IMX317_REG_VTS_M, in imx317_set_ctrl()
1275 ret |= imx317_read_reg(imx317->client, IMX317_REG_VTS_L, in imx317_set_ctrl()
1279 ret = imx317_write_reg(imx317->client, in imx317_set_ctrl()
1283 ret |= imx317_write_reg(imx317->client, in imx317_set_ctrl()
1295 ret = imx317_write_reg(imx317->client, IMX317_REG_GAIN_H, in imx317_set_ctrl()
1298 ret |= imx317_write_reg(imx317->client, IMX317_REG_GAIN_L, in imx317_set_ctrl()
1303 val = ctrl->val + imx317->cur_mode->height; in imx317_set_ctrl()
1304 ret = imx317_write_reg(imx317->client, IMX317_REG_VTS_H, in imx317_set_ctrl()
1307 ret |= imx317_write_reg(imx317->client, IMX317_REG_VTS_M, in imx317_set_ctrl()
1310 ret |= imx317_write_reg(imx317->client, IMX317_REG_VTS_L, in imx317_set_ctrl()
1315 ret = imx317_enable_test_pattern(imx317, ctrl->val); in imx317_set_ctrl()
1332 static int imx317_initialize_controls(struct imx317 *imx317) in imx317_initialize_controls() argument
1340 handler = &imx317->ctrl_handler; in imx317_initialize_controls()
1341 mode = imx317->cur_mode; in imx317_initialize_controls()
1345 handler->lock = &imx317->mutex; in imx317_initialize_controls()
1347 imx317->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in imx317_initialize_controls()
1352 0, imx317->pixel_rate, 1, imx317->pixel_rate); in imx317_initialize_controls()
1355 imx317->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx317_initialize_controls()
1357 if (imx317->hblank) in imx317_initialize_controls()
1358 imx317->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx317_initialize_controls()
1361 imx317->vblank = v4l2_ctrl_new_std(handler, &imx317_ctrl_ops, in imx317_initialize_controls()
1367 imx317->exposure = v4l2_ctrl_new_std(handler, &imx317_ctrl_ops, in imx317_initialize_controls()
1372 imx317->anal_gain = v4l2_ctrl_new_std(handler, &imx317_ctrl_ops, in imx317_initialize_controls()
1377 imx317->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in imx317_initialize_controls()
1384 dev_err(&imx317->client->dev, in imx317_initialize_controls()
1389 imx317->subdev.ctrl_handler = handler; in imx317_initialize_controls()
1399 static int imx317_check_sensor_id(struct imx317 *imx317, in imx317_check_sensor_id() argument
1402 struct device *dev = &imx317->client->dev; in imx317_check_sensor_id()
1418 static int imx317_configure_regulators(struct imx317 *imx317) in imx317_configure_regulators() argument
1423 imx317->supplies[i].supply = imx317_supply_names[i]; in imx317_configure_regulators()
1425 return devm_regulator_bulk_get(&imx317->client->dev, in imx317_configure_regulators()
1427 imx317->supplies); in imx317_configure_regulators()
1430 static int imx317_parse_of(struct imx317 *imx317) in imx317_parse_of() argument
1432 struct device *dev = &imx317->client->dev; in imx317_parse_of()
1450 imx317->lane_num = rval; in imx317_parse_of()
1451 if (4 == imx317->lane_num) { in imx317_parse_of()
1452 imx317->cur_mode = &supported_modes_4lane[0]; in imx317_parse_of()
1454 imx317->cfg_num = ARRAY_SIZE(supported_modes_4lane); in imx317_parse_of()
1457 imx317->pixel_rate = MIPI_FREQ * 2U * imx317->lane_num / 10U; in imx317_parse_of()
1459 imx317->lane_num, imx317->pixel_rate); in imx317_parse_of()
1461 imx317->cur_mode = &supported_modes_2lane[0]; in imx317_parse_of()
1463 imx317->cfg_num = ARRAY_SIZE(supported_modes_2lane); in imx317_parse_of()
1466 imx317->pixel_rate = MIPI_FREQ * 2U * (imx317->lane_num) / 10U; in imx317_parse_of()
1468 imx317->lane_num, imx317->pixel_rate); in imx317_parse_of()
1478 struct imx317 *imx317; in imx317_probe() local
1488 imx317 = devm_kzalloc(dev, sizeof(*imx317), GFP_KERNEL); in imx317_probe()
1489 if (!imx317) in imx317_probe()
1493 &imx317->module_index); in imx317_probe()
1495 &imx317->module_facing); in imx317_probe()
1497 &imx317->module_name); in imx317_probe()
1499 &imx317->len_name); in imx317_probe()
1505 imx317->client = client; in imx317_probe()
1506 imx317->cur_mode = &supported_modes[0]; in imx317_probe()
1508 imx317->xvclk = devm_clk_get(dev, "xvclk"); in imx317_probe()
1509 if (IS_ERR(imx317->xvclk)) { in imx317_probe()
1514 imx317->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in imx317_probe()
1515 if (IS_ERR(imx317->power_gpio)) in imx317_probe()
1517 imx317->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx317_probe()
1518 if (IS_ERR(imx317->reset_gpio)) in imx317_probe()
1521 imx317->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx317_probe()
1522 if (IS_ERR(imx317->pwdn_gpio)) in imx317_probe()
1525 ret = imx317_parse_of(imx317); in imx317_probe()
1529 imx317->pinctrl = devm_pinctrl_get(dev); in imx317_probe()
1530 if (!IS_ERR(imx317->pinctrl)) { in imx317_probe()
1531 imx317->pins_default = in imx317_probe()
1532 pinctrl_lookup_state(imx317->pinctrl, in imx317_probe()
1534 if (IS_ERR(imx317->pins_default)) in imx317_probe()
1537 imx317->pins_sleep = in imx317_probe()
1538 pinctrl_lookup_state(imx317->pinctrl, in imx317_probe()
1540 if (IS_ERR(imx317->pins_sleep)) in imx317_probe()
1546 ret = imx317_configure_regulators(imx317); in imx317_probe()
1552 mutex_init(&imx317->mutex); in imx317_probe()
1554 sd = &imx317->subdev; in imx317_probe()
1556 ret = imx317_initialize_controls(imx317); in imx317_probe()
1560 ret = __imx317_power_on(imx317); in imx317_probe()
1564 ret = imx317_check_sensor_id(imx317, client); in imx317_probe()
1574 imx317->pad.flags = MEDIA_PAD_FL_SOURCE; in imx317_probe()
1576 ret = media_entity_pads_init(&sd->entity, 1, &imx317->pad); in imx317_probe()
1582 if (strcmp(imx317->module_facing, "back") == 0) in imx317_probe()
1588 imx317->module_index, facing, in imx317_probe()
1607 __imx317_power_off(imx317); in imx317_probe()
1609 v4l2_ctrl_handler_free(&imx317->ctrl_handler); in imx317_probe()
1611 mutex_destroy(&imx317->mutex); in imx317_probe()
1619 struct imx317 *imx317 = to_imx317(sd); in imx317_remove() local
1625 v4l2_ctrl_handler_free(&imx317->ctrl_handler); in imx317_remove()
1626 mutex_destroy(&imx317->mutex); in imx317_remove()
1630 __imx317_power_off(imx317); in imx317_remove()