• Home
  • Raw
  • Download

Lines Matching +full:capture +full:- +full:sd +full:- +full:lines

2  * Copyright (C) 2011-2013 Freescale Semiconductor, Inc. All Rights Reserved.
3 * Copyright (C) 2014-2017 Mentor Graphics Inc.
12 #include <linux/clk-provider.h>
25 #include <media/v4l2-async.h>
26 #include <media/v4l2-ctrls.h>
27 #include <media/v4l2-device.h>
28 #include <media/v4l2-fwnode.h>
29 #include <media/v4l2-subdev.h>
134 * to set the MIPI CSI-2 virtual channel.
139 "MIPI CSI-2 virtual channel (0..3), default 0");
209 struct v4l2_subdev sd; member
242 static inline struct ov5640_dev *to_ov5640_dev(struct v4l2_subdev *sd) in to_ov5640_dev() argument
244 return container_of(sd, struct ov5640_dev, sd); in to_ov5640_dev()
249 return &container_of(ctrl->handler, struct ov5640_dev, in ctrl_to_sd()
250 ctrls.handler)->sd; in ctrl_to_sd()
255 * entries that set the register to their power-on default values,
700 /* power-on sensor init reg table */
779 {OV5640_MODE_QSXGA_2592_1944, -1, 0, 0, 0, 0, NULL, 0},
785 struct i2c_client *client = sensor->i2c_client; in ov5640_init_slave_id()
790 if (client->addr == OV5640_DEFAULT_SLAVE_ID) in ov5640_init_slave_id()
795 buf[2] = client->addr << 1; in ov5640_init_slave_id()
802 ret = i2c_transfer(client->adapter, &msg, 1); in ov5640_init_slave_id()
804 dev_err(&client->dev, "%s: failed with %d\n", __func__, ret); in ov5640_init_slave_id()
813 struct i2c_client *client = sensor->i2c_client; in ov5640_write_reg()
822 msg.addr = client->addr; in ov5640_write_reg()
823 msg.flags = client->flags; in ov5640_write_reg()
827 ret = i2c_transfer(client->adapter, &msg, 1); in ov5640_write_reg()
829 dev_err(&client->dev, "%s: error: reg=%x, val=%x\n", in ov5640_write_reg()
839 struct i2c_client *client = sensor->i2c_client; in ov5640_read_reg()
847 msg[0].addr = client->addr; in ov5640_read_reg()
848 msg[0].flags = client->flags; in ov5640_read_reg()
852 msg[1].addr = client->addr; in ov5640_read_reg()
853 msg[1].flags = client->flags | I2C_M_RD; in ov5640_read_reg()
857 ret = i2c_transfer(client->adapter, msg, 2); in ov5640_read_reg()
859 dev_err(&client->dev, "%s: error: reg=%x\n", in ov5640_read_reg()
918 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPHO, mode->hact); in ov5640_set_timings()
922 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPVO, mode->vact); in ov5640_set_timings()
926 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HTS, mode->htot); in ov5640_set_timings()
930 return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, mode->vtot); in ov5640_set_timings()
936 const struct reg_value *regs = mode->reg_data; in ov5640_load_regs()
943 for (i = 0; i < mode->reg_data_size; ++i, ++regs) { in ov5640_load_regs()
944 delay_ms = regs->delay_ms; in ov5640_load_regs()
945 reg_addr = regs->reg_addr; in ov5640_load_regs()
946 val = regs->val; in ov5640_load_regs()
947 mask = regs->mask; in ov5640_load_regs()
1040 unsigned int flags = sensor->ep.bus.parallel.flags; in ov5640_set_stream_dvp()
1049 * output 10 bits data on DVP data lines [9:0]. in ov5640_set_stream_dvp()
1050 * If only 8 bits data are wanted, the 8 bits data lines in ov5640_set_stream_dvp()
1052 * on the DVP data lines [9:2]. in ov5640_set_stream_dvp()
1054 * Control lines polarity can be configured through in ov5640_set_stream_dvp()
1055 * devicetree endpoint control lines properties. in ov5640_set_stream_dvp()
1056 * If no endpoint control lines properties are set, in ov5640_set_stream_dvp()
1058 * - VSYNC: active high in ov5640_set_stream_dvp()
1059 * - HREF: active low in ov5640_set_stream_dvp()
1060 * - PCLK: active low in ov5640_set_stream_dvp()
1068 * - [3..0]: MIPI PCLK/SERCLK divider in ov5640_set_stream_dvp()
1075 * configure parallel port control lines polarity in ov5640_set_stream_dvp()
1078 * - [5]: PCLK polarity (0: active low, 1: active high) in ov5640_set_stream_dvp()
1079 * - [1]: HREF polarity (0: active low, 1: active high) in ov5640_set_stream_dvp()
1080 * - [0]: VSYNC polarity (mismatch here between in ov5640_set_stream_dvp()
1115 * enable VSYNC/HREF/PCLK DVP control lines in ov5640_set_stream_dvp()
1116 * & D[9:6] DVP data lines in ov5640_set_stream_dvp()
1119 * - 6: VSYNC output enable in ov5640_set_stream_dvp()
1120 * - 5: HREF output enable in ov5640_set_stream_dvp()
1121 * - 4: PCLK output enable in ov5640_set_stream_dvp()
1122 * - [3:0]: D[9:6] output enable in ov5640_set_stream_dvp()
1131 * enable D[5:0] DVP data lines in ov5640_set_stream_dvp()
1134 * - [7:2]: D[5:0] output enable in ov5640_set_stream_dvp()
1174 u32 xvclk = sensor->xclk_freq / 10000; in ov5640_get_sysclk()
1213 return -EINVAL; in ov5640_get_sysclk()
1314 return -EINVAL; in ov5640_set_bandingfilter()
1315 sensor->prev_sysclk = ret; in ov5640_set_bandingfilter()
1321 return -EINVAL; in ov5640_set_bandingfilter()
1322 sensor->prev_hts = ret; in ov5640_set_bandingfilter()
1332 band_step60 = sensor->prev_sysclk * 100 / sensor->prev_hts * 100 / 120; in ov5640_set_bandingfilter()
1337 return -EINVAL; in ov5640_set_bandingfilter()
1338 max_band60 = (int)((prev_vts - 4) / band_step60); in ov5640_set_bandingfilter()
1344 band_step50 = sensor->prev_sysclk * 100 / sensor->prev_hts; in ov5640_set_bandingfilter()
1349 return -EINVAL; in ov5640_set_bandingfilter()
1350 max_band50 = (int)((prev_vts - 4) / band_step50); in ov5640_set_bandingfilter()
1360 sensor->ae_low = target * 23 / 25; /* 0.92 */ in ov5640_set_ae_target()
1361 sensor->ae_high = target * 27 / 25; /* 1.08 */ in ov5640_set_ae_target()
1363 fast_high = sensor->ae_high << 1; in ov5640_set_ae_target()
1367 fast_low = sensor->ae_low >> 1; in ov5640_set_ae_target()
1369 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0F, sensor->ae_high); in ov5640_set_ae_target()
1372 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL10, sensor->ae_low); in ov5640_set_ae_target()
1375 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1B, sensor->ae_high); in ov5640_set_ae_target()
1378 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1E, sensor->ae_low); in ov5640_set_ae_target()
1405 * - [0]: Horizontal binning enable in ov5640_set_binning()
1413 * - [0]: Undocumented, but hardcoded init sequences in ov5640_set_binning()
1422 struct i2c_client *client = sensor->i2c_client; in ov5640_set_virtual_channel()
1427 dev_err(&client->dev, in ov5640_set_virtual_channel()
1430 return -EINVAL; in ov5640_set_virtual_channel()
1453 (!nearest && (mode->hact != width || mode->vact != height))) in ov5640_find_mode()
1474 if (!mode->reg_data) in ov5640_set_mode_exposure_calc()
1475 return -EINVAL; in ov5640_set_mode_exposure_calc()
1485 if (ret && mode->id != OV5640_MODE_720P_1280_720 && in ov5640_set_mode_exposure_calc()
1486 mode->id != OV5640_MODE_1080P_1920_1080) in ov5640_set_mode_exposure_calc()
1500 /* turn off night mode for capture */ in ov5640_set_mode_exposure_calc()
1505 /* Write capture setting */ in ov5640_set_mode_exposure_calc()
1510 /* read capture VTS */ in ov5640_set_mode_exposure_calc()
1519 return -EINVAL; in ov5640_set_mode_exposure_calc()
1526 return -EINVAL; in ov5640_set_mode_exposure_calc()
1529 /* calculate capture banding filter */ in ov5640_set_mode_exposure_calc()
1543 if (!sensor->prev_sysclk) { in ov5640_set_mode_exposure_calc()
1548 return -EINVAL; in ov5640_set_mode_exposure_calc()
1549 sensor->prev_sysclk = ret; in ov5640_set_mode_exposure_calc()
1553 return -EINVAL; in ov5640_set_mode_exposure_calc()
1555 cap_maxband = (int)((cap_vts - 4) / cap_bandfilt); in ov5640_set_mode_exposure_calc()
1557 /* calculate capture shutter/gain16 */ in ov5640_set_mode_exposure_calc()
1558 if (average > sensor->ae_low && average < sensor->ae_high) { in ov5640_set_mode_exposure_calc()
1562 cap_sysclk / sensor->prev_sysclk * in ov5640_set_mode_exposure_calc()
1563 sensor->prev_hts / cap_hts * in ov5640_set_mode_exposure_calc()
1564 sensor->ae_target / average; in ov5640_set_mode_exposure_calc()
1568 cap_sysclk / sensor->prev_sysclk * in ov5640_set_mode_exposure_calc()
1569 sensor->prev_hts / cap_hts; in ov5640_set_mode_exposure_calc()
1587 return -EINVAL; in ov5640_set_mode_exposure_calc()
1596 return -EINVAL; in ov5640_set_mode_exposure_calc()
1602 /* set capture gain */ in ov5640_set_mode_exposure_calc()
1607 /* write capture shutter */ in ov5640_set_mode_exposure_calc()
1608 if (cap_shutter > (cap_vts - 4)) { in ov5640_set_mode_exposure_calc()
1626 if (!mode->reg_data) in ov5640_set_mode_direct()
1627 return -EINVAL; in ov5640_set_mode_direct()
1629 /* Write capture setting */ in ov5640_set_mode_direct()
1635 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_set_mode()
1636 const struct ov5640_mode_info *orig_mode = sensor->last_mode; in ov5640_set_mode()
1638 bool auto_gain = sensor->ctrls.auto_gain->val == 1; in ov5640_set_mode()
1639 bool auto_exp = sensor->ctrls.auto_exp->val == V4L2_EXPOSURE_AUTO; in ov5640_set_mode()
1642 dn_mode = mode->dn_mode; in ov5640_set_mode()
1643 orig_dn_mode = orig_mode->dn_mode; in ov5640_set_mode()
1684 ret = ov5640_set_ae_target(sensor, sensor->ae_target); in ov5640_set_mode()
1697 sensor->pending_mode_change = false; in ov5640_set_mode()
1698 sensor->last_mode = mode; in ov5640_set_mode()
1715 /* restore the last set video mode after chip power-on */
1724 sensor->last_mode = &ov5640_mode_init_data; in ov5640_restore_mode()
1732 /* now restore the last capture mode */ in ov5640_restore_mode()
1737 return ov5640_set_framefmt(sensor, &sensor->fmt); in ov5640_restore_mode()
1742 gpiod_set_value_cansleep(sensor->pwdn_gpio, enable ? 0 : 1); in ov5640_power()
1747 if (!sensor->reset_gpio) in ov5640_reset()
1750 gpiod_set_value_cansleep(sensor->reset_gpio, 0); in ov5640_reset()
1758 gpiod_set_value_cansleep(sensor->reset_gpio, 1); in ov5640_reset()
1761 gpiod_set_value_cansleep(sensor->reset_gpio, 0); in ov5640_reset()
1767 struct i2c_client *client = sensor->i2c_client; in ov5640_set_power_on()
1770 ret = clk_prepare_enable(sensor->xclk); in ov5640_set_power_on()
1772 dev_err(&client->dev, "%s: failed to enable clock\n", in ov5640_set_power_on()
1778 sensor->supplies); in ov5640_set_power_on()
1780 dev_err(&client->dev, "%s: failed to enable regulators\n", in ov5640_set_power_on()
1796 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies); in ov5640_set_power_on()
1798 clk_disable_unprepare(sensor->xclk); in ov5640_set_power_on()
1805 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies); in ov5640_set_power_off()
1806 clk_disable_unprepare(sensor->xclk); in ov5640_set_power_off()
1822 /* We're done here for DVP bus, while CSI-2 needs setup. */ in ov5640_set_power()
1823 if (sensor->ep.bus_type != V4L2_MBUS_CSI2) in ov5640_set_power()
1870 if (sensor->ep.bus_type == V4L2_MBUS_CSI2) { in ov5640_set_power()
1890 /* --------------- Subdev Operations --------------- */
1892 static int ov5640_s_power(struct v4l2_subdev *sd, int on) in ov5640_s_power() argument
1894 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_power()
1897 mutex_lock(&sensor->lock); in ov5640_s_power()
1903 if (sensor->power_count == !on) { in ov5640_s_power()
1910 sensor->power_count += on ? 1 : -1; in ov5640_s_power()
1911 WARN_ON(sensor->power_count < 0); in ov5640_s_power()
1913 mutex_unlock(&sensor->lock); in ov5640_s_power()
1915 if (on && !ret && sensor->power_count == 1) { in ov5640_s_power()
1917 ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler); in ov5640_s_power()
1934 if (fi->numerator == 0) { in ov5640_try_frame_interval()
1935 fi->denominator = maxfps; in ov5640_try_frame_interval()
1936 fi->numerator = 1; in ov5640_try_frame_interval()
1940 fps = DIV_ROUND_CLOSEST(fi->denominator, fi->numerator); in ov5640_try_frame_interval()
1942 fi->numerator = 1; in ov5640_try_frame_interval()
1944 fi->denominator = maxfps; in ov5640_try_frame_interval()
1946 fi->denominator = minfps; in ov5640_try_frame_interval()
1947 else if (2 * fps >= 2 * minfps + (maxfps - minfps)) in ov5640_try_frame_interval()
1948 fi->denominator = maxfps; in ov5640_try_frame_interval()
1950 fi->denominator = minfps; in ov5640_try_frame_interval()
1952 ret = (fi->denominator == minfps) ? OV5640_15_FPS : OV5640_30_FPS; in ov5640_try_frame_interval()
1955 return mode ? ret : -EINVAL; in ov5640_try_frame_interval()
1958 static int ov5640_get_fmt(struct v4l2_subdev *sd, in ov5640_get_fmt() argument
1962 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_get_fmt()
1965 if (format->pad != 0) in ov5640_get_fmt()
1966 return -EINVAL; in ov5640_get_fmt()
1968 mutex_lock(&sensor->lock); in ov5640_get_fmt()
1970 if (format->which == V4L2_SUBDEV_FORMAT_TRY) in ov5640_get_fmt()
1971 fmt = v4l2_subdev_get_try_format(&sensor->sd, cfg, in ov5640_get_fmt()
1972 format->pad); in ov5640_get_fmt()
1974 fmt = &sensor->fmt; in ov5640_get_fmt()
1976 format->format = *fmt; in ov5640_get_fmt()
1978 mutex_unlock(&sensor->lock); in ov5640_get_fmt()
1983 static int ov5640_try_fmt_internal(struct v4l2_subdev *sd, in ov5640_try_fmt_internal() argument
1988 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_try_fmt_internal()
1992 mode = ov5640_find_mode(sensor, fr, fmt->width, fmt->height, true); in ov5640_try_fmt_internal()
1994 return -EINVAL; in ov5640_try_fmt_internal()
1995 fmt->width = mode->hact; in ov5640_try_fmt_internal()
1996 fmt->height = mode->vact; in ov5640_try_fmt_internal()
2002 if (ov5640_formats[i].code == fmt->code) in ov5640_try_fmt_internal()
2007 fmt->code = ov5640_formats[i].code; in ov5640_try_fmt_internal()
2008 fmt->colorspace = ov5640_formats[i].colorspace; in ov5640_try_fmt_internal()
2009 fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace); in ov5640_try_fmt_internal()
2010 fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE; in ov5640_try_fmt_internal()
2011 fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace); in ov5640_try_fmt_internal()
2016 static int ov5640_set_fmt(struct v4l2_subdev *sd, in ov5640_set_fmt() argument
2020 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_set_fmt()
2022 struct v4l2_mbus_framefmt *mbus_fmt = &format->format; in ov5640_set_fmt()
2026 if (format->pad != 0) in ov5640_set_fmt()
2027 return -EINVAL; in ov5640_set_fmt()
2029 mutex_lock(&sensor->lock); in ov5640_set_fmt()
2031 if (sensor->streaming) { in ov5640_set_fmt()
2032 ret = -EBUSY; in ov5640_set_fmt()
2036 ret = ov5640_try_fmt_internal(sd, mbus_fmt, in ov5640_set_fmt()
2037 sensor->current_fr, &new_mode); in ov5640_set_fmt()
2041 if (format->which == V4L2_SUBDEV_FORMAT_TRY) in ov5640_set_fmt()
2042 fmt = v4l2_subdev_get_try_format(sd, cfg, 0); in ov5640_set_fmt()
2044 fmt = &sensor->fmt; in ov5640_set_fmt()
2048 if (new_mode != sensor->current_mode) { in ov5640_set_fmt()
2049 sensor->current_mode = new_mode; in ov5640_set_fmt()
2050 sensor->pending_mode_change = true; in ov5640_set_fmt()
2052 if (mbus_fmt->code != sensor->fmt.code) in ov5640_set_fmt()
2053 sensor->pending_fmt_change = true; in ov5640_set_fmt()
2056 mutex_unlock(&sensor->lock); in ov5640_set_fmt()
2068 switch (format->code) { in ov5640_set_framefmt()
2093 return -EINVAL; in ov5640_set_framefmt()
2109 * - [5]: JPEG enable in ov5640_set_framefmt()
2118 * - [4]: Reset JFIFO in ov5640_set_framefmt()
2119 * - [3]: Reset SFIFO in ov5640_set_framefmt()
2120 * - [2]: Reset JPEG in ov5640_set_framefmt()
2130 * - [5]: Enable JPEG 2x clock in ov5640_set_framefmt()
2131 * - [3]: Enable JPEG clock in ov5640_set_framefmt()
2209 u16 red = (u16)sensor->ctrls.red_balance->val; in ov5640_set_ctrl_white_balance()
2210 u16 blue = (u16)sensor->ctrls.blue_balance->val; in ov5640_set_ctrl_white_balance()
2224 struct ov5640_ctrls *ctrls = &sensor->ctrls; in ov5640_set_ctrl_exposure()
2228 if (ctrls->auto_exp->is_new) { in ov5640_set_ctrl_exposure()
2234 if (!auto_exp && ctrls->exposure->is_new) { in ov5640_set_ctrl_exposure()
2247 if (ctrls->exposure->val < max_exp) in ov5640_set_ctrl_exposure()
2248 ret = ov5640_set_exposure(sensor, ctrls->exposure->val); in ov5640_set_ctrl_exposure()
2256 struct ov5640_ctrls *ctrls = &sensor->ctrls; in ov5640_set_ctrl_gain()
2259 if (ctrls->auto_gain->is_new) { in ov5640_set_ctrl_gain()
2265 if (!auto_gain && ctrls->gain->is_new) in ov5640_set_ctrl_gain()
2266 ret = ov5640_set_gain(sensor, ctrls->gain->val); in ov5640_set_ctrl_gain()
2305 * - [2]: ISP mirror in ov5640_set_ctrl_hflip()
2306 * - [1]: Sensor mirror in ov5640_set_ctrl_hflip()
2310 (!(value ^ sensor->upside_down)) ? in ov5640_set_ctrl_hflip()
2320 * - [2]: ISP vflip in ov5640_set_ctrl_vflip()
2321 * - [1]: Sensor vflip in ov5640_set_ctrl_vflip()
2325 (value ^ sensor->upside_down) ? in ov5640_set_ctrl_vflip()
2331 struct v4l2_subdev *sd = ctrl_to_sd(ctrl); in ov5640_g_volatile_ctrl() local
2332 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_g_volatile_ctrl()
2337 switch (ctrl->id) { in ov5640_g_volatile_ctrl()
2342 sensor->ctrls.gain->val = val; in ov5640_g_volatile_ctrl()
2348 sensor->ctrls.exposure->val = val; in ov5640_g_volatile_ctrl()
2357 struct v4l2_subdev *sd = ctrl_to_sd(ctrl); in ov5640_s_ctrl() local
2358 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_ctrl()
2366 * the controls will be restored right after power-up. in ov5640_s_ctrl()
2368 if (sensor->power_count == 0) in ov5640_s_ctrl()
2371 switch (ctrl->id) { in ov5640_s_ctrl()
2373 ret = ov5640_set_ctrl_gain(sensor, ctrl->val); in ov5640_s_ctrl()
2376 ret = ov5640_set_ctrl_exposure(sensor, ctrl->val); in ov5640_s_ctrl()
2379 ret = ov5640_set_ctrl_white_balance(sensor, ctrl->val); in ov5640_s_ctrl()
2382 ret = ov5640_set_ctrl_hue(sensor, ctrl->val); in ov5640_s_ctrl()
2385 ret = ov5640_set_ctrl_contrast(sensor, ctrl->val); in ov5640_s_ctrl()
2388 ret = ov5640_set_ctrl_saturation(sensor, ctrl->val); in ov5640_s_ctrl()
2391 ret = ov5640_set_ctrl_test_pattern(sensor, ctrl->val); in ov5640_s_ctrl()
2394 ret = ov5640_set_ctrl_light_freq(sensor, ctrl->val); in ov5640_s_ctrl()
2397 ret = ov5640_set_ctrl_hflip(sensor, ctrl->val); in ov5640_s_ctrl()
2400 ret = ov5640_set_ctrl_vflip(sensor, ctrl->val); in ov5640_s_ctrl()
2403 ret = -EINVAL; in ov5640_s_ctrl()
2423 struct ov5640_ctrls *ctrls = &sensor->ctrls; in ov5640_init_controls()
2424 struct v4l2_ctrl_handler *hdl = &ctrls->handler; in ov5640_init_controls()
2430 hdl->lock = &sensor->lock; in ov5640_init_controls()
2433 ctrls->auto_wb = v4l2_ctrl_new_std(hdl, ops, in ov5640_init_controls()
2436 ctrls->blue_balance = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_BLUE_BALANCE, in ov5640_init_controls()
2438 ctrls->red_balance = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_RED_BALANCE, in ov5640_init_controls()
2441 ctrls->auto_exp = v4l2_ctrl_new_std_menu(hdl, ops, in ov5640_init_controls()
2445 ctrls->exposure = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE, in ov5640_init_controls()
2448 ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN, in ov5640_init_controls()
2450 ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAIN, in ov5640_init_controls()
2453 ctrls->saturation = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SATURATION, in ov5640_init_controls()
2455 ctrls->hue = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HUE, in ov5640_init_controls()
2457 ctrls->contrast = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_CONTRAST, in ov5640_init_controls()
2459 ctrls->test_pattern = in ov5640_init_controls()
2461 ARRAY_SIZE(test_pattern_menu) - 1, in ov5640_init_controls()
2463 ctrls->hflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HFLIP, in ov5640_init_controls()
2465 ctrls->vflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VFLIP, in ov5640_init_controls()
2468 ctrls->light_freq = in ov5640_init_controls()
2474 if (hdl->error) { in ov5640_init_controls()
2475 ret = hdl->error; in ov5640_init_controls()
2479 ctrls->gain->flags |= V4L2_CTRL_FLAG_VOLATILE; in ov5640_init_controls()
2480 ctrls->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE; in ov5640_init_controls()
2482 v4l2_ctrl_auto_cluster(3, &ctrls->auto_wb, 0, false); in ov5640_init_controls()
2483 v4l2_ctrl_auto_cluster(2, &ctrls->auto_gain, 0, true); in ov5640_init_controls()
2484 v4l2_ctrl_auto_cluster(2, &ctrls->auto_exp, 1, true); in ov5640_init_controls()
2486 sensor->sd.ctrl_handler = hdl; in ov5640_init_controls()
2494 static int ov5640_enum_frame_size(struct v4l2_subdev *sd, in ov5640_enum_frame_size() argument
2498 if (fse->pad != 0) in ov5640_enum_frame_size()
2499 return -EINVAL; in ov5640_enum_frame_size()
2500 if (fse->index >= OV5640_NUM_MODES) in ov5640_enum_frame_size()
2501 return -EINVAL; in ov5640_enum_frame_size()
2503 fse->min_width = in ov5640_enum_frame_size()
2504 ov5640_mode_data[0][fse->index].hact; in ov5640_enum_frame_size()
2505 fse->max_width = fse->min_width; in ov5640_enum_frame_size()
2506 fse->min_height = in ov5640_enum_frame_size()
2507 ov5640_mode_data[0][fse->index].vact; in ov5640_enum_frame_size()
2508 fse->max_height = fse->min_height; in ov5640_enum_frame_size()
2514 struct v4l2_subdev *sd, in ov5640_enum_frame_interval() argument
2518 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_enum_frame_interval()
2522 if (fie->pad != 0) in ov5640_enum_frame_interval()
2523 return -EINVAL; in ov5640_enum_frame_interval()
2524 if (fie->index >= OV5640_NUM_FRAMERATES) in ov5640_enum_frame_interval()
2525 return -EINVAL; in ov5640_enum_frame_interval()
2528 tpf.denominator = ov5640_framerates[fie->index]; in ov5640_enum_frame_interval()
2531 fie->width, fie->height); in ov5640_enum_frame_interval()
2533 return -EINVAL; in ov5640_enum_frame_interval()
2535 fie->interval = tpf; in ov5640_enum_frame_interval()
2539 static int ov5640_g_frame_interval(struct v4l2_subdev *sd, in ov5640_g_frame_interval() argument
2542 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_g_frame_interval()
2544 mutex_lock(&sensor->lock); in ov5640_g_frame_interval()
2545 fi->interval = sensor->frame_interval; in ov5640_g_frame_interval()
2546 mutex_unlock(&sensor->lock); in ov5640_g_frame_interval()
2551 static int ov5640_s_frame_interval(struct v4l2_subdev *sd, in ov5640_s_frame_interval() argument
2554 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_frame_interval()
2558 if (fi->pad != 0) in ov5640_s_frame_interval()
2559 return -EINVAL; in ov5640_s_frame_interval()
2561 mutex_lock(&sensor->lock); in ov5640_s_frame_interval()
2563 if (sensor->streaming) { in ov5640_s_frame_interval()
2564 ret = -EBUSY; in ov5640_s_frame_interval()
2568 mode = sensor->current_mode; in ov5640_s_frame_interval()
2570 frame_rate = ov5640_try_frame_interval(sensor, &fi->interval, in ov5640_s_frame_interval()
2571 mode->hact, mode->vact); in ov5640_s_frame_interval()
2575 mode = ov5640_find_mode(sensor, frame_rate, mode->hact, in ov5640_s_frame_interval()
2576 mode->vact, true); in ov5640_s_frame_interval()
2578 ret = -EINVAL; in ov5640_s_frame_interval()
2582 if (mode != sensor->current_mode || in ov5640_s_frame_interval()
2583 frame_rate != sensor->current_fr) { in ov5640_s_frame_interval()
2584 sensor->current_fr = frame_rate; in ov5640_s_frame_interval()
2585 sensor->frame_interval = fi->interval; in ov5640_s_frame_interval()
2586 sensor->current_mode = mode; in ov5640_s_frame_interval()
2587 sensor->pending_mode_change = true; in ov5640_s_frame_interval()
2590 mutex_unlock(&sensor->lock); in ov5640_s_frame_interval()
2594 static int ov5640_enum_mbus_code(struct v4l2_subdev *sd, in ov5640_enum_mbus_code() argument
2598 if (code->pad != 0) in ov5640_enum_mbus_code()
2599 return -EINVAL; in ov5640_enum_mbus_code()
2600 if (code->index >= ARRAY_SIZE(ov5640_formats)) in ov5640_enum_mbus_code()
2601 return -EINVAL; in ov5640_enum_mbus_code()
2603 code->code = ov5640_formats[code->index].code; in ov5640_enum_mbus_code()
2607 static int ov5640_s_stream(struct v4l2_subdev *sd, int enable) in ov5640_s_stream() argument
2609 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_stream()
2612 mutex_lock(&sensor->lock); in ov5640_s_stream()
2614 if (sensor->streaming == !enable) { in ov5640_s_stream()
2615 if (enable && sensor->pending_mode_change) { in ov5640_s_stream()
2621 if (enable && sensor->pending_fmt_change) { in ov5640_s_stream()
2622 ret = ov5640_set_framefmt(sensor, &sensor->fmt); in ov5640_s_stream()
2625 sensor->pending_fmt_change = false; in ov5640_s_stream()
2628 if (sensor->ep.bus_type == V4L2_MBUS_CSI2) in ov5640_s_stream()
2634 sensor->streaming = enable; in ov5640_s_stream()
2637 mutex_unlock(&sensor->lock); in ov5640_s_stream()
2670 sensor->supplies[i].supply = ov5640_supply_name[i]; in ov5640_get_regulators()
2672 return devm_regulator_bulk_get(&sensor->i2c_client->dev, in ov5640_get_regulators()
2674 sensor->supplies); in ov5640_get_regulators()
2679 struct i2c_client *client = sensor->i2c_client; in ov5640_check_chip_id()
2689 dev_err(&client->dev, "%s: failed to read chip identifier\n", in ov5640_check_chip_id()
2695 dev_err(&client->dev, "%s: wrong chip identifier, expected 0x5640, got 0x%x\n", in ov5640_check_chip_id()
2697 ret = -ENXIO; in ov5640_check_chip_id()
2708 struct device *dev = &client->dev; in ov5640_probe()
2717 return -ENOMEM; in ov5640_probe()
2719 sensor->i2c_client = client; in ov5640_probe()
2725 fmt = &sensor->fmt; in ov5640_probe()
2726 fmt->code = MEDIA_BUS_FMT_UYVY8_2X8; in ov5640_probe()
2727 fmt->colorspace = V4L2_COLORSPACE_SRGB; in ov5640_probe()
2728 fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace); in ov5640_probe()
2729 fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE; in ov5640_probe()
2730 fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace); in ov5640_probe()
2731 fmt->width = 640; in ov5640_probe()
2732 fmt->height = 480; in ov5640_probe()
2733 fmt->field = V4L2_FIELD_NONE; in ov5640_probe()
2734 sensor->frame_interval.numerator = 1; in ov5640_probe()
2735 sensor->frame_interval.denominator = ov5640_framerates[OV5640_30_FPS]; in ov5640_probe()
2736 sensor->current_fr = OV5640_30_FPS; in ov5640_probe()
2737 sensor->current_mode = in ov5640_probe()
2739 sensor->last_mode = sensor->current_mode; in ov5640_probe()
2741 sensor->ae_target = 52; in ov5640_probe()
2744 ret = fwnode_property_read_u32(dev_fwnode(&client->dev), "rotation", in ov5640_probe()
2749 sensor->upside_down = true; in ov5640_probe()
2759 endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev), in ov5640_probe()
2763 return -EINVAL; in ov5640_probe()
2766 ret = v4l2_fwnode_endpoint_parse(endpoint, &sensor->ep); in ov5640_probe()
2774 sensor->xclk = devm_clk_get(dev, "xclk"); in ov5640_probe()
2775 if (IS_ERR(sensor->xclk)) { in ov5640_probe()
2777 return PTR_ERR(sensor->xclk); in ov5640_probe()
2780 sensor->xclk_freq = clk_get_rate(sensor->xclk); in ov5640_probe()
2781 if (sensor->xclk_freq < OV5640_XCLK_MIN || in ov5640_probe()
2782 sensor->xclk_freq > OV5640_XCLK_MAX) { in ov5640_probe()
2784 sensor->xclk_freq); in ov5640_probe()
2785 return -EINVAL; in ov5640_probe()
2789 sensor->pwdn_gpio = devm_gpiod_get_optional(dev, "powerdown", in ov5640_probe()
2791 if (IS_ERR(sensor->pwdn_gpio)) in ov5640_probe()
2792 return PTR_ERR(sensor->pwdn_gpio); in ov5640_probe()
2795 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in ov5640_probe()
2797 if (IS_ERR(sensor->reset_gpio)) in ov5640_probe()
2798 return PTR_ERR(sensor->reset_gpio); in ov5640_probe()
2800 v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops); in ov5640_probe()
2802 sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in ov5640_probe()
2803 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in ov5640_probe()
2804 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov5640_probe()
2805 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in ov5640_probe()
2813 mutex_init(&sensor->lock); in ov5640_probe()
2823 ret = v4l2_async_register_subdev(&sensor->sd); in ov5640_probe()
2830 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov5640_probe()
2832 media_entity_cleanup(&sensor->sd.entity); in ov5640_probe()
2833 mutex_destroy(&sensor->lock); in ov5640_probe()
2839 struct v4l2_subdev *sd = i2c_get_clientdata(client); in ov5640_remove() local
2840 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_remove()
2842 v4l2_async_unregister_subdev(&sensor->sd); in ov5640_remove()
2843 media_entity_cleanup(&sensor->sd.entity); in ov5640_remove()
2844 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov5640_remove()
2845 mutex_destroy(&sensor->lock); in ov5640_remove()