Lines Matching full:sensor
545 /* power-on sensor init reg table */
602 static int ov5640_init_slave_id(struct ov5640_dev *sensor) in ov5640_init_slave_id() argument
604 struct i2c_client *client = sensor->i2c_client; in ov5640_init_slave_id()
630 static int ov5640_write_reg(struct ov5640_dev *sensor, u16 reg, u8 val) in ov5640_write_reg() argument
632 struct i2c_client *client = sensor->i2c_client; in ov5640_write_reg()
656 static int ov5640_read_reg(struct ov5640_dev *sensor, u16 reg, u8 *val) in ov5640_read_reg() argument
658 struct i2c_client *client = sensor->i2c_client; in ov5640_read_reg()
687 static int ov5640_read_reg16(struct ov5640_dev *sensor, u16 reg, u16 *val) in ov5640_read_reg16() argument
692 ret = ov5640_read_reg(sensor, reg, &hi); in ov5640_read_reg16()
695 ret = ov5640_read_reg(sensor, reg + 1, &lo); in ov5640_read_reg16()
703 static int ov5640_write_reg16(struct ov5640_dev *sensor, u16 reg, u16 val) in ov5640_write_reg16() argument
707 ret = ov5640_write_reg(sensor, reg, val >> 8); in ov5640_write_reg16()
711 return ov5640_write_reg(sensor, reg + 1, val & 0xff); in ov5640_write_reg16()
714 static int ov5640_mod_reg(struct ov5640_dev *sensor, u16 reg, in ov5640_mod_reg() argument
720 ret = ov5640_read_reg(sensor, reg, &readval); in ov5640_mod_reg()
728 return ov5640_write_reg(sensor, reg, val); in ov5640_mod_reg()
845 static unsigned long ov5640_compute_sys_clk(struct ov5640_dev *sensor, in ov5640_compute_sys_clk() argument
849 unsigned long sysclk = sensor->xclk_freq / pll_prediv * pll_mult; in ov5640_compute_sys_clk()
858 static unsigned long ov5640_calc_sys_clk(struct ov5640_dev *sensor, in ov5640_calc_sys_clk() argument
882 _rate = ov5640_compute_sys_clk(sensor, in ov5640_calc_sys_clk()
957 * FIXME: this deviates from the sensor manual documentation which is quite
960 static int ov5640_set_mipi_pclk(struct ov5640_dev *sensor, in ov5640_set_mipi_pclk() argument
963 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_set_mipi_pclk()
970 * but according to the sensor manual it goes through the in ov5640_set_mipi_pclk()
979 ov5640_calc_sys_clk(sensor, rate, &prediv, &mult, &sysdiv); in ov5640_set_mipi_pclk()
981 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0, in ov5640_set_mipi_pclk()
984 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1, in ov5640_set_mipi_pclk()
989 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2, 0xff, mult); in ov5640_set_mipi_pclk()
993 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3, in ov5640_set_mipi_pclk()
998 return ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, in ov5640_set_mipi_pclk()
1002 static unsigned long ov5640_calc_pclk(struct ov5640_dev *sensor, in ov5640_calc_pclk() argument
1010 _rate = ov5640_calc_sys_clk(sensor, _rate, pll_prediv, pll_mult, in ov5640_calc_pclk()
1019 static int ov5640_set_dvp_pclk(struct ov5640_dev *sensor, unsigned long rate) in ov5640_set_dvp_pclk() argument
1024 ov5640_calc_pclk(sensor, rate, &prediv, &mult, &sysdiv, &pll_rdiv, in ov5640_set_dvp_pclk()
1030 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0, in ov5640_set_dvp_pclk()
1039 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1, in ov5640_set_dvp_pclk()
1044 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2, in ov5640_set_dvp_pclk()
1049 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3, in ov5640_set_dvp_pclk()
1054 return ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x30, in ov5640_set_dvp_pclk()
1059 static int ov5640_set_jpeg_timings(struct ov5640_dev *sensor, in ov5640_set_jpeg_timings() argument
1071 ret = ov5640_mod_reg(sensor, OV5640_REG_JPG_MODE_SELECT, 0x7, 0x3); in ov5640_set_jpeg_timings()
1075 ret = ov5640_write_reg16(sensor, OV5640_REG_VFIFO_HSIZE, mode->hact); in ov5640_set_jpeg_timings()
1079 return ov5640_write_reg16(sensor, OV5640_REG_VFIFO_VSIZE, mode->vact); in ov5640_set_jpeg_timings()
1082 /* download ov5640 settings to sensor through i2c */
1083 static int ov5640_set_timings(struct ov5640_dev *sensor, in ov5640_set_timings() argument
1088 if (sensor->fmt.code == MEDIA_BUS_FMT_JPEG_1X8) { in ov5640_set_timings()
1089 ret = ov5640_set_jpeg_timings(sensor, mode); in ov5640_set_timings()
1094 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPHO, mode->hact); in ov5640_set_timings()
1098 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPVO, mode->vact); in ov5640_set_timings()
1102 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HTS, mode->htot); in ov5640_set_timings()
1106 return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, mode->vtot); in ov5640_set_timings()
1109 static int ov5640_load_regs(struct ov5640_dev *sensor, in ov5640_load_regs() argument
1128 sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY) in ov5640_load_regs()
1132 ret = ov5640_mod_reg(sensor, reg_addr, mask, val); in ov5640_load_regs()
1134 ret = ov5640_write_reg(sensor, reg_addr, val); in ov5640_load_regs()
1142 return ov5640_set_timings(sensor, mode); in ov5640_load_regs()
1145 static int ov5640_set_autoexposure(struct ov5640_dev *sensor, bool on) in ov5640_set_autoexposure() argument
1147 return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL, in ov5640_set_autoexposure()
1152 static int ov5640_get_exposure(struct ov5640_dev *sensor) in ov5640_get_exposure() argument
1157 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_HI, &temp); in ov5640_get_exposure()
1161 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_MED, &temp); in ov5640_get_exposure()
1165 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_LO, &temp); in ov5640_get_exposure()
1174 static int ov5640_set_exposure(struct ov5640_dev *sensor, u32 exposure) in ov5640_set_exposure() argument
1180 ret = ov5640_write_reg(sensor, in ov5640_set_exposure()
1185 ret = ov5640_write_reg(sensor, in ov5640_set_exposure()
1190 return ov5640_write_reg(sensor, in ov5640_set_exposure()
1195 static int ov5640_get_gain(struct ov5640_dev *sensor) in ov5640_get_gain() argument
1200 ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN, &gain); in ov5640_get_gain()
1207 static int ov5640_set_gain(struct ov5640_dev *sensor, int gain) in ov5640_set_gain() argument
1209 return ov5640_write_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN, in ov5640_set_gain()
1213 static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on) in ov5640_set_autogain() argument
1215 return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL, in ov5640_set_autogain()
1219 static int ov5640_set_stream_bt656(struct ov5640_dev *sensor, bool on) in ov5640_set_stream_bt656() argument
1223 ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00, in ov5640_set_stream_bt656()
1228 return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ? in ov5640_set_stream_bt656()
1233 static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on) in ov5640_set_stream_dvp() argument
1235 return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ? in ov5640_set_stream_dvp()
1240 static int ov5640_set_stream_mipi(struct ov5640_dev *sensor, bool on) in ov5640_set_stream_mipi() argument
1249 * FIXME: the sensor manual (version 2.03) reports in ov5640_set_stream_mipi()
1261 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, in ov5640_set_stream_mipi()
1266 return ov5640_write_reg(sensor, OV5640_REG_FRAME_CTRL01, in ov5640_set_stream_mipi()
1270 static int ov5640_get_sysclk(struct ov5640_dev *sensor) in ov5640_get_sysclk() argument
1273 u32 xvclk = sensor->xclk_freq / 10000; in ov5640_get_sysclk()
1280 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL0, &temp1); in ov5640_get_sysclk()
1287 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL1, &temp1); in ov5640_get_sysclk()
1294 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL2, &temp1); in ov5640_get_sysclk()
1299 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL3, &temp1); in ov5640_get_sysclk()
1305 ret = ov5640_read_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, &temp1); in ov5640_get_sysclk()
1321 static int ov5640_set_night_mode(struct ov5640_dev *sensor) in ov5640_set_night_mode() argument
1327 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_CTRL00, &mode); in ov5640_set_night_mode()
1331 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL00, mode); in ov5640_set_night_mode()
1334 static int ov5640_get_hts(struct ov5640_dev *sensor) in ov5640_get_hts() argument
1340 ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_HTS, &hts); in ov5640_get_hts()
1346 static int ov5640_get_vts(struct ov5640_dev *sensor) in ov5640_get_vts() argument
1351 ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_VTS, &vts); in ov5640_get_vts()
1357 static int ov5640_set_vts(struct ov5640_dev *sensor, int vts) in ov5640_set_vts() argument
1359 return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, vts); in ov5640_set_vts()
1362 static int ov5640_get_light_freq(struct ov5640_dev *sensor) in ov5640_get_light_freq() argument
1368 ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL01, &temp); in ov5640_get_light_freq()
1374 ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL00, in ov5640_get_light_freq()
1387 ret = ov5640_read_reg(sensor, OV5640_REG_SIGMADELTA_CTRL0C, in ov5640_get_light_freq()
1403 static int ov5640_set_bandingfilter(struct ov5640_dev *sensor) in ov5640_set_bandingfilter() argument
1409 ret = ov5640_get_sysclk(sensor); in ov5640_set_bandingfilter()
1414 sensor->prev_sysclk = ret; in ov5640_set_bandingfilter()
1416 ret = ov5640_get_hts(sensor); in ov5640_set_bandingfilter()
1421 sensor->prev_hts = ret; in ov5640_set_bandingfilter()
1424 ret = ov5640_get_vts(sensor); in ov5640_set_bandingfilter()
1431 band_step60 = sensor->prev_sysclk * 100 / sensor->prev_hts * 100 / 120; in ov5640_set_bandingfilter()
1432 ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B60_STEP, band_step60); in ov5640_set_bandingfilter()
1438 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0D, max_band60); in ov5640_set_bandingfilter()
1443 band_step50 = sensor->prev_sysclk * 100 / sensor->prev_hts; in ov5640_set_bandingfilter()
1444 ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B50_STEP, band_step50); in ov5640_set_bandingfilter()
1450 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0E, max_band50); in ov5640_set_bandingfilter()
1453 static int ov5640_set_ae_target(struct ov5640_dev *sensor, int target) in ov5640_set_ae_target() argument
1459 sensor->ae_low = target * 23 / 25; /* 0.92 */ in ov5640_set_ae_target()
1460 sensor->ae_high = target * 27 / 25; /* 1.08 */ in ov5640_set_ae_target()
1462 fast_high = sensor->ae_high << 1; in ov5640_set_ae_target()
1466 fast_low = sensor->ae_low >> 1; in ov5640_set_ae_target()
1468 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0F, sensor->ae_high); in ov5640_set_ae_target()
1471 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL10, sensor->ae_low); in ov5640_set_ae_target()
1474 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1B, sensor->ae_high); in ov5640_set_ae_target()
1477 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1E, sensor->ae_low); in ov5640_set_ae_target()
1480 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL11, fast_high); in ov5640_set_ae_target()
1483 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1F, fast_low); in ov5640_set_ae_target()
1486 static int ov5640_get_binning(struct ov5640_dev *sensor) in ov5640_get_binning() argument
1491 ret = ov5640_read_reg(sensor, OV5640_REG_TIMING_TC_REG21, &temp); in ov5640_get_binning()
1498 static int ov5640_set_binning(struct ov5640_dev *sensor, bool enable) in ov5640_set_binning() argument
1506 ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21, in ov5640_set_binning()
1515 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20, in ov5640_set_binning()
1519 static int ov5640_set_virtual_channel(struct ov5640_dev *sensor) in ov5640_set_virtual_channel() argument
1521 struct i2c_client *client = sensor->i2c_client; in ov5640_set_virtual_channel()
1532 ret = ov5640_read_reg(sensor, OV5640_REG_DEBUG_MODE, &temp); in ov5640_set_virtual_channel()
1537 return ov5640_write_reg(sensor, OV5640_REG_DEBUG_MODE, temp); in ov5640_set_virtual_channel()
1541 ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr, in ov5640_find_mode() argument
1562 static u64 ov5640_calc_pixel_rate(struct ov5640_dev *sensor) in ov5640_calc_pixel_rate() argument
1566 rate = sensor->current_mode->vtot * sensor->current_mode->htot; in ov5640_calc_pixel_rate()
1567 rate *= ov5640_framerates[sensor->current_fr]; in ov5640_calc_pixel_rate()
1573 * sensor changes between scaling and subsampling, go through
1576 static int ov5640_set_mode_exposure_calc(struct ov5640_dev *sensor, in ov5640_set_mode_exposure_calc() argument
1591 ret = ov5640_get_exposure(sensor); in ov5640_set_mode_exposure_calc()
1595 ret = ov5640_get_binning(sensor); in ov5640_set_mode_exposure_calc()
1603 ret = ov5640_get_gain(sensor); in ov5640_set_mode_exposure_calc()
1609 ret = ov5640_read_reg(sensor, OV5640_REG_AVG_READOUT, &average); in ov5640_set_mode_exposure_calc()
1614 ret = ov5640_set_night_mode(sensor); in ov5640_set_mode_exposure_calc()
1619 ret = ov5640_load_regs(sensor, mode); in ov5640_set_mode_exposure_calc()
1624 ret = ov5640_get_vts(sensor); in ov5640_set_mode_exposure_calc()
1628 ret = ov5640_get_hts(sensor); in ov5640_set_mode_exposure_calc()
1635 ret = ov5640_get_sysclk(sensor); in ov5640_set_mode_exposure_calc()
1643 ret = ov5640_get_light_freq(sensor); in ov5640_set_mode_exposure_calc()
1656 if (!sensor->prev_sysclk) { in ov5640_set_mode_exposure_calc()
1657 ret = ov5640_get_sysclk(sensor); in ov5640_set_mode_exposure_calc()
1662 sensor->prev_sysclk = ret; in ov5640_set_mode_exposure_calc()
1671 if (average > sensor->ae_low && average < sensor->ae_high) { in ov5640_set_mode_exposure_calc()
1675 cap_sysclk / sensor->prev_sysclk * in ov5640_set_mode_exposure_calc()
1676 sensor->prev_hts / cap_hts * in ov5640_set_mode_exposure_calc()
1677 sensor->ae_target / average; in ov5640_set_mode_exposure_calc()
1681 cap_sysclk / sensor->prev_sysclk * in ov5640_set_mode_exposure_calc()
1682 sensor->prev_hts / cap_hts; in ov5640_set_mode_exposure_calc()
1716 ret = ov5640_set_gain(sensor, cap_gain16); in ov5640_set_mode_exposure_calc()
1723 ret = ov5640_set_vts(sensor, cap_vts); in ov5640_set_mode_exposure_calc()
1729 return ov5640_set_exposure(sensor, cap_shutter); in ov5640_set_mode_exposure_calc()
1733 * if sensor changes inside scaling or subsampling
1736 static int ov5640_set_mode_direct(struct ov5640_dev *sensor, in ov5640_set_mode_direct() argument
1743 return ov5640_load_regs(sensor, mode); in ov5640_set_mode_direct()
1746 static int ov5640_set_mode(struct ov5640_dev *sensor) in ov5640_set_mode() argument
1748 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_set_mode()
1749 const struct ov5640_mode_info *orig_mode = sensor->last_mode; in ov5640_set_mode()
1751 bool auto_gain = sensor->ctrls.auto_gain->val == 1; in ov5640_set_mode()
1752 bool auto_exp = sensor->ctrls.auto_exp->val == V4L2_EXPOSURE_AUTO; in ov5640_set_mode()
1761 ret = ov5640_set_autogain(sensor, false); in ov5640_set_mode()
1767 ret = ov5640_set_autoexposure(sensor, false); in ov5640_set_mode()
1776 rate = ov5640_calc_pixel_rate(sensor) * 16; in ov5640_set_mode()
1777 if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) { in ov5640_set_mode()
1778 rate = rate / sensor->ep.bus.mipi_csi2.num_data_lanes; in ov5640_set_mode()
1779 ret = ov5640_set_mipi_pclk(sensor, rate); in ov5640_set_mode()
1781 rate = rate / sensor->ep.bus.parallel.bus_width; in ov5640_set_mode()
1782 ret = ov5640_set_dvp_pclk(sensor, rate); in ov5640_set_mode()
1794 ret = ov5640_set_mode_exposure_calc(sensor, mode); in ov5640_set_mode()
1800 ret = ov5640_set_mode_direct(sensor, mode); in ov5640_set_mode()
1807 ov5640_set_autogain(sensor, true); in ov5640_set_mode()
1809 ov5640_set_autoexposure(sensor, true); in ov5640_set_mode()
1811 ret = ov5640_set_binning(sensor, dn_mode != SCALING); in ov5640_set_mode()
1814 ret = ov5640_set_ae_target(sensor, sensor->ae_target); in ov5640_set_mode()
1817 ret = ov5640_get_light_freq(sensor); in ov5640_set_mode()
1820 ret = ov5640_set_bandingfilter(sensor); in ov5640_set_mode()
1823 ret = ov5640_set_virtual_channel(sensor); in ov5640_set_mode()
1827 sensor->pending_mode_change = false; in ov5640_set_mode()
1828 sensor->last_mode = mode; in ov5640_set_mode()
1834 ov5640_set_autoexposure(sensor, true); in ov5640_set_mode()
1837 ov5640_set_autogain(sensor, true); in ov5640_set_mode()
1842 static int ov5640_set_framefmt(struct ov5640_dev *sensor,
1846 static int ov5640_restore_mode(struct ov5640_dev *sensor) in ov5640_restore_mode() argument
1851 ret = ov5640_load_regs(sensor, &ov5640_mode_init_data); in ov5640_restore_mode()
1854 sensor->last_mode = &ov5640_mode_init_data; in ov5640_restore_mode()
1856 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f, in ov5640_restore_mode()
1863 ret = ov5640_set_mode(sensor); in ov5640_restore_mode()
1867 return ov5640_set_framefmt(sensor, &sensor->fmt); in ov5640_restore_mode()
1870 static void ov5640_power(struct ov5640_dev *sensor, bool enable) in ov5640_power() argument
1872 gpiod_set_value_cansleep(sensor->pwdn_gpio, enable ? 0 : 1); in ov5640_power()
1875 static void ov5640_reset(struct ov5640_dev *sensor) in ov5640_reset() argument
1877 if (!sensor->reset_gpio) in ov5640_reset()
1880 gpiod_set_value_cansleep(sensor->reset_gpio, 0); in ov5640_reset()
1883 ov5640_power(sensor, false); in ov5640_reset()
1885 ov5640_power(sensor, true); in ov5640_reset()
1888 gpiod_set_value_cansleep(sensor->reset_gpio, 1); in ov5640_reset()
1891 gpiod_set_value_cansleep(sensor->reset_gpio, 0); in ov5640_reset()
1895 static int ov5640_set_power_on(struct ov5640_dev *sensor) in ov5640_set_power_on() argument
1897 struct i2c_client *client = sensor->i2c_client; in ov5640_set_power_on()
1900 ret = clk_prepare_enable(sensor->xclk); in ov5640_set_power_on()
1908 sensor->supplies); in ov5640_set_power_on()
1915 ov5640_reset(sensor); in ov5640_set_power_on()
1916 ov5640_power(sensor, true); in ov5640_set_power_on()
1918 ret = ov5640_init_slave_id(sensor); in ov5640_set_power_on()
1925 ov5640_power(sensor, false); in ov5640_set_power_on()
1926 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies); in ov5640_set_power_on()
1928 clk_disable_unprepare(sensor->xclk); in ov5640_set_power_on()
1932 static void ov5640_set_power_off(struct ov5640_dev *sensor) in ov5640_set_power_off() argument
1934 ov5640_power(sensor, false); in ov5640_set_power_off()
1935 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies); in ov5640_set_power_off()
1936 clk_disable_unprepare(sensor->xclk); in ov5640_set_power_off()
1939 static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on) in ov5640_set_power_mipi() argument
1945 ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58); in ov5640_set_power_mipi()
1946 ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x04); in ov5640_set_power_mipi()
1947 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x00); in ov5640_set_power_mipi()
1961 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x40); in ov5640_set_power_mipi()
1972 ret = ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x24); in ov5640_set_power_mipi()
1984 ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x70); in ov5640_set_power_mipi()
1994 static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on) in ov5640_set_power_dvp() argument
1996 unsigned int flags = sensor->ep.bus.parallel.flags; in ov5640_set_power_dvp()
2004 ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58); in ov5640_set_power_dvp()
2005 ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20); in ov5640_set_power_dvp()
2006 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00); in ov5640_set_power_dvp()
2007 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00); in ov5640_set_power_dvp()
2038 if (sensor->ep.bus_type == V4L2_MBUS_PARALLEL) { in ov5640_set_power_dvp()
2046 ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, in ov5640_set_power_dvp()
2062 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18); in ov5640_set_power_dvp()
2076 ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, in ov5640_set_power_dvp()
2077 sensor->ep.bus_type == V4L2_MBUS_PARALLEL ? in ov5640_set_power_dvp()
2088 return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc); in ov5640_set_power_dvp()
2091 static int ov5640_set_power(struct ov5640_dev *sensor, bool on) in ov5640_set_power() argument
2096 ret = ov5640_set_power_on(sensor); in ov5640_set_power()
2100 ret = ov5640_restore_mode(sensor); in ov5640_set_power()
2105 if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) in ov5640_set_power()
2106 ret = ov5640_set_power_mipi(sensor, on); in ov5640_set_power()
2108 ret = ov5640_set_power_dvp(sensor, on); in ov5640_set_power()
2113 ov5640_set_power_off(sensor); in ov5640_set_power()
2118 ov5640_set_power_off(sensor); in ov5640_set_power()
2126 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_power() local
2129 mutex_lock(&sensor->lock); in ov5640_s_power()
2135 if (sensor->power_count == !on) { in ov5640_s_power()
2136 ret = ov5640_set_power(sensor, !!on); in ov5640_s_power()
2142 sensor->power_count += on ? 1 : -1; in ov5640_s_power()
2143 WARN_ON(sensor->power_count < 0); in ov5640_s_power()
2145 mutex_unlock(&sensor->lock); in ov5640_s_power()
2147 if (on && !ret && sensor->power_count == 1) { in ov5640_s_power()
2149 ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler); in ov5640_s_power()
2155 static int ov5640_try_frame_interval(struct ov5640_dev *sensor, in ov5640_try_frame_interval() argument
2191 mode = ov5640_find_mode(sensor, rate, width, height, false); in ov5640_try_frame_interval()
2199 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_get_fmt() local
2205 mutex_lock(&sensor->lock); in ov5640_get_fmt()
2208 fmt = v4l2_subdev_get_try_format(&sensor->sd, cfg, in ov5640_get_fmt()
2211 fmt = &sensor->fmt; in ov5640_get_fmt()
2215 mutex_unlock(&sensor->lock); in ov5640_get_fmt()
2225 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_try_fmt_internal() local
2229 mode = ov5640_find_mode(sensor, fr, fmt->width, fmt->height, true); in ov5640_try_fmt_internal()
2257 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_set_fmt() local
2266 mutex_lock(&sensor->lock); in ov5640_set_fmt()
2268 if (sensor->streaming) { in ov5640_set_fmt()
2274 sensor->current_fr, &new_mode); in ov5640_set_fmt()
2281 fmt = &sensor->fmt; in ov5640_set_fmt()
2285 if (new_mode != sensor->current_mode) { in ov5640_set_fmt()
2286 sensor->current_mode = new_mode; in ov5640_set_fmt()
2287 sensor->pending_mode_change = true; in ov5640_set_fmt()
2289 if (mbus_fmt->code != sensor->fmt.code) in ov5640_set_fmt()
2290 sensor->pending_fmt_change = true; in ov5640_set_fmt()
2292 __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate, in ov5640_set_fmt()
2293 ov5640_calc_pixel_rate(sensor)); in ov5640_set_fmt()
2295 mutex_unlock(&sensor->lock); in ov5640_set_fmt()
2299 static int ov5640_set_framefmt(struct ov5640_dev *sensor, in ov5640_set_framefmt() argument
2358 ret = ov5640_write_reg(sensor, OV5640_REG_FORMAT_CONTROL00, fmt); in ov5640_set_framefmt()
2363 ret = ov5640_write_reg(sensor, OV5640_REG_ISP_FORMAT_MUX_CTRL, mux); in ov5640_set_framefmt()
2371 ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21, in ov5640_set_framefmt()
2382 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_RESET02, in ov5640_set_framefmt()
2393 return ov5640_mod_reg(sensor, OV5640_REG_SYS_CLOCK_ENABLE02, in ov5640_set_framefmt()
2399 * Sensor Controls.
2402 static int ov5640_set_ctrl_hue(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_hue() argument
2407 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, in ov5640_set_ctrl_hue()
2411 ret = ov5640_write_reg16(sensor, OV5640_REG_SDE_CTRL1, value); in ov5640_set_ctrl_hue()
2413 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(0), 0); in ov5640_set_ctrl_hue()
2419 static int ov5640_set_ctrl_contrast(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_contrast() argument
2424 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, in ov5640_set_ctrl_contrast()
2428 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL5, in ov5640_set_ctrl_contrast()
2431 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(2), 0); in ov5640_set_ctrl_contrast()
2437 static int ov5640_set_ctrl_saturation(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_saturation() argument
2442 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, in ov5640_set_ctrl_saturation()
2446 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL3, in ov5640_set_ctrl_saturation()
2450 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL4, in ov5640_set_ctrl_saturation()
2453 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(1), 0); in ov5640_set_ctrl_saturation()
2459 static int ov5640_set_ctrl_white_balance(struct ov5640_dev *sensor, int awb) in ov5640_set_ctrl_white_balance() argument
2463 ret = ov5640_mod_reg(sensor, OV5640_REG_AWB_MANUAL_CTRL, in ov5640_set_ctrl_white_balance()
2469 u16 red = (u16)sensor->ctrls.red_balance->val; in ov5640_set_ctrl_white_balance()
2470 u16 blue = (u16)sensor->ctrls.blue_balance->val; in ov5640_set_ctrl_white_balance()
2472 ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_R_GAIN, red); in ov5640_set_ctrl_white_balance()
2475 ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_B_GAIN, blue); in ov5640_set_ctrl_white_balance()
2481 static int ov5640_set_ctrl_exposure(struct ov5640_dev *sensor, in ov5640_set_ctrl_exposure() argument
2484 struct ov5640_ctrls *ctrls = &sensor->ctrls; in ov5640_set_ctrl_exposure()
2489 ret = ov5640_set_autoexposure(sensor, auto_exp); in ov5640_set_ctrl_exposure()
2497 ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_VTS, in ov5640_set_ctrl_exposure()
2501 ret = ov5640_get_vts(sensor); in ov5640_set_ctrl_exposure()
2508 ret = ov5640_set_exposure(sensor, ctrls->exposure->val); in ov5640_set_ctrl_exposure()
2514 static int ov5640_set_ctrl_gain(struct ov5640_dev *sensor, bool auto_gain) in ov5640_set_ctrl_gain() argument
2516 struct ov5640_ctrls *ctrls = &sensor->ctrls; in ov5640_set_ctrl_gain()
2520 ret = ov5640_set_autogain(sensor, auto_gain); in ov5640_set_ctrl_gain()
2526 ret = ov5640_set_gain(sensor, ctrls->gain->val); in ov5640_set_ctrl_gain()
2562 static int ov5640_set_ctrl_test_pattern(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_test_pattern() argument
2564 return ov5640_write_reg(sensor, OV5640_REG_PRE_ISP_TEST_SET1, in ov5640_set_ctrl_test_pattern()
2568 static int ov5640_set_ctrl_light_freq(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_light_freq() argument
2572 ret = ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL01, BIT(7), in ov5640_set_ctrl_light_freq()
2578 return ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL00, BIT(2), in ov5640_set_ctrl_light_freq()
2583 static int ov5640_set_ctrl_hflip(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_hflip() argument
2586 * If sensor is mounted upside down, mirror logic is inversed. in ov5640_set_ctrl_hflip()
2588 * Sensor is a BSI (Back Side Illuminated) one, in ov5640_set_ctrl_hflip()
2597 * - [1]: Sensor mirror in ov5640_set_ctrl_hflip()
2599 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21, in ov5640_set_ctrl_hflip()
2601 (!(value ^ sensor->upside_down)) ? in ov5640_set_ctrl_hflip()
2605 static int ov5640_set_ctrl_vflip(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_vflip() argument
2607 /* If sensor is mounted upside down, flip logic is inversed */ in ov5640_set_ctrl_vflip()
2612 * - [1]: Sensor vflip in ov5640_set_ctrl_vflip()
2614 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20, in ov5640_set_ctrl_vflip()
2616 (value ^ sensor->upside_down) ? in ov5640_set_ctrl_vflip()
2623 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_g_volatile_ctrl() local
2630 val = ov5640_get_gain(sensor); in ov5640_g_volatile_ctrl()
2633 sensor->ctrls.gain->val = val; in ov5640_g_volatile_ctrl()
2636 val = ov5640_get_exposure(sensor); in ov5640_g_volatile_ctrl()
2639 sensor->ctrls.exposure->val = val; in ov5640_g_volatile_ctrl()
2649 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_ctrl() local
2659 if (sensor->power_count == 0) in ov5640_s_ctrl()
2664 ret = ov5640_set_ctrl_gain(sensor, ctrl->val); in ov5640_s_ctrl()
2667 ret = ov5640_set_ctrl_exposure(sensor, ctrl->val); in ov5640_s_ctrl()
2670 ret = ov5640_set_ctrl_white_balance(sensor, ctrl->val); in ov5640_s_ctrl()
2673 ret = ov5640_set_ctrl_hue(sensor, ctrl->val); in ov5640_s_ctrl()
2676 ret = ov5640_set_ctrl_contrast(sensor, ctrl->val); in ov5640_s_ctrl()
2679 ret = ov5640_set_ctrl_saturation(sensor, ctrl->val); in ov5640_s_ctrl()
2682 ret = ov5640_set_ctrl_test_pattern(sensor, ctrl->val); in ov5640_s_ctrl()
2685 ret = ov5640_set_ctrl_light_freq(sensor, ctrl->val); in ov5640_s_ctrl()
2688 ret = ov5640_set_ctrl_hflip(sensor, ctrl->val); in ov5640_s_ctrl()
2691 ret = ov5640_set_ctrl_vflip(sensor, ctrl->val); in ov5640_s_ctrl()
2706 static int ov5640_init_controls(struct ov5640_dev *sensor) in ov5640_init_controls() argument
2709 struct ov5640_ctrls *ctrls = &sensor->ctrls; in ov5640_init_controls()
2716 hdl->lock = &sensor->lock; in ov5640_init_controls()
2721 ov5640_calc_pixel_rate(sensor)); in ov5640_init_controls()
2778 sensor->sd.ctrl_handler = hdl; in ov5640_init_controls()
2810 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_enum_frame_interval() local
2822 ret = ov5640_try_frame_interval(sensor, &tpf, in ov5640_enum_frame_interval()
2834 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_g_frame_interval() local
2836 mutex_lock(&sensor->lock); in ov5640_g_frame_interval()
2837 fi->interval = sensor->frame_interval; in ov5640_g_frame_interval()
2838 mutex_unlock(&sensor->lock); in ov5640_g_frame_interval()
2846 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_frame_interval() local
2853 mutex_lock(&sensor->lock); in ov5640_s_frame_interval()
2855 if (sensor->streaming) { in ov5640_s_frame_interval()
2860 mode = sensor->current_mode; in ov5640_s_frame_interval()
2862 frame_rate = ov5640_try_frame_interval(sensor, &fi->interval, in ov5640_s_frame_interval()
2866 fi->interval = sensor->frame_interval; in ov5640_s_frame_interval()
2870 mode = ov5640_find_mode(sensor, frame_rate, mode->hact, in ov5640_s_frame_interval()
2877 if (mode != sensor->current_mode || in ov5640_s_frame_interval()
2878 frame_rate != sensor->current_fr) { in ov5640_s_frame_interval()
2879 sensor->current_fr = frame_rate; in ov5640_s_frame_interval()
2880 sensor->frame_interval = fi->interval; in ov5640_s_frame_interval()
2881 sensor->current_mode = mode; in ov5640_s_frame_interval()
2882 sensor->pending_mode_change = true; in ov5640_s_frame_interval()
2884 __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate, in ov5640_s_frame_interval()
2885 ov5640_calc_pixel_rate(sensor)); in ov5640_s_frame_interval()
2888 mutex_unlock(&sensor->lock); in ov5640_s_frame_interval()
2907 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_stream() local
2910 mutex_lock(&sensor->lock); in ov5640_s_stream()
2912 if (sensor->streaming == !enable) { in ov5640_s_stream()
2913 if (enable && sensor->pending_mode_change) { in ov5640_s_stream()
2914 ret = ov5640_set_mode(sensor); in ov5640_s_stream()
2919 if (enable && sensor->pending_fmt_change) { in ov5640_s_stream()
2920 ret = ov5640_set_framefmt(sensor, &sensor->fmt); in ov5640_s_stream()
2923 sensor->pending_fmt_change = false; in ov5640_s_stream()
2926 if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) in ov5640_s_stream()
2927 ret = ov5640_set_stream_mipi(sensor, enable); in ov5640_s_stream()
2928 else if (sensor->ep.bus_type == V4L2_MBUS_BT656) in ov5640_s_stream()
2929 ret = ov5640_set_stream_bt656(sensor, enable); in ov5640_s_stream()
2931 ret = ov5640_set_stream_dvp(sensor, enable); in ov5640_s_stream()
2934 sensor->streaming = enable; in ov5640_s_stream()
2937 mutex_unlock(&sensor->lock); in ov5640_s_stream()
2968 static int ov5640_get_regulators(struct ov5640_dev *sensor) in ov5640_get_regulators() argument
2973 sensor->supplies[i].supply = ov5640_supply_name[i]; in ov5640_get_regulators()
2975 return devm_regulator_bulk_get(&sensor->i2c_client->dev, in ov5640_get_regulators()
2977 sensor->supplies); in ov5640_get_regulators()
2980 static int ov5640_check_chip_id(struct ov5640_dev *sensor) in ov5640_check_chip_id() argument
2982 struct i2c_client *client = sensor->i2c_client; in ov5640_check_chip_id()
2986 ret = ov5640_set_power_on(sensor); in ov5640_check_chip_id()
2990 ret = ov5640_read_reg16(sensor, OV5640_REG_CHIP_ID, &chip_id); in ov5640_check_chip_id()
3004 ov5640_set_power_off(sensor); in ov5640_check_chip_id()
3012 struct ov5640_dev *sensor; in ov5640_probe() local
3017 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); in ov5640_probe()
3018 if (!sensor) in ov5640_probe()
3021 sensor->i2c_client = client; in ov5640_probe()
3024 * default init sequence initialize sensor to in ov5640_probe()
3027 fmt = &sensor->fmt; in ov5640_probe()
3036 sensor->frame_interval.numerator = 1; in ov5640_probe()
3037 sensor->frame_interval.denominator = ov5640_framerates[OV5640_30_FPS]; in ov5640_probe()
3038 sensor->current_fr = OV5640_30_FPS; in ov5640_probe()
3039 sensor->current_mode = in ov5640_probe()
3041 sensor->last_mode = sensor->current_mode; in ov5640_probe()
3043 sensor->ae_target = 52; in ov5640_probe()
3045 /* optional indication of physical rotation of sensor */ in ov5640_probe()
3051 sensor->upside_down = true; in ov5640_probe()
3068 ret = v4l2_fwnode_endpoint_parse(endpoint, &sensor->ep); in ov5640_probe()
3075 if (sensor->ep.bus_type != V4L2_MBUS_PARALLEL && in ov5640_probe()
3076 sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY && in ov5640_probe()
3077 sensor->ep.bus_type != V4L2_MBUS_BT656) { in ov5640_probe()
3078 dev_err(dev, "Unsupported bus type %d\n", sensor->ep.bus_type); in ov5640_probe()
3083 sensor->xclk = devm_clk_get(dev, "xclk"); in ov5640_probe()
3084 if (IS_ERR(sensor->xclk)) { in ov5640_probe()
3086 return PTR_ERR(sensor->xclk); in ov5640_probe()
3089 sensor->xclk_freq = clk_get_rate(sensor->xclk); in ov5640_probe()
3090 if (sensor->xclk_freq < OV5640_XCLK_MIN || in ov5640_probe()
3091 sensor->xclk_freq > OV5640_XCLK_MAX) { in ov5640_probe()
3093 sensor->xclk_freq); in ov5640_probe()
3098 sensor->pwdn_gpio = devm_gpiod_get_optional(dev, "powerdown", in ov5640_probe()
3100 if (IS_ERR(sensor->pwdn_gpio)) in ov5640_probe()
3101 return PTR_ERR(sensor->pwdn_gpio); in ov5640_probe()
3104 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in ov5640_probe()
3106 if (IS_ERR(sensor->reset_gpio)) in ov5640_probe()
3107 return PTR_ERR(sensor->reset_gpio); in ov5640_probe()
3109 v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops); in ov5640_probe()
3111 sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in ov5640_probe()
3113 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in ov5640_probe()
3114 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov5640_probe()
3115 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in ov5640_probe()
3119 ret = ov5640_get_regulators(sensor); in ov5640_probe()
3123 mutex_init(&sensor->lock); in ov5640_probe()
3125 ret = ov5640_check_chip_id(sensor); in ov5640_probe()
3129 ret = ov5640_init_controls(sensor); in ov5640_probe()
3133 ret = v4l2_async_register_subdev_sensor_common(&sensor->sd); in ov5640_probe()
3140 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov5640_probe()
3142 media_entity_cleanup(&sensor->sd.entity); in ov5640_probe()
3143 mutex_destroy(&sensor->lock); in ov5640_probe()
3150 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_remove() local
3152 v4l2_async_unregister_subdev(&sensor->sd); in ov5640_remove()
3153 media_entity_cleanup(&sensor->sd.entity); in ov5640_remove()
3154 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov5640_remove()
3155 mutex_destroy(&sensor->lock); in ov5640_remove()