Lines Matching refs:sc223a

126 struct sc223a {  struct
162 #define to_sc223a(sd) container_of(sd, struct sc223a, subdev) argument
462 static int sc223a_set_gain_reg(struct sc223a *sc223a, u32 gain) in sc223a_set_gain_reg() argument
464 struct i2c_client *client = sc223a->client; in sc223a_set_gain_reg()
515 ret = sc223a_write_reg(sc223a->client, in sc223a_set_gain_reg()
519 ret |= sc223a_write_reg(sc223a->client, in sc223a_set_gain_reg()
523 ret |= sc223a_write_reg(sc223a->client, in sc223a_set_gain_reg()
562 struct sc223a *sc223a = to_sc223a(sd); in sc223a_set_fmt() local
566 mutex_lock(&sc223a->mutex); in sc223a_set_fmt()
577 mutex_unlock(&sc223a->mutex); in sc223a_set_fmt()
581 sc223a->cur_mode = mode; in sc223a_set_fmt()
583 __v4l2_ctrl_modify_range(sc223a->hblank, h_blank, in sc223a_set_fmt()
586 __v4l2_ctrl_modify_range(sc223a->vblank, vblank_def, in sc223a_set_fmt()
589 sc223a->cur_fps = mode->max_fps; in sc223a_set_fmt()
592 mutex_unlock(&sc223a->mutex); in sc223a_set_fmt()
601 struct sc223a *sc223a = to_sc223a(sd); in sc223a_get_fmt() local
602 const struct sc223a_mode *mode = sc223a->cur_mode; in sc223a_get_fmt()
604 mutex_lock(&sc223a->mutex); in sc223a_get_fmt()
609 mutex_unlock(&sc223a->mutex); in sc223a_get_fmt()
623 mutex_unlock(&sc223a->mutex); in sc223a_get_fmt()
632 struct sc223a *sc223a = to_sc223a(sd); in sc223a_enum_mbus_code() local
636 code->code = sc223a->cur_mode->bus_fmt; in sc223a_enum_mbus_code()
659 static int sc223a_enable_test_pattern(struct sc223a *sc223a, u32 pattern) in sc223a_enable_test_pattern() argument
664 ret = sc223a_read_reg(sc223a->client, SC223A_REG_TEST_PATTERN, in sc223a_enable_test_pattern()
671 ret |= sc223a_write_reg(sc223a->client, SC223A_REG_TEST_PATTERN, in sc223a_enable_test_pattern()
679 struct sc223a *sc223a = to_sc223a(sd); in sc223a_g_frame_interval() local
680 const struct sc223a_mode *mode = sc223a->cur_mode; in sc223a_g_frame_interval()
682 if (sc223a->streaming) in sc223a_g_frame_interval()
683 fi->interval = sc223a->cur_fps; in sc223a_g_frame_interval()
694 struct sc223a *sc223a = to_sc223a(sd); in sc223a_g_mbus_config() local
695 const struct sc223a_mode *mode = sc223a->cur_mode; in sc223a_g_mbus_config()
712 static void sc223a_get_module_inf(struct sc223a *sc223a, in sc223a_get_module_inf() argument
717 strscpy(inf->base.module, sc223a->module_name, in sc223a_get_module_inf()
719 strscpy(inf->base.lens, sc223a->len_name, sizeof(inf->base.lens)); in sc223a_get_module_inf()
724 struct sc223a *sc223a = to_sc223a(sd); in sc223a_ioctl() local
732 sc223a_get_module_inf(sc223a, (struct rkmodule_inf *)arg); in sc223a_ioctl()
737 hdr->hdr_mode = sc223a->cur_mode->hdr_mode; in sc223a_ioctl()
741 w = sc223a->cur_mode->width; in sc223a_ioctl()
742 h = sc223a->cur_mode->height; in sc223a_ioctl()
747 sc223a->cur_mode = &supported_modes[i]; in sc223a_ioctl()
752 dev_err(&sc223a->client->dev, in sc223a_ioctl()
757 w = sc223a->cur_mode->hts_def - sc223a->cur_mode->width; in sc223a_ioctl()
758 h = sc223a->cur_mode->vts_def - sc223a->cur_mode->height; in sc223a_ioctl()
759 __v4l2_ctrl_modify_range(sc223a->hblank, w, w, 1, w); in sc223a_ioctl()
760 __v4l2_ctrl_modify_range(sc223a->vblank, h, in sc223a_ioctl()
761 SC223A_VTS_MAX - sc223a->cur_mode->height, 1, h); in sc223a_ioctl()
762 sc223a->cur_fps = sc223a->cur_mode->max_fps; in sc223a_ioctl()
772 ret = sc223a_write_reg(sc223a->client, SC223A_REG_CTRL_MODE, in sc223a_ioctl()
775 ret = sc223a_write_reg(sc223a->client, SC223A_REG_CTRL_MODE, in sc223a_ioctl()
870 static int __sc223a_start_stream(struct sc223a *sc223a) in __sc223a_start_stream() argument
874 if (!sc223a->is_thunderboot) { in __sc223a_start_stream()
875 ret = sc223a_write_array(sc223a->client, sc223a->cur_mode->reg_list); in __sc223a_start_stream()
879 ret = __v4l2_ctrl_handler_setup(&sc223a->ctrl_handler); in __sc223a_start_stream()
882 if (sc223a->has_init_exp && sc223a->cur_mode->hdr_mode != NO_HDR) { in __sc223a_start_stream()
883 ret = sc223a_ioctl(&sc223a->subdev, PREISP_CMD_SET_HDRAE_EXP, in __sc223a_start_stream()
884 &sc223a->init_hdrae_exp); in __sc223a_start_stream()
886 dev_err(&sc223a->client->dev, in __sc223a_start_stream()
892 return sc223a_write_reg(sc223a->client, SC223A_REG_CTRL_MODE, in __sc223a_start_stream()
896 static int __sc223a_stop_stream(struct sc223a *sc223a) in __sc223a_stop_stream() argument
898 sc223a->has_init_exp = false; in __sc223a_stop_stream()
899 if (sc223a->is_thunderboot) { in __sc223a_stop_stream()
900 sc223a->is_first_streamoff = true; in __sc223a_stop_stream()
901 pm_runtime_put(&sc223a->client->dev); in __sc223a_stop_stream()
903 return sc223a_write_reg(sc223a->client, SC223A_REG_CTRL_MODE, in __sc223a_stop_stream()
907 static int __sc223a_power_on(struct sc223a *sc223a);
910 struct sc223a *sc223a = to_sc223a(sd); in sc223a_s_stream() local
911 struct i2c_client *client = sc223a->client; in sc223a_s_stream()
914 mutex_lock(&sc223a->mutex); in sc223a_s_stream()
916 if (on == sc223a->streaming) in sc223a_s_stream()
919 if (sc223a->is_thunderboot && rkisp_tb_get_state() == RKISP_TB_NG) { in sc223a_s_stream()
920 sc223a->is_thunderboot = false; in sc223a_s_stream()
921 __sc223a_power_on(sc223a); in sc223a_s_stream()
928 ret = __sc223a_start_stream(sc223a); in sc223a_s_stream()
935 __sc223a_stop_stream(sc223a); in sc223a_s_stream()
939 sc223a->streaming = on; in sc223a_s_stream()
941 mutex_unlock(&sc223a->mutex); in sc223a_s_stream()
947 struct sc223a *sc223a = to_sc223a(sd); in sc223a_s_power() local
948 struct i2c_client *client = sc223a->client; in sc223a_s_power()
951 mutex_lock(&sc223a->mutex); in sc223a_s_power()
954 if (sc223a->power_on == !!on) in sc223a_s_power()
964 if (!sc223a->is_thunderboot) { in sc223a_s_power()
965 ret = sc223a_write_array(sc223a->client, sc223a_global_regs); in sc223a_s_power()
973 sc223a->power_on = true; in sc223a_s_power()
976 sc223a->power_on = false; in sc223a_s_power()
980 mutex_unlock(&sc223a->mutex); in sc223a_s_power()
991 static int __sc223a_power_on(struct sc223a *sc223a) in __sc223a_power_on() argument
995 struct device *dev = &sc223a->client->dev; in __sc223a_power_on()
997 if (!IS_ERR_OR_NULL(sc223a->pins_default)) { in __sc223a_power_on()
998 ret = pinctrl_select_state(sc223a->pinctrl, in __sc223a_power_on()
999 sc223a->pins_default); in __sc223a_power_on()
1003 ret = clk_set_rate(sc223a->xvclk, SC223A_XVCLK_FREQ); in __sc223a_power_on()
1006 if (clk_get_rate(sc223a->xvclk) != SC223A_XVCLK_FREQ) in __sc223a_power_on()
1008 ret = clk_prepare_enable(sc223a->xvclk); in __sc223a_power_on()
1014 if (sc223a->is_thunderboot) in __sc223a_power_on()
1017 if (!IS_ERR(sc223a->reset_gpio)) in __sc223a_power_on()
1018 gpiod_set_value_cansleep(sc223a->reset_gpio, 0); in __sc223a_power_on()
1020 ret = regulator_bulk_enable(SC223A_NUM_SUPPLIES, sc223a->supplies); in __sc223a_power_on()
1026 if (!IS_ERR(sc223a->reset_gpio)) in __sc223a_power_on()
1027 gpiod_set_value_cansleep(sc223a->reset_gpio, 1); in __sc223a_power_on()
1031 if (!IS_ERR(sc223a->pwdn_gpio)) in __sc223a_power_on()
1032 gpiod_set_value_cansleep(sc223a->pwdn_gpio, 1); in __sc223a_power_on()
1034 if (!IS_ERR(sc223a->reset_gpio)) in __sc223a_power_on()
1046 clk_disable_unprepare(sc223a->xvclk); in __sc223a_power_on()
1051 static void __sc223a_power_off(struct sc223a *sc223a) in __sc223a_power_off() argument
1054 struct device *dev = &sc223a->client->dev; in __sc223a_power_off()
1056 clk_disable_unprepare(sc223a->xvclk); in __sc223a_power_off()
1057 if (sc223a->is_thunderboot) { in __sc223a_power_off()
1058 if (sc223a->is_first_streamoff) { in __sc223a_power_off()
1059 sc223a->is_thunderboot = false; in __sc223a_power_off()
1060 sc223a->is_first_streamoff = false; in __sc223a_power_off()
1066 if (!IS_ERR(sc223a->pwdn_gpio)) in __sc223a_power_off()
1067 gpiod_set_value_cansleep(sc223a->pwdn_gpio, 0); in __sc223a_power_off()
1068 clk_disable_unprepare(sc223a->xvclk); in __sc223a_power_off()
1069 if (!IS_ERR(sc223a->reset_gpio)) in __sc223a_power_off()
1070 gpiod_set_value_cansleep(sc223a->reset_gpio, 0); in __sc223a_power_off()
1071 if (!IS_ERR_OR_NULL(sc223a->pins_sleep)) { in __sc223a_power_off()
1072 ret = pinctrl_select_state(sc223a->pinctrl, in __sc223a_power_off()
1073 sc223a->pins_sleep); in __sc223a_power_off()
1077 regulator_bulk_disable(SC223A_NUM_SUPPLIES, sc223a->supplies); in __sc223a_power_off()
1084 struct sc223a *sc223a = to_sc223a(sd); in sc223a_runtime_resume() local
1086 return __sc223a_power_on(sc223a); in sc223a_runtime_resume()
1093 struct sc223a *sc223a = to_sc223a(sd); in sc223a_runtime_suspend() local
1095 __sc223a_power_off(sc223a); in sc223a_runtime_suspend()
1103 struct sc223a *sc223a = to_sc223a(sd); in sc223a_open() local
1108 mutex_lock(&sc223a->mutex); in sc223a_open()
1115 mutex_unlock(&sc223a->mutex); in sc223a_open()
1176 static void sc223a_modify_fps_info(struct sc223a *sc223a) in sc223a_modify_fps_info() argument
1178 const struct sc223a_mode *mode = sc223a->cur_mode; in sc223a_modify_fps_info()
1180 sc223a->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / in sc223a_modify_fps_info()
1181 sc223a->cur_vts; in sc223a_modify_fps_info()
1186 struct sc223a *sc223a = container_of(ctrl->handler, in sc223a_set_ctrl() local
1187 struct sc223a, ctrl_handler); in sc223a_set_ctrl()
1188 struct i2c_client *client = sc223a->client; in sc223a_set_ctrl()
1197 max = sc223a->cur_mode->height + ctrl->val - 10; in sc223a_set_ctrl()
1198 __v4l2_ctrl_modify_range(sc223a->exposure, in sc223a_set_ctrl()
1199 sc223a->exposure->minimum, max, in sc223a_set_ctrl()
1200 sc223a->exposure->step, in sc223a_set_ctrl()
1201 sc223a->exposure->default_value); in sc223a_set_ctrl()
1211 if (sc223a->cur_mode->hdr_mode == NO_HDR) { in sc223a_set_ctrl()
1214 ret = sc223a_write_reg(sc223a->client, in sc223a_set_ctrl()
1218 ret |= sc223a_write_reg(sc223a->client, in sc223a_set_ctrl()
1222 ret |= sc223a_write_reg(sc223a->client, in sc223a_set_ctrl()
1230 if (sc223a->cur_mode->hdr_mode == NO_HDR) in sc223a_set_ctrl()
1231 ret = sc223a_set_gain_reg(sc223a, ctrl->val); in sc223a_set_ctrl()
1235 ret = sc223a_write_reg(sc223a->client, in sc223a_set_ctrl()
1238 (ctrl->val + sc223a->cur_mode->height) in sc223a_set_ctrl()
1240 ret |= sc223a_write_reg(sc223a->client, in sc223a_set_ctrl()
1243 (ctrl->val + sc223a->cur_mode->height) in sc223a_set_ctrl()
1245 sc223a->cur_vts = ctrl->val + sc223a->cur_mode->height; in sc223a_set_ctrl()
1246 sc223a_modify_fps_info(sc223a); in sc223a_set_ctrl()
1249 ret = sc223a_enable_test_pattern(sc223a, ctrl->val); in sc223a_set_ctrl()
1252 ret = sc223a_read_reg(sc223a->client, SC223A_FLIP_MIRROR_REG, in sc223a_set_ctrl()
1254 ret |= sc223a_write_reg(sc223a->client, SC223A_FLIP_MIRROR_REG, in sc223a_set_ctrl()
1259 ret = sc223a_read_reg(sc223a->client, SC223A_FLIP_MIRROR_REG, in sc223a_set_ctrl()
1261 ret |= sc223a_write_reg(sc223a->client, SC223A_FLIP_MIRROR_REG, in sc223a_set_ctrl()
1280 static int sc223a_initialize_controls(struct sc223a *sc223a) in sc223a_initialize_controls() argument
1289 handler = &sc223a->ctrl_handler; in sc223a_initialize_controls()
1290 mode = sc223a->cur_mode; in sc223a_initialize_controls()
1294 handler->lock = &sc223a->mutex; in sc223a_initialize_controls()
1305 sc223a->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in sc223a_initialize_controls()
1307 if (sc223a->hblank) in sc223a_initialize_controls()
1308 sc223a->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc223a_initialize_controls()
1310 sc223a->vblank = v4l2_ctrl_new_std(handler, &sc223a_ctrl_ops, in sc223a_initialize_controls()
1315 sc223a->exposure = v4l2_ctrl_new_std(handler, &sc223a_ctrl_ops, in sc223a_initialize_controls()
1319 sc223a->anal_gain = v4l2_ctrl_new_std(handler, &sc223a_ctrl_ops, in sc223a_initialize_controls()
1323 sc223a->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in sc223a_initialize_controls()
1334 dev_err(&sc223a->client->dev, in sc223a_initialize_controls()
1339 sc223a->subdev.ctrl_handler = handler; in sc223a_initialize_controls()
1340 sc223a->has_init_exp = false; in sc223a_initialize_controls()
1341 sc223a->cur_fps = mode->max_fps; in sc223a_initialize_controls()
1351 static int sc223a_check_sensor_id(struct sc223a *sc223a, in sc223a_check_sensor_id() argument
1354 struct device *dev = &sc223a->client->dev; in sc223a_check_sensor_id()
1358 if (sc223a->is_thunderboot) { in sc223a_check_sensor_id()
1375 static int sc223a_configure_regulators(struct sc223a *sc223a) in sc223a_configure_regulators() argument
1380 sc223a->supplies[i].supply = sc223a_supply_names[i]; in sc223a_configure_regulators()
1382 return devm_regulator_bulk_get(&sc223a->client->dev, in sc223a_configure_regulators()
1384 sc223a->supplies); in sc223a_configure_regulators()
1392 struct sc223a *sc223a; in sc223a_probe() local
1403 sc223a = devm_kzalloc(dev, sizeof(*sc223a), GFP_KERNEL); in sc223a_probe()
1404 if (!sc223a) in sc223a_probe()
1408 &sc223a->module_index); in sc223a_probe()
1410 &sc223a->module_facing); in sc223a_probe()
1412 &sc223a->module_name); in sc223a_probe()
1414 &sc223a->len_name); in sc223a_probe()
1420 sc223a->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); in sc223a_probe()
1422 sc223a->client = client; in sc223a_probe()
1425 sc223a->cur_mode = &supported_modes[i]; in sc223a_probe()
1430 sc223a->cur_mode = &supported_modes[0]; in sc223a_probe()
1432 sc223a->xvclk = devm_clk_get(dev, "xvclk"); in sc223a_probe()
1433 if (IS_ERR(sc223a->xvclk)) { in sc223a_probe()
1438 if (sc223a->is_thunderboot) { in sc223a_probe()
1439 sc223a->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS); in sc223a_probe()
1440 if (IS_ERR(sc223a->reset_gpio)) in sc223a_probe()
1443 sc223a->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_ASIS); in sc223a_probe()
1444 if (IS_ERR(sc223a->pwdn_gpio)) in sc223a_probe()
1447 sc223a->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in sc223a_probe()
1448 if (IS_ERR(sc223a->reset_gpio)) in sc223a_probe()
1451 sc223a->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in sc223a_probe()
1452 if (IS_ERR(sc223a->pwdn_gpio)) in sc223a_probe()
1456 sc223a->pinctrl = devm_pinctrl_get(dev); in sc223a_probe()
1457 if (!IS_ERR(sc223a->pinctrl)) { in sc223a_probe()
1458 sc223a->pins_default = in sc223a_probe()
1459 pinctrl_lookup_state(sc223a->pinctrl, in sc223a_probe()
1461 if (IS_ERR(sc223a->pins_default)) in sc223a_probe()
1464 sc223a->pins_sleep = in sc223a_probe()
1465 pinctrl_lookup_state(sc223a->pinctrl, in sc223a_probe()
1467 if (IS_ERR(sc223a->pins_sleep)) in sc223a_probe()
1473 ret = sc223a_configure_regulators(sc223a); in sc223a_probe()
1479 mutex_init(&sc223a->mutex); in sc223a_probe()
1481 sd = &sc223a->subdev; in sc223a_probe()
1483 ret = sc223a_initialize_controls(sc223a); in sc223a_probe()
1487 ret = __sc223a_power_on(sc223a); in sc223a_probe()
1491 ret = sc223a_check_sensor_id(sc223a, client); in sc223a_probe()
1501 sc223a->pad.flags = MEDIA_PAD_FL_SOURCE; in sc223a_probe()
1503 ret = media_entity_pads_init(&sd->entity, 1, &sc223a->pad); in sc223a_probe()
1509 if (strcmp(sc223a->module_facing, "back") == 0) in sc223a_probe()
1515 sc223a->module_index, facing, in sc223a_probe()
1525 if (sc223a->is_thunderboot) in sc223a_probe()
1537 __sc223a_power_off(sc223a); in sc223a_probe()
1539 v4l2_ctrl_handler_free(&sc223a->ctrl_handler); in sc223a_probe()
1541 mutex_destroy(&sc223a->mutex); in sc223a_probe()
1549 struct sc223a *sc223a = to_sc223a(sd); in sc223a_remove() local
1555 v4l2_ctrl_handler_free(&sc223a->ctrl_handler); in sc223a_remove()
1556 mutex_destroy(&sc223a->mutex); in sc223a_remove()
1560 __sc223a_power_off(sc223a); in sc223a_remove()