Lines Matching refs:os08a20

135 struct os08a20 {  struct
171 #define to_os08a20(sd) container_of(sd, struct os08a20, subdev) argument
552 os08a20_find_best_fit(struct os08a20 *os08a20, in os08a20_find_best_fit() argument
561 for (i = 0; i < os08a20->cfg_num; i++) { in os08a20_find_best_fit()
576 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_set_fmt() local
580 mutex_lock(&os08a20->mutex); in os08a20_set_fmt()
582 mode = os08a20_find_best_fit(os08a20, fmt); in os08a20_set_fmt()
591 mutex_unlock(&os08a20->mutex); in os08a20_set_fmt()
595 os08a20->cur_mode = mode; in os08a20_set_fmt()
597 __v4l2_ctrl_modify_range(os08a20->hblank, h_blank, in os08a20_set_fmt()
600 __v4l2_ctrl_modify_range(os08a20->vblank, vblank_def, in os08a20_set_fmt()
605 mutex_unlock(&os08a20->mutex); in os08a20_set_fmt()
614 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_get_fmt() local
615 const struct os08a20_mode *mode = os08a20->cur_mode; in os08a20_get_fmt()
617 mutex_lock(&os08a20->mutex); in os08a20_get_fmt()
622 mutex_unlock(&os08a20->mutex); in os08a20_get_fmt()
631 mutex_unlock(&os08a20->mutex); in os08a20_get_fmt()
651 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_enum_frame_sizes() local
653 if (fse->index >= os08a20->cfg_num) in os08a20_enum_frame_sizes()
667 static int os08a20_enable_test_pattern(struct os08a20 *os08a20, u32 pattern) in os08a20_enable_test_pattern() argument
677 return os08a20_write_reg(os08a20->client, OS08A20_REG_TEST_PATTERN, in os08a20_enable_test_pattern()
684 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_g_frame_interval() local
685 const struct os08a20_mode *mode = os08a20->cur_mode; in os08a20_g_frame_interval()
692 static void os08a20_get_module_inf(struct os08a20 *os08a20, in os08a20_get_module_inf() argument
697 strscpy(inf->base.module, os08a20->module_name, in os08a20_get_module_inf()
699 strscpy(inf->base.lens, os08a20->len_name, sizeof(inf->base.lens)); in os08a20_get_module_inf()
702 static void os08a20_set_awb_cfg(struct os08a20 *os08a20, in os08a20_set_awb_cfg() argument
705 mutex_lock(&os08a20->mutex); in os08a20_set_awb_cfg()
706 memcpy(&os08a20->awb_cfg, cfg, sizeof(*cfg)); in os08a20_set_awb_cfg()
707 mutex_unlock(&os08a20->mutex); in os08a20_set_awb_cfg()
712 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_ioctl() local
719 os08a20_get_module_inf(os08a20, (struct rkmodule_inf *)arg); in os08a20_ioctl()
724 hdr->hdr_mode = os08a20->cur_mode->hdr_mode; in os08a20_ioctl()
732 os08a20_set_awb_cfg(os08a20, (struct rkmodule_awb_cfg *)arg); in os08a20_ioctl()
739 ret = os08a20_write_reg(os08a20->client, OS08A20_REG_CTRL_MODE, in os08a20_ioctl()
742 ret = os08a20_write_reg(os08a20->client, OS08A20_REG_CTRL_MODE, in os08a20_ioctl()
840 static int __os08a20_start_stream(struct os08a20 *os08a20) in __os08a20_start_stream() argument
844 ret = os08a20_write_array(os08a20->client, os08a20->cur_mode->reg_list); in __os08a20_start_stream()
852 dev_info(&os08a20->client->dev, "%s:Check register value!\n", in __os08a20_start_stream()
854 ret = os08a20_reg_verify(os08a20->client, os08a20_global_regs); in __os08a20_start_stream()
858 ret = os08a20_reg_verify(os08a20->client, os08a20->cur_mode->reg_list); in __os08a20_start_stream()
864 mutex_unlock(&os08a20->mutex); in __os08a20_start_stream()
865 ret = v4l2_ctrl_handler_setup(&os08a20->ctrl_handler); in __os08a20_start_stream()
866 mutex_lock(&os08a20->mutex); in __os08a20_start_stream()
870 ret = os08a20_write_reg(os08a20->client, OS08A20_REG_CTRL_MODE, in __os08a20_start_stream()
875 static int __os08a20_stop_stream(struct os08a20 *os08a20) in __os08a20_stop_stream() argument
877 return os08a20_write_reg(os08a20->client, OS08A20_REG_CTRL_MODE, in __os08a20_stop_stream()
883 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_s_stream() local
884 struct i2c_client *client = os08a20->client; in os08a20_s_stream()
888 os08a20->cur_mode->width, in os08a20_s_stream()
889 os08a20->cur_mode->height, in os08a20_s_stream()
890 DIV_ROUND_CLOSEST(os08a20->cur_mode->max_fps.denominator, in os08a20_s_stream()
891 os08a20->cur_mode->max_fps.numerator)); in os08a20_s_stream()
893 mutex_lock(&os08a20->mutex); in os08a20_s_stream()
895 if (on == os08a20->streaming) in os08a20_s_stream()
906 ret = __os08a20_start_stream(os08a20); in os08a20_s_stream()
914 __os08a20_stop_stream(os08a20); in os08a20_s_stream()
918 os08a20->streaming = on; in os08a20_s_stream()
921 mutex_unlock(&os08a20->mutex); in os08a20_s_stream()
928 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_s_power() local
929 struct i2c_client *client = os08a20->client; in os08a20_s_power()
934 mutex_lock(&os08a20->mutex); in os08a20_s_power()
937 if (os08a20->power_on == !!on) in os08a20_s_power()
947 ret = os08a20_write_array(os08a20->client, os08a20_global_regs); in os08a20_s_power()
954 os08a20->power_on = true; in os08a20_s_power()
956 if (!IS_ERR(os08a20->reset_gpio)) in os08a20_s_power()
957 gpiod_export(os08a20->reset_gpio, false); in os08a20_s_power()
958 if (!IS_ERR(os08a20->pwdn_gpio)) in os08a20_s_power()
959 gpiod_export(os08a20->pwdn_gpio, false); in os08a20_s_power()
962 os08a20->power_on = false; in os08a20_s_power()
966 mutex_unlock(&os08a20->mutex); in os08a20_s_power()
977 static int __os08a20_power_on(struct os08a20 *os08a20) in __os08a20_power_on() argument
981 struct device *dev = &os08a20->client->dev; in __os08a20_power_on()
983 if (!IS_ERR(os08a20->power_gpio)) in __os08a20_power_on()
984 gpiod_set_value_cansleep(os08a20->power_gpio, 1); in __os08a20_power_on()
988 if (!IS_ERR_OR_NULL(os08a20->pins_default)) { in __os08a20_power_on()
989 ret = pinctrl_select_state(os08a20->pinctrl, in __os08a20_power_on()
990 os08a20->pins_default); in __os08a20_power_on()
994 ret = clk_set_rate(os08a20->xvclk, OS08A20_XVCLK_FREQ); in __os08a20_power_on()
997 if (clk_get_rate(os08a20->xvclk) != OS08A20_XVCLK_FREQ) in __os08a20_power_on()
999 ret = clk_prepare_enable(os08a20->xvclk); in __os08a20_power_on()
1005 ret = regulator_bulk_enable(OS08A20_NUM_SUPPLIES, os08a20->supplies); in __os08a20_power_on()
1011 if (!IS_ERR(os08a20->reset_gpio)) in __os08a20_power_on()
1012 gpiod_set_value_cansleep(os08a20->reset_gpio, 1); in __os08a20_power_on()
1014 if (!IS_ERR(os08a20->pwdn_gpio)) in __os08a20_power_on()
1015 gpiod_set_value_cansleep(os08a20->pwdn_gpio, 1); in __os08a20_power_on()
1018 if (!IS_ERR(os08a20->reset_gpio)) in __os08a20_power_on()
1019 gpiod_export(os08a20->reset_gpio, false); in __os08a20_power_on()
1020 if (!IS_ERR(os08a20->pwdn_gpio)) in __os08a20_power_on()
1021 gpiod_export(os08a20->pwdn_gpio, false); in __os08a20_power_on()
1030 clk_disable_unprepare(os08a20->xvclk); in __os08a20_power_on()
1035 static void __os08a20_power_off(struct os08a20 *os08a20) in __os08a20_power_off() argument
1038 struct device *dev = &os08a20->client->dev; in __os08a20_power_off()
1040 if (!IS_ERR(os08a20->pwdn_gpio)) in __os08a20_power_off()
1041 gpiod_set_value_cansleep(os08a20->pwdn_gpio, 0); in __os08a20_power_off()
1042 clk_disable_unprepare(os08a20->xvclk); in __os08a20_power_off()
1043 if (!IS_ERR(os08a20->reset_gpio)) in __os08a20_power_off()
1044 gpiod_set_value_cansleep(os08a20->reset_gpio, 0); in __os08a20_power_off()
1045 if (!IS_ERR_OR_NULL(os08a20->pins_sleep)) { in __os08a20_power_off()
1046 ret = pinctrl_select_state(os08a20->pinctrl, in __os08a20_power_off()
1047 os08a20->pins_sleep); in __os08a20_power_off()
1051 if (!IS_ERR(os08a20->power_gpio)) in __os08a20_power_off()
1052 gpiod_set_value_cansleep(os08a20->power_gpio, 0); in __os08a20_power_off()
1054 regulator_bulk_disable(OS08A20_NUM_SUPPLIES, os08a20->supplies); in __os08a20_power_off()
1061 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_runtime_resume() local
1063 return __os08a20_power_on(os08a20); in os08a20_runtime_resume()
1070 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_runtime_suspend() local
1072 __os08a20_power_off(os08a20); in os08a20_runtime_suspend()
1080 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_open() local
1085 mutex_lock(&os08a20->mutex); in os08a20_open()
1092 mutex_unlock(&os08a20->mutex); in os08a20_open()
1103 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_enum_frame_interval() local
1105 if (fie->index >= os08a20->cfg_num) in os08a20_enum_frame_interval()
1172 struct os08a20 *os08a20 = container_of(ctrl->handler, in os08a20_set_ctrl() local
1173 struct os08a20, ctrl_handler); in os08a20_set_ctrl()
1174 struct i2c_client *client = os08a20->client; in os08a20_set_ctrl()
1183 max = os08a20->cur_mode->height + ctrl->val - 4; in os08a20_set_ctrl()
1184 __v4l2_ctrl_modify_range(os08a20->exposure, in os08a20_set_ctrl()
1185 os08a20->exposure->minimum, max, in os08a20_set_ctrl()
1186 os08a20->exposure->step, in os08a20_set_ctrl()
1187 os08a20->exposure->default_value); in os08a20_set_ctrl()
1196 ret = os08a20_write_reg(os08a20->client, OS08A20_REG_EXPOSURE, in os08a20_set_ctrl()
1200 ret = os08a20_write_reg(os08a20->client, OS08A20_REG_GAIN_L, in os08a20_set_ctrl()
1203 ret |= os08a20_write_reg(os08a20->client, OS08A20_REG_GAIN_H, in os08a20_set_ctrl()
1209 ret = os08a20_write_reg(os08a20->client, OS08A20_REG_VTS, in os08a20_set_ctrl()
1211 ctrl->val + os08a20->cur_mode->height); in os08a20_set_ctrl()
1214 ret = os08a20_enable_test_pattern(os08a20, ctrl->val); in os08a20_set_ctrl()
1217 ret = os08a20_read_reg(os08a20->client, OS08A20_REG_MIRROR, in os08a20_set_ctrl()
1224 ret |= os08a20_write_reg(os08a20->client, OS08A20_REG_MIRROR, in os08a20_set_ctrl()
1229 ret = os08a20_read_reg(os08a20->client, OS08A20_REG_FLIP, in os08a20_set_ctrl()
1236 ret |= os08a20_write_reg(os08a20->client, OS08A20_REG_FLIP, in os08a20_set_ctrl()
1255 static int os08a20_initialize_controls(struct os08a20 *os08a20) in os08a20_initialize_controls() argument
1264 handler = &os08a20->ctrl_handler; in os08a20_initialize_controls()
1265 mode = os08a20->cur_mode; in os08a20_initialize_controls()
1269 handler->lock = &os08a20->mutex; in os08a20_initialize_controls()
1277 0, os08a20->pixel_rate, 1, os08a20->pixel_rate); in os08a20_initialize_controls()
1280 os08a20->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in os08a20_initialize_controls()
1282 if (os08a20->hblank) in os08a20_initialize_controls()
1283 os08a20->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in os08a20_initialize_controls()
1286 os08a20->vblank = v4l2_ctrl_new_std(handler, &os08a20_ctrl_ops, in os08a20_initialize_controls()
1292 os08a20->exposure = v4l2_ctrl_new_std(handler, &os08a20_ctrl_ops, in os08a20_initialize_controls()
1297 os08a20->anal_gain = v4l2_ctrl_new_std(handler, &os08a20_ctrl_ops, in os08a20_initialize_controls()
1302 os08a20->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in os08a20_initialize_controls()
1315 dev_err(&os08a20->client->dev, in os08a20_initialize_controls()
1320 os08a20->subdev.ctrl_handler = handler; in os08a20_initialize_controls()
1330 static int os08a20_check_sensor_id(struct os08a20 *os08a20, in os08a20_check_sensor_id() argument
1333 struct device *dev = &os08a20->client->dev; in os08a20_check_sensor_id()
1349 static int os08a20_configure_regulators(struct os08a20 *os08a20) in os08a20_configure_regulators() argument
1354 os08a20->supplies[i].supply = os08a20_supply_names[i]; in os08a20_configure_regulators()
1356 return devm_regulator_bulk_get(&os08a20->client->dev, in os08a20_configure_regulators()
1358 os08a20->supplies); in os08a20_configure_regulators()
1361 static int os08a20_parse_of(struct os08a20 *os08a20) in os08a20_parse_of() argument
1363 struct device *dev = &os08a20->client->dev; in os08a20_parse_of()
1380 os08a20->lane_num = rval; in os08a20_parse_of()
1381 if (os08a20->lane_num == 4) { in os08a20_parse_of()
1382 os08a20->cur_mode = &supported_modes_4lane[0]; in os08a20_parse_of()
1384 os08a20->cfg_num = ARRAY_SIZE(supported_modes_4lane); in os08a20_parse_of()
1387 os08a20->pixel_rate = MIPI_FREQ * 2U * os08a20->lane_num / 8U; in os08a20_parse_of()
1389 os08a20->lane_num, os08a20->pixel_rate); in os08a20_parse_of()
1391 dev_err(dev, "unsupported lane_num(%d)\n", os08a20->lane_num); in os08a20_parse_of()
1403 struct os08a20 *os08a20; in os08a20_probe() local
1413 os08a20 = devm_kzalloc(dev, sizeof(*os08a20), GFP_KERNEL); in os08a20_probe()
1414 if (!os08a20) in os08a20_probe()
1418 &os08a20->module_index); in os08a20_probe()
1421 os08a20->module_index = 0; in os08a20_probe()
1424 &os08a20->module_facing); in os08a20_probe()
1426 &os08a20->module_name); in os08a20_probe()
1428 &os08a20->len_name); in os08a20_probe()
1434 os08a20->client = client; in os08a20_probe()
1436 os08a20->xvclk = devm_clk_get(dev, "xvclk"); in os08a20_probe()
1437 if (IS_ERR(os08a20->xvclk)) { in os08a20_probe()
1442 os08a20->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in os08a20_probe()
1443 if (IS_ERR(os08a20->power_gpio)) in os08a20_probe()
1446 os08a20->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in os08a20_probe()
1447 if (IS_ERR(os08a20->reset_gpio)) in os08a20_probe()
1450 os08a20->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in os08a20_probe()
1451 if (IS_ERR(os08a20->pwdn_gpio)) in os08a20_probe()
1454 ret = os08a20_configure_regulators(os08a20); in os08a20_probe()
1459 ret = os08a20_parse_of(os08a20); in os08a20_probe()
1463 os08a20->pinctrl = devm_pinctrl_get(dev); in os08a20_probe()
1464 if (!IS_ERR(os08a20->pinctrl)) { in os08a20_probe()
1465 os08a20->pins_default = in os08a20_probe()
1466 pinctrl_lookup_state(os08a20->pinctrl, in os08a20_probe()
1468 if (IS_ERR(os08a20->pins_default)) in os08a20_probe()
1471 os08a20->pins_sleep = in os08a20_probe()
1472 pinctrl_lookup_state(os08a20->pinctrl, in os08a20_probe()
1474 if (IS_ERR(os08a20->pins_sleep)) in os08a20_probe()
1478 mutex_init(&os08a20->mutex); in os08a20_probe()
1480 sd = &os08a20->subdev; in os08a20_probe()
1482 ret = os08a20_initialize_controls(os08a20); in os08a20_probe()
1486 ret = __os08a20_power_on(os08a20); in os08a20_probe()
1490 ret = os08a20_check_sensor_id(os08a20, client); in os08a20_probe()
1505 os08a20->pad.flags = MEDIA_PAD_FL_SOURCE; in os08a20_probe()
1507 ret = media_entity_pads_init(&sd->entity, 1, &os08a20->pad); in os08a20_probe()
1513 if (strcmp(os08a20->module_facing, "back") == 0) in os08a20_probe()
1519 os08a20->module_index, facing, in os08a20_probe()
1539 __os08a20_power_off(os08a20); in os08a20_probe()
1541 v4l2_ctrl_handler_free(&os08a20->ctrl_handler); in os08a20_probe()
1543 mutex_destroy(&os08a20->mutex); in os08a20_probe()
1551 struct os08a20 *os08a20 = to_os08a20(sd); in os08a20_remove() local
1557 v4l2_ctrl_handler_free(&os08a20->ctrl_handler); in os08a20_remove()
1558 mutex_destroy(&os08a20->mutex); in os08a20_remove()
1562 __os08a20_power_off(os08a20); in os08a20_remove()