Lines Matching refs:ov4688

124 struct ov4688 {  struct
157 #define to_ov4688(sd) container_of(sd, struct ov4688, subdev) argument
864 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_set_fmt() local
868 mutex_lock(&ov4688->mutex); in ov4688_set_fmt()
879 mutex_unlock(&ov4688->mutex); in ov4688_set_fmt()
883 ov4688->cur_mode = mode; in ov4688_set_fmt()
885 __v4l2_ctrl_modify_range(ov4688->hblank, h_blank, in ov4688_set_fmt()
888 __v4l2_ctrl_modify_range(ov4688->vblank, vblank_def, in ov4688_set_fmt()
893 mutex_unlock(&ov4688->mutex); in ov4688_set_fmt()
902 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_get_fmt() local
903 const struct ov4688_mode *mode = ov4688->cur_mode; in ov4688_get_fmt()
905 mutex_lock(&ov4688->mutex); in ov4688_get_fmt()
910 mutex_unlock(&ov4688->mutex); in ov4688_get_fmt()
924 mutex_unlock(&ov4688->mutex); in ov4688_get_fmt()
933 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_enum_mbus_code() local
937 code->code = ov4688->cur_mode->bus_fmt; in ov4688_enum_mbus_code()
960 static int ov4688_enable_test_pattern(struct ov4688 *ov4688, u32 pattern) in ov4688_enable_test_pattern() argument
969 return ov4688_write_reg(ov4688->client, OV4688_REG_TEST_PATTERN, in ov4688_enable_test_pattern()
976 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_g_frame_interval() local
977 const struct ov4688_mode *mode = ov4688->cur_mode; in ov4688_g_frame_interval()
987 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_g_mbus_config() local
988 const struct ov4688_mode *mode = ov4688->cur_mode; in ov4688_g_mbus_config()
1004 static void ov4688_get_module_inf(struct ov4688 *ov4688, in ov4688_get_module_inf() argument
1009 strlcpy(inf->base.module, ov4688->module_name, in ov4688_get_module_inf()
1011 strlcpy(inf->base.lens, ov4688->len_name, sizeof(inf->base.lens)); in ov4688_get_module_inf()
1016 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_ioctl() local
1024 ov4688_get_module_inf(ov4688, (struct rkmodule_inf *)arg); in ov4688_ioctl()
1029 hdr->hdr_mode = ov4688->cur_mode->hdr_mode; in ov4688_ioctl()
1033 w = ov4688->cur_mode->width; in ov4688_ioctl()
1034 h = ov4688->cur_mode->height; in ov4688_ioctl()
1039 ov4688->cur_mode = &supported_modes[i]; in ov4688_ioctl()
1044 dev_err(&ov4688->client->dev, in ov4688_ioctl()
1049 w = ov4688->cur_mode->hts_def - ov4688->cur_mode->width; in ov4688_ioctl()
1050 h = ov4688->cur_mode->vts_def - ov4688->cur_mode->height; in ov4688_ioctl()
1051 __v4l2_ctrl_modify_range(ov4688->hblank, w, w, 1, w); in ov4688_ioctl()
1052 __v4l2_ctrl_modify_range(ov4688->vblank, h, in ov4688_ioctl()
1053 OV4688_VTS_MAX - ov4688->cur_mode->height, 1, h); in ov4688_ioctl()
1059 ret = ov4688_write_reg(ov4688->client, OV4688_REG_CTRL_MODE, in ov4688_ioctl()
1062 ret = ov4688_write_reg(ov4688->client, OV4688_REG_CTRL_MODE, in ov4688_ioctl()
1178 static int __ov4688_start_stream(struct ov4688 *ov4688) in __ov4688_start_stream() argument
1182 ret = ov4688_write_array(ov4688->client, ov4688->cur_mode->reg_list); in __ov4688_start_stream()
1187 mutex_unlock(&ov4688->mutex); in __ov4688_start_stream()
1188 ret = v4l2_ctrl_handler_setup(&ov4688->ctrl_handler); in __ov4688_start_stream()
1189 mutex_lock(&ov4688->mutex); in __ov4688_start_stream()
1193 ret |= ov4688_write_reg(ov4688->client, OV4688_REG_CTRL_MODE, in __ov4688_start_stream()
1196 ret |= ov4688_write_array(ov4688->client, ov4688_linear_global_regs); in __ov4688_start_stream()
1201 static int __ov4688_stop_stream(struct ov4688 *ov4688) in __ov4688_stop_stream() argument
1203 return ov4688_write_reg(ov4688->client, OV4688_REG_CTRL_MODE, in __ov4688_stop_stream()
1209 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_s_stream() local
1210 struct i2c_client *client = ov4688->client; in ov4688_s_stream()
1213 mutex_lock(&ov4688->mutex); in ov4688_s_stream()
1215 if (on == ov4688->streaming) in ov4688_s_stream()
1225 ret = __ov4688_start_stream(ov4688); in ov4688_s_stream()
1232 __ov4688_stop_stream(ov4688); in ov4688_s_stream()
1236 ov4688->streaming = on; in ov4688_s_stream()
1239 mutex_unlock(&ov4688->mutex); in ov4688_s_stream()
1246 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_s_power() local
1247 struct i2c_client *client = ov4688->client; in ov4688_s_power()
1250 mutex_lock(&ov4688->mutex); in ov4688_s_power()
1253 if (ov4688->power_on == !!on) in ov4688_s_power()
1263 ret = ov4688_write_array(ov4688->client, ov4688_global_regs); in ov4688_s_power()
1270 ov4688->power_on = true; in ov4688_s_power()
1273 ov4688->power_on = false; in ov4688_s_power()
1277 mutex_unlock(&ov4688->mutex); in ov4688_s_power()
1288 static int __ov4688_power_on(struct ov4688 *ov4688) in __ov4688_power_on() argument
1292 struct device *dev = &ov4688->client->dev; in __ov4688_power_on()
1294 if (!IS_ERR_OR_NULL(ov4688->pins_default)) { in __ov4688_power_on()
1295 ret = pinctrl_select_state(ov4688->pinctrl, in __ov4688_power_on()
1296 ov4688->pins_default); in __ov4688_power_on()
1300 ret = clk_set_rate(ov4688->xvclk, OV4688_XVCLK_FREQ); in __ov4688_power_on()
1303 if (clk_get_rate(ov4688->xvclk) != OV4688_XVCLK_FREQ) in __ov4688_power_on()
1305 ret = clk_prepare_enable(ov4688->xvclk); in __ov4688_power_on()
1310 if (!IS_ERR(ov4688->reset_gpio)) in __ov4688_power_on()
1311 gpiod_set_value_cansleep(ov4688->reset_gpio, 1); in __ov4688_power_on()
1313 ret = regulator_bulk_enable(OV4688_NUM_SUPPLIES, ov4688->supplies); in __ov4688_power_on()
1320 if (!IS_ERR(ov4688->reset_gpio)) in __ov4688_power_on()
1321 gpiod_set_value_cansleep(ov4688->reset_gpio, 0); in __ov4688_power_on()
1324 if (!IS_ERR(ov4688->pwdn_gpio)) in __ov4688_power_on()
1325 gpiod_set_value_cansleep(ov4688->pwdn_gpio, 1); in __ov4688_power_on()
1335 clk_disable_unprepare(ov4688->xvclk); in __ov4688_power_on()
1340 static void __ov4688_power_off(struct ov4688 *ov4688) in __ov4688_power_off() argument
1343 struct device *dev = &ov4688->client->dev; in __ov4688_power_off()
1345 if (!IS_ERR(ov4688->pwdn_gpio)) in __ov4688_power_off()
1346 gpiod_set_value_cansleep(ov4688->pwdn_gpio, 0); in __ov4688_power_off()
1347 clk_disable_unprepare(ov4688->xvclk); in __ov4688_power_off()
1348 if (!IS_ERR(ov4688->reset_gpio)) in __ov4688_power_off()
1349 gpiod_set_value_cansleep(ov4688->reset_gpio, 0); in __ov4688_power_off()
1350 if (!IS_ERR_OR_NULL(ov4688->pins_sleep)) { in __ov4688_power_off()
1351 ret = pinctrl_select_state(ov4688->pinctrl, in __ov4688_power_off()
1352 ov4688->pins_sleep); in __ov4688_power_off()
1356 regulator_bulk_disable(OV4688_NUM_SUPPLIES, ov4688->supplies); in __ov4688_power_off()
1363 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_runtime_resume() local
1365 return __ov4688_power_on(ov4688); in ov4688_runtime_resume()
1372 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_runtime_suspend() local
1374 __ov4688_power_off(ov4688); in ov4688_runtime_suspend()
1382 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_open() local
1387 mutex_lock(&ov4688->mutex); in ov4688_open()
1394 mutex_unlock(&ov4688->mutex); in ov4688_open()
1432 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_get_selection() local
1435 if (ov4688->cur_mode->width == 2688) { in ov4688_get_selection()
1436 sel->r.left = CROP_START(ov4688->cur_mode->width, 2560); in ov4688_get_selection()
1438 sel->r.top = CROP_START(ov4688->cur_mode->height, 1440); in ov4688_get_selection()
1441 sel->r.left = CROP_START(ov4688->cur_mode->width, 1920); in ov4688_get_selection()
1443 sel->r.top = CROP_START(ov4688->cur_mode->height, 1080); in ov4688_get_selection()
1493 struct ov4688 *ov4688 = container_of(ctrl->handler, in ov4688_set_ctrl() local
1494 struct ov4688, ctrl_handler); in ov4688_set_ctrl()
1495 struct i2c_client *client = ov4688->client; in ov4688_set_ctrl()
1506 max = ov4688->cur_mode->height + ctrl->val - 4; in ov4688_set_ctrl()
1507 __v4l2_ctrl_modify_range(ov4688->exposure, in ov4688_set_ctrl()
1508 ov4688->exposure->minimum, max, in ov4688_set_ctrl()
1509 ov4688->exposure->step, in ov4688_set_ctrl()
1510 ov4688->exposure->default_value); in ov4688_set_ctrl()
1520 ret = ov4688_write_reg(ov4688->client, OV4688_REG_EXPOSURE_L, in ov4688_set_ctrl()
1533 ret = ov4688_write_reg(ov4688->client, OV4688_REG_GAIN_H, in ov4688_set_ctrl()
1536 ret |= ov4688_write_reg(ov4688->client, OV4688_REG_GAIN_L, in ov4688_set_ctrl()
1539 ret |= ov4688_write_reg(ov4688->client, OV4688_REG_DGAIN_H, in ov4688_set_ctrl()
1542 ret |= ov4688_write_reg(ov4688->client, OV4688_REG_DGAIN_L, in ov4688_set_ctrl()
1547 ret = ov4688_write_reg(ov4688->client, OV4688_REG_VTS, in ov4688_set_ctrl()
1549 ctrl->val + ov4688->cur_mode->height); in ov4688_set_ctrl()
1552 ret = ov4688_read_reg(ov4688->client, OV4688_MIRROR_REG, in ov4688_set_ctrl()
1561 ret |= ov4688_write_reg(ov4688->client, OV4688_MIRROR_REG, in ov4688_set_ctrl()
1564 ov4688->flip = val; in ov4688_set_ctrl()
1567 ret = ov4688_read_reg(ov4688->client, OV4688_FLIP_REG, in ov4688_set_ctrl()
1576 ret |= ov4688_write_reg(ov4688->client, OV4688_FLIP_REG, in ov4688_set_ctrl()
1579 ov4688->flip = val; in ov4688_set_ctrl()
1582 ret = ov4688_enable_test_pattern(ov4688, ctrl->val); in ov4688_set_ctrl()
1599 static int ov4688_initialize_controls(struct ov4688 *ov4688) in ov4688_initialize_controls() argument
1608 handler = &ov4688->ctrl_handler; in ov4688_initialize_controls()
1609 mode = ov4688->cur_mode; in ov4688_initialize_controls()
1613 handler->lock = &ov4688->mutex; in ov4688_initialize_controls()
1624 ov4688->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in ov4688_initialize_controls()
1626 if (ov4688->hblank) in ov4688_initialize_controls()
1627 ov4688->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov4688_initialize_controls()
1630 ov4688->vblank = v4l2_ctrl_new_std(handler, &ov4688_ctrl_ops, in ov4688_initialize_controls()
1636 ov4688->exposure = v4l2_ctrl_new_std(handler, &ov4688_ctrl_ops, in ov4688_initialize_controls()
1641 ov4688->anal_gain = v4l2_ctrl_new_std(handler, &ov4688_ctrl_ops, in ov4688_initialize_controls()
1646 ov4688->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in ov4688_initialize_controls()
1651 ov4688->h_flip = v4l2_ctrl_new_std(handler, &ov4688_ctrl_ops, in ov4688_initialize_controls()
1654 ov4688->v_flip = v4l2_ctrl_new_std(handler, &ov4688_ctrl_ops, in ov4688_initialize_controls()
1656 ov4688->flip = 0; in ov4688_initialize_controls()
1660 dev_err(&ov4688->client->dev, in ov4688_initialize_controls()
1665 ov4688->subdev.ctrl_handler = handler; in ov4688_initialize_controls()
1675 static int ov4688_check_sensor_id(struct ov4688 *ov4688, in ov4688_check_sensor_id() argument
1678 struct device *dev = &ov4688->client->dev; in ov4688_check_sensor_id()
1694 static int ov4688_configure_regulators(struct ov4688 *ov4688) in ov4688_configure_regulators() argument
1699 ov4688->supplies[i].supply = ov4688_supply_names[i]; in ov4688_configure_regulators()
1701 return devm_regulator_bulk_get(&ov4688->client->dev, in ov4688_configure_regulators()
1703 ov4688->supplies); in ov4688_configure_regulators()
1711 struct ov4688 *ov4688; in ov4688_probe() local
1722 ov4688 = devm_kzalloc(dev, sizeof(*ov4688), GFP_KERNEL); in ov4688_probe()
1723 if (!ov4688) in ov4688_probe()
1728 &ov4688->module_index); in ov4688_probe()
1730 &ov4688->module_facing); in ov4688_probe()
1732 &ov4688->module_name); in ov4688_probe()
1734 &ov4688->len_name); in ov4688_probe()
1740 ov4688->client = client; in ov4688_probe()
1743 ov4688->cur_mode = &supported_modes[i]; in ov4688_probe()
1748 ov4688->cur_mode = &supported_modes[0]; in ov4688_probe()
1750 ov4688->xvclk = devm_clk_get(dev, "xvclk"); in ov4688_probe()
1751 if (IS_ERR(ov4688->xvclk)) { in ov4688_probe()
1756 ov4688->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in ov4688_probe()
1757 if (IS_ERR(ov4688->reset_gpio)) in ov4688_probe()
1760 ov4688->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in ov4688_probe()
1761 if (IS_ERR(ov4688->pwdn_gpio)) in ov4688_probe()
1764 ov4688->pinctrl = devm_pinctrl_get(dev); in ov4688_probe()
1765 if (!IS_ERR(ov4688->pinctrl)) { in ov4688_probe()
1766 ov4688->pins_default = in ov4688_probe()
1767 pinctrl_lookup_state(ov4688->pinctrl, in ov4688_probe()
1769 if (IS_ERR(ov4688->pins_default)) in ov4688_probe()
1772 ov4688->pins_sleep = in ov4688_probe()
1773 pinctrl_lookup_state(ov4688->pinctrl, in ov4688_probe()
1775 if (IS_ERR(ov4688->pins_sleep)) in ov4688_probe()
1781 ret = ov4688_configure_regulators(ov4688); in ov4688_probe()
1787 mutex_init(&ov4688->mutex); in ov4688_probe()
1789 sd = &ov4688->subdev; in ov4688_probe()
1791 ret = ov4688_initialize_controls(ov4688); in ov4688_probe()
1795 ret = __ov4688_power_on(ov4688); in ov4688_probe()
1799 ret = ov4688_check_sensor_id(ov4688, client); in ov4688_probe()
1809 ov4688->pad.flags = MEDIA_PAD_FL_SOURCE; in ov4688_probe()
1811 ret = media_entity_pads_init(&sd->entity, 1, &ov4688->pad); in ov4688_probe()
1817 if (strcmp(ov4688->module_facing, "back") == 0) in ov4688_probe()
1823 ov4688->module_index, facing, in ov4688_probe()
1842 __ov4688_power_off(ov4688); in ov4688_probe()
1844 v4l2_ctrl_handler_free(&ov4688->ctrl_handler); in ov4688_probe()
1846 mutex_destroy(&ov4688->mutex); in ov4688_probe()
1854 struct ov4688 *ov4688 = to_ov4688(sd); in ov4688_remove() local
1860 v4l2_ctrl_handler_free(&ov4688->ctrl_handler); in ov4688_remove()
1861 mutex_destroy(&ov4688->mutex); in ov4688_remove()
1865 __ov4688_power_off(ov4688); in ov4688_remove()