Lines Matching +full:dovdd +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0
17 #include <media/media-entity.h>
18 #include <media/v4l2-async.h>
19 #include <media/v4l2-ctrls.h>
20 #include <media/v4l2-subdev.h>
53 #define OV5695_DIGI_GAIN_MAX (0x4000 - 1)
74 "dovdd", /* Digital I/O power */
714 return -EINVAL; in ov5695_write_reg()
722 val_i = 4 - len; in ov5695_write_reg()
728 return -EIO; in ov5695_write_reg()
757 return -EINVAL; in ov5695_read_reg()
761 msgs[0].addr = client->addr; in ov5695_read_reg()
767 msgs[1].addr = client->addr; in ov5695_read_reg()
770 msgs[1].buf = &data_be_p[4 - len]; in ov5695_read_reg()
772 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in ov5695_read_reg()
774 return -EIO; in ov5695_read_reg()
784 return abs(mode->width - framefmt->width) + in ov5695_get_reso_dist()
785 abs(mode->height - framefmt->height); in ov5695_get_reso_dist()
791 struct v4l2_mbus_framefmt *framefmt = &fmt->format; in ov5695_find_best_fit()
794 int cur_best_fit_dist = -1; in ov5695_find_best_fit()
799 if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) { in ov5695_find_best_fit()
816 mutex_lock(&ov5695->mutex); in ov5695_set_fmt()
819 fmt->format.code = MEDIA_BUS_FMT_SBGGR10_1X10; in ov5695_set_fmt()
820 fmt->format.width = mode->width; in ov5695_set_fmt()
821 fmt->format.height = mode->height; in ov5695_set_fmt()
822 fmt->format.field = V4L2_FIELD_NONE; in ov5695_set_fmt()
823 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in ov5695_set_fmt()
825 *v4l2_subdev_get_try_format(sd, cfg, fmt->pad) = fmt->format; in ov5695_set_fmt()
828 ov5695->cur_mode = mode; in ov5695_set_fmt()
829 h_blank = mode->hts_def - mode->width; in ov5695_set_fmt()
830 __v4l2_ctrl_modify_range(ov5695->hblank, h_blank, in ov5695_set_fmt()
832 vblank_def = mode->vts_def - mode->height; in ov5695_set_fmt()
833 __v4l2_ctrl_modify_range(ov5695->vblank, vblank_def, in ov5695_set_fmt()
834 OV5695_VTS_MAX - mode->height, in ov5695_set_fmt()
838 mutex_unlock(&ov5695->mutex); in ov5695_set_fmt()
848 const struct ov5695_mode *mode = ov5695->cur_mode; in ov5695_get_fmt()
850 mutex_lock(&ov5695->mutex); in ov5695_get_fmt()
851 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in ov5695_get_fmt()
853 fmt->format = *v4l2_subdev_get_try_format(sd, cfg, fmt->pad); in ov5695_get_fmt()
855 mutex_unlock(&ov5695->mutex); in ov5695_get_fmt()
856 return -EINVAL; in ov5695_get_fmt()
859 fmt->format.width = mode->width; in ov5695_get_fmt()
860 fmt->format.height = mode->height; in ov5695_get_fmt()
861 fmt->format.code = MEDIA_BUS_FMT_SBGGR10_1X10; in ov5695_get_fmt()
862 fmt->format.field = V4L2_FIELD_NONE; in ov5695_get_fmt()
864 mutex_unlock(&ov5695->mutex); in ov5695_get_fmt()
873 if (code->index != 0) in ov5695_enum_mbus_code()
874 return -EINVAL; in ov5695_enum_mbus_code()
875 code->code = MEDIA_BUS_FMT_SBGGR10_1X10; in ov5695_enum_mbus_code()
884 if (fse->index >= ARRAY_SIZE(supported_modes)) in ov5695_enum_frame_sizes()
885 return -EINVAL; in ov5695_enum_frame_sizes()
887 if (fse->code != MEDIA_BUS_FMT_SBGGR10_1X10) in ov5695_enum_frame_sizes()
888 return -EINVAL; in ov5695_enum_frame_sizes()
890 fse->min_width = supported_modes[fse->index].width; in ov5695_enum_frame_sizes()
891 fse->max_width = supported_modes[fse->index].width; in ov5695_enum_frame_sizes()
892 fse->max_height = supported_modes[fse->index].height; in ov5695_enum_frame_sizes()
893 fse->min_height = supported_modes[fse->index].height; in ov5695_enum_frame_sizes()
903 val = (pattern - 1) | OV5695_TEST_PATTERN_ENABLE; in ov5695_enable_test_pattern()
907 return ov5695_write_reg(ov5695->client, OV5695_REG_TEST_PATTERN, in ov5695_enable_test_pattern()
915 ret = ov5695_write_array(ov5695->client, ov5695_global_regs); in __ov5695_start_stream()
918 ret = ov5695_write_array(ov5695->client, ov5695->cur_mode->reg_list); in __ov5695_start_stream()
923 ret = __v4l2_ctrl_handler_setup(&ov5695->ctrl_handler); in __ov5695_start_stream()
927 return ov5695_write_reg(ov5695->client, OV5695_REG_CTRL_MODE, in __ov5695_start_stream()
933 return ov5695_write_reg(ov5695->client, OV5695_REG_CTRL_MODE, in __ov5695_stop_stream()
940 struct i2c_client *client = ov5695->client; in ov5695_s_stream()
943 mutex_lock(&ov5695->mutex); in ov5695_s_stream()
945 if (on == ov5695->streaming) in ov5695_s_stream()
949 ret = pm_runtime_get_sync(&client->dev); in ov5695_s_stream()
951 pm_runtime_put_noidle(&client->dev); in ov5695_s_stream()
958 pm_runtime_put(&client->dev); in ov5695_s_stream()
963 pm_runtime_put(&client->dev); in ov5695_s_stream()
966 ov5695->streaming = on; in ov5695_s_stream()
969 mutex_unlock(&ov5695->mutex); in ov5695_s_stream()
977 struct device *dev = &ov5695->client->dev; in __ov5695_power_on()
979 ret = clk_prepare_enable(ov5695->xvclk); in __ov5695_power_on()
985 gpiod_set_value_cansleep(ov5695->reset_gpio, 1); in __ov5695_power_on()
992 ret = regulator_enable(ov5695->supplies[i].consumer); in __ov5695_power_on()
995 ov5695->supplies[i].supply, ret); in __ov5695_power_on()
1000 gpiod_set_value_cansleep(ov5695->reset_gpio, 0); in __ov5695_power_on()
1007 for (--i; i >= 0; i--) in __ov5695_power_on()
1008 regulator_disable(ov5695->supplies[i].consumer); in __ov5695_power_on()
1009 clk_disable_unprepare(ov5695->xvclk); in __ov5695_power_on()
1016 struct device *dev = &ov5695->client->dev; in __ov5695_power_off()
1019 clk_disable_unprepare(ov5695->xvclk); in __ov5695_power_off()
1020 gpiod_set_value_cansleep(ov5695->reset_gpio, 1); in __ov5695_power_off()
1026 for (i = OV5695_NUM_SUPPLIES - 1; i >= 0; i--) { in __ov5695_power_off()
1027 ret = regulator_disable(ov5695->supplies[i].consumer); in __ov5695_power_off()
1030 ov5695->supplies[i].supply, ret); in __ov5695_power_off()
1059 v4l2_subdev_get_try_format(sd, fh->pad, 0); in ov5695_open()
1062 mutex_lock(&ov5695->mutex); in ov5695_open()
1064 try_fmt->width = def_mode->width; in ov5695_open()
1065 try_fmt->height = def_mode->height; in ov5695_open()
1066 try_fmt->code = MEDIA_BUS_FMT_SBGGR10_1X10; in ov5695_open()
1067 try_fmt->field = V4L2_FIELD_NONE; in ov5695_open()
1069 mutex_unlock(&ov5695->mutex); in ov5695_open()
1105 struct ov5695 *ov5695 = container_of(ctrl->handler, in ov5695_set_ctrl()
1107 struct i2c_client *client = ov5695->client; in ov5695_set_ctrl()
1112 switch (ctrl->id) { in ov5695_set_ctrl()
1115 max = ov5695->cur_mode->height + ctrl->val - 4; in ov5695_set_ctrl()
1116 __v4l2_ctrl_modify_range(ov5695->exposure, in ov5695_set_ctrl()
1117 ov5695->exposure->minimum, max, in ov5695_set_ctrl()
1118 ov5695->exposure->step, in ov5695_set_ctrl()
1119 ov5695->exposure->default_value); in ov5695_set_ctrl()
1123 if (!pm_runtime_get_if_in_use(&client->dev)) in ov5695_set_ctrl()
1126 switch (ctrl->id) { in ov5695_set_ctrl()
1129 ret = ov5695_write_reg(ov5695->client, OV5695_REG_EXPOSURE, in ov5695_set_ctrl()
1130 OV5695_REG_VALUE_24BIT, ctrl->val << 4); in ov5695_set_ctrl()
1133 ret = ov5695_write_reg(ov5695->client, OV5695_REG_ANALOG_GAIN, in ov5695_set_ctrl()
1134 OV5695_REG_VALUE_08BIT, ctrl->val); in ov5695_set_ctrl()
1137 ret = ov5695_write_reg(ov5695->client, OV5695_REG_DIGI_GAIN_L, in ov5695_set_ctrl()
1139 ctrl->val & OV5695_DIGI_GAIN_L_MASK); in ov5695_set_ctrl()
1140 ret = ov5695_write_reg(ov5695->client, OV5695_REG_DIGI_GAIN_H, in ov5695_set_ctrl()
1142 ctrl->val >> OV5695_DIGI_GAIN_H_SHIFT); in ov5695_set_ctrl()
1145 ret = ov5695_write_reg(ov5695->client, OV5695_REG_VTS, in ov5695_set_ctrl()
1147 ctrl->val + ov5695->cur_mode->height); in ov5695_set_ctrl()
1150 ret = ov5695_enable_test_pattern(ov5695, ctrl->val); in ov5695_set_ctrl()
1153 dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n", in ov5695_set_ctrl()
1154 __func__, ctrl->id, ctrl->val); in ov5695_set_ctrl()
1158 pm_runtime_put(&client->dev); in ov5695_set_ctrl()
1176 handler = &ov5695->ctrl_handler; in ov5695_initialize_controls()
1177 mode = ov5695->cur_mode; in ov5695_initialize_controls()
1181 handler->lock = &ov5695->mutex; in ov5695_initialize_controls()
1186 ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov5695_initialize_controls()
1191 h_blank = mode->hts_def - mode->width; in ov5695_initialize_controls()
1192 ov5695->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in ov5695_initialize_controls()
1194 if (ov5695->hblank) in ov5695_initialize_controls()
1195 ov5695->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in ov5695_initialize_controls()
1197 vblank_def = mode->vts_def - mode->height; in ov5695_initialize_controls()
1198 ov5695->vblank = v4l2_ctrl_new_std(handler, &ov5695_ctrl_ops, in ov5695_initialize_controls()
1200 OV5695_VTS_MAX - mode->height, in ov5695_initialize_controls()
1203 exposure_max = mode->vts_def - 4; in ov5695_initialize_controls()
1204 ov5695->exposure = v4l2_ctrl_new_std(handler, &ov5695_ctrl_ops, in ov5695_initialize_controls()
1207 mode->exp_def); in ov5695_initialize_controls()
1209 ov5695->anal_gain = v4l2_ctrl_new_std(handler, &ov5695_ctrl_ops, in ov5695_initialize_controls()
1215 ov5695->digi_gain = v4l2_ctrl_new_std(handler, &ov5695_ctrl_ops, in ov5695_initialize_controls()
1220 ov5695->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in ov5695_initialize_controls()
1222 ARRAY_SIZE(ov5695_test_pattern_menu) - 1, in ov5695_initialize_controls()
1225 if (handler->error) { in ov5695_initialize_controls()
1226 ret = handler->error; in ov5695_initialize_controls()
1227 dev_err(&ov5695->client->dev, in ov5695_initialize_controls()
1232 ov5695->subdev.ctrl_handler = handler; in ov5695_initialize_controls()
1245 struct device *dev = &ov5695->client->dev; in ov5695_check_sensor_id()
1266 ov5695->supplies[i].supply = ov5695_supply_names[i]; in ov5695_configure_regulators()
1268 return devm_regulator_bulk_get(&ov5695->client->dev, in ov5695_configure_regulators()
1270 ov5695->supplies); in ov5695_configure_regulators()
1276 struct device *dev = &client->dev; in ov5695_probe()
1283 return -ENOMEM; in ov5695_probe()
1285 ov5695->client = client; in ov5695_probe()
1286 ov5695->cur_mode = &supported_modes[0]; in ov5695_probe()
1288 ov5695->xvclk = devm_clk_get(dev, "xvclk"); in ov5695_probe()
1289 if (IS_ERR(ov5695->xvclk)) { in ov5695_probe()
1291 return -EINVAL; in ov5695_probe()
1293 ret = clk_set_rate(ov5695->xvclk, OV5695_XVCLK_FREQ); in ov5695_probe()
1298 if (clk_get_rate(ov5695->xvclk) != OV5695_XVCLK_FREQ) in ov5695_probe()
1301 ov5695->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); in ov5695_probe()
1302 if (IS_ERR(ov5695->reset_gpio)) { in ov5695_probe()
1303 dev_err(dev, "Failed to get reset-gpios\n"); in ov5695_probe()
1304 return -EINVAL; in ov5695_probe()
1313 mutex_init(&ov5695->mutex); in ov5695_probe()
1315 sd = &ov5695->subdev; in ov5695_probe()
1330 sd->internal_ops = &ov5695_internal_ops; in ov5695_probe()
1331 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in ov5695_probe()
1334 ov5695->pad.flags = MEDIA_PAD_FL_SOURCE; in ov5695_probe()
1335 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov5695_probe()
1336 ret = media_entity_pads_init(&sd->entity, 1, &ov5695->pad); in ov5695_probe()
1355 media_entity_cleanup(&sd->entity); in ov5695_probe()
1360 v4l2_ctrl_handler_free(&ov5695->ctrl_handler); in ov5695_probe()
1362 mutex_destroy(&ov5695->mutex); in ov5695_probe()
1374 media_entity_cleanup(&sd->entity); in ov5695_remove()
1376 v4l2_ctrl_handler_free(&ov5695->ctrl_handler); in ov5695_remove()
1377 mutex_destroy(&ov5695->mutex); in ov5695_remove()
1379 pm_runtime_disable(&client->dev); in ov5695_remove()
1380 if (!pm_runtime_status_suspended(&client->dev)) in ov5695_remove()
1382 pm_runtime_set_suspended(&client->dev); in ov5695_remove()