Lines Matching refs:sc850sl

144 struct sc850sl {  struct
183 #define to_sc850sl(sd) container_of(sd, struct sc850sl, subdev) argument
514 sc850sl_find_best_fit(struct sc850sl *sc850sl, struct v4l2_subdev_format *fmt) in sc850sl_find_best_fit() argument
530 dev_info(&sc850sl->client->dev, "%s: cur_best_fit(%d)", in sc850sl_find_best_fit()
536 static void sc850sl_change_mode(struct sc850sl *sc850sl, const struct sc850sl_mode *mode) in sc850sl_change_mode() argument
538 sc850sl->cur_mode = mode; in sc850sl_change_mode()
539 sc850sl->cur_vts = sc850sl->cur_mode->vts_def; in sc850sl_change_mode()
540 dev_info(&sc850sl->client->dev, "set fmt: cur_mode: %dx%d, hdr: %d\n", in sc850sl_change_mode()
548 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_set_fmt() local
553 mutex_lock(&sc850sl->mutex); in sc850sl_set_fmt()
555 mode = sc850sl_find_best_fit(sc850sl, fmt); in sc850sl_set_fmt()
564 mutex_unlock(&sc850sl->mutex); in sc850sl_set_fmt()
568 sc850sl_change_mode(sc850sl, mode); in sc850sl_set_fmt()
570 __v4l2_ctrl_modify_range(sc850sl->hblank, h_blank, in sc850sl_set_fmt()
573 __v4l2_ctrl_modify_range(sc850sl->vblank, vblank_def, in sc850sl_set_fmt()
576 __v4l2_ctrl_s_ctrl(sc850sl->link_freq, mode->mipi_freq_idx); in sc850sl_set_fmt()
579 __v4l2_ctrl_s_ctrl_int64(sc850sl->pixel_rate, pixel_rate); in sc850sl_set_fmt()
580 sc850sl->cur_fps = mode->max_fps; in sc850sl_set_fmt()
581 sc850sl->cur_vts = mode->vts_def; in sc850sl_set_fmt()
584 mutex_unlock(&sc850sl->mutex); in sc850sl_set_fmt()
593 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_get_fmt() local
594 const struct sc850sl_mode *mode = sc850sl->cur_mode; in sc850sl_get_fmt()
596 mutex_lock(&sc850sl->mutex); in sc850sl_get_fmt()
601 mutex_unlock(&sc850sl->mutex); in sc850sl_get_fmt()
614 mutex_unlock(&sc850sl->mutex); in sc850sl_get_fmt()
623 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_enum_mbus_code() local
627 code->code = sc850sl->cur_mode->bus_fmt; in sc850sl_enum_mbus_code()
636 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_enum_frame_sizes() local
638 if (fse->index >= sc850sl->cfg_num) in sc850sl_enum_frame_sizes()
652 static int sc850sl_enable_test_pattern(struct sc850sl *sc850sl, u32 pattern) in sc850sl_enable_test_pattern() argument
657 ret = sc850sl_read_reg(sc850sl->client, SC850SL_REG_TEST_PATTERN, in sc850sl_enable_test_pattern()
663 ret |= sc850sl_write_reg(sc850sl->client, SC850SL_REG_TEST_PATTERN, in sc850sl_enable_test_pattern()
671 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_g_frame_interval() local
672 const struct sc850sl_mode *mode = sc850sl->cur_mode; in sc850sl_g_frame_interval()
674 if (sc850sl->streaming) in sc850sl_g_frame_interval()
675 fi->interval = sc850sl->cur_fps; in sc850sl_g_frame_interval()
685 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_g_mbus_config() local
686 const struct sc850sl_mode *mode = sc850sl->cur_mode; in sc850sl_g_mbus_config()
705 static void sc850sl_get_module_inf(struct sc850sl *sc850sl, in sc850sl_get_module_inf() argument
710 strscpy(inf->base.module, sc850sl->module_name, in sc850sl_get_module_inf()
712 strscpy(inf->base.lens, sc850sl->len_name, sizeof(inf->base.lens)); in sc850sl_get_module_inf()
776 static int sc850sl_get_channel_info(struct sc850sl *sc850sl, struct rkmodule_channel_info *ch_info) in sc850sl_get_channel_info() argument
780 ch_info->vc = sc850sl->cur_mode->vc[ch_info->index]; in sc850sl_get_channel_info()
781 ch_info->width = sc850sl->cur_mode->width; in sc850sl_get_channel_info()
782 ch_info->height = sc850sl->cur_mode->height; in sc850sl_get_channel_info()
783 ch_info->bus_fmt = sc850sl->cur_mode->bus_fmt; in sc850sl_get_channel_info()
789 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_ioctl() local
806 if (sc850sl->streaming) { in sc850sl_ioctl()
807 ret = sc850sl_write_array(sc850sl->client, sc850sl->cur_mode->reg_list); in sc850sl_ioctl()
811 w = sc850sl->cur_mode->width; in sc850sl_ioctl()
812 h = sc850sl->cur_mode->height; in sc850sl_ioctl()
813 for (i = 0; i < sc850sl->cfg_num; i++) { in sc850sl_ioctl()
817 sc850sl_change_mode(sc850sl, &supported_modes[i]); in sc850sl_ioctl()
821 if (i == sc850sl->cfg_num) { in sc850sl_ioctl()
822 dev_err(&sc850sl->client->dev, in sc850sl_ioctl()
827 mode = sc850sl->cur_mode; in sc850sl_ioctl()
830 __v4l2_ctrl_modify_range(sc850sl->hblank, w, w, 1, w); in sc850sl_ioctl()
831 __v4l2_ctrl_modify_range(sc850sl->vblank, h, in sc850sl_ioctl()
834 __v4l2_ctrl_s_ctrl(sc850sl->link_freq, mode->mipi_freq_idx); in sc850sl_ioctl()
837 __v4l2_ctrl_s_ctrl_int64(sc850sl->pixel_rate, in sc850sl_ioctl()
839 sc850sl->cur_fps = mode->max_fps; in sc850sl_ioctl()
840 sc850sl->cur_vts = mode->vts_def; in sc850sl_ioctl()
841 dev_info(&sc850sl->client->dev, in sc850sl_ioctl()
846 sc850sl_get_module_inf(sc850sl, (struct rkmodule_inf *)arg); in sc850sl_ioctl()
852 hdr_cfg->hdr_mode = sc850sl->cur_mode->hdr_mode; in sc850sl_ioctl()
859 ret = sc850sl_write_reg(sc850sl->client, SC850SL_REG_CTRL_MODE, in sc850sl_ioctl()
862 ret = sc850sl_write_reg(sc850sl->client, SC850SL_REG_CTRL_MODE, in sc850sl_ioctl()
868 ret = sc850sl_get_channel_info(sc850sl, ch_info); in sc850sl_ioctl()
1022 static int __sc850sl_start_stream(struct sc850sl *sc850sl) in __sc850sl_start_stream() argument
1026 ret = sc850sl_write_array(sc850sl->client, sc850sl->cur_mode->reg_list); in __sc850sl_start_stream()
1030 ret = __v4l2_ctrl_handler_setup(&sc850sl->ctrl_handler); in __sc850sl_start_stream()
1034 if (sc850sl->has_init_exp && sc850sl->cur_mode->hdr_mode != NO_HDR) { in __sc850sl_start_stream()
1035 ret = sc850sl_ioctl(&sc850sl->subdev, PREISP_CMD_SET_HDRAE_EXP, in __sc850sl_start_stream()
1036 &sc850sl->init_hdrae_exp); in __sc850sl_start_stream()
1038 dev_err(&sc850sl->client->dev, in __sc850sl_start_stream()
1043 return sc850sl_write_reg(sc850sl->client, SC850SL_REG_CTRL_MODE, in __sc850sl_start_stream()
1047 static int __sc850sl_stop_stream(struct sc850sl *sc850sl) in __sc850sl_stop_stream() argument
1049 sc850sl->has_init_exp = false; in __sc850sl_stop_stream()
1050 return sc850sl_write_reg(sc850sl->client, SC850SL_REG_CTRL_MODE, in __sc850sl_stop_stream()
1056 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_s_stream() local
1057 struct i2c_client *client = sc850sl->client; in sc850sl_s_stream()
1060 dev_info(&sc850sl->client->dev, "s_stream: %d. %dx%d, hdr: %d, bpp: %d\n", in sc850sl_s_stream()
1061 on, sc850sl->cur_mode->width, sc850sl->cur_mode->height, in sc850sl_s_stream()
1062 sc850sl->cur_mode->hdr_mode, sc850sl->cur_mode->bpp); in sc850sl_s_stream()
1064 mutex_lock(&sc850sl->mutex); in sc850sl_s_stream()
1066 if (on == sc850sl->streaming) in sc850sl_s_stream()
1075 ret = __sc850sl_start_stream(sc850sl); in sc850sl_s_stream()
1082 __sc850sl_stop_stream(sc850sl); in sc850sl_s_stream()
1086 sc850sl->streaming = on; in sc850sl_s_stream()
1089 mutex_unlock(&sc850sl->mutex); in sc850sl_s_stream()
1095 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_s_power() local
1096 struct i2c_client *client = sc850sl->client; in sc850sl_s_power()
1099 mutex_lock(&sc850sl->mutex); in sc850sl_s_power()
1102 if (sc850sl->power_on == !!on) in sc850sl_s_power()
1112 ret |= sc850sl_write_reg(sc850sl->client, in sc850sl_s_power()
1123 sc850sl->power_on = true; in sc850sl_s_power()
1126 sc850sl->power_on = false; in sc850sl_s_power()
1130 mutex_unlock(&sc850sl->mutex); in sc850sl_s_power()
1135 static int __sc850sl_power_on(struct sc850sl *sc850sl) in __sc850sl_power_on() argument
1138 struct device *dev = &sc850sl->client->dev; in __sc850sl_power_on()
1140 if (!IS_ERR_OR_NULL(sc850sl->pins_default)) { in __sc850sl_power_on()
1141 ret = pinctrl_select_state(sc850sl->pinctrl, sc850sl->pins_default); in __sc850sl_power_on()
1146 if (!IS_ERR(sc850sl->power_gpio)) in __sc850sl_power_on()
1147 gpiod_direction_output(sc850sl->power_gpio, 1); in __sc850sl_power_on()
1150 if (!IS_ERR(sc850sl->reset_gpio)) in __sc850sl_power_on()
1151 gpiod_direction_output(sc850sl->reset_gpio, 0); in __sc850sl_power_on()
1154 ret = clk_set_rate(sc850sl->xvclk, SC850SL_XVCLK_FREQ_24M); in __sc850sl_power_on()
1157 if (clk_get_rate(sc850sl->xvclk) != SC850SL_XVCLK_FREQ_24M) in __sc850sl_power_on()
1159 ret = clk_prepare_enable(sc850sl->xvclk); in __sc850sl_power_on()
1165 ret = regulator_bulk_enable(SC850SL_NUM_SUPPLIES, sc850sl->supplies); in __sc850sl_power_on()
1174 if (!IS_ERR(sc850sl->reset_gpio)) in __sc850sl_power_on()
1175 gpiod_direction_output(sc850sl->reset_gpio, 1); in __sc850sl_power_on()
1177 clk_disable_unprepare(sc850sl->xvclk); in __sc850sl_power_on()
1182 static void __sc850sl_power_off(struct sc850sl *sc850sl) in __sc850sl_power_off() argument
1185 struct device *dev = &sc850sl->client->dev; in __sc850sl_power_off()
1187 if (!IS_ERR(sc850sl->reset_gpio)) in __sc850sl_power_off()
1188 gpiod_direction_output(sc850sl->reset_gpio, 1); in __sc850sl_power_off()
1189 clk_disable_unprepare(sc850sl->xvclk); in __sc850sl_power_off()
1190 if (!IS_ERR_OR_NULL(sc850sl->pins_sleep)) { in __sc850sl_power_off()
1191 ret = pinctrl_select_state(sc850sl->pinctrl, in __sc850sl_power_off()
1192 sc850sl->pins_sleep); in __sc850sl_power_off()
1196 if (!IS_ERR(sc850sl->power_gpio)) in __sc850sl_power_off()
1197 gpiod_direction_output(sc850sl->power_gpio, 0); in __sc850sl_power_off()
1198 regulator_bulk_disable(SC850SL_NUM_SUPPLIES, sc850sl->supplies); in __sc850sl_power_off()
1205 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_runtime_resume() local
1207 return __sc850sl_power_on(sc850sl); in sc850sl_runtime_resume()
1214 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_runtime_suspend() local
1216 __sc850sl_power_off(sc850sl); in sc850sl_runtime_suspend()
1224 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_open() local
1229 mutex_lock(&sc850sl->mutex); in sc850sl_open()
1236 mutex_unlock(&sc850sl->mutex); in sc850sl_open()
1247 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_enum_frame_interval() local
1249 if (fie->index >= sc850sl->cfg_num) in sc850sl_enum_frame_interval()
1270 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_get_selection() local
1273 if (sc850sl->cur_mode->width == 3856) { in sc850sl_get_selection()
1274 sel->r.left = CROP_START(sc850sl->cur_mode->width, DST_WIDTH_3840); in sc850sl_get_selection()
1276 sel->r.top = CROP_START(sc850sl->cur_mode->height, DST_HEIGHT_2160); in sc850sl_get_selection()
1278 } else if (sc850sl->cur_mode->width == 1944) { in sc850sl_get_selection()
1279 sel->r.left = CROP_START(sc850sl->cur_mode->width, DST_WIDTH_1920); in sc850sl_get_selection()
1281 sel->r.top = CROP_START(sc850sl->cur_mode->height, DST_HEIGHT_1080); in sc850sl_get_selection()
1284 sel->r.left = CROP_START(sc850sl->cur_mode->width, in sc850sl_get_selection()
1285 sc850sl->cur_mode->width); in sc850sl_get_selection()
1286 sel->r.width = sc850sl->cur_mode->width; in sc850sl_get_selection()
1287 sel->r.top = CROP_START(sc850sl->cur_mode->height, in sc850sl_get_selection()
1288 sc850sl->cur_mode->height); in sc850sl_get_selection()
1289 sel->r.height = sc850sl->cur_mode->height; in sc850sl_get_selection()
1336 static void sc850sl_modify_fps_info(struct sc850sl *sc850sl) in sc850sl_modify_fps_info() argument
1338 const struct sc850sl_mode *mode = sc850sl->cur_mode; in sc850sl_modify_fps_info()
1340 sc850sl->cur_fps.denominator = mode->max_fps.denominator * sc850sl->cur_vts / in sc850sl_modify_fps_info()
1346 struct sc850sl *sc850sl = container_of(ctrl->handler, in sc850sl_set_ctrl() local
1347 struct sc850sl, ctrl_handler); in sc850sl_set_ctrl()
1348 struct i2c_client *client = sc850sl->client; in sc850sl_set_ctrl()
1358 max = sc850sl->cur_mode->height + ctrl->val - 8; in sc850sl_set_ctrl()
1359 __v4l2_ctrl_modify_range(sc850sl->exposure, in sc850sl_set_ctrl()
1360 sc850sl->exposure->minimum, max, in sc850sl_set_ctrl()
1361 sc850sl->exposure->step, in sc850sl_set_ctrl()
1362 sc850sl->exposure->default_value); in sc850sl_set_ctrl()
1371 if (sc850sl->cur_mode->hdr_mode != NO_HDR) in sc850sl_set_ctrl()
1373 ret = sc850sl_write_reg(sc850sl->client, in sc850sl_set_ctrl()
1377 ret |= sc850sl_write_reg(sc850sl->client, in sc850sl_set_ctrl()
1381 ret |= sc850sl_write_reg(sc850sl->client, in sc850sl_set_ctrl()
1390 if (sc850sl->cur_mode->hdr_mode != NO_HDR) in sc850sl_set_ctrl()
1396 ret |= sc850sl_write_reg(sc850sl->client, in sc850sl_set_ctrl()
1400 ret |= sc850sl_write_reg(sc850sl->client, in sc850sl_set_ctrl()
1404 ret |= sc850sl_write_reg(sc850sl->client, in sc850sl_set_ctrl()
1410 ret = sc850sl_write_reg(sc850sl->client, SC850SL_REG_VTS, in sc850sl_set_ctrl()
1412 ctrl->val + sc850sl->cur_mode->height); in sc850sl_set_ctrl()
1414 sc850sl->cur_vts = ctrl->val + sc850sl->cur_mode->height; in sc850sl_set_ctrl()
1415 sc850sl_modify_fps_info(sc850sl); in sc850sl_set_ctrl()
1420 ret = sc850sl_enable_test_pattern(sc850sl, ctrl->val); in sc850sl_set_ctrl()
1423 ret = sc850sl_read_reg(sc850sl->client, SC850SL_FLIP_REG, in sc850sl_set_ctrl()
1431 ret |= sc850sl_write_reg(sc850sl->client, SC850SL_FLIP_REG, in sc850sl_set_ctrl()
1435 ret = sc850sl_read_reg(sc850sl->client, SC850SL_FLIP_REG, in sc850sl_set_ctrl()
1443 ret |= sc850sl_write_reg(sc850sl->client, SC850SL_FLIP_REG, in sc850sl_set_ctrl()
1462 static int sc850sl_initialize_controls(struct sc850sl *sc850sl) in sc850sl_initialize_controls() argument
1471 handler = &sc850sl->ctrl_handler; in sc850sl_initialize_controls()
1472 mode = sc850sl->cur_mode; in sc850sl_initialize_controls()
1476 handler->lock = &sc850sl->mutex; in sc850sl_initialize_controls()
1478 sc850sl->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in sc850sl_initialize_controls()
1480 v4l2_ctrl_s_ctrl(sc850sl->link_freq, mode->mipi_freq_idx); in sc850sl_initialize_controls()
1484 sc850sl->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in sc850sl_initialize_controls()
1489 sc850sl->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in sc850sl_initialize_controls()
1491 if (sc850sl->hblank) in sc850sl_initialize_controls()
1492 sc850sl->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc850sl_initialize_controls()
1495 sc850sl->vblank = v4l2_ctrl_new_std(handler, &sc850sl_ctrl_ops, in sc850sl_initialize_controls()
1501 sc850sl->exposure = v4l2_ctrl_new_std(handler, &sc850sl_ctrl_ops, in sc850sl_initialize_controls()
1506 sc850sl->anal_a_gain = v4l2_ctrl_new_std(handler, &sc850sl_ctrl_ops, in sc850sl_initialize_controls()
1511 sc850sl->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in sc850sl_initialize_controls()
1521 dev_err(&sc850sl->client->dev, in sc850sl_initialize_controls()
1526 sc850sl->subdev.ctrl_handler = handler; in sc850sl_initialize_controls()
1527 sc850sl->has_init_exp = false; in sc850sl_initialize_controls()
1528 sc850sl->cur_fps = mode->max_fps; in sc850sl_initialize_controls()
1529 sc850sl->cur_vts = mode->vts_def; in sc850sl_initialize_controls()
1539 static int sc850sl_check_sensor_id(struct sc850sl *sc850sl, in sc850sl_check_sensor_id() argument
1542 struct device *dev = &sc850sl->client->dev; in sc850sl_check_sensor_id()
1558 static int sc850sl_configure_regulators(struct sc850sl *sc850sl) in sc850sl_configure_regulators() argument
1563 sc850sl->supplies[i].supply = sc850sl_supply_names[i]; in sc850sl_configure_regulators()
1565 return devm_regulator_bulk_get(&sc850sl->client->dev, in sc850sl_configure_regulators()
1567 sc850sl->supplies); in sc850sl_configure_regulators()
1575 struct sc850sl *sc850sl; in sc850sl_probe() local
1586 sc850sl = devm_kzalloc(dev, sizeof(*sc850sl), GFP_KERNEL); in sc850sl_probe()
1587 if (!sc850sl) in sc850sl_probe()
1591 &sc850sl->module_index); in sc850sl_probe()
1593 &sc850sl->module_facing); in sc850sl_probe()
1595 &sc850sl->module_name); in sc850sl_probe()
1597 &sc850sl->len_name); in sc850sl_probe()
1609 sc850sl->client = client; in sc850sl_probe()
1610 sc850sl->cfg_num = ARRAY_SIZE(supported_modes); in sc850sl_probe()
1611 for (i = 0; i < sc850sl->cfg_num; i++) { in sc850sl_probe()
1613 sc850sl->cur_mode = &supported_modes[i]; in sc850sl_probe()
1618 sc850sl->xvclk = devm_clk_get(dev, "xvclk"); in sc850sl_probe()
1619 if (IS_ERR(sc850sl->xvclk)) { in sc850sl_probe()
1624 sc850sl->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS); in sc850sl_probe()
1625 if (IS_ERR(sc850sl->reset_gpio)) in sc850sl_probe()
1627 sc850sl->power_gpio = devm_gpiod_get(dev, "power", GPIOD_ASIS); in sc850sl_probe()
1628 if (IS_ERR(sc850sl->power_gpio)) in sc850sl_probe()
1631 sc850sl->pinctrl = devm_pinctrl_get(dev); in sc850sl_probe()
1632 if (!IS_ERR(sc850sl->pinctrl)) { in sc850sl_probe()
1633 sc850sl->pins_default = in sc850sl_probe()
1634 pinctrl_lookup_state(sc850sl->pinctrl, in sc850sl_probe()
1636 if (IS_ERR(sc850sl->pins_default)) in sc850sl_probe()
1639 sc850sl->pins_sleep = in sc850sl_probe()
1640 pinctrl_lookup_state(sc850sl->pinctrl, in sc850sl_probe()
1642 if (IS_ERR(sc850sl->pins_sleep)) in sc850sl_probe()
1648 ret = sc850sl_configure_regulators(sc850sl); in sc850sl_probe()
1654 mutex_init(&sc850sl->mutex); in sc850sl_probe()
1656 sd = &sc850sl->subdev; in sc850sl_probe()
1658 ret = sc850sl_initialize_controls(sc850sl); in sc850sl_probe()
1662 ret = __sc850sl_power_on(sc850sl); in sc850sl_probe()
1666 ret = sc850sl_check_sensor_id(sc850sl, client); in sc850sl_probe()
1675 sc850sl->pad.flags = MEDIA_PAD_FL_SOURCE; in sc850sl_probe()
1677 ret = media_entity_pads_init(&sd->entity, 1, &sc850sl->pad); in sc850sl_probe()
1683 if (strcmp(sc850sl->module_facing, "back") == 0) in sc850sl_probe()
1688 sc850sl->module_index, facing, in sc850sl_probe()
1708 __sc850sl_power_off(sc850sl); in sc850sl_probe()
1710 v4l2_ctrl_handler_free(&sc850sl->ctrl_handler); in sc850sl_probe()
1712 mutex_destroy(&sc850sl->mutex); in sc850sl_probe()
1720 struct sc850sl *sc850sl = to_sc850sl(sd); in sc850sl_remove() local
1726 v4l2_ctrl_handler_free(&sc850sl->ctrl_handler); in sc850sl_remove()
1727 mutex_destroy(&sc850sl->mutex); in sc850sl_remove()
1731 __sc850sl_power_off(sc850sl); in sc850sl_remove()