Lines Matching refs:sc3336
133 struct sc3336 { struct
171 #define to_sc3336(sd) container_of(sd, struct sc3336, subdev) argument
589 static int sc3336_set_gain_reg(struct sc3336 *sc3336, u32 gain) in sc3336_set_gain_reg() argument
591 struct i2c_client *client = sc3336->client; in sc3336_set_gain_reg()
646 ret = sc3336_write_reg(sc3336->client, in sc3336_set_gain_reg()
650 ret |= sc3336_write_reg(sc3336->client, in sc3336_set_gain_reg()
654 ret |= sc3336_write_reg(sc3336->client, in sc3336_set_gain_reg()
693 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_set_fmt() local
699 mutex_lock(&sc3336->mutex); in sc3336_set_fmt()
710 mutex_unlock(&sc3336->mutex); in sc3336_set_fmt()
714 sc3336->cur_mode = mode; in sc3336_set_fmt()
716 __v4l2_ctrl_modify_range(sc3336->hblank, h_blank, in sc3336_set_fmt()
719 __v4l2_ctrl_modify_range(sc3336->vblank, vblank_def, in sc3336_set_fmt()
725 __v4l2_ctrl_s_ctrl_int64(sc3336->pixel_rate, in sc3336_set_fmt()
727 __v4l2_ctrl_s_ctrl(sc3336->link_freq, in sc3336_set_fmt()
729 sc3336->cur_fps = mode->max_fps; in sc3336_set_fmt()
732 mutex_unlock(&sc3336->mutex); in sc3336_set_fmt()
741 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_get_fmt() local
742 const struct sc3336_mode *mode = sc3336->cur_mode; in sc3336_get_fmt()
744 mutex_lock(&sc3336->mutex); in sc3336_get_fmt()
749 mutex_unlock(&sc3336->mutex); in sc3336_get_fmt()
763 mutex_unlock(&sc3336->mutex); in sc3336_get_fmt()
772 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_enum_mbus_code() local
776 code->code = sc3336->cur_mode->bus_fmt; in sc3336_enum_mbus_code()
799 static int sc3336_enable_test_pattern(struct sc3336 *sc3336, u32 pattern) in sc3336_enable_test_pattern() argument
804 ret = sc3336_read_reg(sc3336->client, SC3336_REG_TEST_PATTERN, in sc3336_enable_test_pattern()
811 ret |= sc3336_write_reg(sc3336->client, SC3336_REG_TEST_PATTERN, in sc3336_enable_test_pattern()
819 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_g_frame_interval() local
820 const struct sc3336_mode *mode = sc3336->cur_mode; in sc3336_g_frame_interval()
822 if (sc3336->streaming) in sc3336_g_frame_interval()
823 fi->interval = sc3336->cur_fps; in sc3336_g_frame_interval()
833 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_g_mbus_config() local
834 const struct sc3336_mode *mode = sc3336->cur_mode; in sc3336_g_mbus_config()
851 static void sc3336_get_module_inf(struct sc3336 *sc3336, in sc3336_get_module_inf() argument
856 strscpy(inf->base.module, sc3336->module_name, in sc3336_get_module_inf()
858 strscpy(inf->base.lens, sc3336->len_name, sizeof(inf->base.lens)); in sc3336_get_module_inf()
863 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_ioctl() local
871 sc3336_get_module_inf(sc3336, (struct rkmodule_inf *)arg); in sc3336_ioctl()
876 hdr->hdr_mode = sc3336->cur_mode->hdr_mode; in sc3336_ioctl()
880 w = sc3336->cur_mode->width; in sc3336_ioctl()
881 h = sc3336->cur_mode->height; in sc3336_ioctl()
886 sc3336->cur_mode = &supported_modes[i]; in sc3336_ioctl()
891 dev_err(&sc3336->client->dev, in sc3336_ioctl()
896 w = sc3336->cur_mode->hts_def - sc3336->cur_mode->width; in sc3336_ioctl()
897 h = sc3336->cur_mode->vts_def - sc3336->cur_mode->height; in sc3336_ioctl()
898 __v4l2_ctrl_modify_range(sc3336->hblank, w, w, 1, w); in sc3336_ioctl()
899 __v4l2_ctrl_modify_range(sc3336->vblank, h, in sc3336_ioctl()
900 SC3336_VTS_MAX - sc3336->cur_mode->height, 1, h); in sc3336_ioctl()
901 sc3336->cur_fps = sc3336->cur_mode->max_fps; in sc3336_ioctl()
911 ret = sc3336_write_reg(sc3336->client, SC3336_REG_CTRL_MODE, in sc3336_ioctl()
914 ret = sc3336_write_reg(sc3336->client, SC3336_REG_CTRL_MODE, in sc3336_ioctl()
1009 static int __sc3336_start_stream(struct sc3336 *sc3336) in __sc3336_start_stream() argument
1013 if (!sc3336->is_thunderboot) { in __sc3336_start_stream()
1014 ret = sc3336_write_array(sc3336->client, sc3336->cur_mode->reg_list); in __sc3336_start_stream()
1018 ret = __v4l2_ctrl_handler_setup(&sc3336->ctrl_handler); in __sc3336_start_stream()
1021 if (sc3336->has_init_exp && sc3336->cur_mode->hdr_mode != NO_HDR) { in __sc3336_start_stream()
1022 ret = sc3336_ioctl(&sc3336->subdev, PREISP_CMD_SET_HDRAE_EXP, in __sc3336_start_stream()
1023 &sc3336->init_hdrae_exp); in __sc3336_start_stream()
1025 dev_err(&sc3336->client->dev, in __sc3336_start_stream()
1031 ret = sc3336_write_reg(sc3336->client, SC3336_REG_CTRL_MODE, in __sc3336_start_stream()
1036 static int __sc3336_stop_stream(struct sc3336 *sc3336) in __sc3336_stop_stream() argument
1038 sc3336->has_init_exp = false; in __sc3336_stop_stream()
1039 if (sc3336->is_thunderboot) in __sc3336_stop_stream()
1040 sc3336->is_first_streamoff = true; in __sc3336_stop_stream()
1041 return sc3336_write_reg(sc3336->client, SC3336_REG_CTRL_MODE, in __sc3336_stop_stream()
1045 static int __sc3336_power_on(struct sc3336 *sc3336);
1048 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_s_stream() local
1049 struct i2c_client *client = sc3336->client; in sc3336_s_stream()
1052 mutex_lock(&sc3336->mutex); in sc3336_s_stream()
1054 if (on == sc3336->streaming) in sc3336_s_stream()
1057 if (sc3336->is_thunderboot && rkisp_tb_get_state() == RKISP_TB_NG) { in sc3336_s_stream()
1058 sc3336->is_thunderboot = false; in sc3336_s_stream()
1059 __sc3336_power_on(sc3336); in sc3336_s_stream()
1066 ret = __sc3336_start_stream(sc3336); in sc3336_s_stream()
1073 __sc3336_stop_stream(sc3336); in sc3336_s_stream()
1077 sc3336->streaming = on; in sc3336_s_stream()
1079 mutex_unlock(&sc3336->mutex); in sc3336_s_stream()
1085 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_s_power() local
1086 struct i2c_client *client = sc3336->client; in sc3336_s_power()
1089 mutex_lock(&sc3336->mutex); in sc3336_s_power()
1092 if (sc3336->power_on == !!on) in sc3336_s_power()
1102 if (!sc3336->is_thunderboot) { in sc3336_s_power()
1103 ret = sc3336_write_array(sc3336->client, sc3336_global_regs); in sc3336_s_power()
1111 sc3336->power_on = true; in sc3336_s_power()
1114 sc3336->power_on = false; in sc3336_s_power()
1118 mutex_unlock(&sc3336->mutex); in sc3336_s_power()
1124 static inline u32 sc3336_cal_delay(u32 cycles, struct sc3336 *sc3336) in sc3336_cal_delay() argument
1126 return DIV_ROUND_UP(cycles, sc3336->cur_mode->xvclk_freq / 1000 / 1000); in sc3336_cal_delay()
1129 static int __sc3336_power_on(struct sc3336 *sc3336) in __sc3336_power_on() argument
1133 struct device *dev = &sc3336->client->dev; in __sc3336_power_on()
1135 if (!IS_ERR_OR_NULL(sc3336->pins_default)) { in __sc3336_power_on()
1136 ret = pinctrl_select_state(sc3336->pinctrl, in __sc3336_power_on()
1137 sc3336->pins_default); in __sc3336_power_on()
1141 ret = clk_set_rate(sc3336->xvclk, sc3336->cur_mode->xvclk_freq); in __sc3336_power_on()
1143 dev_warn(dev, "Failed to set xvclk rate (%dHz)\n", sc3336->cur_mode->xvclk_freq); in __sc3336_power_on()
1144 if (clk_get_rate(sc3336->xvclk) != sc3336->cur_mode->xvclk_freq) in __sc3336_power_on()
1146 sc3336->cur_mode->xvclk_freq); in __sc3336_power_on()
1147 ret = clk_prepare_enable(sc3336->xvclk); in __sc3336_power_on()
1153 if (sc3336->is_thunderboot) in __sc3336_power_on()
1156 if (!IS_ERR(sc3336->reset_gpio)) in __sc3336_power_on()
1157 gpiod_set_value_cansleep(sc3336->reset_gpio, 0); in __sc3336_power_on()
1159 ret = regulator_bulk_enable(SC3336_NUM_SUPPLIES, sc3336->supplies); in __sc3336_power_on()
1165 if (!IS_ERR(sc3336->reset_gpio)) in __sc3336_power_on()
1166 gpiod_set_value_cansleep(sc3336->reset_gpio, 1); in __sc3336_power_on()
1170 if (!IS_ERR(sc3336->pwdn_gpio)) in __sc3336_power_on()
1171 gpiod_set_value_cansleep(sc3336->pwdn_gpio, 1); in __sc3336_power_on()
1173 if (!IS_ERR(sc3336->reset_gpio)) in __sc3336_power_on()
1179 delay_us = sc3336_cal_delay(8192, sc3336); in __sc3336_power_on()
1185 clk_disable_unprepare(sc3336->xvclk); in __sc3336_power_on()
1190 static void __sc3336_power_off(struct sc3336 *sc3336) in __sc3336_power_off() argument
1193 struct device *dev = &sc3336->client->dev; in __sc3336_power_off()
1195 clk_disable_unprepare(sc3336->xvclk); in __sc3336_power_off()
1196 if (sc3336->is_thunderboot) { in __sc3336_power_off()
1197 if (sc3336->is_first_streamoff) { in __sc3336_power_off()
1198 sc3336->is_thunderboot = false; in __sc3336_power_off()
1199 sc3336->is_first_streamoff = false; in __sc3336_power_off()
1205 if (!IS_ERR(sc3336->pwdn_gpio)) in __sc3336_power_off()
1206 gpiod_set_value_cansleep(sc3336->pwdn_gpio, 0); in __sc3336_power_off()
1207 clk_disable_unprepare(sc3336->xvclk); in __sc3336_power_off()
1208 if (!IS_ERR(sc3336->reset_gpio)) in __sc3336_power_off()
1209 gpiod_set_value_cansleep(sc3336->reset_gpio, 0); in __sc3336_power_off()
1210 if (!IS_ERR_OR_NULL(sc3336->pins_sleep)) { in __sc3336_power_off()
1211 ret = pinctrl_select_state(sc3336->pinctrl, in __sc3336_power_off()
1212 sc3336->pins_sleep); in __sc3336_power_off()
1216 regulator_bulk_disable(SC3336_NUM_SUPPLIES, sc3336->supplies); in __sc3336_power_off()
1223 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_runtime_resume() local
1225 return __sc3336_power_on(sc3336); in sc3336_runtime_resume()
1232 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_runtime_suspend() local
1234 __sc3336_power_off(sc3336); in sc3336_runtime_suspend()
1242 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_open() local
1247 mutex_lock(&sc3336->mutex); in sc3336_open()
1254 mutex_unlock(&sc3336->mutex); in sc3336_open()
1315 static void sc3336_modify_fps_info(struct sc3336 *sc3336) in sc3336_modify_fps_info() argument
1317 const struct sc3336_mode *mode = sc3336->cur_mode; in sc3336_modify_fps_info()
1319 sc3336->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / in sc3336_modify_fps_info()
1320 sc3336->cur_vts; in sc3336_modify_fps_info()
1325 struct sc3336 *sc3336 = container_of(ctrl->handler, in sc3336_set_ctrl() local
1326 struct sc3336, ctrl_handler); in sc3336_set_ctrl()
1327 struct i2c_client *client = sc3336->client; in sc3336_set_ctrl()
1336 max = sc3336->cur_mode->height + ctrl->val - 8; in sc3336_set_ctrl()
1337 __v4l2_ctrl_modify_range(sc3336->exposure, in sc3336_set_ctrl()
1338 sc3336->exposure->minimum, max, in sc3336_set_ctrl()
1339 sc3336->exposure->step, in sc3336_set_ctrl()
1340 sc3336->exposure->default_value); in sc3336_set_ctrl()
1350 if (sc3336->cur_mode->hdr_mode == NO_HDR) { in sc3336_set_ctrl()
1353 ret = sc3336_write_reg(sc3336->client, in sc3336_set_ctrl()
1357 ret |= sc3336_write_reg(sc3336->client, in sc3336_set_ctrl()
1361 ret |= sc3336_write_reg(sc3336->client, in sc3336_set_ctrl()
1369 if (sc3336->cur_mode->hdr_mode == NO_HDR) in sc3336_set_ctrl()
1370 ret = sc3336_set_gain_reg(sc3336, ctrl->val); in sc3336_set_ctrl()
1374 ret = sc3336_write_reg(sc3336->client, in sc3336_set_ctrl()
1377 (ctrl->val + sc3336->cur_mode->height) in sc3336_set_ctrl()
1379 ret |= sc3336_write_reg(sc3336->client, in sc3336_set_ctrl()
1382 (ctrl->val + sc3336->cur_mode->height) in sc3336_set_ctrl()
1384 sc3336->cur_vts = ctrl->val + sc3336->cur_mode->height; in sc3336_set_ctrl()
1385 sc3336_modify_fps_info(sc3336); in sc3336_set_ctrl()
1388 ret = sc3336_enable_test_pattern(sc3336, ctrl->val); in sc3336_set_ctrl()
1391 ret = sc3336_read_reg(sc3336->client, SC3336_FLIP_MIRROR_REG, in sc3336_set_ctrl()
1393 ret |= sc3336_write_reg(sc3336->client, SC3336_FLIP_MIRROR_REG, in sc3336_set_ctrl()
1398 ret = sc3336_read_reg(sc3336->client, SC3336_FLIP_MIRROR_REG, in sc3336_set_ctrl()
1400 ret |= sc3336_write_reg(sc3336->client, SC3336_FLIP_MIRROR_REG, in sc3336_set_ctrl()
1419 static int sc3336_initialize_controls(struct sc3336 *sc3336) in sc3336_initialize_controls() argument
1429 handler = &sc3336->ctrl_handler; in sc3336_initialize_controls()
1430 mode = sc3336->cur_mode; in sc3336_initialize_controls()
1434 handler->lock = &sc3336->mutex; in sc3336_initialize_controls()
1436 sc3336->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in sc3336_initialize_controls()
1439 if (sc3336->link_freq) in sc3336_initialize_controls()
1440 sc3336->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc3336_initialize_controls()
1445 sc3336->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE, in sc3336_initialize_controls()
1448 __v4l2_ctrl_s_ctrl(sc3336->link_freq, dst_link_freq); in sc3336_initialize_controls()
1451 sc3336->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in sc3336_initialize_controls()
1453 if (sc3336->hblank) in sc3336_initialize_controls()
1454 sc3336->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc3336_initialize_controls()
1456 sc3336->vblank = v4l2_ctrl_new_std(handler, &sc3336_ctrl_ops, in sc3336_initialize_controls()
1461 sc3336->exposure = v4l2_ctrl_new_std(handler, &sc3336_ctrl_ops, in sc3336_initialize_controls()
1465 sc3336->anal_gain = v4l2_ctrl_new_std(handler, &sc3336_ctrl_ops, in sc3336_initialize_controls()
1469 sc3336->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in sc3336_initialize_controls()
1480 dev_err(&sc3336->client->dev, in sc3336_initialize_controls()
1485 sc3336->subdev.ctrl_handler = handler; in sc3336_initialize_controls()
1486 sc3336->has_init_exp = false; in sc3336_initialize_controls()
1487 sc3336->cur_fps = mode->max_fps; in sc3336_initialize_controls()
1497 static int sc3336_check_sensor_id(struct sc3336 *sc3336, in sc3336_check_sensor_id() argument
1500 struct device *dev = &sc3336->client->dev; in sc3336_check_sensor_id()
1504 if (sc3336->is_thunderboot) { in sc3336_check_sensor_id()
1521 static int sc3336_configure_regulators(struct sc3336 *sc3336) in sc3336_configure_regulators() argument
1526 sc3336->supplies[i].supply = sc3336_supply_names[i]; in sc3336_configure_regulators()
1528 return devm_regulator_bulk_get(&sc3336->client->dev, in sc3336_configure_regulators()
1530 sc3336->supplies); in sc3336_configure_regulators()
1538 struct sc3336 *sc3336; in sc3336_probe() local
1549 sc3336 = devm_kzalloc(dev, sizeof(*sc3336), GFP_KERNEL); in sc3336_probe()
1550 if (!sc3336) in sc3336_probe()
1554 &sc3336->module_index); in sc3336_probe()
1556 &sc3336->module_facing); in sc3336_probe()
1558 &sc3336->module_name); in sc3336_probe()
1560 &sc3336->len_name); in sc3336_probe()
1566 sc3336->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); in sc3336_probe()
1568 sc3336->client = client; in sc3336_probe()
1571 sc3336->cur_mode = &supported_modes[i]; in sc3336_probe()
1576 sc3336->cur_mode = &supported_modes[0]; in sc3336_probe()
1578 sc3336->xvclk = devm_clk_get(dev, "xvclk"); in sc3336_probe()
1579 if (IS_ERR(sc3336->xvclk)) { in sc3336_probe()
1584 if (!sc3336->is_thunderboot) in sc3336_probe()
1585 sc3336->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in sc3336_probe()
1587 sc3336->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS); in sc3336_probe()
1588 if (IS_ERR(sc3336->reset_gpio)) in sc3336_probe()
1591 if (!sc3336->is_thunderboot) in sc3336_probe()
1592 sc3336->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in sc3336_probe()
1594 sc3336->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_ASIS); in sc3336_probe()
1595 if (IS_ERR(sc3336->pwdn_gpio)) in sc3336_probe()
1598 sc3336->pinctrl = devm_pinctrl_get(dev); in sc3336_probe()
1599 if (!IS_ERR(sc3336->pinctrl)) { in sc3336_probe()
1600 sc3336->pins_default = in sc3336_probe()
1601 pinctrl_lookup_state(sc3336->pinctrl, in sc3336_probe()
1603 if (IS_ERR(sc3336->pins_default)) in sc3336_probe()
1606 sc3336->pins_sleep = in sc3336_probe()
1607 pinctrl_lookup_state(sc3336->pinctrl, in sc3336_probe()
1609 if (IS_ERR(sc3336->pins_sleep)) in sc3336_probe()
1615 ret = sc3336_configure_regulators(sc3336); in sc3336_probe()
1621 mutex_init(&sc3336->mutex); in sc3336_probe()
1623 sd = &sc3336->subdev; in sc3336_probe()
1625 ret = sc3336_initialize_controls(sc3336); in sc3336_probe()
1629 ret = __sc3336_power_on(sc3336); in sc3336_probe()
1633 ret = sc3336_check_sensor_id(sc3336, client); in sc3336_probe()
1643 sc3336->pad.flags = MEDIA_PAD_FL_SOURCE; in sc3336_probe()
1645 ret = media_entity_pads_init(&sd->entity, 1, &sc3336->pad); in sc3336_probe()
1651 if (strcmp(sc3336->module_facing, "back") == 0) in sc3336_probe()
1657 sc3336->module_index, facing, in sc3336_probe()
1676 __sc3336_power_off(sc3336); in sc3336_probe()
1678 v4l2_ctrl_handler_free(&sc3336->ctrl_handler); in sc3336_probe()
1680 mutex_destroy(&sc3336->mutex); in sc3336_probe()
1688 struct sc3336 *sc3336 = to_sc3336(sd); in sc3336_remove() local
1694 v4l2_ctrl_handler_free(&sc3336->ctrl_handler); in sc3336_remove()
1695 mutex_destroy(&sc3336->mutex); in sc3336_remove()
1699 __sc3336_power_off(sc3336); in sc3336_remove()