Lines Matching full:sensor
481 static inline bool ov5640_is_csi2(const struct ov5640_dev *sensor) in ov5640_is_csi2() argument
483 return sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY; in ov5640_is_csi2()
487 ov5640_formats(struct ov5640_dev *sensor) in ov5640_formats() argument
489 return ov5640_is_csi2(sensor) ? ov5640_csi2_formats in ov5640_formats()
494 ov5640_code_to_pixfmt(struct ov5640_dev *sensor, u32 code) in ov5640_code_to_pixfmt() argument
496 const struct ov5640_pixfmt *formats = ov5640_formats(sensor); in ov5640_code_to_pixfmt()
507 static u32 ov5640_code_to_bpp(struct ov5640_dev *sensor, u32 code) in ov5640_code_to_bpp() argument
509 const struct ov5640_pixfmt *format = ov5640_code_to_pixfmt(sensor, in ov5640_code_to_bpp()
1141 ov5640_timings(const struct ov5640_dev *sensor, in ov5640_timings() argument
1144 if (ov5640_is_csi2(sensor)) in ov5640_timings()
1150 static int ov5640_init_slave_id(struct ov5640_dev *sensor) in ov5640_init_slave_id() argument
1152 struct i2c_client *client = sensor->i2c_client; in ov5640_init_slave_id()
1178 static int ov5640_write_reg(struct ov5640_dev *sensor, u16 reg, u8 val) in ov5640_write_reg() argument
1180 struct i2c_client *client = sensor->i2c_client; in ov5640_write_reg()
1204 static int ov5640_read_reg(struct ov5640_dev *sensor, u16 reg, u8 *val) in ov5640_read_reg() argument
1206 struct i2c_client *client = sensor->i2c_client; in ov5640_read_reg()
1235 static int ov5640_read_reg16(struct ov5640_dev *sensor, u16 reg, u16 *val) in ov5640_read_reg16() argument
1240 ret = ov5640_read_reg(sensor, reg, &hi); in ov5640_read_reg16()
1243 ret = ov5640_read_reg(sensor, reg + 1, &lo); in ov5640_read_reg16()
1251 static int ov5640_write_reg16(struct ov5640_dev *sensor, u16 reg, u16 val) in ov5640_write_reg16() argument
1255 ret = ov5640_write_reg(sensor, reg, val >> 8); in ov5640_write_reg16()
1259 return ov5640_write_reg(sensor, reg + 1, val & 0xff); in ov5640_write_reg16()
1262 static int ov5640_mod_reg(struct ov5640_dev *sensor, u16 reg, in ov5640_mod_reg() argument
1268 ret = ov5640_read_reg(sensor, reg, &readval); in ov5640_mod_reg()
1276 return ov5640_write_reg(sensor, reg, val); in ov5640_mod_reg()
1376 static unsigned long ov5640_compute_sys_clk(struct ov5640_dev *sensor, in ov5640_compute_sys_clk() argument
1380 unsigned long sysclk = sensor->xclk_freq / pll_prediv * pll_mult; in ov5640_compute_sys_clk()
1389 static unsigned long ov5640_calc_sys_clk(struct ov5640_dev *sensor, in ov5640_calc_sys_clk() argument
1413 _rate = ov5640_compute_sys_clk(sensor, in ov5640_calc_sys_clk()
1454 static int ov5640_set_mipi_pclk(struct ov5640_dev *sensor) in ov5640_set_mipi_pclk() argument
1466 link_freq = sensor->current_link_freq; in ov5640_set_mipi_pclk()
1480 ov5640_calc_sys_clk(sensor, sysclk, &prediv, &mult, &sysdiv); in ov5640_set_mipi_pclk()
1519 num_lanes = sensor->ep.bus.mipi_csi2.num_data_lanes; in ov5640_set_mipi_pclk()
1524 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0, 0x0f, bit_div); in ov5640_set_mipi_pclk()
1528 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1, 0xff, in ov5640_set_mipi_pclk()
1533 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2, 0xff, mult); in ov5640_set_mipi_pclk()
1537 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3, 0x1f, in ov5640_set_mipi_pclk()
1542 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f, in ov5640_set_mipi_pclk()
1547 return ov5640_write_reg(sensor, OV5640_REG_PCLK_PERIOD, pclk_period); in ov5640_set_mipi_pclk()
1550 static u32 ov5640_calc_pixel_rate(struct ov5640_dev *sensor) in ov5640_calc_pixel_rate() argument
1552 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_calc_pixel_rate()
1557 rate *= ov5640_framerates[sensor->current_fr]; in ov5640_calc_pixel_rate()
1562 static unsigned long ov5640_calc_pclk(struct ov5640_dev *sensor, in ov5640_calc_pclk() argument
1570 _rate = ov5640_calc_sys_clk(sensor, _rate, pll_prediv, pll_mult, in ov5640_calc_pclk()
1579 static int ov5640_set_dvp_pclk(struct ov5640_dev *sensor) in ov5640_set_dvp_pclk() argument
1585 rate = ov5640_calc_pixel_rate(sensor); in ov5640_set_dvp_pclk()
1586 rate *= ov5640_code_to_bpp(sensor, sensor->fmt.code); in ov5640_set_dvp_pclk()
1587 rate /= sensor->ep.bus.parallel.bus_width; in ov5640_set_dvp_pclk()
1589 ov5640_calc_pclk(sensor, rate, &prediv, &mult, &sysdiv, &pll_rdiv, in ov5640_set_dvp_pclk()
1595 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0, in ov5640_set_dvp_pclk()
1604 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1, in ov5640_set_dvp_pclk()
1609 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2, in ov5640_set_dvp_pclk()
1614 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3, in ov5640_set_dvp_pclk()
1619 return ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x30, in ov5640_set_dvp_pclk()
1624 static int ov5640_set_jpeg_timings(struct ov5640_dev *sensor, in ov5640_set_jpeg_timings() argument
1636 ret = ov5640_mod_reg(sensor, OV5640_REG_JPG_MODE_SELECT, 0x7, 0x3); in ov5640_set_jpeg_timings()
1640 ret = ov5640_write_reg16(sensor, OV5640_REG_VFIFO_HSIZE, mode->width); in ov5640_set_jpeg_timings()
1644 return ov5640_write_reg16(sensor, OV5640_REG_VFIFO_VSIZE, mode->height); in ov5640_set_jpeg_timings()
1647 /* download ov5640 settings to sensor through i2c */
1648 static int ov5640_set_timings(struct ov5640_dev *sensor, in ov5640_set_timings() argument
1656 if (sensor->fmt.code == MEDIA_BUS_FMT_JPEG_1X8) { in ov5640_set_timings()
1657 ret = ov5640_set_jpeg_timings(sensor, mode); in ov5640_set_timings()
1662 timings = ov5640_timings(sensor, mode); in ov5640_set_timings()
1666 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HS, in ov5640_set_timings()
1671 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_VS, in ov5640_set_timings()
1676 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HW, in ov5640_set_timings()
1681 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_VH, in ov5640_set_timings()
1686 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HOFFS, crop->left); in ov5640_set_timings()
1690 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_VOFFS, crop->top); in ov5640_set_timings()
1694 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPHO, mode->width); in ov5640_set_timings()
1698 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPVO, mode->height); in ov5640_set_timings()
1702 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HTS, timings->htot); in ov5640_set_timings()
1706 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, in ov5640_set_timings()
1714 static void ov5640_load_regs(struct ov5640_dev *sensor, in ov5640_load_regs() argument
1732 !ov5640_is_csi2(sensor)) in ov5640_load_regs()
1736 ret = ov5640_mod_reg(sensor, reg_addr, mask, val); in ov5640_load_regs()
1738 ret = ov5640_write_reg(sensor, reg_addr, val); in ov5640_load_regs()
1747 static int ov5640_set_autoexposure(struct ov5640_dev *sensor, bool on) in ov5640_set_autoexposure() argument
1749 return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL, in ov5640_set_autoexposure()
1754 static int ov5640_get_exposure(struct ov5640_dev *sensor) in ov5640_get_exposure() argument
1759 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_HI, &temp); in ov5640_get_exposure()
1763 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_MED, &temp); in ov5640_get_exposure()
1767 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_LO, &temp); in ov5640_get_exposure()
1776 static int ov5640_set_exposure(struct ov5640_dev *sensor, u32 exposure) in ov5640_set_exposure() argument
1782 ret = ov5640_write_reg(sensor, in ov5640_set_exposure()
1787 ret = ov5640_write_reg(sensor, in ov5640_set_exposure()
1792 return ov5640_write_reg(sensor, in ov5640_set_exposure()
1797 static int ov5640_get_gain(struct ov5640_dev *sensor) in ov5640_get_gain() argument
1802 ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN, &gain); in ov5640_get_gain()
1809 static int ov5640_set_gain(struct ov5640_dev *sensor, int gain) in ov5640_set_gain() argument
1811 return ov5640_write_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN, in ov5640_set_gain()
1815 static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on) in ov5640_set_autogain() argument
1817 return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL, in ov5640_set_autogain()
1821 static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on) in ov5640_set_stream_dvp() argument
1823 return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ? in ov5640_set_stream_dvp()
1828 static int ov5640_set_stream_mipi(struct ov5640_dev *sensor, bool on) in ov5640_set_stream_mipi() argument
1837 * FIXME: the sensor manual (version 2.03) reports in ov5640_set_stream_mipi()
1849 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, in ov5640_set_stream_mipi()
1854 return ov5640_write_reg(sensor, OV5640_REG_FRAME_CTRL01, in ov5640_set_stream_mipi()
1858 static int ov5640_get_sysclk(struct ov5640_dev *sensor) in ov5640_get_sysclk() argument
1861 u32 xvclk = sensor->xclk_freq / 10000; in ov5640_get_sysclk()
1868 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL0, &temp1); in ov5640_get_sysclk()
1875 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL1, &temp1); in ov5640_get_sysclk()
1882 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL2, &temp1); in ov5640_get_sysclk()
1887 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL3, &temp1); in ov5640_get_sysclk()
1893 ret = ov5640_read_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, &temp1); in ov5640_get_sysclk()
1909 static int ov5640_set_night_mode(struct ov5640_dev *sensor) in ov5640_set_night_mode() argument
1915 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_CTRL00, &mode); in ov5640_set_night_mode()
1919 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL00, mode); in ov5640_set_night_mode()
1922 static int ov5640_get_hts(struct ov5640_dev *sensor) in ov5640_get_hts() argument
1928 ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_HTS, &hts); in ov5640_get_hts()
1934 static int ov5640_get_vts(struct ov5640_dev *sensor) in ov5640_get_vts() argument
1939 ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_VTS, &vts); in ov5640_get_vts()
1945 static int ov5640_set_vts(struct ov5640_dev *sensor, int vts) in ov5640_set_vts() argument
1947 return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, vts); in ov5640_set_vts()
1950 static int ov5640_get_light_freq(struct ov5640_dev *sensor) in ov5640_get_light_freq() argument
1956 ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL01, &temp); in ov5640_get_light_freq()
1962 ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL00, in ov5640_get_light_freq()
1975 ret = ov5640_read_reg(sensor, OV5640_REG_SIGMADELTA_CTRL0C, in ov5640_get_light_freq()
1992 static int ov5640_set_bandingfilter(struct ov5640_dev *sensor) in ov5640_set_bandingfilter() argument
1998 ret = ov5640_get_sysclk(sensor); in ov5640_set_bandingfilter()
2003 sensor->prev_sysclk = ret; in ov5640_set_bandingfilter()
2005 ret = ov5640_get_hts(sensor); in ov5640_set_bandingfilter()
2010 sensor->prev_hts = ret; in ov5640_set_bandingfilter()
2013 ret = ov5640_get_vts(sensor); in ov5640_set_bandingfilter()
2020 band_step60 = sensor->prev_sysclk * 100 / sensor->prev_hts * 100 / 120; in ov5640_set_bandingfilter()
2021 ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B60_STEP, band_step60); in ov5640_set_bandingfilter()
2027 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0D, max_band60); in ov5640_set_bandingfilter()
2032 band_step50 = sensor->prev_sysclk * 100 / sensor->prev_hts; in ov5640_set_bandingfilter()
2033 ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B50_STEP, band_step50); in ov5640_set_bandingfilter()
2039 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0E, max_band50); in ov5640_set_bandingfilter()
2042 static int ov5640_set_ae_target(struct ov5640_dev *sensor, int target) in ov5640_set_ae_target() argument
2048 sensor->ae_low = target * 23 / 25; /* 0.92 */ in ov5640_set_ae_target()
2049 sensor->ae_high = target * 27 / 25; /* 1.08 */ in ov5640_set_ae_target()
2051 fast_high = sensor->ae_high << 1; in ov5640_set_ae_target()
2055 fast_low = sensor->ae_low >> 1; in ov5640_set_ae_target()
2057 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0F, sensor->ae_high); in ov5640_set_ae_target()
2060 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL10, sensor->ae_low); in ov5640_set_ae_target()
2063 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1B, sensor->ae_high); in ov5640_set_ae_target()
2066 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1E, sensor->ae_low); in ov5640_set_ae_target()
2069 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL11, fast_high); in ov5640_set_ae_target()
2072 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1F, fast_low); in ov5640_set_ae_target()
2075 static int ov5640_get_binning(struct ov5640_dev *sensor) in ov5640_get_binning() argument
2080 ret = ov5640_read_reg(sensor, OV5640_REG_TIMING_TC_REG21, &temp); in ov5640_get_binning()
2087 static int ov5640_set_binning(struct ov5640_dev *sensor, bool enable) in ov5640_set_binning() argument
2095 ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21, in ov5640_set_binning()
2104 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20, in ov5640_set_binning()
2108 static int ov5640_set_virtual_channel(struct ov5640_dev *sensor) in ov5640_set_virtual_channel() argument
2110 struct i2c_client *client = sensor->i2c_client; in ov5640_set_virtual_channel()
2121 ret = ov5640_read_reg(sensor, OV5640_REG_DEBUG_MODE, &temp); in ov5640_set_virtual_channel()
2126 return ov5640_write_reg(sensor, OV5640_REG_DEBUG_MODE, temp); in ov5640_set_virtual_channel()
2130 ov5640_find_mode(struct ov5640_dev *sensor, int width, int height, bool nearest) in ov5640_find_mode() argument
2147 * sensor changes between scaling and subsampling, go through
2150 static int ov5640_set_mode_exposure_calc(struct ov5640_dev *sensor, in ov5640_set_mode_exposure_calc() argument
2165 ret = ov5640_get_exposure(sensor); in ov5640_set_mode_exposure_calc()
2169 ret = ov5640_get_binning(sensor); in ov5640_set_mode_exposure_calc()
2177 ret = ov5640_get_gain(sensor); in ov5640_set_mode_exposure_calc()
2183 ret = ov5640_read_reg(sensor, OV5640_REG_AVG_READOUT, &average); in ov5640_set_mode_exposure_calc()
2188 ret = ov5640_set_night_mode(sensor); in ov5640_set_mode_exposure_calc()
2193 ov5640_load_regs(sensor, mode->reg_data, mode->reg_data_size); in ov5640_set_mode_exposure_calc()
2194 ret = ov5640_set_timings(sensor, mode); in ov5640_set_mode_exposure_calc()
2199 ret = ov5640_get_vts(sensor); in ov5640_set_mode_exposure_calc()
2203 ret = ov5640_get_hts(sensor); in ov5640_set_mode_exposure_calc()
2210 ret = ov5640_get_sysclk(sensor); in ov5640_set_mode_exposure_calc()
2218 ret = ov5640_get_light_freq(sensor); in ov5640_set_mode_exposure_calc()
2231 if (!sensor->prev_sysclk) { in ov5640_set_mode_exposure_calc()
2232 ret = ov5640_get_sysclk(sensor); in ov5640_set_mode_exposure_calc()
2237 sensor->prev_sysclk = ret; in ov5640_set_mode_exposure_calc()
2246 if (average > sensor->ae_low && average < sensor->ae_high) { in ov5640_set_mode_exposure_calc()
2250 cap_sysclk / sensor->prev_sysclk * in ov5640_set_mode_exposure_calc()
2251 sensor->prev_hts / cap_hts * in ov5640_set_mode_exposure_calc()
2252 sensor->ae_target / average; in ov5640_set_mode_exposure_calc()
2256 cap_sysclk / sensor->prev_sysclk * in ov5640_set_mode_exposure_calc()
2257 sensor->prev_hts / cap_hts; in ov5640_set_mode_exposure_calc()
2291 ret = ov5640_set_gain(sensor, cap_gain16); in ov5640_set_mode_exposure_calc()
2298 ret = ov5640_set_vts(sensor, cap_vts); in ov5640_set_mode_exposure_calc()
2304 return ov5640_set_exposure(sensor, cap_shutter); in ov5640_set_mode_exposure_calc()
2308 * if sensor changes inside scaling or subsampling
2311 static int ov5640_set_mode_direct(struct ov5640_dev *sensor, in ov5640_set_mode_direct() argument
2318 ov5640_load_regs(sensor, mode->reg_data, mode->reg_data_size); in ov5640_set_mode_direct()
2319 return ov5640_set_timings(sensor, mode); in ov5640_set_mode_direct()
2322 static int ov5640_set_mode(struct ov5640_dev *sensor) in ov5640_set_mode() argument
2324 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_set_mode()
2325 const struct ov5640_mode_info *orig_mode = sensor->last_mode; in ov5640_set_mode()
2327 bool auto_gain = sensor->ctrls.auto_gain->val == 1; in ov5640_set_mode()
2328 bool auto_exp = sensor->ctrls.auto_exp->val == V4L2_EXPOSURE_AUTO; in ov5640_set_mode()
2336 ret = ov5640_set_autogain(sensor, false); in ov5640_set_mode()
2342 ret = ov5640_set_autoexposure(sensor, false); in ov5640_set_mode()
2347 if (ov5640_is_csi2(sensor)) in ov5640_set_mode()
2348 ret = ov5640_set_mipi_pclk(sensor); in ov5640_set_mode()
2350 ret = ov5640_set_dvp_pclk(sensor); in ov5640_set_mode()
2360 ret = ov5640_set_mode_exposure_calc(sensor, mode); in ov5640_set_mode()
2366 ret = ov5640_set_mode_direct(sensor, mode); in ov5640_set_mode()
2373 ov5640_set_autogain(sensor, true); in ov5640_set_mode()
2375 ov5640_set_autoexposure(sensor, true); in ov5640_set_mode()
2377 ret = ov5640_set_binning(sensor, dn_mode != SCALING); in ov5640_set_mode()
2380 ret = ov5640_set_ae_target(sensor, sensor->ae_target); in ov5640_set_mode()
2383 ret = ov5640_get_light_freq(sensor); in ov5640_set_mode()
2386 ret = ov5640_set_bandingfilter(sensor); in ov5640_set_mode()
2389 ret = ov5640_set_virtual_channel(sensor); in ov5640_set_mode()
2393 sensor->pending_mode_change = false; in ov5640_set_mode()
2394 sensor->last_mode = mode; in ov5640_set_mode()
2400 ov5640_set_autoexposure(sensor, true); in ov5640_set_mode()
2403 ov5640_set_autogain(sensor, true); in ov5640_set_mode()
2408 static int ov5640_set_framefmt(struct ov5640_dev *sensor,
2412 static int ov5640_restore_mode(struct ov5640_dev *sensor) in ov5640_restore_mode() argument
2417 ov5640_load_regs(sensor, ov5640_init_setting, in ov5640_restore_mode()
2420 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f, in ov5640_restore_mode()
2427 ret = ov5640_set_mode(sensor); in ov5640_restore_mode()
2431 return ov5640_set_framefmt(sensor, &sensor->fmt); in ov5640_restore_mode()
2434 static void ov5640_power(struct ov5640_dev *sensor, bool enable) in ov5640_power() argument
2436 gpiod_set_value_cansleep(sensor->pwdn_gpio, enable ? 0 : 1); in ov5640_power()
2453 static void ov5640_powerup_sequence(struct ov5640_dev *sensor) in ov5640_powerup_sequence() argument
2455 if (sensor->pwdn_gpio) { in ov5640_powerup_sequence()
2456 gpiod_set_value_cansleep(sensor->reset_gpio, 1); in ov5640_powerup_sequence()
2459 ov5640_power(sensor, false); in ov5640_powerup_sequence()
2461 ov5640_power(sensor, true); in ov5640_powerup_sequence()
2464 gpiod_set_value_cansleep(sensor->reset_gpio, 0); in ov5640_powerup_sequence()
2467 ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, in ov5640_powerup_sequence()
2476 ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, in ov5640_powerup_sequence()
2480 static int ov5640_set_power_on(struct ov5640_dev *sensor) in ov5640_set_power_on() argument
2482 struct i2c_client *client = sensor->i2c_client; in ov5640_set_power_on()
2485 ret = clk_prepare_enable(sensor->xclk); in ov5640_set_power_on()
2493 sensor->supplies); in ov5640_set_power_on()
2500 ov5640_powerup_sequence(sensor); in ov5640_set_power_on()
2502 ret = ov5640_init_slave_id(sensor); in ov5640_set_power_on()
2509 ov5640_power(sensor, false); in ov5640_set_power_on()
2510 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies); in ov5640_set_power_on()
2512 clk_disable_unprepare(sensor->xclk); in ov5640_set_power_on()
2516 static void ov5640_set_power_off(struct ov5640_dev *sensor) in ov5640_set_power_off() argument
2518 ov5640_power(sensor, false); in ov5640_set_power_off()
2519 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies); in ov5640_set_power_off()
2520 clk_disable_unprepare(sensor->xclk); in ov5640_set_power_off()
2523 static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on) in ov5640_set_power_mipi() argument
2529 ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58); in ov5640_set_power_mipi()
2530 ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x04); in ov5640_set_power_mipi()
2531 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x00); in ov5640_set_power_mipi()
2545 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x44); in ov5640_set_power_mipi()
2556 ret = ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x24); in ov5640_set_power_mipi()
2568 ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x70); in ov5640_set_power_mipi()
2578 static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on) in ov5640_set_power_dvp() argument
2580 unsigned int flags = sensor->ep.bus.parallel.flags; in ov5640_set_power_dvp()
2581 bool bt656 = sensor->ep.bus_type == V4L2_MBUS_BT656; in ov5640_set_power_dvp()
2587 ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00, 0x00); in ov5640_set_power_dvp()
2588 ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58); in ov5640_set_power_dvp()
2589 ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20); in ov5640_set_power_dvp()
2590 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00); in ov5640_set_power_dvp()
2591 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00); in ov5640_set_power_dvp()
2635 ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00, in ov5640_set_power_dvp()
2659 ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, polarities); in ov5640_set_power_dvp()
2671 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18); in ov5640_set_power_dvp()
2685 ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, in ov5640_set_power_dvp()
2696 return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc); in ov5640_set_power_dvp()
2699 static int ov5640_set_power(struct ov5640_dev *sensor, bool on) in ov5640_set_power() argument
2704 ret = ov5640_set_power_on(sensor); in ov5640_set_power()
2708 ret = ov5640_restore_mode(sensor); in ov5640_set_power()
2713 if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) in ov5640_set_power()
2714 ret = ov5640_set_power_mipi(sensor, on); in ov5640_set_power()
2716 ret = ov5640_set_power_dvp(sensor, on); in ov5640_set_power()
2721 ov5640_set_power_off(sensor); in ov5640_set_power()
2726 ov5640_set_power_off(sensor); in ov5640_set_power()
2748 static int ov5640_try_frame_interval(struct ov5640_dev *sensor, in ov5640_try_frame_interval() argument
2784 mode = ov5640_find_mode(sensor, mode->width, mode->height, false); in ov5640_try_frame_interval()
2792 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_get_fmt() local
2798 mutex_lock(&sensor->lock); in ov5640_get_fmt()
2801 fmt = v4l2_subdev_get_try_format(&sensor->sd, sd_state, in ov5640_get_fmt()
2804 fmt = &sensor->fmt; in ov5640_get_fmt()
2808 mutex_unlock(&sensor->lock); in ov5640_get_fmt()
2817 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_try_fmt_internal() local
2822 mode = ov5640_find_mode(sensor, fmt->width, fmt->height, true); in ov5640_try_fmt_internal()
2826 pixfmt = ov5640_code_to_pixfmt(sensor, fmt->code); in ov5640_try_fmt_internal()
2854 static void __v4l2_ctrl_vblank_update(struct ov5640_dev *sensor, u32 vblank) in __v4l2_ctrl_vblank_update() argument
2856 const struct ov5640_mode_info *mode = sensor->current_mode; in __v4l2_ctrl_vblank_update()
2858 __v4l2_ctrl_modify_range(sensor->ctrls.vblank, OV5640_MIN_VBLANK, in __v4l2_ctrl_vblank_update()
2861 __v4l2_ctrl_s_ctrl(sensor->ctrls.vblank, vblank); in __v4l2_ctrl_vblank_update()
2864 static int ov5640_update_pixel_rate(struct ov5640_dev *sensor) in ov5640_update_pixel_rate() argument
2866 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_update_pixel_rate()
2868 struct v4l2_mbus_framefmt *fmt = &sensor->fmt; in ov5640_update_pixel_rate()
2869 const struct ov5640_timings *timings = ov5640_timings(sensor, mode); in ov5640_update_pixel_rate()
2884 if (!ov5640_is_csi2(sensor)) { in ov5640_update_pixel_rate()
2885 __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate, in ov5640_update_pixel_rate()
2886 ov5640_calc_pixel_rate(sensor)); in ov5640_update_pixel_rate()
2888 __v4l2_ctrl_vblank_update(sensor, timings->vblank_def); in ov5640_update_pixel_rate()
2900 num_lanes = sensor->ep.bus.mipi_csi2.num_data_lanes; in ov5640_update_pixel_rate()
2901 bpp = ov5640_code_to_bpp(sensor, fmt->code); in ov5640_update_pixel_rate()
2908 sensor->current_link_freq = link_freq; in ov5640_update_pixel_rate()
2929 __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate, pixel_rate); in ov5640_update_pixel_rate()
2930 __v4l2_ctrl_s_ctrl(sensor->ctrls.link_freq, i); in ov5640_update_pixel_rate()
2933 __v4l2_ctrl_modify_range(sensor->ctrls.hblank, in ov5640_update_pixel_rate()
2937 __v4l2_ctrl_vblank_update(sensor, vblank); in ov5640_update_pixel_rate()
2940 exposure_val = clamp_t(s32, sensor->ctrls.exposure->val, in ov5640_update_pixel_rate()
2941 sensor->ctrls.exposure->minimum, in ov5640_update_pixel_rate()
2944 __v4l2_ctrl_modify_range(sensor->ctrls.exposure, in ov5640_update_pixel_rate()
2945 sensor->ctrls.exposure->minimum, in ov5640_update_pixel_rate()
2955 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_set_fmt() local
2963 mutex_lock(&sensor->lock); in ov5640_set_fmt()
2965 if (sensor->streaming) { in ov5640_set_fmt()
2979 if (new_mode != sensor->current_mode) { in ov5640_set_fmt()
2980 sensor->current_fr = new_mode->def_fps; in ov5640_set_fmt()
2981 sensor->current_mode = new_mode; in ov5640_set_fmt()
2982 sensor->pending_mode_change = true; in ov5640_set_fmt()
2984 if (mbus_fmt->code != sensor->fmt.code) in ov5640_set_fmt()
2985 sensor->pending_fmt_change = true; in ov5640_set_fmt()
2988 sensor->fmt = *mbus_fmt; in ov5640_set_fmt()
2990 ov5640_update_pixel_rate(sensor); in ov5640_set_fmt()
2993 mutex_unlock(&sensor->lock); in ov5640_set_fmt()
3001 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_get_selection() local
3002 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_get_selection()
3007 mutex_lock(&sensor->lock); in ov5640_get_selection()
3008 timings = ov5640_timings(sensor, mode); in ov5640_get_selection()
3010 mutex_unlock(&sensor->lock); in ov5640_get_selection()
3036 static int ov5640_set_framefmt(struct ov5640_dev *sensor, in ov5640_set_framefmt() argument
3043 pixfmt = ov5640_code_to_pixfmt(sensor, format->code); in ov5640_set_framefmt()
3046 ret = ov5640_write_reg(sensor, OV5640_REG_FORMAT_CONTROL00, in ov5640_set_framefmt()
3052 ret = ov5640_write_reg(sensor, OV5640_REG_ISP_FORMAT_MUX_CTRL, in ov5640_set_framefmt()
3061 ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21, in ov5640_set_framefmt()
3072 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_RESET02, in ov5640_set_framefmt()
3083 return ov5640_mod_reg(sensor, OV5640_REG_SYS_CLOCK_ENABLE02, in ov5640_set_framefmt()
3089 * Sensor Controls.
3092 static int ov5640_set_ctrl_hue(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_hue() argument
3097 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, in ov5640_set_ctrl_hue()
3101 ret = ov5640_write_reg16(sensor, OV5640_REG_SDE_CTRL1, value); in ov5640_set_ctrl_hue()
3103 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(0), 0); in ov5640_set_ctrl_hue()
3109 static int ov5640_set_ctrl_contrast(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_contrast() argument
3114 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, in ov5640_set_ctrl_contrast()
3118 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL5, in ov5640_set_ctrl_contrast()
3121 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(2), 0); in ov5640_set_ctrl_contrast()
3127 static int ov5640_set_ctrl_saturation(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_saturation() argument
3132 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, in ov5640_set_ctrl_saturation()
3136 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL3, in ov5640_set_ctrl_saturation()
3140 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL4, in ov5640_set_ctrl_saturation()
3143 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(1), 0); in ov5640_set_ctrl_saturation()
3149 static int ov5640_set_ctrl_white_balance(struct ov5640_dev *sensor, int awb) in ov5640_set_ctrl_white_balance() argument
3153 ret = ov5640_mod_reg(sensor, OV5640_REG_AWB_MANUAL_CTRL, in ov5640_set_ctrl_white_balance()
3159 u16 red = (u16)sensor->ctrls.red_balance->val; in ov5640_set_ctrl_white_balance()
3160 u16 blue = (u16)sensor->ctrls.blue_balance->val; in ov5640_set_ctrl_white_balance()
3162 ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_R_GAIN, red); in ov5640_set_ctrl_white_balance()
3165 ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_B_GAIN, blue); in ov5640_set_ctrl_white_balance()
3171 static int ov5640_set_ctrl_exposure(struct ov5640_dev *sensor, in ov5640_set_ctrl_exposure() argument
3174 struct ov5640_ctrls *ctrls = &sensor->ctrls; in ov5640_set_ctrl_exposure()
3179 ret = ov5640_set_autoexposure(sensor, auto_exp); in ov5640_set_ctrl_exposure()
3187 ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_VTS, in ov5640_set_ctrl_exposure()
3191 ret = ov5640_get_vts(sensor); in ov5640_set_ctrl_exposure()
3198 ret = ov5640_set_exposure(sensor, ctrls->exposure->val); in ov5640_set_ctrl_exposure()
3204 static int ov5640_set_ctrl_gain(struct ov5640_dev *sensor, bool auto_gain) in ov5640_set_ctrl_gain() argument
3206 struct ov5640_ctrls *ctrls = &sensor->ctrls; in ov5640_set_ctrl_gain()
3210 ret = ov5640_set_autogain(sensor, auto_gain); in ov5640_set_ctrl_gain()
3216 ret = ov5640_set_gain(sensor, ctrls->gain->val); in ov5640_set_ctrl_gain()
3252 static int ov5640_set_ctrl_test_pattern(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_test_pattern() argument
3254 return ov5640_write_reg(sensor, OV5640_REG_PRE_ISP_TEST_SET1, in ov5640_set_ctrl_test_pattern()
3258 static int ov5640_set_ctrl_light_freq(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_light_freq() argument
3262 ret = ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL01, BIT(7), in ov5640_set_ctrl_light_freq()
3268 return ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL00, BIT(2), in ov5640_set_ctrl_light_freq()
3273 static int ov5640_set_ctrl_hflip(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_hflip() argument
3276 * If sensor is mounted upside down, mirror logic is inversed. in ov5640_set_ctrl_hflip()
3278 * Sensor is a BSI (Back Side Illuminated) one, in ov5640_set_ctrl_hflip()
3287 * - [1]: Sensor mirror in ov5640_set_ctrl_hflip()
3289 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21, in ov5640_set_ctrl_hflip()
3291 (!(value ^ sensor->upside_down)) ? in ov5640_set_ctrl_hflip()
3295 static int ov5640_set_ctrl_vflip(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_vflip() argument
3297 /* If sensor is mounted upside down, flip logic is inversed */ in ov5640_set_ctrl_vflip()
3302 * - [1]: Sensor vflip in ov5640_set_ctrl_vflip()
3304 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20, in ov5640_set_ctrl_vflip()
3306 (value ^ sensor->upside_down) ? in ov5640_set_ctrl_vflip()
3310 static int ov5640_set_ctrl_vblank(struct ov5640_dev *sensor, int value) in ov5640_set_ctrl_vblank() argument
3312 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_set_ctrl_vblank()
3315 return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, in ov5640_set_ctrl_vblank()
3322 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_g_volatile_ctrl() local
3327 if (!pm_runtime_get_if_in_use(&sensor->i2c_client->dev)) in ov5640_g_volatile_ctrl()
3332 val = ov5640_get_gain(sensor); in ov5640_g_volatile_ctrl()
3335 sensor->ctrls.gain->val = val; in ov5640_g_volatile_ctrl()
3338 val = ov5640_get_exposure(sensor); in ov5640_g_volatile_ctrl()
3341 sensor->ctrls.exposure->val = val; in ov5640_g_volatile_ctrl()
3345 pm_runtime_mark_last_busy(&sensor->i2c_client->dev); in ov5640_g_volatile_ctrl()
3346 pm_runtime_put_autosuspend(&sensor->i2c_client->dev); in ov5640_g_volatile_ctrl()
3354 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_ctrl() local
3355 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_s_ctrl()
3365 timings = ov5640_timings(sensor, mode); in ov5640_s_ctrl()
3367 __v4l2_ctrl_modify_range(sensor->ctrls.exposure, in ov5640_s_ctrl()
3368 sensor->ctrls.exposure->minimum, in ov5640_s_ctrl()
3369 exp_max, sensor->ctrls.exposure->step, in ov5640_s_ctrl()
3379 if (!pm_runtime_get_if_in_use(&sensor->i2c_client->dev)) in ov5640_s_ctrl()
3384 ret = ov5640_set_ctrl_gain(sensor, ctrl->val); in ov5640_s_ctrl()
3387 ret = ov5640_set_ctrl_exposure(sensor, ctrl->val); in ov5640_s_ctrl()
3390 ret = ov5640_set_ctrl_white_balance(sensor, ctrl->val); in ov5640_s_ctrl()
3393 ret = ov5640_set_ctrl_hue(sensor, ctrl->val); in ov5640_s_ctrl()
3396 ret = ov5640_set_ctrl_contrast(sensor, ctrl->val); in ov5640_s_ctrl()
3399 ret = ov5640_set_ctrl_saturation(sensor, ctrl->val); in ov5640_s_ctrl()
3402 ret = ov5640_set_ctrl_test_pattern(sensor, ctrl->val); in ov5640_s_ctrl()
3405 ret = ov5640_set_ctrl_light_freq(sensor, ctrl->val); in ov5640_s_ctrl()
3408 ret = ov5640_set_ctrl_hflip(sensor, ctrl->val); in ov5640_s_ctrl()
3411 ret = ov5640_set_ctrl_vflip(sensor, ctrl->val); in ov5640_s_ctrl()
3414 ret = ov5640_set_ctrl_vblank(sensor, ctrl->val); in ov5640_s_ctrl()
3421 pm_runtime_mark_last_busy(&sensor->i2c_client->dev); in ov5640_s_ctrl()
3422 pm_runtime_put_autosuspend(&sensor->i2c_client->dev); in ov5640_s_ctrl()
3432 static int ov5640_init_controls(struct ov5640_dev *sensor) in ov5640_init_controls() argument
3434 const struct ov5640_mode_info *mode = sensor->current_mode; in ov5640_init_controls()
3436 struct ov5640_ctrls *ctrls = &sensor->ctrls; in ov5640_init_controls()
3447 hdl->lock = &sensor->lock; in ov5640_init_controls()
3461 timings = ov5640_timings(sensor, mode); in ov5640_init_controls()
3518 ret = v4l2_fwnode_device_parse(&sensor->i2c_client->dev, &props); in ov5640_init_controls()
3523 sensor->upside_down = true; in ov5640_init_controls()
3539 sensor->sd.ctrl_handler = hdl; in ov5640_init_controls()
3551 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_enum_frame_size() local
3552 u32 bpp = ov5640_code_to_bpp(sensor, fse->code); in ov5640_enum_frame_size()
3584 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_enum_frame_interval() local
3594 mode = ov5640_find_mode(sensor, fie->width, fie->height, false); in ov5640_enum_frame_interval()
3601 ret = ov5640_try_frame_interval(sensor, &tpf, mode); in ov5640_enum_frame_interval()
3612 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_g_frame_interval() local
3614 mutex_lock(&sensor->lock); in ov5640_g_frame_interval()
3615 fi->interval = sensor->frame_interval; in ov5640_g_frame_interval()
3616 mutex_unlock(&sensor->lock); in ov5640_g_frame_interval()
3624 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_frame_interval() local
3631 mutex_lock(&sensor->lock); in ov5640_s_frame_interval()
3633 if (sensor->streaming) { in ov5640_s_frame_interval()
3638 mode = sensor->current_mode; in ov5640_s_frame_interval()
3640 frame_rate = ov5640_try_frame_interval(sensor, &fi->interval, mode); in ov5640_s_frame_interval()
3643 fi->interval = sensor->frame_interval; in ov5640_s_frame_interval()
3647 mode = ov5640_find_mode(sensor, mode->width, mode->height, true); in ov5640_s_frame_interval()
3658 if (mode != sensor->current_mode || in ov5640_s_frame_interval()
3659 frame_rate != sensor->current_fr) { in ov5640_s_frame_interval()
3660 sensor->current_fr = frame_rate; in ov5640_s_frame_interval()
3661 sensor->frame_interval = fi->interval; in ov5640_s_frame_interval()
3662 sensor->current_mode = mode; in ov5640_s_frame_interval()
3663 sensor->pending_mode_change = true; in ov5640_s_frame_interval()
3665 ov5640_update_pixel_rate(sensor); in ov5640_s_frame_interval()
3668 mutex_unlock(&sensor->lock); in ov5640_s_frame_interval()
3676 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_enum_mbus_code() local
3680 if (ov5640_is_csi2(sensor)) { in ov5640_enum_mbus_code()
3698 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_s_stream() local
3702 ret = pm_runtime_resume_and_get(&sensor->i2c_client->dev); in ov5640_s_stream()
3706 ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler); in ov5640_s_stream()
3708 pm_runtime_put(&sensor->i2c_client->dev); in ov5640_s_stream()
3713 mutex_lock(&sensor->lock); in ov5640_s_stream()
3715 if (sensor->streaming == !enable) { in ov5640_s_stream()
3716 if (enable && sensor->pending_mode_change) { in ov5640_s_stream()
3717 ret = ov5640_set_mode(sensor); in ov5640_s_stream()
3722 if (enable && sensor->pending_fmt_change) { in ov5640_s_stream()
3723 ret = ov5640_set_framefmt(sensor, &sensor->fmt); in ov5640_s_stream()
3726 sensor->pending_fmt_change = false; in ov5640_s_stream()
3729 if (ov5640_is_csi2(sensor)) in ov5640_s_stream()
3730 ret = ov5640_set_stream_mipi(sensor, enable); in ov5640_s_stream()
3732 ret = ov5640_set_stream_dvp(sensor, enable); in ov5640_s_stream()
3735 sensor->streaming = enable; in ov5640_s_stream()
3739 mutex_unlock(&sensor->lock); in ov5640_s_stream()
3742 pm_runtime_mark_last_busy(&sensor->i2c_client->dev); in ov5640_s_stream()
3743 pm_runtime_put_autosuspend(&sensor->i2c_client->dev); in ov5640_s_stream()
3752 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_init_cfg() local
3757 *fmt = ov5640_is_csi2(sensor) ? ov5640_csi2_default_fmt : in ov5640_init_cfg()
3796 static int ov5640_get_regulators(struct ov5640_dev *sensor) in ov5640_get_regulators() argument
3801 sensor->supplies[i].supply = ov5640_supply_name[i]; in ov5640_get_regulators()
3803 return devm_regulator_bulk_get(&sensor->i2c_client->dev, in ov5640_get_regulators()
3805 sensor->supplies); in ov5640_get_regulators()
3808 static int ov5640_check_chip_id(struct ov5640_dev *sensor) in ov5640_check_chip_id() argument
3810 struct i2c_client *client = sensor->i2c_client; in ov5640_check_chip_id()
3814 ret = ov5640_read_reg16(sensor, OV5640_REG_CHIP_ID, &chip_id); in ov5640_check_chip_id()
3834 struct ov5640_dev *sensor; in ov5640_probe() local
3837 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); in ov5640_probe()
3838 if (!sensor) in ov5640_probe()
3841 sensor->i2c_client = client; in ov5640_probe()
3844 * default init sequence initialize sensor to in ov5640_probe()
3847 sensor->frame_interval.numerator = 1; in ov5640_probe()
3848 sensor->frame_interval.denominator = ov5640_framerates[OV5640_30_FPS]; in ov5640_probe()
3849 sensor->current_fr = OV5640_30_FPS; in ov5640_probe()
3850 sensor->current_mode = in ov5640_probe()
3852 sensor->last_mode = sensor->current_mode; in ov5640_probe()
3853 sensor->current_link_freq = in ov5640_probe()
3856 sensor->ae_target = 52; in ov5640_probe()
3865 ret = v4l2_fwnode_endpoint_parse(endpoint, &sensor->ep); in ov5640_probe()
3872 if (sensor->ep.bus_type != V4L2_MBUS_PARALLEL && in ov5640_probe()
3873 sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY && in ov5640_probe()
3874 sensor->ep.bus_type != V4L2_MBUS_BT656) { in ov5640_probe()
3875 dev_err(dev, "Unsupported bus type %d\n", sensor->ep.bus_type); in ov5640_probe()
3879 sensor->fmt = ov5640_is_csi2(sensor) ? ov5640_csi2_default_fmt : in ov5640_probe()
3883 sensor->xclk = devm_clk_get(dev, "xclk"); in ov5640_probe()
3884 if (IS_ERR(sensor->xclk)) { in ov5640_probe()
3886 return PTR_ERR(sensor->xclk); in ov5640_probe()
3889 sensor->xclk_freq = clk_get_rate(sensor->xclk); in ov5640_probe()
3890 if (sensor->xclk_freq < OV5640_XCLK_MIN || in ov5640_probe()
3891 sensor->xclk_freq > OV5640_XCLK_MAX) { in ov5640_probe()
3893 sensor->xclk_freq); in ov5640_probe()
3898 sensor->pwdn_gpio = devm_gpiod_get_optional(dev, "powerdown", in ov5640_probe()
3900 if (IS_ERR(sensor->pwdn_gpio)) in ov5640_probe()
3901 return PTR_ERR(sensor->pwdn_gpio); in ov5640_probe()
3904 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", in ov5640_probe()
3906 if (IS_ERR(sensor->reset_gpio)) in ov5640_probe()
3907 return PTR_ERR(sensor->reset_gpio); in ov5640_probe()
3909 v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops); in ov5640_probe()
3911 sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in ov5640_probe()
3913 sensor->pad.flags = MEDIA_PAD_FL_SOURCE; in ov5640_probe()
3914 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in ov5640_probe()
3915 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); in ov5640_probe()
3919 ret = ov5640_get_regulators(sensor); in ov5640_probe()
3923 mutex_init(&sensor->lock); in ov5640_probe()
3925 ret = ov5640_init_controls(sensor); in ov5640_probe()
3939 ret = ov5640_check_chip_id(sensor); in ov5640_probe()
3943 ret = v4l2_async_register_subdev_sensor(&sensor->sd); in ov5640_probe()
3959 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov5640_probe()
3961 media_entity_cleanup(&sensor->sd.entity); in ov5640_probe()
3962 mutex_destroy(&sensor->lock); in ov5640_probe()
3969 struct ov5640_dev *sensor = to_ov5640_dev(sd); in ov5640_remove() local
3977 v4l2_async_unregister_subdev(&sensor->sd); in ov5640_remove()
3978 media_entity_cleanup(&sensor->sd.entity); in ov5640_remove()
3979 v4l2_ctrl_handler_free(&sensor->ctrls.handler); in ov5640_remove()
3980 mutex_destroy(&sensor->lock); in ov5640_remove()