Lines Matching refs:s5k3l6xx

125 struct s5k3l6xx {  struct
158 #define to_s5k3l6xx(sd) container_of(sd, struct s5k3l6xx, subdev) argument
598 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_set_fmt() local
604 mutex_lock(&s5k3l6xx->mutex); in s5k3l6xx_set_fmt()
615 mutex_unlock(&s5k3l6xx->mutex); in s5k3l6xx_set_fmt()
619 s5k3l6xx->cur_mode = mode; in s5k3l6xx_set_fmt()
621 __v4l2_ctrl_modify_range(s5k3l6xx->hblank, h_blank, in s5k3l6xx_set_fmt()
624 __v4l2_ctrl_modify_range(s5k3l6xx->vblank, vblank_def, in s5k3l6xx_set_fmt()
629 __v4l2_ctrl_s_ctrl_int64(s5k3l6xx->pixel_rate, in s5k3l6xx_set_fmt()
631 __v4l2_ctrl_s_ctrl(s5k3l6xx->link_freq, in s5k3l6xx_set_fmt()
635 mutex_unlock(&s5k3l6xx->mutex); in s5k3l6xx_set_fmt()
644 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_get_fmt() local
645 const struct s5k3l6xx_mode *mode = s5k3l6xx->cur_mode; in s5k3l6xx_get_fmt()
647 mutex_lock(&s5k3l6xx->mutex); in s5k3l6xx_get_fmt()
652 mutex_unlock(&s5k3l6xx->mutex); in s5k3l6xx_get_fmt()
661 mutex_unlock(&s5k3l6xx->mutex); in s5k3l6xx_get_fmt()
695 static int s5k3l6xx_enable_test_pattern(struct s5k3l6xx *s5k3l6xx, u32 pattern) in s5k3l6xx_enable_test_pattern() argument
704 return s5k3l6xx_write_reg(s5k3l6xx->client, in s5k3l6xx_enable_test_pattern()
713 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_g_frame_interval() local
714 const struct s5k3l6xx_mode *mode = s5k3l6xx->cur_mode; in s5k3l6xx_g_frame_interval()
716 mutex_lock(&s5k3l6xx->mutex); in s5k3l6xx_g_frame_interval()
718 mutex_unlock(&s5k3l6xx->mutex); in s5k3l6xx_g_frame_interval()
723 static void s5k3l6xx_get_module_inf(struct s5k3l6xx *s5k3l6xx, in s5k3l6xx_get_module_inf() argument
728 strscpy(inf->base.module, s5k3l6xx->module_name, in s5k3l6xx_get_module_inf()
730 strscpy(inf->base.lens, s5k3l6xx->len_name, sizeof(inf->base.lens)); in s5k3l6xx_get_module_inf()
735 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_ioctl() local
741 s5k3l6xx_get_module_inf(s5k3l6xx, (struct rkmodule_inf *)arg); in s5k3l6xx_ioctl()
748 ret = s5k3l6xx_write_reg(s5k3l6xx->client, in s5k3l6xx_ioctl()
753 ret = s5k3l6xx_write_reg(s5k3l6xx->client, in s5k3l6xx_ioctl()
822 static int __s5k3l6xx_start_stream(struct s5k3l6xx *s5k3l6xx) in __s5k3l6xx_start_stream() argument
826 ret = s5k3l6xx_write_array(s5k3l6xx->client, s5k3l6xx->cur_mode->reg_list); in __s5k3l6xx_start_stream()
831 mutex_unlock(&s5k3l6xx->mutex); in __s5k3l6xx_start_stream()
832 ret = v4l2_ctrl_handler_setup(&s5k3l6xx->ctrl_handler); in __s5k3l6xx_start_stream()
833 mutex_lock(&s5k3l6xx->mutex); in __s5k3l6xx_start_stream()
837 s5k3l6xx_write_reg(s5k3l6xx->client, in __s5k3l6xx_start_stream()
841 s5k3l6xx_write_reg(s5k3l6xx->client, in __s5k3l6xx_start_stream()
845 s5k3l6xx_write_reg(s5k3l6xx->client, in __s5k3l6xx_start_stream()
852 static int __s5k3l6xx_stop_stream(struct s5k3l6xx *s5k3l6xx) in __s5k3l6xx_stop_stream() argument
854 return s5k3l6xx_write_reg(s5k3l6xx->client, in __s5k3l6xx_stop_stream()
862 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_s_stream() local
863 struct i2c_client *client = s5k3l6xx->client; in s5k3l6xx_s_stream()
867 s5k3l6xx->cur_mode->width, in s5k3l6xx_s_stream()
868 s5k3l6xx->cur_mode->height, in s5k3l6xx_s_stream()
869 DIV_ROUND_CLOSEST(s5k3l6xx->cur_mode->max_fps.denominator, in s5k3l6xx_s_stream()
870 s5k3l6xx->cur_mode->max_fps.numerator)); in s5k3l6xx_s_stream()
872 mutex_lock(&s5k3l6xx->mutex); in s5k3l6xx_s_stream()
874 if (on == s5k3l6xx->streaming) in s5k3l6xx_s_stream()
884 ret = __s5k3l6xx_start_stream(s5k3l6xx); in s5k3l6xx_s_stream()
891 __s5k3l6xx_stop_stream(s5k3l6xx); in s5k3l6xx_s_stream()
895 s5k3l6xx->streaming = on; in s5k3l6xx_s_stream()
898 mutex_unlock(&s5k3l6xx->mutex); in s5k3l6xx_s_stream()
905 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_s_power() local
906 struct i2c_client *client = s5k3l6xx->client; in s5k3l6xx_s_power()
909 mutex_lock(&s5k3l6xx->mutex); in s5k3l6xx_s_power()
912 if (s5k3l6xx->power_on == !!on) in s5k3l6xx_s_power()
922 s5k3l6xx->power_on = true; in s5k3l6xx_s_power()
925 s5k3l6xx->power_on = false; in s5k3l6xx_s_power()
929 mutex_unlock(&s5k3l6xx->mutex); in s5k3l6xx_s_power()
940 static int __s5k3l6xx_power_on(struct s5k3l6xx *s5k3l6xx) in __s5k3l6xx_power_on() argument
944 struct device *dev = &s5k3l6xx->client->dev; in __s5k3l6xx_power_on()
946 if (!IS_ERR(s5k3l6xx->power_gpio)) in __s5k3l6xx_power_on()
947 gpiod_set_value_cansleep(s5k3l6xx->power_gpio, 1); in __s5k3l6xx_power_on()
951 if (!IS_ERR_OR_NULL(s5k3l6xx->pins_default)) { in __s5k3l6xx_power_on()
952 ret = pinctrl_select_state(s5k3l6xx->pinctrl, in __s5k3l6xx_power_on()
953 s5k3l6xx->pins_default); in __s5k3l6xx_power_on()
957 ret = clk_set_rate(s5k3l6xx->xvclk, S5K3L6XX_XVCLK_FREQ); in __s5k3l6xx_power_on()
960 if (clk_get_rate(s5k3l6xx->xvclk) != S5K3L6XX_XVCLK_FREQ) in __s5k3l6xx_power_on()
962 ret = clk_prepare_enable(s5k3l6xx->xvclk); in __s5k3l6xx_power_on()
967 if (!IS_ERR(s5k3l6xx->reset_gpio)) in __s5k3l6xx_power_on()
968 gpiod_set_value_cansleep(s5k3l6xx->reset_gpio, 0); in __s5k3l6xx_power_on()
970 ret = regulator_bulk_enable(S5K3L6XX_NUM_SUPPLIES, s5k3l6xx->supplies); in __s5k3l6xx_power_on()
976 if (!IS_ERR(s5k3l6xx->reset_gpio)) in __s5k3l6xx_power_on()
977 gpiod_set_value_cansleep(s5k3l6xx->reset_gpio, 1); in __s5k3l6xx_power_on()
980 if (!IS_ERR(s5k3l6xx->pwdn_gpio)) in __s5k3l6xx_power_on()
981 gpiod_set_value_cansleep(s5k3l6xx->pwdn_gpio, 1); in __s5k3l6xx_power_on()
990 clk_disable_unprepare(s5k3l6xx->xvclk); in __s5k3l6xx_power_on()
995 static void __s5k3l6xx_power_off(struct s5k3l6xx *s5k3l6xx) in __s5k3l6xx_power_off() argument
998 struct device *dev = &s5k3l6xx->client->dev; in __s5k3l6xx_power_off()
1000 if (!IS_ERR(s5k3l6xx->pwdn_gpio)) in __s5k3l6xx_power_off()
1001 gpiod_set_value_cansleep(s5k3l6xx->pwdn_gpio, 0); in __s5k3l6xx_power_off()
1002 clk_disable_unprepare(s5k3l6xx->xvclk); in __s5k3l6xx_power_off()
1003 if (!IS_ERR(s5k3l6xx->reset_gpio)) in __s5k3l6xx_power_off()
1004 gpiod_set_value_cansleep(s5k3l6xx->reset_gpio, 0); in __s5k3l6xx_power_off()
1006 if (!IS_ERR_OR_NULL(s5k3l6xx->pins_sleep)) { in __s5k3l6xx_power_off()
1007 ret = pinctrl_select_state(s5k3l6xx->pinctrl, in __s5k3l6xx_power_off()
1008 s5k3l6xx->pins_sleep); in __s5k3l6xx_power_off()
1012 if (!IS_ERR(s5k3l6xx->power_gpio)) in __s5k3l6xx_power_off()
1013 gpiod_set_value_cansleep(s5k3l6xx->power_gpio, 0); in __s5k3l6xx_power_off()
1015 regulator_bulk_disable(S5K3L6XX_NUM_SUPPLIES, s5k3l6xx->supplies); in __s5k3l6xx_power_off()
1022 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_runtime_resume() local
1024 return __s5k3l6xx_power_on(s5k3l6xx); in s5k3l6xx_runtime_resume()
1031 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_runtime_suspend() local
1033 __s5k3l6xx_power_off(s5k3l6xx); in s5k3l6xx_runtime_suspend()
1041 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_open() local
1046 mutex_lock(&s5k3l6xx->mutex); in s5k3l6xx_open()
1053 mutex_unlock(&s5k3l6xx->mutex); in s5k3l6xx_open()
1102 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_get_selection() local
1105 if (s5k3l6xx->cur_mode->width == 2104) { in s5k3l6xx_get_selection()
1106 sel->r.left = CROP_START(s5k3l6xx->cur_mode->width, DST_WIDTH_2096); in s5k3l6xx_get_selection()
1108 sel->r.top = CROP_START(s5k3l6xx->cur_mode->height, DST_HEIGHT_1560); in s5k3l6xx_get_selection()
1111 sel->r.left = CROP_START(s5k3l6xx->cur_mode->width, in s5k3l6xx_get_selection()
1112 s5k3l6xx->cur_mode->width); in s5k3l6xx_get_selection()
1113 sel->r.width = s5k3l6xx->cur_mode->width; in s5k3l6xx_get_selection()
1114 sel->r.top = CROP_START(s5k3l6xx->cur_mode->height, in s5k3l6xx_get_selection()
1115 s5k3l6xx->cur_mode->height); in s5k3l6xx_get_selection()
1116 sel->r.height = s5k3l6xx->cur_mode->height; in s5k3l6xx_get_selection()
1166 struct s5k3l6xx *s5k3l6xx = container_of(ctrl->handler, in s5k3l6xx_set_ctrl() local
1167 struct s5k3l6xx, ctrl_handler); in s5k3l6xx_set_ctrl()
1168 struct i2c_client *client = s5k3l6xx->client; in s5k3l6xx_set_ctrl()
1176 max = s5k3l6xx->cur_mode->height + ctrl->val - 4; in s5k3l6xx_set_ctrl()
1177 __v4l2_ctrl_modify_range(s5k3l6xx->exposure, in s5k3l6xx_set_ctrl()
1178 s5k3l6xx->exposure->minimum, max, in s5k3l6xx_set_ctrl()
1179 s5k3l6xx->exposure->step, in s5k3l6xx_set_ctrl()
1180 s5k3l6xx->exposure->default_value); in s5k3l6xx_set_ctrl()
1190 ret = s5k3l6xx_write_reg(s5k3l6xx->client, in s5k3l6xx_set_ctrl()
1196 ret = s5k3l6xx_write_reg(s5k3l6xx->client, in s5k3l6xx_set_ctrl()
1202 ret = s5k3l6xx_write_reg(s5k3l6xx->client, in s5k3l6xx_set_ctrl()
1205 ctrl->val + s5k3l6xx->cur_mode->height); in s5k3l6xx_set_ctrl()
1208 ret = s5k3l6xx_enable_test_pattern(s5k3l6xx, ctrl->val); in s5k3l6xx_set_ctrl()
1225 static int s5k3l6xx_initialize_controls(struct s5k3l6xx *s5k3l6xx) in s5k3l6xx_initialize_controls() argument
1235 handler = &s5k3l6xx->ctrl_handler; in s5k3l6xx_initialize_controls()
1236 mode = s5k3l6xx->cur_mode; in s5k3l6xx_initialize_controls()
1240 handler->lock = &s5k3l6xx->mutex; in s5k3l6xx_initialize_controls()
1242 s5k3l6xx->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in s5k3l6xx_initialize_controls()
1248 s5k3l6xx->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in s5k3l6xx_initialize_controls()
1253 __v4l2_ctrl_s_ctrl(s5k3l6xx->link_freq, in s5k3l6xx_initialize_controls()
1257 s5k3l6xx->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in s5k3l6xx_initialize_controls()
1259 if (s5k3l6xx->hblank) in s5k3l6xx_initialize_controls()
1260 s5k3l6xx->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in s5k3l6xx_initialize_controls()
1263 s5k3l6xx->vblank = v4l2_ctrl_new_std(handler, &s5k3l6xx_ctrl_ops, in s5k3l6xx_initialize_controls()
1269 s5k3l6xx->exposure = v4l2_ctrl_new_std(handler, &s5k3l6xx_ctrl_ops, in s5k3l6xx_initialize_controls()
1274 s5k3l6xx->anal_gain = v4l2_ctrl_new_std(handler, &s5k3l6xx_ctrl_ops, in s5k3l6xx_initialize_controls()
1279 s5k3l6xx->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in s5k3l6xx_initialize_controls()
1286 dev_err(&s5k3l6xx->client->dev, in s5k3l6xx_initialize_controls()
1291 s5k3l6xx->subdev.ctrl_handler = handler; in s5k3l6xx_initialize_controls()
1301 static int s5k3l6xx_check_sensor_id(struct s5k3l6xx *s5k3l6xx, in s5k3l6xx_check_sensor_id() argument
1304 struct device *dev = &s5k3l6xx->client->dev; in s5k3l6xx_check_sensor_id()
1327 static int s5k3l6xx_configure_regulators(struct s5k3l6xx *s5k3l6xx) in s5k3l6xx_configure_regulators() argument
1332 s5k3l6xx->supplies[i].supply = s5k3l6xx_supply_names[i]; in s5k3l6xx_configure_regulators()
1334 return devm_regulator_bulk_get(&s5k3l6xx->client->dev, in s5k3l6xx_configure_regulators()
1336 s5k3l6xx->supplies); in s5k3l6xx_configure_regulators()
1344 struct s5k3l6xx *s5k3l6xx; in s5k3l6xx_probe() local
1354 s5k3l6xx = devm_kzalloc(dev, sizeof(*s5k3l6xx), GFP_KERNEL); in s5k3l6xx_probe()
1355 if (!s5k3l6xx) in s5k3l6xx_probe()
1359 &s5k3l6xx->module_index); in s5k3l6xx_probe()
1361 &s5k3l6xx->module_facing); in s5k3l6xx_probe()
1363 &s5k3l6xx->module_name); in s5k3l6xx_probe()
1365 &s5k3l6xx->len_name); in s5k3l6xx_probe()
1371 s5k3l6xx->client = client; in s5k3l6xx_probe()
1372 s5k3l6xx->cur_mode = &supported_modes[0]; in s5k3l6xx_probe()
1374 s5k3l6xx->xvclk = devm_clk_get(dev, "xvclk"); in s5k3l6xx_probe()
1375 if (IS_ERR(s5k3l6xx->xvclk)) { in s5k3l6xx_probe()
1380 s5k3l6xx->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in s5k3l6xx_probe()
1381 if (IS_ERR(s5k3l6xx->power_gpio)) in s5k3l6xx_probe()
1384 s5k3l6xx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in s5k3l6xx_probe()
1385 if (IS_ERR(s5k3l6xx->reset_gpio)) in s5k3l6xx_probe()
1388 s5k3l6xx->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in s5k3l6xx_probe()
1389 if (IS_ERR(s5k3l6xx->pwdn_gpio)) in s5k3l6xx_probe()
1392 ret = s5k3l6xx_configure_regulators(s5k3l6xx); in s5k3l6xx_probe()
1398 s5k3l6xx->pinctrl = devm_pinctrl_get(dev); in s5k3l6xx_probe()
1399 if (!IS_ERR(s5k3l6xx->pinctrl)) { in s5k3l6xx_probe()
1400 s5k3l6xx->pins_default = in s5k3l6xx_probe()
1401 pinctrl_lookup_state(s5k3l6xx->pinctrl, in s5k3l6xx_probe()
1403 if (IS_ERR(s5k3l6xx->pins_default)) in s5k3l6xx_probe()
1406 s5k3l6xx->pins_sleep = in s5k3l6xx_probe()
1407 pinctrl_lookup_state(s5k3l6xx->pinctrl, in s5k3l6xx_probe()
1409 if (IS_ERR(s5k3l6xx->pins_sleep)) in s5k3l6xx_probe()
1413 mutex_init(&s5k3l6xx->mutex); in s5k3l6xx_probe()
1415 sd = &s5k3l6xx->subdev; in s5k3l6xx_probe()
1417 ret = s5k3l6xx_initialize_controls(s5k3l6xx); in s5k3l6xx_probe()
1421 ret = __s5k3l6xx_power_on(s5k3l6xx); in s5k3l6xx_probe()
1425 ret = s5k3l6xx_check_sensor_id(s5k3l6xx, client); in s5k3l6xx_probe()
1434 s5k3l6xx->pad.flags = MEDIA_PAD_FL_SOURCE; in s5k3l6xx_probe()
1436 ret = media_entity_pads_init(&sd->entity, 1, &s5k3l6xx->pad); in s5k3l6xx_probe()
1442 if (strcmp(s5k3l6xx->module_facing, "back") == 0) in s5k3l6xx_probe()
1448 s5k3l6xx->module_index, facing, in s5k3l6xx_probe()
1467 __s5k3l6xx_power_off(s5k3l6xx); in s5k3l6xx_probe()
1469 v4l2_ctrl_handler_free(&s5k3l6xx->ctrl_handler); in s5k3l6xx_probe()
1471 mutex_destroy(&s5k3l6xx->mutex); in s5k3l6xx_probe()
1479 struct s5k3l6xx *s5k3l6xx = to_s5k3l6xx(sd); in s5k3l6xx_remove() local
1485 v4l2_ctrl_handler_free(&s5k3l6xx->ctrl_handler); in s5k3l6xx_remove()
1486 mutex_destroy(&s5k3l6xx->mutex); in s5k3l6xx_remove()
1490 __s5k3l6xx_power_off(s5k3l6xx); in s5k3l6xx_remove()