Lines Matching +full:dovdd +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0
8 * Copyright (C) 2011-2013 Freescale Semiconductor, Inc. All Rights Reserved.
9 * Copyright (C) 2014-2017 Mentor Graphics Inc.
24 #include <media/v4l2-common.h>
25 #include <media/v4l2-ctrls.h>
26 #include <media/v4l2-subdev.h>
70 "DOVDD",
188 return &sensor->i2c_client->dev; in ov2680_to_dev()
193 return &container_of(ctrl->handler, struct ov2680_dev, in ctrl_to_sd()
194 ctrls.handler)->sd; in ctrl_to_sd()
200 struct i2c_client *client = sensor->i2c_client; in __ov2680_write_reg()
205 return -EINVAL; in __ov2680_write_reg()
208 put_unaligned_be32(val << (8 * (4 - len)), buf + 2); in __ov2680_write_reg()
211 dev_err(&client->dev, "write error: reg=0x%4x: %d\n", reg, ret); in __ov2680_write_reg()
212 return -EIO; in __ov2680_write_reg()
230 struct i2c_client *client = sensor->i2c_client; in __ov2680_read_reg()
237 return -EINVAL; in __ov2680_read_reg()
239 msgs[0].addr = client->addr; in __ov2680_read_reg()
244 msgs[1].addr = client->addr; in __ov2680_read_reg()
247 msgs[1].buf = &data_buf[4 - len]; in __ov2680_read_reg()
249 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in __ov2680_read_reg()
251 dev_err(&client->dev, "read error: reg=0x%4x: %d\n", reg, ret); in __ov2680_read_reg()
252 return -EIO; in __ov2680_read_reg()
288 const struct reg_value *regs = mode->reg_data; in ov2680_load_regs()
294 for (i = 0; i < mode->reg_data_size; ++i, ++regs) { in ov2680_load_regs()
295 reg_addr = regs->reg_addr; in ov2680_load_regs()
296 val = regs->val; in ov2680_load_regs()
308 if (!sensor->reset_gpio) in ov2680_power_up()
311 gpiod_set_value(sensor->reset_gpio, 0); in ov2680_power_up()
317 if (!sensor->reset_gpio) in ov2680_power_down()
320 gpiod_set_value(sensor->reset_gpio, 1); in ov2680_power_down()
341 sensor->fmt.code = ov2680_hv_flip_bayer_order[hv_flip]; in ov2680_bayer_order()
397 ret = ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, 0x03, value - 1); in ov2680_test_pattern_set()
410 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_gain_set()
419 if (auto_gain || !ctrls->gain->is_new) in ov2680_gain_set()
422 gain = ctrls->gain->val; in ov2680_gain_set()
443 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_exposure_set()
452 if (auto_exp || !ctrls->exposure->is_new) in ov2680_exposure_set()
455 exp = (u32)ctrls->exposure->val; in ov2680_exposure_set()
485 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_mode_set()
496 ret = ov2680_load_regs(sensor, sensor->current_mode); in ov2680_mode_set()
500 if (ctrls->auto_gain->val) { in ov2680_mode_set()
506 if (ctrls->auto_exp->val == V4L2_EXPOSURE_AUTO) { in ov2680_mode_set()
512 sensor->mode_pending_changes = false; in ov2680_mode_set()
530 if (!sensor->is_enabled) in ov2680_power_off()
533 clk_disable_unprepare(sensor->xvclk); in ov2680_power_off()
535 regulator_bulk_disable(OV2680_NUM_SUPPLIES, sensor->supplies); in ov2680_power_off()
536 sensor->is_enabled = false; in ov2680_power_off()
546 if (sensor->is_enabled) in ov2680_power_on()
549 ret = regulator_bulk_enable(OV2680_NUM_SUPPLIES, sensor->supplies); in ov2680_power_on()
555 if (!sensor->reset_gpio) { in ov2680_power_on()
567 ret = clk_prepare_enable(sensor->xvclk); in ov2680_power_on()
571 sensor->is_enabled = true; in ov2680_power_on()
573 /* Set clock lane into LP-11 state */ in ov2680_power_on()
586 mutex_lock(&sensor->lock); in ov2680_s_power()
593 mutex_unlock(&sensor->lock); in ov2680_s_power()
596 ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler); in ov2680_s_power()
611 mutex_lock(&sensor->lock); in ov2680_s_g_frame_interval()
612 fi->interval = sensor->frame_interval; in ov2680_s_g_frame_interval()
613 mutex_unlock(&sensor->lock); in ov2680_s_g_frame_interval()
623 mutex_lock(&sensor->lock); in ov2680_s_stream()
625 if (sensor->is_streaming == !!enable) in ov2680_s_stream()
628 if (enable && sensor->mode_pending_changes) { in ov2680_s_stream()
639 sensor->is_streaming = !!enable; in ov2680_s_stream()
642 mutex_unlock(&sensor->lock); in ov2680_s_stream()
653 if (code->pad != 0 || code->index != 0) in ov2680_enum_mbus_code()
654 return -EINVAL; in ov2680_enum_mbus_code()
656 code->code = sensor->fmt.code; in ov2680_enum_mbus_code()
669 if (format->pad != 0) in ov2680_get_fmt()
670 return -EINVAL; in ov2680_get_fmt()
672 mutex_lock(&sensor->lock); in ov2680_get_fmt()
674 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { in ov2680_get_fmt()
676 fmt = v4l2_subdev_get_try_format(&sensor->sd, cfg, format->pad); in ov2680_get_fmt()
678 ret = -EINVAL; in ov2680_get_fmt()
681 fmt = &sensor->fmt; in ov2680_get_fmt()
685 format->format = *fmt; in ov2680_get_fmt()
687 mutex_unlock(&sensor->lock); in ov2680_get_fmt()
697 struct v4l2_mbus_framefmt *fmt = &format->format; in ov2680_set_fmt()
704 if (format->pad != 0) in ov2680_set_fmt()
705 return -EINVAL; in ov2680_set_fmt()
707 mutex_lock(&sensor->lock); in ov2680_set_fmt()
709 if (sensor->is_streaming) { in ov2680_set_fmt()
710 ret = -EBUSY; in ov2680_set_fmt()
716 height, fmt->width, fmt->height); in ov2680_set_fmt()
718 ret = -EINVAL; in ov2680_set_fmt()
722 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { in ov2680_set_fmt()
725 format->format = *try_fmt; in ov2680_set_fmt()
730 fmt->width = mode->width; in ov2680_set_fmt()
731 fmt->height = mode->height; in ov2680_set_fmt()
732 fmt->code = sensor->fmt.code; in ov2680_set_fmt()
733 fmt->colorspace = sensor->fmt.colorspace; in ov2680_set_fmt()
735 sensor->current_mode = mode; in ov2680_set_fmt()
736 sensor->fmt = format->format; in ov2680_set_fmt()
737 sensor->mode_pending_changes = true; in ov2680_set_fmt()
740 mutex_unlock(&sensor->lock); in ov2680_set_fmt()
764 int index = fse->index; in ov2680_enum_frame_size()
767 return -EINVAL; in ov2680_enum_frame_size()
769 fse->min_width = ov2680_mode_data[index].width; in ov2680_enum_frame_size()
770 fse->min_height = ov2680_mode_data[index].height; in ov2680_enum_frame_size()
771 fse->max_width = ov2680_mode_data[index].width; in ov2680_enum_frame_size()
772 fse->max_height = ov2680_mode_data[index].height; in ov2680_enum_frame_size()
783 if (fie->index >= OV2680_MODE_MAX || fie->width > OV2680_WIDTH_MAX || in ov2680_enum_frame_interval()
784 fie->height > OV2680_HEIGHT_MAX || in ov2680_enum_frame_interval()
785 fie->which > V4L2_SUBDEV_FORMAT_ACTIVE) in ov2680_enum_frame_interval()
786 return -EINVAL; in ov2680_enum_frame_interval()
791 fie->interval = tpf; in ov2680_enum_frame_interval()
800 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_g_volatile_ctrl()
803 if (!sensor->is_enabled) in ov2680_g_volatile_ctrl()
806 switch (ctrl->id) { in ov2680_g_volatile_ctrl()
811 ctrls->gain->val = val; in ov2680_g_volatile_ctrl()
817 ctrls->exposure->val = val; in ov2680_g_volatile_ctrl()
828 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_s_ctrl()
830 if (!sensor->is_enabled) in ov2680_s_ctrl()
833 switch (ctrl->id) { in ov2680_s_ctrl()
835 return ov2680_gain_set(sensor, !!ctrl->val); in ov2680_s_ctrl()
837 return ov2680_gain_set(sensor, !!ctrls->auto_gain->val); in ov2680_s_ctrl()
839 return ov2680_exposure_set(sensor, !!ctrl->val); in ov2680_s_ctrl()
841 return ov2680_exposure_set(sensor, !!ctrls->auto_exp->val); in ov2680_s_ctrl()
843 if (sensor->is_streaming) in ov2680_s_ctrl()
844 return -EBUSY; in ov2680_s_ctrl()
845 if (ctrl->val) in ov2680_s_ctrl()
850 if (sensor->is_streaming) in ov2680_s_ctrl()
851 return -EBUSY; in ov2680_s_ctrl()
852 if (ctrl->val) in ov2680_s_ctrl()
857 return ov2680_test_pattern_set(sensor, ctrl->val); in ov2680_s_ctrl()
862 return -EINVAL; in ov2680_s_ctrl()
900 sensor->fmt.code = MEDIA_BUS_FMT_SBGGR10_1X10; in ov2680_mode_init()
901 sensor->fmt.width = 800; in ov2680_mode_init()
902 sensor->fmt.height = 600; in ov2680_mode_init()
903 sensor->fmt.field = V4L2_FIELD_NONE; in ov2680_mode_init()
904 sensor->fmt.colorspace = V4L2_COLORSPACE_SRGB; in ov2680_mode_init()
906 sensor->frame_interval.denominator = OV2680_FRAME_RATE; in ov2680_mode_init()
907 sensor->frame_interval.numerator = 1; in ov2680_mode_init()
911 sensor->current_mode = init_mode; in ov2680_mode_init()
913 sensor->mode_pending_changes = true; in ov2680_mode_init()
921 struct ov2680_ctrls *ctrls = &sensor->ctrls; in ov2680_v4l2_register()
922 struct v4l2_ctrl_handler *hdl = &ctrls->handler; in ov2680_v4l2_register()
925 v4l2_i2c_subdev_init(&sensor->sd, sensor->i2c_client, in ov2680_v4l2_register()
929 sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; in ov2680_v4l2_register()
931 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in ov2680_v4l2_register()
932 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov2680_v4l2_register()
934 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in ov2680_v4l2_register()
940 hdl->lock = &sensor->lock; in ov2680_v4l2_register()
942 ctrls->vflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VFLIP, 0, 1, 1, 0); in ov2680_v4l2_register()
943 ctrls->hflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HFLIP, 0, 1, 1, 0); in ov2680_v4l2_register()
945 ctrls->test_pattern = v4l2_ctrl_new_std_menu_items(hdl, in ov2680_v4l2_register()
947 ARRAY_SIZE(test_pattern_menu) - 1, in ov2680_v4l2_register()
950 ctrls->auto_exp = v4l2_ctrl_new_std_menu(hdl, ops, in ov2680_v4l2_register()
955 ctrls->exposure = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE, in ov2680_v4l2_register()
958 ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN, in ov2680_v4l2_register()
960 ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAIN, 0, 2047, 1, 0); in ov2680_v4l2_register()
962 if (hdl->error) { in ov2680_v4l2_register()
963 ret = hdl->error; in ov2680_v4l2_register()
967 ctrls->gain->flags |= V4L2_CTRL_FLAG_VOLATILE; in ov2680_v4l2_register()
968 ctrls->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE; in ov2680_v4l2_register()
970 v4l2_ctrl_auto_cluster(2, &ctrls->auto_gain, 0, true); in ov2680_v4l2_register()
971 v4l2_ctrl_auto_cluster(2, &ctrls->auto_exp, 1, true); in ov2680_v4l2_register()
973 sensor->sd.ctrl_handler = hdl; in ov2680_v4l2_register()
975 ret = v4l2_async_register_subdev(&sensor->sd); in ov2680_v4l2_register()
982 media_entity_cleanup(&sensor->sd.entity); in ov2680_v4l2_register()
993 sensor->supplies[i].supply = ov2680_supply_name[i]; in ov2680_get_regulators()
995 return devm_regulator_bulk_get(&sensor->i2c_client->dev, in ov2680_get_regulators()
997 sensor->supplies); in ov2680_get_regulators()
1011 return -ENODEV; in ov2680_check_id()
1017 return -ENODEV; in ov2680_check_id()
1028 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in ov2680_parse_dt()
1030 ret = PTR_ERR_OR_ZERO(sensor->reset_gpio); in ov2680_parse_dt()
1036 sensor->xvclk = devm_clk_get(dev, "xvclk"); in ov2680_parse_dt()
1037 if (IS_ERR(sensor->xvclk)) { in ov2680_parse_dt()
1039 return PTR_ERR(sensor->xvclk); in ov2680_parse_dt()
1042 sensor->xvclk_freq = clk_get_rate(sensor->xvclk); in ov2680_parse_dt()
1043 if (sensor->xvclk_freq != OV2680_XVCLK_VALUE) { in ov2680_parse_dt()
1045 sensor->xvclk_freq, OV2680_XVCLK_VALUE); in ov2680_parse_dt()
1046 return -EINVAL; in ov2680_parse_dt()
1054 struct device *dev = &client->dev; in ov2680_probe()
1060 return -ENOMEM; in ov2680_probe()
1062 sensor->i2c_client = client; in ov2680_probe()
1066 return -EINVAL; in ov2680_probe()
1078 mutex_init(&sensor->lock); in ov2680_probe()
1094 mutex_destroy(&sensor->lock); in ov2680_probe()
1104 v4l2_async_unregister_subdev(&sensor->sd); in ov2680_remove()
1105 mutex_destroy(&sensor->lock); in ov2680_remove()
1106 media_entity_cleanup(&sensor->sd.entity); in ov2680_remove()
1107 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov2680_remove()
1118 if (sensor->is_streaming) in ov2680_suspend()
1131 if (sensor->is_streaming) { in ov2680_resume()
1141 sensor->is_streaming = false; in ov2680_resume()