Lines Matching refs:sc230ai
148 struct sc230ai { struct
186 #define to_sc230ai(sd) container_of(sd, struct sc230ai, subdev) argument
667 static int sc230ai_get_gain_reg(struct sc230ai *sc230ai, u32 *again, u32 *dgain, in sc230ai_get_gain_reg() argument
726 static int sc230ai_set_hdrae(struct sc230ai *sc230ai, in sc230ai_set_hdrae() argument
765 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_set_fmt() local
770 mutex_lock(&sc230ai->mutex); in sc230ai_set_fmt()
781 mutex_unlock(&sc230ai->mutex); in sc230ai_set_fmt()
785 sc230ai->cur_mode = mode; in sc230ai_set_fmt()
787 __v4l2_ctrl_modify_range(sc230ai->hblank, h_blank, in sc230ai_set_fmt()
790 __v4l2_ctrl_modify_range(sc230ai->vblank, vblank_def, in sc230ai_set_fmt()
794 __v4l2_ctrl_s_ctrl(sc230ai->link_freq, mode->mipi_freq_idx); in sc230ai_set_fmt()
797 __v4l2_ctrl_s_ctrl_int64(sc230ai->pixel_rate, pixel_rate); in sc230ai_set_fmt()
798 sc230ai->cur_fps = mode->max_fps; in sc230ai_set_fmt()
801 mutex_unlock(&sc230ai->mutex); in sc230ai_set_fmt()
810 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_get_fmt() local
811 const struct sc230ai_mode *mode = sc230ai->cur_mode; in sc230ai_get_fmt()
813 mutex_lock(&sc230ai->mutex); in sc230ai_get_fmt()
818 mutex_unlock(&sc230ai->mutex); in sc230ai_get_fmt()
832 mutex_unlock(&sc230ai->mutex); in sc230ai_get_fmt()
841 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_enum_mbus_code() local
845 code->code = sc230ai->cur_mode->bus_fmt; in sc230ai_enum_mbus_code()
868 static int sc230ai_enable_test_pattern(struct sc230ai *sc230ai, u32 pattern) in sc230ai_enable_test_pattern() argument
873 ret = sc230ai_read_reg(sc230ai->client, SC230AI_REG_TEST_PATTERN, in sc230ai_enable_test_pattern()
880 ret |= sc230ai_write_reg(sc230ai->client, SC230AI_REG_TEST_PATTERN, in sc230ai_enable_test_pattern()
888 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_g_frame_interval() local
889 const struct sc230ai_mode *mode = sc230ai->cur_mode; in sc230ai_g_frame_interval()
891 if (sc230ai->streaming) in sc230ai_g_frame_interval()
892 fi->interval = sc230ai->cur_fps; in sc230ai_g_frame_interval()
902 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_g_mbus_config() local
903 const struct sc230ai_mode *mode = sc230ai->cur_mode; in sc230ai_g_mbus_config()
919 static void sc230ai_get_module_inf(struct sc230ai *sc230ai, in sc230ai_get_module_inf() argument
924 strscpy(inf->base.module, sc230ai->module_name, in sc230ai_get_module_inf()
926 strscpy(inf->base.lens, sc230ai->len_name, sizeof(inf->base.lens)); in sc230ai_get_module_inf()
931 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_ioctl() local
939 sc230ai_get_module_inf(sc230ai, (struct rkmodule_inf *)arg); in sc230ai_ioctl()
944 hdr->hdr_mode = sc230ai->cur_mode->hdr_mode; in sc230ai_ioctl()
948 w = sc230ai->cur_mode->width; in sc230ai_ioctl()
949 h = sc230ai->cur_mode->height; in sc230ai_ioctl()
954 sc230ai->cur_mode = &supported_modes[i]; in sc230ai_ioctl()
959 dev_err(&sc230ai->client->dev, in sc230ai_ioctl()
964 w = sc230ai->cur_mode->hts_def - sc230ai->cur_mode->width; in sc230ai_ioctl()
965 h = sc230ai->cur_mode->vts_def - sc230ai->cur_mode->height; in sc230ai_ioctl()
966 __v4l2_ctrl_modify_range(sc230ai->hblank, w, w, 1, w); in sc230ai_ioctl()
967 __v4l2_ctrl_modify_range(sc230ai->vblank, h, in sc230ai_ioctl()
968 SC230AI_VTS_MAX - sc230ai->cur_mode->height, 1, h); in sc230ai_ioctl()
969 sc230ai->cur_fps = sc230ai->cur_mode->max_fps; in sc230ai_ioctl()
973 sc230ai_set_hdrae(sc230ai, arg); in sc230ai_ioctl()
980 ret = sc230ai_write_reg(sc230ai->client, SC230AI_REG_CTRL_MODE, in sc230ai_ioctl()
983 ret = sc230ai_write_reg(sc230ai->client, SC230AI_REG_CTRL_MODE, in sc230ai_ioctl()
1081 static int __sc230ai_start_stream(struct sc230ai *sc230ai) in __sc230ai_start_stream() argument
1085 if (!sc230ai->is_thunderboot) { in __sc230ai_start_stream()
1086 ret = sc230ai_write_array(sc230ai->client, sc230ai->cur_mode->reg_list); in __sc230ai_start_stream()
1090 ret = __v4l2_ctrl_handler_setup(&sc230ai->ctrl_handler); in __sc230ai_start_stream()
1093 if (sc230ai->has_init_exp && sc230ai->cur_mode->hdr_mode != NO_HDR) { in __sc230ai_start_stream()
1094 ret = sc230ai_ioctl(&sc230ai->subdev, PREISP_CMD_SET_HDRAE_EXP, in __sc230ai_start_stream()
1095 &sc230ai->init_hdrae_exp); in __sc230ai_start_stream()
1097 dev_err(&sc230ai->client->dev, in __sc230ai_start_stream()
1103 return sc230ai_write_reg(sc230ai->client, SC230AI_REG_CTRL_MODE, in __sc230ai_start_stream()
1107 static int __sc230ai_stop_stream(struct sc230ai *sc230ai) in __sc230ai_stop_stream() argument
1109 sc230ai->has_init_exp = false; in __sc230ai_stop_stream()
1110 if (sc230ai->is_thunderboot) { in __sc230ai_stop_stream()
1111 sc230ai->is_first_streamoff = true; in __sc230ai_stop_stream()
1112 pm_runtime_put(&sc230ai->client->dev); in __sc230ai_stop_stream()
1114 return sc230ai_write_reg(sc230ai->client, SC230AI_REG_CTRL_MODE, in __sc230ai_stop_stream()
1118 static int __sc230ai_power_on(struct sc230ai *sc230ai);
1121 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_s_stream() local
1122 struct i2c_client *client = sc230ai->client; in sc230ai_s_stream()
1125 mutex_lock(&sc230ai->mutex); in sc230ai_s_stream()
1127 if (on == sc230ai->streaming) in sc230ai_s_stream()
1131 if (sc230ai->is_thunderboot && rkisp_tb_get_state() == RKISP_TB_NG) { in sc230ai_s_stream()
1132 sc230ai->is_thunderboot = false; in sc230ai_s_stream()
1133 __sc230ai_power_on(sc230ai); in sc230ai_s_stream()
1141 ret = __sc230ai_start_stream(sc230ai); in sc230ai_s_stream()
1148 __sc230ai_stop_stream(sc230ai); in sc230ai_s_stream()
1152 sc230ai->streaming = on; in sc230ai_s_stream()
1155 mutex_unlock(&sc230ai->mutex); in sc230ai_s_stream()
1162 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_s_power() local
1163 struct i2c_client *client = sc230ai->client; in sc230ai_s_power()
1166 mutex_lock(&sc230ai->mutex); in sc230ai_s_power()
1169 if (sc230ai->power_on == !!on) in sc230ai_s_power()
1178 if (!sc230ai->is_thunderboot) { in sc230ai_s_power()
1179 ret = sc230ai_write_array(sc230ai->client, sc230ai_global_regs); in sc230ai_s_power()
1187 sc230ai->power_on = true; in sc230ai_s_power()
1190 sc230ai->power_on = false; in sc230ai_s_power()
1194 mutex_unlock(&sc230ai->mutex); in sc230ai_s_power()
1205 static int __sc230ai_power_on(struct sc230ai *sc230ai) in __sc230ai_power_on() argument
1209 struct device *dev = &sc230ai->client->dev; in __sc230ai_power_on()
1211 if (!IS_ERR_OR_NULL(sc230ai->pins_default)) { in __sc230ai_power_on()
1212 ret = pinctrl_select_state(sc230ai->pinctrl, in __sc230ai_power_on()
1213 sc230ai->pins_default); in __sc230ai_power_on()
1217 ret = clk_set_rate(sc230ai->xvclk, SC230AI_XVCLK_FREQ); in __sc230ai_power_on()
1220 if (clk_get_rate(sc230ai->xvclk) != SC230AI_XVCLK_FREQ) in __sc230ai_power_on()
1222 ret = clk_prepare_enable(sc230ai->xvclk); in __sc230ai_power_on()
1227 if (sc230ai->is_thunderboot) in __sc230ai_power_on()
1230 if (!IS_ERR(sc230ai->reset_gpio)) in __sc230ai_power_on()
1231 gpiod_set_value_cansleep(sc230ai->reset_gpio, 0); in __sc230ai_power_on()
1233 ret = regulator_bulk_enable(SC230AI_NUM_SUPPLIES, sc230ai->supplies); in __sc230ai_power_on()
1239 if (!IS_ERR(sc230ai->reset_gpio)) in __sc230ai_power_on()
1240 gpiod_set_value_cansleep(sc230ai->reset_gpio, 1); in __sc230ai_power_on()
1243 if (!IS_ERR(sc230ai->pwdn_gpio)) in __sc230ai_power_on()
1244 gpiod_set_value_cansleep(sc230ai->pwdn_gpio, 1); in __sc230ai_power_on()
1246 if (!IS_ERR(sc230ai->reset_gpio)) in __sc230ai_power_on()
1258 clk_disable_unprepare(sc230ai->xvclk); in __sc230ai_power_on()
1263 static void __sc230ai_power_off(struct sc230ai *sc230ai) in __sc230ai_power_off() argument
1266 struct device *dev = &sc230ai->client->dev; in __sc230ai_power_off()
1268 clk_disable_unprepare(sc230ai->xvclk); in __sc230ai_power_off()
1269 if (sc230ai->is_thunderboot) { in __sc230ai_power_off()
1270 if (sc230ai->is_first_streamoff) { in __sc230ai_power_off()
1271 sc230ai->is_thunderboot = false; in __sc230ai_power_off()
1272 sc230ai->is_first_streamoff = false; in __sc230ai_power_off()
1277 if (!IS_ERR(sc230ai->pwdn_gpio)) in __sc230ai_power_off()
1278 gpiod_set_value_cansleep(sc230ai->pwdn_gpio, 0); in __sc230ai_power_off()
1279 if (!IS_ERR(sc230ai->reset_gpio)) in __sc230ai_power_off()
1280 gpiod_set_value_cansleep(sc230ai->reset_gpio, 0); in __sc230ai_power_off()
1281 if (!IS_ERR_OR_NULL(sc230ai->pins_sleep)) { in __sc230ai_power_off()
1282 ret = pinctrl_select_state(sc230ai->pinctrl, in __sc230ai_power_off()
1283 sc230ai->pins_sleep); in __sc230ai_power_off()
1287 regulator_bulk_disable(SC230AI_NUM_SUPPLIES, sc230ai->supplies); in __sc230ai_power_off()
1294 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_runtime_resume() local
1296 return __sc230ai_power_on(sc230ai); in sc230ai_runtime_resume()
1303 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_runtime_suspend() local
1305 __sc230ai_power_off(sc230ai); in sc230ai_runtime_suspend()
1313 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_open() local
1318 mutex_lock(&sc230ai->mutex); in sc230ai_open()
1325 mutex_unlock(&sc230ai->mutex); in sc230ai_open()
1386 static void sc230ai_modify_fps_info(struct sc230ai *sc230ai) in sc230ai_modify_fps_info() argument
1388 const struct sc230ai_mode *mode = sc230ai->cur_mode; in sc230ai_modify_fps_info()
1390 sc230ai->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / in sc230ai_modify_fps_info()
1391 sc230ai->cur_vts; in sc230ai_modify_fps_info()
1396 struct sc230ai *sc230ai = container_of(ctrl->handler, in sc230ai_set_ctrl() local
1397 struct sc230ai, ctrl_handler); in sc230ai_set_ctrl()
1398 struct i2c_client *client = sc230ai->client; in sc230ai_set_ctrl()
1409 max = sc230ai->cur_mode->height + ctrl->val - 4; in sc230ai_set_ctrl()
1410 __v4l2_ctrl_modify_range(sc230ai->exposure, in sc230ai_set_ctrl()
1411 sc230ai->exposure->minimum, max, in sc230ai_set_ctrl()
1412 sc230ai->exposure->step, in sc230ai_set_ctrl()
1413 sc230ai->exposure->default_value); in sc230ai_set_ctrl()
1423 if (sc230ai->cur_mode->hdr_mode == NO_HDR) { in sc230ai_set_ctrl()
1426 ret = sc230ai_write_reg(sc230ai->client, in sc230ai_set_ctrl()
1430 ret |= sc230ai_write_reg(sc230ai->client, in sc230ai_set_ctrl()
1434 ret |= sc230ai_write_reg(sc230ai->client, in sc230ai_set_ctrl()
1441 if (sc230ai->cur_mode->hdr_mode == NO_HDR) in sc230ai_set_ctrl()
1442 sc230ai_get_gain_reg(sc230ai, &again, &dgain, in sc230ai_set_ctrl()
1446 ret = sc230ai_write_reg(sc230ai->client, in sc230ai_set_ctrl()
1450 ret |= sc230ai_write_reg(sc230ai->client, in sc230ai_set_ctrl()
1454 ret |= sc230ai_write_reg(sc230ai->client, in sc230ai_set_ctrl()
1461 ret = sc230ai_write_reg(sc230ai->client, in sc230ai_set_ctrl()
1464 (ctrl->val + sc230ai->cur_mode->height) in sc230ai_set_ctrl()
1466 ret |= sc230ai_write_reg(sc230ai->client, in sc230ai_set_ctrl()
1469 (ctrl->val + sc230ai->cur_mode->height) in sc230ai_set_ctrl()
1471 sc230ai->cur_vts = ctrl->val + sc230ai->cur_mode->height; in sc230ai_set_ctrl()
1472 sc230ai_modify_fps_info(sc230ai); in sc230ai_set_ctrl()
1475 ret = sc230ai_enable_test_pattern(sc230ai, ctrl->val); in sc230ai_set_ctrl()
1478 ret = sc230ai_read_reg(sc230ai->client, SC230AI_FLIP_MIRROR_REG, in sc230ai_set_ctrl()
1480 ret |= sc230ai_write_reg(sc230ai->client, SC230AI_FLIP_MIRROR_REG, in sc230ai_set_ctrl()
1485 ret = sc230ai_read_reg(sc230ai->client, SC230AI_FLIP_MIRROR_REG, in sc230ai_set_ctrl()
1487 ret |= sc230ai_write_reg(sc230ai->client, SC230AI_FLIP_MIRROR_REG, in sc230ai_set_ctrl()
1506 static int sc230ai_initialize_controls(struct sc230ai *sc230ai) in sc230ai_initialize_controls() argument
1515 handler = &sc230ai->ctrl_handler; in sc230ai_initialize_controls()
1516 mode = sc230ai->cur_mode; in sc230ai_initialize_controls()
1520 handler->lock = &sc230ai->mutex; in sc230ai_initialize_controls()
1522 sc230ai->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in sc230ai_initialize_controls()
1526 __v4l2_ctrl_s_ctrl(sc230ai->link_freq, mode->mipi_freq_idx); in sc230ai_initialize_controls()
1533 sc230ai->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in sc230ai_initialize_controls()
1539 sc230ai->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in sc230ai_initialize_controls()
1541 if (sc230ai->hblank) in sc230ai_initialize_controls()
1542 sc230ai->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc230ai_initialize_controls()
1544 sc230ai->vblank = v4l2_ctrl_new_std(handler, &sc230ai_ctrl_ops, in sc230ai_initialize_controls()
1549 sc230ai->exposure = v4l2_ctrl_new_std(handler, &sc230ai_ctrl_ops, in sc230ai_initialize_controls()
1553 sc230ai->anal_gain = v4l2_ctrl_new_std(handler, &sc230ai_ctrl_ops, in sc230ai_initialize_controls()
1557 sc230ai->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in sc230ai_initialize_controls()
1570 dev_err(&sc230ai->client->dev, in sc230ai_initialize_controls()
1575 sc230ai->subdev.ctrl_handler = handler; in sc230ai_initialize_controls()
1576 sc230ai->has_init_exp = false; in sc230ai_initialize_controls()
1577 sc230ai->cur_fps = mode->max_fps; in sc230ai_initialize_controls()
1586 static int sc230ai_check_sensor_id(struct sc230ai *sc230ai, in sc230ai_check_sensor_id() argument
1589 struct device *dev = &sc230ai->client->dev; in sc230ai_check_sensor_id()
1593 if (sc230ai->is_thunderboot) { in sc230ai_check_sensor_id()
1609 static int sc230ai_configure_regulators(struct sc230ai *sc230ai) in sc230ai_configure_regulators() argument
1614 sc230ai->supplies[i].supply = sc230ai_supply_names[i]; in sc230ai_configure_regulators()
1616 return devm_regulator_bulk_get(&sc230ai->client->dev, in sc230ai_configure_regulators()
1618 sc230ai->supplies); in sc230ai_configure_regulators()
1626 struct sc230ai *sc230ai; in sc230ai_probe() local
1637 sc230ai = devm_kzalloc(dev, sizeof(*sc230ai), GFP_KERNEL); in sc230ai_probe()
1638 if (!sc230ai) in sc230ai_probe()
1643 &sc230ai->module_index); in sc230ai_probe()
1645 &sc230ai->module_facing); in sc230ai_probe()
1647 &sc230ai->module_name); in sc230ai_probe()
1649 &sc230ai->len_name); in sc230ai_probe()
1654 sc230ai->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); in sc230ai_probe()
1655 sc230ai->client = client; in sc230ai_probe()
1658 sc230ai->cur_mode = &supported_modes[i]; in sc230ai_probe()
1663 sc230ai->cur_mode = &supported_modes[0]; in sc230ai_probe()
1665 sc230ai->xvclk = devm_clk_get(dev, "xvclk"); in sc230ai_probe()
1666 if (IS_ERR(sc230ai->xvclk)) { in sc230ai_probe()
1671 sc230ai->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS); in sc230ai_probe()
1672 if (IS_ERR(sc230ai->reset_gpio)) in sc230ai_probe()
1675 sc230ai->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_ASIS); in sc230ai_probe()
1676 if (IS_ERR(sc230ai->pwdn_gpio)) in sc230ai_probe()
1679 sc230ai->pinctrl = devm_pinctrl_get(dev); in sc230ai_probe()
1680 if (!IS_ERR(sc230ai->pinctrl)) { in sc230ai_probe()
1681 sc230ai->pins_default = in sc230ai_probe()
1682 pinctrl_lookup_state(sc230ai->pinctrl, in sc230ai_probe()
1684 if (IS_ERR(sc230ai->pins_default)) in sc230ai_probe()
1687 sc230ai->pins_sleep = in sc230ai_probe()
1688 pinctrl_lookup_state(sc230ai->pinctrl, in sc230ai_probe()
1690 if (IS_ERR(sc230ai->pins_sleep)) in sc230ai_probe()
1696 ret = sc230ai_configure_regulators(sc230ai); in sc230ai_probe()
1702 mutex_init(&sc230ai->mutex); in sc230ai_probe()
1704 sd = &sc230ai->subdev; in sc230ai_probe()
1706 ret = sc230ai_initialize_controls(sc230ai); in sc230ai_probe()
1710 ret = __sc230ai_power_on(sc230ai); in sc230ai_probe()
1714 ret = sc230ai_check_sensor_id(sc230ai, client); in sc230ai_probe()
1724 sc230ai->pad.flags = MEDIA_PAD_FL_SOURCE; in sc230ai_probe()
1726 ret = media_entity_pads_init(&sd->entity, 1, &sc230ai->pad); in sc230ai_probe()
1732 if (strcmp(sc230ai->module_facing, "back") == 0) in sc230ai_probe()
1738 sc230ai->module_index, facing, in sc230ai_probe()
1748 if (sc230ai->is_thunderboot) in sc230ai_probe()
1760 __sc230ai_power_off(sc230ai); in sc230ai_probe()
1762 v4l2_ctrl_handler_free(&sc230ai->ctrl_handler); in sc230ai_probe()
1764 mutex_destroy(&sc230ai->mutex); in sc230ai_probe()
1772 struct sc230ai *sc230ai = to_sc230ai(sd); in sc230ai_remove() local
1778 v4l2_ctrl_handler_free(&sc230ai->ctrl_handler); in sc230ai_remove()
1779 mutex_destroy(&sc230ai->mutex); in sc230ai_remove()
1783 __sc230ai_power_off(sc230ai); in sc230ai_remove()