Lines Matching defs:sensor
545 /* power-on sensor init reg table */
602 static int ov5640_init_slave_id(struct ov5640_dev *sensor)
604 struct i2c_client *client = sensor->i2c_client;
630 static int ov5640_write_reg(struct ov5640_dev *sensor, u16 reg, u8 val)
632 struct i2c_client *client = sensor->i2c_client;
656 static int ov5640_read_reg(struct ov5640_dev *sensor, u16 reg, u8 *val)
658 struct i2c_client *client = sensor->i2c_client;
687 static int ov5640_read_reg16(struct ov5640_dev *sensor, u16 reg, u16 *val)
692 ret = ov5640_read_reg(sensor, reg, &hi);
695 ret = ov5640_read_reg(sensor, reg + 1, &lo);
703 static int ov5640_write_reg16(struct ov5640_dev *sensor, u16 reg, u16 val)
707 ret = ov5640_write_reg(sensor, reg, val >> 8);
711 return ov5640_write_reg(sensor, reg + 1, val & 0xff);
714 static int ov5640_mod_reg(struct ov5640_dev *sensor, u16 reg,
720 ret = ov5640_read_reg(sensor, reg, &readval);
728 return ov5640_write_reg(sensor, reg, val);
845 static unsigned long ov5640_compute_sys_clk(struct ov5640_dev *sensor,
849 unsigned long sysclk = sensor->xclk_freq / pll_prediv * pll_mult;
858 static unsigned long ov5640_calc_sys_clk(struct ov5640_dev *sensor,
882 _rate = ov5640_compute_sys_clk(sensor,
957 * FIXME: this deviates from the sensor manual documentation which is quite
960 static int ov5640_set_mipi_pclk(struct ov5640_dev *sensor,
963 const struct ov5640_mode_info *mode = sensor->current_mode;
970 * but according to the sensor manual it goes through the
979 ov5640_calc_sys_clk(sensor, rate, &prediv, &mult, &sysdiv);
981 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0,
984 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1,
989 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2, 0xff, mult);
993 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3,
998 return ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER,
1002 static unsigned long ov5640_calc_pclk(struct ov5640_dev *sensor,
1010 _rate = ov5640_calc_sys_clk(sensor, _rate, pll_prediv, pll_mult,
1019 static int ov5640_set_dvp_pclk(struct ov5640_dev *sensor, unsigned long rate)
1024 ov5640_calc_pclk(sensor, rate, &prediv, &mult, &sysdiv, &pll_rdiv,
1030 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0,
1039 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1,
1044 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2,
1049 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3,
1054 return ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x30,
1059 static int ov5640_set_jpeg_timings(struct ov5640_dev *sensor,
1071 ret = ov5640_mod_reg(sensor, OV5640_REG_JPG_MODE_SELECT, 0x7, 0x3);
1075 ret = ov5640_write_reg16(sensor, OV5640_REG_VFIFO_HSIZE, mode->hact);
1079 return ov5640_write_reg16(sensor, OV5640_REG_VFIFO_VSIZE, mode->vact);
1082 /* download ov5640 settings to sensor through i2c */
1083 static int ov5640_set_timings(struct ov5640_dev *sensor,
1088 if (sensor->fmt.code == MEDIA_BUS_FMT_JPEG_1X8) {
1089 ret = ov5640_set_jpeg_timings(sensor, mode);
1094 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPHO, mode->hact);
1098 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPVO, mode->vact);
1102 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HTS, mode->htot);
1106 return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, mode->vtot);
1109 static int ov5640_load_regs(struct ov5640_dev *sensor,
1128 sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY)
1132 ret = ov5640_mod_reg(sensor, reg_addr, mask, val);
1134 ret = ov5640_write_reg(sensor, reg_addr, val);
1142 return ov5640_set_timings(sensor, mode);
1145 static int ov5640_set_autoexposure(struct ov5640_dev *sensor, bool on)
1147 return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL,
1152 static int ov5640_get_exposure(struct ov5640_dev *sensor)
1157 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_HI, &temp);
1161 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_MED, &temp);
1165 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_LO, &temp);
1174 static int ov5640_set_exposure(struct ov5640_dev *sensor, u32 exposure)
1180 ret = ov5640_write_reg(sensor,
1185 ret = ov5640_write_reg(sensor,
1190 return ov5640_write_reg(sensor,
1195 static int ov5640_get_gain(struct ov5640_dev *sensor)
1200 ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN, &gain);
1207 static int ov5640_set_gain(struct ov5640_dev *sensor, int gain)
1209 return ov5640_write_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN,
1213 static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on)
1215 return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL,
1219 static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on)
1221 return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?
1226 static int ov5640_set_stream_mipi(struct ov5640_dev *sensor, bool on)
1235 * FIXME: the sensor manual (version 2.03) reports
1247 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00,
1252 return ov5640_write_reg(sensor, OV5640_REG_FRAME_CTRL01,
1256 static int ov5640_get_sysclk(struct ov5640_dev *sensor)
1259 u32 xvclk = sensor->xclk_freq / 10000;
1266 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL0, &temp1);
1273 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL1, &temp1);
1280 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL2, &temp1);
1285 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL3, &temp1);
1291 ret = ov5640_read_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, &temp1);
1307 static int ov5640_set_night_mode(struct ov5640_dev *sensor)
1313 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_CTRL00, &mode);
1317 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL00, mode);
1320 static int ov5640_get_hts(struct ov5640_dev *sensor)
1326 ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_HTS, &hts);
1332 static int ov5640_get_vts(struct ov5640_dev *sensor)
1337 ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_VTS, &vts);
1343 static int ov5640_set_vts(struct ov5640_dev *sensor, int vts)
1345 return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, vts);
1348 static int ov5640_get_light_freq(struct ov5640_dev *sensor)
1354 ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL01, &temp);
1360 ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL00,
1373 ret = ov5640_read_reg(sensor, OV5640_REG_SIGMADELTA_CTRL0C,
1389 static int ov5640_set_bandingfilter(struct ov5640_dev *sensor)
1395 ret = ov5640_get_sysclk(sensor);
1400 sensor->prev_sysclk = ret;
1402 ret = ov5640_get_hts(sensor);
1407 sensor->prev_hts = ret;
1410 ret = ov5640_get_vts(sensor);
1417 band_step60 = sensor->prev_sysclk * 100 / sensor->prev_hts * 100 / 120;
1418 ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B60_STEP, band_step60);
1424 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0D, max_band60);
1429 band_step50 = sensor->prev_sysclk * 100 / sensor->prev_hts;
1430 ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B50_STEP, band_step50);
1436 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0E, max_band50);
1439 static int ov5640_set_ae_target(struct ov5640_dev *sensor, int target)
1445 sensor->ae_low = target * 23 / 25; /* 0.92 */
1446 sensor->ae_high = target * 27 / 25; /* 1.08 */
1448 fast_high = sensor->ae_high << 1;
1452 fast_low = sensor->ae_low >> 1;
1454 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0F, sensor->ae_high);
1457 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL10, sensor->ae_low);
1460 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1B, sensor->ae_high);
1463 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1E, sensor->ae_low);
1466 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL11, fast_high);
1469 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1F, fast_low);
1472 static int ov5640_get_binning(struct ov5640_dev *sensor)
1477 ret = ov5640_read_reg(sensor, OV5640_REG_TIMING_TC_REG21, &temp);
1484 static int ov5640_set_binning(struct ov5640_dev *sensor, bool enable)
1492 ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21,
1501 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20,
1505 static int ov5640_set_virtual_channel(struct ov5640_dev *sensor)
1507 struct i2c_client *client = sensor->i2c_client;
1518 ret = ov5640_read_reg(sensor, OV5640_REG_DEBUG_MODE, &temp);
1523 return ov5640_write_reg(sensor, OV5640_REG_DEBUG_MODE, temp);
1527 ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr,
1548 static u64 ov5640_calc_pixel_rate(struct ov5640_dev *sensor)
1552 rate = sensor->current_mode->vtot * sensor->current_mode->htot;
1553 rate *= ov5640_framerates[sensor->current_fr];
1559 * sensor changes between scaling and subsampling, go through
1562 static int ov5640_set_mode_exposure_calc(struct ov5640_dev *sensor,
1577 ret = ov5640_get_exposure(sensor);
1581 ret = ov5640_get_binning(sensor);
1589 ret = ov5640_get_gain(sensor);
1595 ret = ov5640_read_reg(sensor, OV5640_REG_AVG_READOUT, &average);
1600 ret = ov5640_set_night_mode(sensor);
1605 ret = ov5640_load_regs(sensor, mode);
1610 ret = ov5640_get_vts(sensor);
1614 ret = ov5640_get_hts(sensor);
1621 ret = ov5640_get_sysclk(sensor);
1629 ret = ov5640_get_light_freq(sensor);
1642 if (!sensor->prev_sysclk) {
1643 ret = ov5640_get_sysclk(sensor);
1648 sensor->prev_sysclk = ret;
1657 if (average > sensor->ae_low && average < sensor->ae_high) {
1661 cap_sysclk / sensor->prev_sysclk *
1662 sensor->prev_hts / cap_hts *
1663 sensor->ae_target / average;
1667 cap_sysclk / sensor->prev_sysclk *
1668 sensor->prev_hts / cap_hts;
1702 ret = ov5640_set_gain(sensor, cap_gain16);
1709 ret = ov5640_set_vts(sensor, cap_vts);
1715 return ov5640_set_exposure(sensor, cap_shutter);
1719 * if sensor changes inside scaling or subsampling
1722 static int ov5640_set_mode_direct(struct ov5640_dev *sensor,
1729 return ov5640_load_regs(sensor, mode);
1732 static int ov5640_set_mode(struct ov5640_dev *sensor)
1734 const struct ov5640_mode_info *mode = sensor->current_mode;
1735 const struct ov5640_mode_info *orig_mode = sensor->last_mode;
1737 bool auto_gain = sensor->ctrls.auto_gain->val == 1;
1738 bool auto_exp = sensor->ctrls.auto_exp->val == V4L2_EXPOSURE_AUTO;
1747 ret = ov5640_set_autogain(sensor, false);
1753 ret = ov5640_set_autoexposure(sensor, false);
1762 rate = ov5640_calc_pixel_rate(sensor) * 16;
1763 if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) {
1764 rate = rate / sensor->ep.bus.mipi_csi2.num_data_lanes;
1765 ret = ov5640_set_mipi_pclk(sensor, rate);
1767 rate = rate / sensor->ep.bus.parallel.bus_width;
1768 ret = ov5640_set_dvp_pclk(sensor, rate);
1780 ret = ov5640_set_mode_exposure_calc(sensor, mode);
1786 ret = ov5640_set_mode_direct(sensor, mode);
1793 ov5640_set_autogain(sensor, true);
1795 ov5640_set_autoexposure(sensor, true);
1797 ret = ov5640_set_binning(sensor, dn_mode != SCALING);
1800 ret = ov5640_set_ae_target(sensor, sensor->ae_target);
1803 ret = ov5640_get_light_freq(sensor);
1806 ret = ov5640_set_bandingfilter(sensor);
1809 ret = ov5640_set_virtual_channel(sensor);
1813 sensor->pending_mode_change = false;
1814 sensor->last_mode = mode;
1820 ov5640_set_autoexposure(sensor, true);
1823 ov5640_set_autogain(sensor, true);
1828 static int ov5640_set_framefmt(struct ov5640_dev *sensor,
1832 static int ov5640_restore_mode(struct ov5640_dev *sensor)
1837 ret = ov5640_load_regs(sensor, &ov5640_mode_init_data);
1840 sensor->last_mode = &ov5640_mode_init_data;
1842 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f,
1849 ret = ov5640_set_mode(sensor);
1853 return ov5640_set_framefmt(sensor, &sensor->fmt);
1856 static void ov5640_power(struct ov5640_dev *sensor, bool enable)
1858 gpiod_set_value_cansleep(sensor->pwdn_gpio, enable ? 0 : 1);
1861 static void ov5640_reset(struct ov5640_dev *sensor)
1863 if (!sensor->reset_gpio)
1866 gpiod_set_value_cansleep(sensor->reset_gpio, 0);
1869 ov5640_power(sensor, false);
1871 ov5640_power(sensor, true);
1874 gpiod_set_value_cansleep(sensor->reset_gpio, 1);
1877 gpiod_set_value_cansleep(sensor->reset_gpio, 0);
1881 static int ov5640_set_power_on(struct ov5640_dev *sensor)
1883 struct i2c_client *client = sensor->i2c_client;
1886 ret = clk_prepare_enable(sensor->xclk);
1894 sensor->supplies);
1901 ov5640_reset(sensor);
1902 ov5640_power(sensor, true);
1904 ret = ov5640_init_slave_id(sensor);
1911 ov5640_power(sensor, false);
1912 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies);
1914 clk_disable_unprepare(sensor->xclk);
1918 static void ov5640_set_power_off(struct ov5640_dev *sensor)
1920 ov5640_power(sensor, false);
1921 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies);
1922 clk_disable_unprepare(sensor->xclk);
1925 static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on)
1931 ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);
1932 ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x04);
1933 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x00);
1947 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x44);
1958 ret = ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x24);
1970 ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x70);
1980 static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
1982 unsigned int flags = sensor->ep.bus.parallel.flags;
1983 bool bt656 = sensor->ep.bus_type == V4L2_MBUS_BT656;
1989 ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00, 0x00);
1990 ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);
1991 ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20);
1992 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00);
1993 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00);
2037 ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,
2061 ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, polarities);
2073 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18);
2087 ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01,
2098 return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc);
2101 static int ov5640_set_power(struct ov5640_dev *sensor, bool on)
2106 ret = ov5640_set_power_on(sensor);
2110 ret = ov5640_restore_mode(sensor);
2115 if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)
2116 ret = ov5640_set_power_mipi(sensor, on);
2118 ret = ov5640_set_power_dvp(sensor, on);
2123 ov5640_set_power_off(sensor);
2128 ov5640_set_power_off(sensor);
2136 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2139 mutex_lock(&sensor->lock);
2145 if (sensor->power_count == !on) {
2146 ret = ov5640_set_power(sensor, !!on);
2152 sensor->power_count += on ? 1 : -1;
2153 WARN_ON(sensor->power_count < 0);
2155 mutex_unlock(&sensor->lock);
2157 if (on && !ret && sensor->power_count == 1) {
2159 ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
2165 static int ov5640_try_frame_interval(struct ov5640_dev *sensor,
2201 mode = ov5640_find_mode(sensor, rate, width, height, false);
2209 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2215 mutex_lock(&sensor->lock);
2218 fmt = v4l2_subdev_get_try_format(&sensor->sd, cfg,
2221 fmt = &sensor->fmt;
2225 mutex_unlock(&sensor->lock);
2235 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2239 mode = ov5640_find_mode(sensor, fr, fmt->width, fmt->height, true);
2267 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2276 mutex_lock(&sensor->lock);
2278 if (sensor->streaming) {
2284 sensor->current_fr, &new_mode);
2291 fmt = &sensor->fmt;
2295 if (new_mode != sensor->current_mode) {
2296 sensor->current_mode = new_mode;
2297 sensor->pending_mode_change = true;
2299 if (mbus_fmt->code != sensor->fmt.code)
2300 sensor->pending_fmt_change = true;
2302 __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
2303 ov5640_calc_pixel_rate(sensor));
2305 mutex_unlock(&sensor->lock);
2309 static int ov5640_set_framefmt(struct ov5640_dev *sensor,
2368 ret = ov5640_write_reg(sensor, OV5640_REG_FORMAT_CONTROL00, fmt);
2373 ret = ov5640_write_reg(sensor, OV5640_REG_ISP_FORMAT_MUX_CTRL, mux);
2381 ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21,
2392 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_RESET02,
2403 return ov5640_mod_reg(sensor, OV5640_REG_SYS_CLOCK_ENABLE02,
2412 static int ov5640_set_ctrl_hue(struct ov5640_dev *sensor, int value)
2417 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0,
2421 ret = ov5640_write_reg16(sensor, OV5640_REG_SDE_CTRL1, value);
2423 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(0), 0);
2429 static int ov5640_set_ctrl_contrast(struct ov5640_dev *sensor, int value)
2434 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0,
2438 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL5,
2441 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(2), 0);
2447 static int ov5640_set_ctrl_saturation(struct ov5640_dev *sensor, int value)
2452 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0,
2456 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL3,
2460 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL4,
2463 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(1), 0);
2469 static int ov5640_set_ctrl_white_balance(struct ov5640_dev *sensor, int awb)
2473 ret = ov5640_mod_reg(sensor, OV5640_REG_AWB_MANUAL_CTRL,
2479 u16 red = (u16)sensor->ctrls.red_balance->val;
2480 u16 blue = (u16)sensor->ctrls.blue_balance->val;
2482 ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_R_GAIN, red);
2485 ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_B_GAIN, blue);
2491 static int ov5640_set_ctrl_exposure(struct ov5640_dev *sensor,
2494 struct ov5640_ctrls *ctrls = &sensor->ctrls;
2499 ret = ov5640_set_autoexposure(sensor, auto_exp);
2507 ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_VTS,
2511 ret = ov5640_get_vts(sensor);
2518 ret = ov5640_set_exposure(sensor, ctrls->exposure->val);
2524 static int ov5640_set_ctrl_gain(struct ov5640_dev *sensor, bool auto_gain)
2526 struct ov5640_ctrls *ctrls = &sensor->ctrls;
2530 ret = ov5640_set_autogain(sensor, auto_gain);
2536 ret = ov5640_set_gain(sensor, ctrls->gain->val);
2572 static int ov5640_set_ctrl_test_pattern(struct ov5640_dev *sensor, int value)
2574 return ov5640_write_reg(sensor, OV5640_REG_PRE_ISP_TEST_SET1,
2578 static int ov5640_set_ctrl_light_freq(struct ov5640_dev *sensor, int value)
2582 ret = ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL01, BIT(7),
2588 return ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL00, BIT(2),
2593 static int ov5640_set_ctrl_hflip(struct ov5640_dev *sensor, int value)
2596 * If sensor is mounted upside down, mirror logic is inversed.
2609 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21,
2611 (!(value ^ sensor->upside_down)) ?
2615 static int ov5640_set_ctrl_vflip(struct ov5640_dev *sensor, int value)
2617 /* If sensor is mounted upside down, flip logic is inversed */
2624 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20,
2626 (value ^ sensor->upside_down) ?
2633 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2640 val = ov5640_get_gain(sensor);
2643 sensor->ctrls.gain->val = val;
2646 val = ov5640_get_exposure(sensor);
2649 sensor->ctrls.exposure->val = val;
2659 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2669 if (sensor->power_count == 0)
2674 ret = ov5640_set_ctrl_gain(sensor, ctrl->val);
2677 ret = ov5640_set_ctrl_exposure(sensor, ctrl->val);
2680 ret = ov5640_set_ctrl_white_balance(sensor, ctrl->val);
2683 ret = ov5640_set_ctrl_hue(sensor, ctrl->val);
2686 ret = ov5640_set_ctrl_contrast(sensor, ctrl->val);
2689 ret = ov5640_set_ctrl_saturation(sensor, ctrl->val);
2692 ret = ov5640_set_ctrl_test_pattern(sensor, ctrl->val);
2695 ret = ov5640_set_ctrl_light_freq(sensor, ctrl->val);
2698 ret = ov5640_set_ctrl_hflip(sensor, ctrl->val);
2701 ret = ov5640_set_ctrl_vflip(sensor, ctrl->val);
2716 static int ov5640_init_controls(struct ov5640_dev *sensor)
2719 struct ov5640_ctrls *ctrls = &sensor->ctrls;
2726 hdl->lock = &sensor->lock;
2731 ov5640_calc_pixel_rate(sensor));
2788 sensor->sd.ctrl_handler = hdl;
2820 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2832 ret = ov5640_try_frame_interval(sensor, &tpf,
2844 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2846 mutex_lock(&sensor->lock);
2847 fi->interval = sensor->frame_interval;
2848 mutex_unlock(&sensor->lock);
2856 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2863 mutex_lock(&sensor->lock);
2865 if (sensor->streaming) {
2870 mode = sensor->current_mode;
2872 frame_rate = ov5640_try_frame_interval(sensor, &fi->interval,
2876 fi->interval = sensor->frame_interval;
2880 mode = ov5640_find_mode(sensor, frame_rate, mode->hact,
2887 if (mode != sensor->current_mode ||
2888 frame_rate != sensor->current_fr) {
2889 sensor->current_fr = frame_rate;
2890 sensor->frame_interval = fi->interval;
2891 sensor->current_mode = mode;
2892 sensor->pending_mode_change = true;
2894 __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
2895 ov5640_calc_pixel_rate(sensor));
2898 mutex_unlock(&sensor->lock);
2917 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2920 mutex_lock(&sensor->lock);
2922 if (sensor->streaming == !enable) {
2923 if (enable && sensor->pending_mode_change) {
2924 ret = ov5640_set_mode(sensor);
2929 if (enable && sensor->pending_fmt_change) {
2930 ret = ov5640_set_framefmt(sensor, &sensor->fmt);
2933 sensor->pending_fmt_change = false;
2936 if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)
2937 ret = ov5640_set_stream_mipi(sensor, enable);
2939 ret = ov5640_set_stream_dvp(sensor, enable);
2942 sensor->streaming = enable;
2945 mutex_unlock(&sensor->lock);
2976 static int ov5640_get_regulators(struct ov5640_dev *sensor)
2981 sensor->supplies[i].supply = ov5640_supply_name[i];
2983 return devm_regulator_bulk_get(&sensor->i2c_client->dev,
2985 sensor->supplies);
2988 static int ov5640_check_chip_id(struct ov5640_dev *sensor)
2990 struct i2c_client *client = sensor->i2c_client;
2994 ret = ov5640_set_power_on(sensor);
2998 ret = ov5640_read_reg16(sensor, OV5640_REG_CHIP_ID, &chip_id);
3012 ov5640_set_power_off(sensor);
3020 struct ov5640_dev *sensor;
3025 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
3026 if (!sensor)
3029 sensor->i2c_client = client;
3032 * default init sequence initialize sensor to
3035 fmt = &sensor->fmt;
3044 sensor->frame_interval.numerator = 1;
3045 sensor->frame_interval.denominator = ov5640_framerates[OV5640_30_FPS];
3046 sensor->current_fr = OV5640_30_FPS;
3047 sensor->current_mode =
3049 sensor->last_mode = sensor->current_mode;
3051 sensor->ae_target = 52;
3053 /* optional indication of physical rotation of sensor */
3059 sensor->upside_down = true;
3076 ret = v4l2_fwnode_endpoint_parse(endpoint, &sensor->ep);
3083 if (sensor->ep.bus_type != V4L2_MBUS_PARALLEL &&
3084 sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY &&
3085 sensor->ep.bus_type != V4L2_MBUS_BT656) {
3086 dev_err(dev, "Unsupported bus type %d\n", sensor->ep.bus_type);
3091 sensor->xclk = devm_clk_get(dev, "xclk");
3092 if (IS_ERR(sensor->xclk)) {
3094 return PTR_ERR(sensor->xclk);
3097 sensor->xclk_freq = clk_get_rate(sensor->xclk);
3098 if (sensor->xclk_freq < OV5640_XCLK_MIN ||
3099 sensor->xclk_freq > OV5640_XCLK_MAX) {
3101 sensor->xclk_freq);
3106 sensor->pwdn_gpio = devm_gpiod_get_optional(dev, "powerdown",
3108 if (IS_ERR(sensor->pwdn_gpio))
3109 return PTR_ERR(sensor->pwdn_gpio);
3112 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset",
3114 if (IS_ERR(sensor->reset_gpio))
3115 return PTR_ERR(sensor->reset_gpio);
3117 v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops);
3119 sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
3121 sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
3122 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
3123 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad);
3127 ret = ov5640_get_regulators(sensor);
3131 mutex_init(&sensor->lock);
3133 ret = ov5640_check_chip_id(sensor);
3137 ret = ov5640_init_controls(sensor);
3141 ret = v4l2_async_register_subdev_sensor_common(&sensor->sd);
3148 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
3150 media_entity_cleanup(&sensor->sd.entity);
3151 mutex_destroy(&sensor->lock);
3158 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3160 v4l2_async_unregister_subdev(&sensor->sd);
3161 media_entity_cleanup(&sensor->sd.entity);
3162 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
3163 mutex_destroy(&sensor->lock);