Lines Matching refs:os05a20
127 struct os05a20 { struct
168 #define to_os05a20(sd) container_of(sd, struct os05a20, subdev) argument
693 static int __os05a20_power_on(struct os05a20 *os05a20);
782 os05a20_find_best_fit(struct os05a20 *os05a20, struct v4l2_subdev_format *fmt) in os05a20_find_best_fit() argument
790 for (i = 0; i < os05a20->cfg_num; i++) { in os05a20_find_best_fit()
806 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_set_fmt() local
810 mutex_lock(&os05a20->mutex); in os05a20_set_fmt()
812 mode = os05a20_find_best_fit(os05a20, fmt); in os05a20_set_fmt()
821 mutex_unlock(&os05a20->mutex); in os05a20_set_fmt()
825 os05a20->cur_mode = mode; in os05a20_set_fmt()
827 __v4l2_ctrl_modify_range(os05a20->hblank, h_blank, in os05a20_set_fmt()
830 __v4l2_ctrl_modify_range(os05a20->vblank, vblank_def, in os05a20_set_fmt()
835 mutex_unlock(&os05a20->mutex); in os05a20_set_fmt()
844 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_get_fmt() local
845 const struct os05a20_mode *mode = os05a20->cur_mode; in os05a20_get_fmt()
847 mutex_lock(&os05a20->mutex); in os05a20_get_fmt()
852 mutex_unlock(&os05a20->mutex); in os05a20_get_fmt()
865 mutex_unlock(&os05a20->mutex); in os05a20_get_fmt()
874 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_enum_mbus_code() local
878 code->code = os05a20->cur_mode->bus_fmt; in os05a20_enum_mbus_code()
887 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_enum_frame_sizes() local
889 if (fse->index >= os05a20->cfg_num) in os05a20_enum_frame_sizes()
903 static int os05a20_enable_test_pattern(struct os05a20 *os05a20, u32 pattern) in os05a20_enable_test_pattern() argument
912 ret = os05a20_write_reg(os05a20->client, OS05A20_REG_TEST_PATTERN, in os05a20_enable_test_pattern()
920 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_g_frame_interval() local
921 const struct os05a20_mode *mode = os05a20->cur_mode; in os05a20_g_frame_interval()
931 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_g_mbus_config() local
932 const struct os05a20_mode *mode = os05a20->cur_mode; in os05a20_g_mbus_config()
951 static void os05a20_get_module_inf(struct os05a20 *os05a20, in os05a20_get_module_inf() argument
956 strlcpy(inf->base.module, os05a20->module_name, in os05a20_get_module_inf()
958 strlcpy(inf->base.lens, os05a20->len_name, sizeof(inf->base.lens)); in os05a20_get_module_inf()
961 static int os05a20_set_hdrae(struct os05a20 *os05a20, in os05a20_set_hdrae() argument
970 if (!os05a20->has_init_exp && !os05a20->streaming) { in os05a20_set_hdrae()
971 os05a20->init_hdrae_exp = *ae; in os05a20_set_hdrae()
972 os05a20->has_init_exp = true; in os05a20_set_hdrae()
973 dev_dbg(&os05a20->client->dev, "os05a20 don't stream, record exp for hdr!\n"); in os05a20_set_hdrae()
980 dev_dbg(&os05a20->client->dev, in os05a20_set_hdrae()
986 dev_err(&os05a20->client->dev, in os05a20_set_hdrae()
1000 dev_dbg(&os05a20->client->dev, in os05a20_set_hdrae()
1005 ret = os05a20_write_reg(os05a20->client, in os05a20_set_hdrae()
1010 ret |= os05a20_write_reg(os05a20->client, in os05a20_set_hdrae()
1014 ret |= os05a20_write_reg(os05a20->client, in os05a20_set_hdrae()
1019 ret |= os05a20_write_reg(os05a20->client, in os05a20_set_hdrae()
1023 ret |= os05a20_write_reg(os05a20->client, in os05a20_set_hdrae()
1028 ret |= os05a20_write_reg(os05a20->client, in os05a20_set_hdrae()
1032 ret |= os05a20_write_reg(os05a20->client, in os05a20_set_hdrae()
1036 ret |= os05a20_write_reg(os05a20->client, in os05a20_set_hdrae()
1040 ret |= os05a20_write_reg(os05a20->client, in os05a20_set_hdrae()
1049 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_ioctl() local
1057 return os05a20_set_hdrae(os05a20, arg); in os05a20_ioctl()
1060 w = os05a20->cur_mode->width; in os05a20_ioctl()
1061 h = os05a20->cur_mode->height; in os05a20_ioctl()
1062 for (i = 0; i < os05a20->cfg_num; i++) { in os05a20_ioctl()
1066 os05a20->cur_mode = &supported_modes[i]; in os05a20_ioctl()
1070 if (i == os05a20->cfg_num) { in os05a20_ioctl()
1071 dev_err(&os05a20->client->dev, in os05a20_ioctl()
1076 w = os05a20->cur_mode->hts_def - os05a20->cur_mode->width; in os05a20_ioctl()
1077 h = os05a20->cur_mode->vts_def - os05a20->cur_mode->height; in os05a20_ioctl()
1078 __v4l2_ctrl_modify_range(os05a20->hblank, w, w, 1, w); in os05a20_ioctl()
1079 __v4l2_ctrl_modify_range(os05a20->vblank, h, in os05a20_ioctl()
1080 OS05A20_VTS_MAX - os05a20->cur_mode->height, in os05a20_ioctl()
1082 dev_info(&os05a20->client->dev, in os05a20_ioctl()
1084 os05a20->cur_mode->hdr_mode); in os05a20_ioctl()
1088 os05a20_get_module_inf(os05a20, (struct rkmodule_inf *)arg); in os05a20_ioctl()
1093 hdr_cfg->hdr_mode = os05a20->cur_mode->hdr_mode; in os05a20_ioctl()
1103 ret = os05a20_write_reg(os05a20->client, OS05A20_REG_CTRL_MODE, in os05a20_ioctl()
1106 ret = os05a20_write_reg(os05a20->client, OS05A20_REG_CTRL_MODE, in os05a20_ioctl()
1207 static int __os05a20_start_stream(struct os05a20 *os05a20) in __os05a20_start_stream() argument
1211 if (!os05a20->is_thunderboot) { in __os05a20_start_stream()
1212 ret = os05a20_write_array(os05a20->client, os05a20_global_regs); in __os05a20_start_stream()
1214 dev_err(&os05a20->client->dev, in __os05a20_start_stream()
1219 ret = os05a20_write_array(os05a20->client, os05a20->cur_mode->reg_list); in __os05a20_start_stream()
1225 ret = __v4l2_ctrl_handler_setup(&os05a20->ctrl_handler); in __os05a20_start_stream()
1228 if (os05a20->has_init_exp && os05a20->cur_mode->hdr_mode != NO_HDR) { in __os05a20_start_stream()
1229 ret = os05a20_ioctl(&os05a20->subdev, in __os05a20_start_stream()
1231 &os05a20->init_hdrae_exp); in __os05a20_start_stream()
1233 dev_err(&os05a20->client->dev, in __os05a20_start_stream()
1238 return os05a20_write_reg(os05a20->client, OS05A20_REG_CTRL_MODE, in __os05a20_start_stream()
1242 static int __os05a20_stop_stream(struct os05a20 *os05a20) in __os05a20_stop_stream() argument
1244 os05a20->has_init_exp = false; in __os05a20_stop_stream()
1245 if (os05a20->is_thunderboot) in __os05a20_stop_stream()
1246 os05a20->is_first_streamoff = true; in __os05a20_stop_stream()
1247 return os05a20_write_reg(os05a20->client, OS05A20_REG_CTRL_MODE, in __os05a20_stop_stream()
1253 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_s_stream() local
1254 struct i2c_client *client = os05a20->client; in os05a20_s_stream()
1257 mutex_lock(&os05a20->mutex); in os05a20_s_stream()
1259 if (on == os05a20->streaming) in os05a20_s_stream()
1263 if (os05a20->is_thunderboot && rkisp_tb_get_state() == RKISP_TB_NG) { in os05a20_s_stream()
1264 os05a20->is_thunderboot = false; in os05a20_s_stream()
1265 __os05a20_power_on(os05a20); in os05a20_s_stream()
1273 ret = __os05a20_start_stream(os05a20); in os05a20_s_stream()
1280 __os05a20_stop_stream(os05a20); in os05a20_s_stream()
1284 os05a20->streaming = on; in os05a20_s_stream()
1287 mutex_unlock(&os05a20->mutex); in os05a20_s_stream()
1294 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_s_power() local
1295 struct i2c_client *client = os05a20->client; in os05a20_s_power()
1298 mutex_lock(&os05a20->mutex); in os05a20_s_power()
1301 if (os05a20->power_on == !!on) in os05a20_s_power()
1311 if (!os05a20->is_thunderboot) { in os05a20_s_power()
1312 ret |= os05a20_write_reg(os05a20->client, in os05a20_s_power()
1319 os05a20->power_on = true; in os05a20_s_power()
1322 os05a20->power_on = false; in os05a20_s_power()
1326 mutex_unlock(&os05a20->mutex); in os05a20_s_power()
1337 static int __os05a20_power_on(struct os05a20 *os05a20) in __os05a20_power_on() argument
1341 struct device *dev = &os05a20->client->dev; in __os05a20_power_on()
1343 if (os05a20->is_thunderboot) in __os05a20_power_on()
1346 if (!IS_ERR_OR_NULL(os05a20->pins_default)) { in __os05a20_power_on()
1347 ret = pinctrl_select_state(os05a20->pinctrl, in __os05a20_power_on()
1348 os05a20->pins_default); in __os05a20_power_on()
1352 ret = clk_set_rate(os05a20->xvclk, OS05A20_XVCLK_FREQ); in __os05a20_power_on()
1355 if (clk_get_rate(os05a20->xvclk) != OS05A20_XVCLK_FREQ) in __os05a20_power_on()
1357 ret = clk_prepare_enable(os05a20->xvclk); in __os05a20_power_on()
1362 if (!IS_ERR(os05a20->power_gpio)) { in __os05a20_power_on()
1363 gpiod_direction_output(os05a20->power_gpio, 1); in __os05a20_power_on()
1366 if (!IS_ERR(os05a20->reset_gpio)) in __os05a20_power_on()
1367 gpiod_direction_output(os05a20->reset_gpio, 1); in __os05a20_power_on()
1369 ret = regulator_bulk_enable(OS05A20_NUM_SUPPLIES, os05a20->supplies); in __os05a20_power_on()
1375 if (!IS_ERR(os05a20->reset_gpio)) in __os05a20_power_on()
1376 gpiod_direction_output(os05a20->reset_gpio, 0); in __os05a20_power_on()
1379 if (!IS_ERR(os05a20->pwdn_gpio)) in __os05a20_power_on()
1380 gpiod_direction_output(os05a20->pwdn_gpio, 1); in __os05a20_power_on()
1385 if (!IS_ERR(os05a20->reset_gpio)) in __os05a20_power_on()
1397 clk_disable_unprepare(os05a20->xvclk); in __os05a20_power_on()
1402 static void __os05a20_power_off(struct os05a20 *os05a20) in __os05a20_power_off() argument
1405 struct device *dev = &os05a20->client->dev; in __os05a20_power_off()
1407 if (os05a20->is_thunderboot) { in __os05a20_power_off()
1408 if (os05a20->is_first_streamoff) { in __os05a20_power_off()
1409 os05a20->is_thunderboot = false; in __os05a20_power_off()
1410 os05a20->is_first_streamoff = false; in __os05a20_power_off()
1416 if (!IS_ERR(os05a20->pwdn_gpio)) in __os05a20_power_off()
1417 gpiod_direction_output(os05a20->pwdn_gpio, 0); in __os05a20_power_off()
1419 clk_disable_unprepare(os05a20->xvclk); in __os05a20_power_off()
1421 if (!IS_ERR(os05a20->reset_gpio)) in __os05a20_power_off()
1422 gpiod_direction_output(os05a20->reset_gpio, 0); in __os05a20_power_off()
1423 if (!IS_ERR(os05a20->power_gpio)) in __os05a20_power_off()
1424 gpiod_direction_output(os05a20->power_gpio, 0); in __os05a20_power_off()
1425 if (!IS_ERR_OR_NULL(os05a20->pins_sleep)) { in __os05a20_power_off()
1426 ret = pinctrl_select_state(os05a20->pinctrl, in __os05a20_power_off()
1427 os05a20->pins_sleep); in __os05a20_power_off()
1432 if (os05a20->is_thunderboot_ng) { in __os05a20_power_off()
1433 os05a20->is_thunderboot_ng = false; in __os05a20_power_off()
1434 regulator_bulk_disable(OS05A20_NUM_SUPPLIES, os05a20->supplies); in __os05a20_power_off()
1442 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_runtime_resume() local
1444 return __os05a20_power_on(os05a20); in os05a20_runtime_resume()
1451 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_runtime_suspend() local
1453 __os05a20_power_off(os05a20); in os05a20_runtime_suspend()
1461 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_open() local
1466 mutex_lock(&os05a20->mutex); in os05a20_open()
1473 mutex_unlock(&os05a20->mutex); in os05a20_open()
1484 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_enum_frame_interval() local
1486 if (fie->index >= os05a20->cfg_num) in os05a20_enum_frame_interval()
1538 struct os05a20 *os05a20 = container_of(ctrl->handler, in os05a20_set_ctrl() local
1539 struct os05a20, ctrl_handler); in os05a20_set_ctrl()
1540 struct i2c_client *client = os05a20->client; in os05a20_set_ctrl()
1549 if (os05a20->cur_mode->hdr_mode == NO_HDR) { in os05a20_set_ctrl()
1551 max = os05a20->cur_mode->height + ctrl->val - 8; in os05a20_set_ctrl()
1552 __v4l2_ctrl_modify_range(os05a20->exposure, in os05a20_set_ctrl()
1553 os05a20->exposure->minimum, max, in os05a20_set_ctrl()
1554 os05a20->exposure->step, in os05a20_set_ctrl()
1555 os05a20->exposure->default_value); in os05a20_set_ctrl()
1565 if (os05a20->cur_mode->hdr_mode != NO_HDR) in os05a20_set_ctrl()
1567 ret = os05a20_write_reg(os05a20->client, in os05a20_set_ctrl()
1575 if (os05a20->cur_mode->hdr_mode != NO_HDR) in os05a20_set_ctrl()
1584 ret = os05a20_write_reg(os05a20->client, in os05a20_set_ctrl()
1588 ret |= os05a20_write_reg(os05a20->client, in os05a20_set_ctrl()
1596 ret = os05a20_write_reg(os05a20->client, OS05A20_REG_VTS, in os05a20_set_ctrl()
1598 ctrl->val + os05a20->cur_mode->height); in os05a20_set_ctrl()
1603 ret = os05a20_enable_test_pattern(os05a20, ctrl->val); in os05a20_set_ctrl()
1606 ret = os05a20_read_reg(os05a20->client, OS05A20_MIRROR_REG, in os05a20_set_ctrl()
1613 ret = os05a20_write_reg(os05a20->client, OS05A20_MIRROR_REG, in os05a20_set_ctrl()
1618 ret = os05a20_read_reg(os05a20->client, OS05A20_FLIP_REG, in os05a20_set_ctrl()
1625 ret = os05a20_write_reg(os05a20->client, OS05A20_FLIP_REG, in os05a20_set_ctrl()
1645 static int os05a20_initialize_controls(struct os05a20 *os05a20) in os05a20_initialize_controls() argument
1653 handler = &os05a20->ctrl_handler; in os05a20_initialize_controls()
1654 mode = os05a20->cur_mode; in os05a20_initialize_controls()
1658 handler->lock = &os05a20->mutex; in os05a20_initialize_controls()
1660 os05a20->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in os05a20_initialize_controls()
1664 os05a20->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in os05a20_initialize_controls()
1670 os05a20->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in os05a20_initialize_controls()
1672 if (os05a20->hblank) in os05a20_initialize_controls()
1673 os05a20->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in os05a20_initialize_controls()
1676 os05a20->vblank = v4l2_ctrl_new_std(handler, &os05a20_ctrl_ops, in os05a20_initialize_controls()
1682 os05a20->exposure = v4l2_ctrl_new_std(handler, &os05a20_ctrl_ops, in os05a20_initialize_controls()
1687 os05a20->anal_gain = v4l2_ctrl_new_std(handler, &os05a20_ctrl_ops, in os05a20_initialize_controls()
1692 os05a20->test_pattern = in os05a20_initialize_controls()
1698 os05a20->h_flip = v4l2_ctrl_new_std(handler, &os05a20_ctrl_ops, in os05a20_initialize_controls()
1701 os05a20->v_flip = v4l2_ctrl_new_std(handler, &os05a20_ctrl_ops, in os05a20_initialize_controls()
1705 dev_err(&os05a20->client->dev, in os05a20_initialize_controls()
1710 os05a20->subdev.ctrl_handler = handler; in os05a20_initialize_controls()
1711 os05a20->has_init_exp = false; in os05a20_initialize_controls()
1721 static int os05a20_check_sensor_id(struct os05a20 *os05a20, in os05a20_check_sensor_id() argument
1724 struct device *dev = &os05a20->client->dev; in os05a20_check_sensor_id()
1728 if (os05a20->is_thunderboot) { in os05a20_check_sensor_id()
1745 static int os05a20_configure_regulators(struct os05a20 *os05a20) in os05a20_configure_regulators() argument
1750 os05a20->supplies[i].supply = os05a20_supply_names[i]; in os05a20_configure_regulators()
1752 return devm_regulator_bulk_get(&os05a20->client->dev, in os05a20_configure_regulators()
1754 os05a20->supplies); in os05a20_configure_regulators()
1762 struct os05a20 *os05a20; in os05a20_probe() local
1773 os05a20 = devm_kzalloc(dev, sizeof(*os05a20), GFP_KERNEL); in os05a20_probe()
1774 if (!os05a20) in os05a20_probe()
1778 &os05a20->module_index); in os05a20_probe()
1780 &os05a20->module_facing); in os05a20_probe()
1782 &os05a20->module_name); in os05a20_probe()
1784 &os05a20->len_name); in os05a20_probe()
1790 os05a20->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); in os05a20_probe()
1797 os05a20->cfg_num = ARRAY_SIZE(supported_modes); in os05a20_probe()
1798 for (i = 0; i < os05a20->cfg_num; i++) { in os05a20_probe()
1800 os05a20->cur_mode = &supported_modes[i]; in os05a20_probe()
1804 os05a20->client = client; in os05a20_probe()
1806 os05a20->xvclk = devm_clk_get(dev, "xvclk"); in os05a20_probe()
1807 if (IS_ERR(os05a20->xvclk)) { in os05a20_probe()
1812 os05a20->power_gpio = devm_gpiod_get(dev, "power", GPIOD_ASIS); in os05a20_probe()
1813 if (IS_ERR(os05a20->power_gpio)) in os05a20_probe()
1816 os05a20->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS); in os05a20_probe()
1817 if (IS_ERR(os05a20->reset_gpio)) in os05a20_probe()
1820 os05a20->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_ASIS); in os05a20_probe()
1821 if (IS_ERR(os05a20->pwdn_gpio)) in os05a20_probe()
1824 os05a20->pinctrl = devm_pinctrl_get(dev); in os05a20_probe()
1825 if (!IS_ERR(os05a20->pinctrl)) { in os05a20_probe()
1826 os05a20->pins_default = in os05a20_probe()
1827 pinctrl_lookup_state(os05a20->pinctrl, in os05a20_probe()
1829 if (IS_ERR(os05a20->pins_default)) in os05a20_probe()
1832 os05a20->pins_sleep = in os05a20_probe()
1833 pinctrl_lookup_state(os05a20->pinctrl, in os05a20_probe()
1835 if (IS_ERR(os05a20->pins_sleep)) in os05a20_probe()
1841 ret = os05a20_configure_regulators(os05a20); in os05a20_probe()
1847 mutex_init(&os05a20->mutex); in os05a20_probe()
1849 sd = &os05a20->subdev; in os05a20_probe()
1851 ret = os05a20_initialize_controls(os05a20); in os05a20_probe()
1855 ret = __os05a20_power_on(os05a20); in os05a20_probe()
1859 ret = os05a20_check_sensor_id(os05a20, client); in os05a20_probe()
1868 os05a20->pad.flags = MEDIA_PAD_FL_SOURCE; in os05a20_probe()
1870 ret = media_entity_pads_init(&sd->entity, 1, &os05a20->pad); in os05a20_probe()
1876 if (strcmp(os05a20->module_facing, "back") == 0) in os05a20_probe()
1882 os05a20->module_index, facing, in os05a20_probe()
1900 __os05a20_power_off(os05a20); in os05a20_probe()
1902 v4l2_ctrl_handler_free(&os05a20->ctrl_handler); in os05a20_probe()
1904 mutex_destroy(&os05a20->mutex); in os05a20_probe()
1912 struct os05a20 *os05a20 = to_os05a20(sd); in os05a20_remove() local
1918 v4l2_ctrl_handler_free(&os05a20->ctrl_handler); in os05a20_remove()
1919 mutex_destroy(&os05a20->mutex); in os05a20_remove()
1923 __os05a20_power_off(os05a20); in os05a20_remove()