Lines Matching refs:sc2310

144 struct sc2310 {  struct
179 #define to_sc2310(sd) container_of(sd, struct sc2310, subdev) argument
708 sc2310_find_best_fit(struct sc2310 *sc2310, struct v4l2_subdev_format *fmt) in sc2310_find_best_fit() argument
716 for (i = 0; i < sc2310->cfg_num; i++) { in sc2310_find_best_fit()
728 static void sc2310_change_mode(struct sc2310 *sc2310, const struct sc2310_mode *mode) in sc2310_change_mode() argument
730 sc2310->cur_mode = mode; in sc2310_change_mode()
731 sc2310->cur_vts = sc2310->cur_mode->vts_def; in sc2310_change_mode()
732 dev_info(&sc2310->client->dev, "set fmt: cur_mode: %dx%d, hdr: %d\n", in sc2310_change_mode()
740 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_set_fmt() local
745 mutex_lock(&sc2310->mutex); in sc2310_set_fmt()
747 mode = sc2310_find_best_fit(sc2310, fmt); in sc2310_set_fmt()
756 mutex_unlock(&sc2310->mutex); in sc2310_set_fmt()
760 sc2310_change_mode(sc2310, mode); in sc2310_set_fmt()
762 __v4l2_ctrl_modify_range(sc2310->hblank, h_blank, in sc2310_set_fmt()
765 __v4l2_ctrl_modify_range(sc2310->vblank, vblank_def, in sc2310_set_fmt()
768 __v4l2_ctrl_s_ctrl(sc2310->link_freq, mode->mipi_freq_idx); in sc2310_set_fmt()
771 __v4l2_ctrl_s_ctrl_int64(sc2310->pixel_rate, pixel_rate); in sc2310_set_fmt()
772 sc2310->cur_fps = mode->max_fps; in sc2310_set_fmt()
773 sc2310->cur_vts = mode->vts_def; in sc2310_set_fmt()
776 mutex_unlock(&sc2310->mutex); in sc2310_set_fmt()
785 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_get_fmt() local
786 const struct sc2310_mode *mode = sc2310->cur_mode; in sc2310_get_fmt()
788 mutex_lock(&sc2310->mutex); in sc2310_get_fmt()
793 mutex_unlock(&sc2310->mutex); in sc2310_get_fmt()
806 mutex_unlock(&sc2310->mutex); in sc2310_get_fmt()
815 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_enum_mbus_code() local
819 code->code = sc2310->cur_mode->bus_fmt; in sc2310_enum_mbus_code()
828 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_enum_frame_sizes() local
830 if (fse->index >= sc2310->cfg_num) in sc2310_enum_frame_sizes()
844 static int sc2310_enable_test_pattern(struct sc2310 *sc2310, u32 pattern) in sc2310_enable_test_pattern() argument
849 ret = sc2310_read_reg(sc2310->client, SC2310_REG_TEST_PATTERN, in sc2310_enable_test_pattern()
855 ret |= sc2310_write_reg(sc2310->client, SC2310_REG_TEST_PATTERN, in sc2310_enable_test_pattern()
863 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_g_frame_interval() local
864 const struct sc2310_mode *mode = sc2310->cur_mode; in sc2310_g_frame_interval()
866 if (sc2310->streaming) in sc2310_g_frame_interval()
867 fi->interval = sc2310->cur_fps; in sc2310_g_frame_interval()
877 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_g_mbus_config() local
878 const struct sc2310_mode *mode = sc2310->cur_mode; in sc2310_g_mbus_config()
897 static void sc2310_get_module_inf(struct sc2310 *sc2310, in sc2310_get_module_inf() argument
902 strlcpy(inf->base.module, sc2310->module_name, in sc2310_get_module_inf()
904 strlcpy(inf->base.lens, sc2310->len_name, sizeof(inf->base.lens)); in sc2310_get_module_inf()
973 static int sc2310_set_hdrae(struct sc2310 *sc2310, in sc2310_set_hdrae() argument
976 struct i2c_client *client = sc2310->client; in sc2310_set_hdrae()
983 if (!sc2310->has_init_exp && !sc2310->streaming) { in sc2310_set_hdrae()
984 sc2310->init_hdrae_exp = *ae; in sc2310_set_hdrae()
985 sc2310->has_init_exp = true; in sc2310_set_hdrae()
1001 if (sc2310->cur_mode->hdr_mode == HDR_X2) { in sc2310_set_hdrae()
1017 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1021 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1025 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1030 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1034 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1038 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1042 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1047 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1051 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1056 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1060 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1064 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1068 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_hdrae()
1077 static int sc2310_get_channel_info(struct sc2310 *sc2310, struct rkmodule_channel_info *ch_info) in sc2310_get_channel_info() argument
1081 ch_info->vc = sc2310->cur_mode->vc[ch_info->index]; in sc2310_get_channel_info()
1082 ch_info->width = sc2310->cur_mode->width; in sc2310_get_channel_info()
1083 ch_info->height = sc2310->cur_mode->height; in sc2310_get_channel_info()
1084 ch_info->bus_fmt = sc2310->cur_mode->bus_fmt; in sc2310_get_channel_info()
1090 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_ioctl() local
1100 ret = sc2310_set_hdrae(sc2310, arg); in sc2310_ioctl()
1104 if (sc2310->streaming) { in sc2310_ioctl()
1105 ret = sc2310_write_array(sc2310->client, sc2310->cur_mode->reg_list); in sc2310_ioctl()
1109 w = sc2310->cur_mode->width; in sc2310_ioctl()
1110 h = sc2310->cur_mode->height; in sc2310_ioctl()
1111 for (i = 0; i < sc2310->cfg_num; i++) { in sc2310_ioctl()
1115 sc2310_change_mode(sc2310, &supported_modes[i]); in sc2310_ioctl()
1120 if (i == sc2310->cfg_num) { in sc2310_ioctl()
1121 dev_err(&sc2310->client->dev, in sc2310_ioctl()
1126 mode = sc2310->cur_mode; in sc2310_ioctl()
1129 __v4l2_ctrl_modify_range(sc2310->hblank, w, w, 1, w); in sc2310_ioctl()
1130 __v4l2_ctrl_modify_range(sc2310->vblank, h, in sc2310_ioctl()
1133 __v4l2_ctrl_s_ctrl(sc2310->link_freq, mode->mipi_freq_idx); in sc2310_ioctl()
1136 __v4l2_ctrl_s_ctrl_int64(sc2310->pixel_rate, in sc2310_ioctl()
1138 sc2310->cur_fps = mode->max_fps; in sc2310_ioctl()
1139 sc2310->cur_vts = mode->vts_def; in sc2310_ioctl()
1140 dev_info(&sc2310->client->dev, in sc2310_ioctl()
1145 sc2310_get_module_inf(sc2310, (struct rkmodule_inf *)arg); in sc2310_ioctl()
1150 hdr_cfg->hdr_mode = sc2310->cur_mode->hdr_mode; in sc2310_ioctl()
1157 ret = sc2310_write_reg(sc2310->client, SC2310_REG_CTRL_MODE, in sc2310_ioctl()
1160 ret = sc2310_write_reg(sc2310->client, SC2310_REG_CTRL_MODE, in sc2310_ioctl()
1165 ret = sc2310_get_channel_info(sc2310, ch_info); in sc2310_ioctl()
1298 static int __sc2310_start_stream(struct sc2310 *sc2310) in __sc2310_start_stream() argument
1302 ret = sc2310_write_array(sc2310->client, sc2310->cur_mode->reg_list); in __sc2310_start_stream()
1306 ret = __v4l2_ctrl_handler_setup(&sc2310->ctrl_handler); in __sc2310_start_stream()
1311 if (sc2310->has_init_exp && sc2310->cur_mode->hdr_mode != NO_HDR) { in __sc2310_start_stream()
1312 ret = sc2310_ioctl(&sc2310->subdev, PREISP_CMD_SET_HDRAE_EXP, in __sc2310_start_stream()
1313 &sc2310->init_hdrae_exp); in __sc2310_start_stream()
1315 dev_err(&sc2310->client->dev, in __sc2310_start_stream()
1321 return sc2310_write_reg(sc2310->client, SC2310_REG_CTRL_MODE, in __sc2310_start_stream()
1325 static int __sc2310_stop_stream(struct sc2310 *sc2310) in __sc2310_stop_stream() argument
1327 sc2310->has_init_exp = false; in __sc2310_stop_stream()
1328 return sc2310_write_reg(sc2310->client, SC2310_REG_CTRL_MODE, in __sc2310_stop_stream()
1334 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_s_stream() local
1335 struct i2c_client *client = sc2310->client; in sc2310_s_stream()
1338 mutex_lock(&sc2310->mutex); in sc2310_s_stream()
1340 if (on == sc2310->streaming) in sc2310_s_stream()
1350 ret = __sc2310_start_stream(sc2310); in sc2310_s_stream()
1357 __sc2310_stop_stream(sc2310); in sc2310_s_stream()
1361 sc2310->streaming = on; in sc2310_s_stream()
1364 mutex_unlock(&sc2310->mutex); in sc2310_s_stream()
1371 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_s_power() local
1372 struct i2c_client *client = sc2310->client; in sc2310_s_power()
1375 mutex_lock(&sc2310->mutex); in sc2310_s_power()
1378 if (sc2310->power_on == !!on) in sc2310_s_power()
1388 ret |= sc2310_write_reg(sc2310->client, in sc2310_s_power()
1393 ret |= sc2310_write_reg(sc2310->client, in sc2310_s_power()
1398 sc2310->power_on = true; in sc2310_s_power()
1401 sc2310->power_on = false; in sc2310_s_power()
1405 mutex_unlock(&sc2310->mutex); in sc2310_s_power()
1410 static int __sc2310_power_on(struct sc2310 *sc2310) in __sc2310_power_on() argument
1413 struct device *dev = &sc2310->client->dev; in __sc2310_power_on()
1415 if (!IS_ERR_OR_NULL(sc2310->pins_default)) { in __sc2310_power_on()
1416 ret = pinctrl_select_state(sc2310->pinctrl, in __sc2310_power_on()
1417 sc2310->pins_default); in __sc2310_power_on()
1421 ret = clk_set_rate(sc2310->xvclk, SC2310_XVCLK_FREQ); in __sc2310_power_on()
1424 if (clk_get_rate(sc2310->xvclk) != SC2310_XVCLK_FREQ) in __sc2310_power_on()
1426 ret = clk_prepare_enable(sc2310->xvclk); in __sc2310_power_on()
1431 if (!IS_ERR(sc2310->reset_gpio)) in __sc2310_power_on()
1432 gpiod_set_value_cansleep(sc2310->reset_gpio, 1); in __sc2310_power_on()
1434 ret = regulator_bulk_enable(SC2310_NUM_SUPPLIES, sc2310->supplies); in __sc2310_power_on()
1440 if (!IS_ERR(sc2310->reset_gpio)) in __sc2310_power_on()
1441 gpiod_set_value_cansleep(sc2310->reset_gpio, 0); in __sc2310_power_on()
1444 if (!IS_ERR(sc2310->pwdn_gpio)) in __sc2310_power_on()
1445 gpiod_set_value_cansleep(sc2310->pwdn_gpio, 0); in __sc2310_power_on()
1451 clk_disable_unprepare(sc2310->xvclk); in __sc2310_power_on()
1456 static void __sc2310_power_off(struct sc2310 *sc2310) in __sc2310_power_off() argument
1459 struct device *dev = &sc2310->client->dev; in __sc2310_power_off()
1461 if (!IS_ERR(sc2310->pwdn_gpio)) in __sc2310_power_off()
1462 gpiod_set_value_cansleep(sc2310->pwdn_gpio, 1); in __sc2310_power_off()
1463 clk_disable_unprepare(sc2310->xvclk); in __sc2310_power_off()
1464 if (!IS_ERR(sc2310->reset_gpio)) in __sc2310_power_off()
1465 gpiod_set_value_cansleep(sc2310->reset_gpio, 1); in __sc2310_power_off()
1466 if (!IS_ERR_OR_NULL(sc2310->pins_sleep)) { in __sc2310_power_off()
1467 ret = pinctrl_select_state(sc2310->pinctrl, in __sc2310_power_off()
1468 sc2310->pins_sleep); in __sc2310_power_off()
1472 regulator_bulk_disable(SC2310_NUM_SUPPLIES, sc2310->supplies); in __sc2310_power_off()
1479 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_runtime_resume() local
1481 return __sc2310_power_on(sc2310); in sc2310_runtime_resume()
1488 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_runtime_suspend() local
1490 __sc2310_power_off(sc2310); in sc2310_runtime_suspend()
1498 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_open() local
1503 mutex_lock(&sc2310->mutex); in sc2310_open()
1510 mutex_unlock(&sc2310->mutex); in sc2310_open()
1521 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_enum_frame_interval() local
1523 if (fie->index >= sc2310->cfg_num) in sc2310_enum_frame_interval()
1573 static void sc2310_modify_fps_info(struct sc2310 *sc2310) in sc2310_modify_fps_info() argument
1575 const struct sc2310_mode *mode = sc2310->cur_mode; in sc2310_modify_fps_info()
1577 sc2310->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / in sc2310_modify_fps_info()
1578 sc2310->cur_vts; in sc2310_modify_fps_info()
1583 struct sc2310 *sc2310 = container_of(ctrl->handler, in sc2310_set_ctrl() local
1584 struct sc2310, ctrl_handler); in sc2310_set_ctrl()
1585 struct i2c_client *client = sc2310->client; in sc2310_set_ctrl()
1595 max = sc2310->cur_mode->height + ctrl->val - 3; in sc2310_set_ctrl()
1596 __v4l2_ctrl_modify_range(sc2310->exposure, in sc2310_set_ctrl()
1597 sc2310->exposure->minimum, max, in sc2310_set_ctrl()
1598 sc2310->exposure->step, in sc2310_set_ctrl()
1599 sc2310->exposure->default_value); in sc2310_set_ctrl()
1608 if (sc2310->cur_mode->hdr_mode != NO_HDR) in sc2310_set_ctrl()
1611 ret = sc2310_write_reg(sc2310->client, in sc2310_set_ctrl()
1615 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_ctrl()
1619 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_ctrl()
1627 if (sc2310->cur_mode->hdr_mode != NO_HDR) in sc2310_set_ctrl()
1633 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_ctrl()
1637 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_ctrl()
1641 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_ctrl()
1645 ret |= sc2310_write_reg(sc2310->client, in sc2310_set_ctrl()
1651 ret = sc2310_write_reg(sc2310->client, SC2310_REG_VTS, in sc2310_set_ctrl()
1653 ctrl->val + sc2310->cur_mode->height); in sc2310_set_ctrl()
1655 sc2310->cur_vts = ctrl->val + sc2310->cur_mode->height; in sc2310_set_ctrl()
1656 sc2310_modify_fps_info(sc2310); in sc2310_set_ctrl()
1661 ret = sc2310_enable_test_pattern(sc2310, ctrl->val); in sc2310_set_ctrl()
1664 ret = sc2310_read_reg(sc2310->client, SC2310_FLIP_REG, in sc2310_set_ctrl()
1672 ret |= sc2310_write_reg(sc2310->client, SC2310_FLIP_REG, in sc2310_set_ctrl()
1676 ret = sc2310_read_reg(sc2310->client, SC2310_FLIP_REG, in sc2310_set_ctrl()
1684 ret |= sc2310_write_reg(sc2310->client, SC2310_FLIP_REG, in sc2310_set_ctrl()
1703 static int sc2310_initialize_controls(struct sc2310 *sc2310) in sc2310_initialize_controls() argument
1712 handler = &sc2310->ctrl_handler; in sc2310_initialize_controls()
1713 mode = sc2310->cur_mode; in sc2310_initialize_controls()
1717 handler->lock = &sc2310->mutex; in sc2310_initialize_controls()
1719 sc2310->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in sc2310_initialize_controls()
1723 __v4l2_ctrl_s_ctrl(sc2310->link_freq, mode->mipi_freq_idx); in sc2310_initialize_controls()
1727 sc2310->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in sc2310_initialize_controls()
1732 sc2310->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in sc2310_initialize_controls()
1734 if (sc2310->hblank) in sc2310_initialize_controls()
1735 sc2310->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc2310_initialize_controls()
1738 sc2310->vblank = v4l2_ctrl_new_std(handler, &sc2310_ctrl_ops, in sc2310_initialize_controls()
1744 sc2310->exposure = v4l2_ctrl_new_std(handler, &sc2310_ctrl_ops, in sc2310_initialize_controls()
1749 sc2310->anal_gain = v4l2_ctrl_new_std(handler, &sc2310_ctrl_ops, in sc2310_initialize_controls()
1754 sc2310->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in sc2310_initialize_controls()
1764 dev_err(&sc2310->client->dev, in sc2310_initialize_controls()
1769 sc2310->subdev.ctrl_handler = handler; in sc2310_initialize_controls()
1770 sc2310->has_init_exp = false; in sc2310_initialize_controls()
1771 sc2310->cur_fps = mode->max_fps; in sc2310_initialize_controls()
1772 sc2310->cur_vts = mode->vts_def; in sc2310_initialize_controls()
1782 static int sc2310_check_sensor_id(struct sc2310 *sc2310, in sc2310_check_sensor_id() argument
1785 struct device *dev = &sc2310->client->dev; in sc2310_check_sensor_id()
1801 static int sc2310_configure_regulators(struct sc2310 *sc2310) in sc2310_configure_regulators() argument
1806 sc2310->supplies[i].supply = sc2310_supply_names[i]; in sc2310_configure_regulators()
1808 return devm_regulator_bulk_get(&sc2310->client->dev, in sc2310_configure_regulators()
1810 sc2310->supplies); in sc2310_configure_regulators()
1818 struct sc2310 *sc2310; in sc2310_probe() local
1829 sc2310 = devm_kzalloc(dev, sizeof(*sc2310), GFP_KERNEL); in sc2310_probe()
1830 if (!sc2310) in sc2310_probe()
1834 &sc2310->module_index); in sc2310_probe()
1836 &sc2310->module_facing); in sc2310_probe()
1838 &sc2310->module_name); in sc2310_probe()
1840 &sc2310->len_name); in sc2310_probe()
1854 sc2310->cfg_num = ARRAY_SIZE(supported_modes); in sc2310_probe()
1855 for (i = 0; i < sc2310->cfg_num; i++) { in sc2310_probe()
1857 sc2310->cur_mode = &supported_modes[i]; in sc2310_probe()
1861 sc2310->client = client; in sc2310_probe()
1863 sc2310->xvclk = devm_clk_get(dev, "xvclk"); in sc2310_probe()
1864 if (IS_ERR(sc2310->xvclk)) { in sc2310_probe()
1869 sc2310->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in sc2310_probe()
1870 if (IS_ERR(sc2310->reset_gpio)) in sc2310_probe()
1873 sc2310->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in sc2310_probe()
1874 if (IS_ERR(sc2310->pwdn_gpio)) in sc2310_probe()
1877 sc2310->pinctrl = devm_pinctrl_get(dev); in sc2310_probe()
1878 if (!IS_ERR(sc2310->pinctrl)) { in sc2310_probe()
1879 sc2310->pins_default = in sc2310_probe()
1880 pinctrl_lookup_state(sc2310->pinctrl, in sc2310_probe()
1882 if (IS_ERR(sc2310->pins_default)) in sc2310_probe()
1885 sc2310->pins_sleep = in sc2310_probe()
1886 pinctrl_lookup_state(sc2310->pinctrl, in sc2310_probe()
1888 if (IS_ERR(sc2310->pins_sleep)) in sc2310_probe()
1894 ret = sc2310_configure_regulators(sc2310); in sc2310_probe()
1900 mutex_init(&sc2310->mutex); in sc2310_probe()
1902 sd = &sc2310->subdev; in sc2310_probe()
1904 ret = sc2310_initialize_controls(sc2310); in sc2310_probe()
1908 ret = __sc2310_power_on(sc2310); in sc2310_probe()
1912 ret = sc2310_check_sensor_id(sc2310, client); in sc2310_probe()
1921 sc2310->pad.flags = MEDIA_PAD_FL_SOURCE; in sc2310_probe()
1923 ret = media_entity_pads_init(&sd->entity, 1, &sc2310->pad); in sc2310_probe()
1929 if (strcmp(sc2310->module_facing, "back") == 0) in sc2310_probe()
1935 sc2310->module_index, facing, in sc2310_probe()
1956 __sc2310_power_off(sc2310); in sc2310_probe()
1958 v4l2_ctrl_handler_free(&sc2310->ctrl_handler); in sc2310_probe()
1960 mutex_destroy(&sc2310->mutex); in sc2310_probe()
1968 struct sc2310 *sc2310 = to_sc2310(sd); in sc2310_remove() local
1974 v4l2_ctrl_handler_free(&sc2310->ctrl_handler); in sc2310_remove()
1975 mutex_destroy(&sc2310->mutex); in sc2310_remove()
1979 __sc2310_power_off(sc2310); in sc2310_remove()