Lines Matching defs:sensor
481 static inline bool ov5640_is_csi2(const struct ov5640_dev *sensor)
483 return sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY;
487 ov5640_formats(struct ov5640_dev *sensor)
489 return ov5640_is_csi2(sensor) ? ov5640_csi2_formats
494 ov5640_code_to_pixfmt(struct ov5640_dev *sensor, u32 code)
496 const struct ov5640_pixfmt *formats = ov5640_formats(sensor);
507 static u32 ov5640_code_to_bpp(struct ov5640_dev *sensor, u32 code)
509 const struct ov5640_pixfmt *format = ov5640_code_to_pixfmt(sensor,
1141 ov5640_timings(const struct ov5640_dev *sensor,
1144 if (ov5640_is_csi2(sensor))
1150 static int ov5640_init_slave_id(struct ov5640_dev *sensor)
1152 struct i2c_client *client = sensor->i2c_client;
1178 static int ov5640_write_reg(struct ov5640_dev *sensor, u16 reg, u8 val)
1180 struct i2c_client *client = sensor->i2c_client;
1204 static int ov5640_read_reg(struct ov5640_dev *sensor, u16 reg, u8 *val)
1206 struct i2c_client *client = sensor->i2c_client;
1235 static int ov5640_read_reg16(struct ov5640_dev *sensor, u16 reg, u16 *val)
1240 ret = ov5640_read_reg(sensor, reg, &hi);
1243 ret = ov5640_read_reg(sensor, reg + 1, &lo);
1251 static int ov5640_write_reg16(struct ov5640_dev *sensor, u16 reg, u16 val)
1255 ret = ov5640_write_reg(sensor, reg, val >> 8);
1259 return ov5640_write_reg(sensor, reg + 1, val & 0xff);
1262 static int ov5640_mod_reg(struct ov5640_dev *sensor, u16 reg,
1268 ret = ov5640_read_reg(sensor, reg, &readval);
1276 return ov5640_write_reg(sensor, reg, val);
1376 static unsigned long ov5640_compute_sys_clk(struct ov5640_dev *sensor,
1380 unsigned long sysclk = sensor->xclk_freq / pll_prediv * pll_mult;
1389 static unsigned long ov5640_calc_sys_clk(struct ov5640_dev *sensor,
1413 _rate = ov5640_compute_sys_clk(sensor,
1454 static int ov5640_set_mipi_pclk(struct ov5640_dev *sensor)
1466 link_freq = sensor->current_link_freq;
1480 ov5640_calc_sys_clk(sensor, sysclk, &prediv, &mult, &sysdiv);
1519 num_lanes = sensor->ep.bus.mipi_csi2.num_data_lanes;
1524 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0, 0x0f, bit_div);
1528 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1, 0xff,
1533 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2, 0xff, mult);
1537 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3, 0x1f,
1542 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f,
1547 return ov5640_write_reg(sensor, OV5640_REG_PCLK_PERIOD, pclk_period);
1550 static u32 ov5640_calc_pixel_rate(struct ov5640_dev *sensor)
1552 const struct ov5640_mode_info *mode = sensor->current_mode;
1557 rate *= ov5640_framerates[sensor->current_fr];
1562 static unsigned long ov5640_calc_pclk(struct ov5640_dev *sensor,
1570 _rate = ov5640_calc_sys_clk(sensor, _rate, pll_prediv, pll_mult,
1579 static int ov5640_set_dvp_pclk(struct ov5640_dev *sensor)
1585 rate = ov5640_calc_pixel_rate(sensor);
1586 rate *= ov5640_code_to_bpp(sensor, sensor->fmt.code);
1587 rate /= sensor->ep.bus.parallel.bus_width;
1589 ov5640_calc_pclk(sensor, rate, &prediv, &mult, &sysdiv, &pll_rdiv,
1595 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0,
1604 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1,
1609 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2,
1614 ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3,
1619 return ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x30,
1624 static int ov5640_set_jpeg_timings(struct ov5640_dev *sensor,
1636 ret = ov5640_mod_reg(sensor, OV5640_REG_JPG_MODE_SELECT, 0x7, 0x3);
1640 ret = ov5640_write_reg16(sensor, OV5640_REG_VFIFO_HSIZE, mode->width);
1644 return ov5640_write_reg16(sensor, OV5640_REG_VFIFO_VSIZE, mode->height);
1647 /* download ov5640 settings to sensor through i2c */
1648 static int ov5640_set_timings(struct ov5640_dev *sensor,
1656 if (sensor->fmt.code == MEDIA_BUS_FMT_JPEG_1X8) {
1657 ret = ov5640_set_jpeg_timings(sensor, mode);
1662 timings = ov5640_timings(sensor, mode);
1666 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HS,
1671 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_VS,
1676 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HW,
1681 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_VH,
1686 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HOFFS, crop->left);
1690 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_VOFFS, crop->top);
1694 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPHO, mode->width);
1698 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPVO, mode->height);
1702 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HTS, timings->htot);
1706 ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS,
1714 static void ov5640_load_regs(struct ov5640_dev *sensor,
1732 !ov5640_is_csi2(sensor))
1736 ret = ov5640_mod_reg(sensor, reg_addr, mask, val);
1738 ret = ov5640_write_reg(sensor, reg_addr, val);
1747 static int ov5640_set_autoexposure(struct ov5640_dev *sensor, bool on)
1749 return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL,
1754 static int ov5640_get_exposure(struct ov5640_dev *sensor)
1759 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_HI, &temp);
1763 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_MED, &temp);
1767 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_LO, &temp);
1776 static int ov5640_set_exposure(struct ov5640_dev *sensor, u32 exposure)
1782 ret = ov5640_write_reg(sensor,
1787 ret = ov5640_write_reg(sensor,
1792 return ov5640_write_reg(sensor,
1797 static int ov5640_get_gain(struct ov5640_dev *sensor)
1802 ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN, &gain);
1809 static int ov5640_set_gain(struct ov5640_dev *sensor, int gain)
1811 return ov5640_write_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN,
1815 static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on)
1817 return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL,
1821 static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on)
1823 return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?
1828 static int ov5640_set_stream_mipi(struct ov5640_dev *sensor, bool on)
1837 * FIXME: the sensor manual (version 2.03) reports
1849 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00,
1854 return ov5640_write_reg(sensor, OV5640_REG_FRAME_CTRL01,
1858 static int ov5640_get_sysclk(struct ov5640_dev *sensor)
1861 u32 xvclk = sensor->xclk_freq / 10000;
1868 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL0, &temp1);
1875 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL1, &temp1);
1882 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL2, &temp1);
1887 ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL3, &temp1);
1893 ret = ov5640_read_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, &temp1);
1909 static int ov5640_set_night_mode(struct ov5640_dev *sensor)
1915 ret = ov5640_read_reg(sensor, OV5640_REG_AEC_CTRL00, &mode);
1919 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL00, mode);
1922 static int ov5640_get_hts(struct ov5640_dev *sensor)
1928 ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_HTS, &hts);
1934 static int ov5640_get_vts(struct ov5640_dev *sensor)
1939 ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_VTS, &vts);
1945 static int ov5640_set_vts(struct ov5640_dev *sensor, int vts)
1947 return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, vts);
1950 static int ov5640_get_light_freq(struct ov5640_dev *sensor)
1956 ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL01, &temp);
1962 ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL00,
1975 ret = ov5640_read_reg(sensor, OV5640_REG_SIGMADELTA_CTRL0C,
1991 static int ov5640_set_bandingfilter(struct ov5640_dev *sensor)
1997 ret = ov5640_get_sysclk(sensor);
2002 sensor->prev_sysclk = ret;
2004 ret = ov5640_get_hts(sensor);
2009 sensor->prev_hts = ret;
2012 ret = ov5640_get_vts(sensor);
2019 band_step60 = sensor->prev_sysclk * 100 / sensor->prev_hts * 100 / 120;
2020 ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B60_STEP, band_step60);
2026 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0D, max_band60);
2031 band_step50 = sensor->prev_sysclk * 100 / sensor->prev_hts;
2032 ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B50_STEP, band_step50);
2038 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0E, max_band50);
2041 static int ov5640_set_ae_target(struct ov5640_dev *sensor, int target)
2047 sensor->ae_low = target * 23 / 25; /* 0.92 */
2048 sensor->ae_high = target * 27 / 25; /* 1.08 */
2050 fast_high = sensor->ae_high << 1;
2054 fast_low = sensor->ae_low >> 1;
2056 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0F, sensor->ae_high);
2059 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL10, sensor->ae_low);
2062 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1B, sensor->ae_high);
2065 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1E, sensor->ae_low);
2068 ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL11, fast_high);
2071 return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1F, fast_low);
2074 static int ov5640_get_binning(struct ov5640_dev *sensor)
2079 ret = ov5640_read_reg(sensor, OV5640_REG_TIMING_TC_REG21, &temp);
2086 static int ov5640_set_binning(struct ov5640_dev *sensor, bool enable)
2094 ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21,
2103 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20,
2107 static int ov5640_set_virtual_channel(struct ov5640_dev *sensor)
2109 struct i2c_client *client = sensor->i2c_client;
2120 ret = ov5640_read_reg(sensor, OV5640_REG_DEBUG_MODE, &temp);
2125 return ov5640_write_reg(sensor, OV5640_REG_DEBUG_MODE, temp);
2129 ov5640_find_mode(struct ov5640_dev *sensor, int width, int height, bool nearest)
2146 * sensor changes between scaling and subsampling, go through
2149 static int ov5640_set_mode_exposure_calc(struct ov5640_dev *sensor,
2164 ret = ov5640_get_exposure(sensor);
2168 ret = ov5640_get_binning(sensor);
2176 ret = ov5640_get_gain(sensor);
2182 ret = ov5640_read_reg(sensor, OV5640_REG_AVG_READOUT, &average);
2187 ret = ov5640_set_night_mode(sensor);
2192 ov5640_load_regs(sensor, mode->reg_data, mode->reg_data_size);
2193 ret = ov5640_set_timings(sensor, mode);
2198 ret = ov5640_get_vts(sensor);
2202 ret = ov5640_get_hts(sensor);
2209 ret = ov5640_get_sysclk(sensor);
2217 ret = ov5640_get_light_freq(sensor);
2230 if (!sensor->prev_sysclk) {
2231 ret = ov5640_get_sysclk(sensor);
2236 sensor->prev_sysclk = ret;
2245 if (average > sensor->ae_low && average < sensor->ae_high) {
2249 cap_sysclk / sensor->prev_sysclk *
2250 sensor->prev_hts / cap_hts *
2251 sensor->ae_target / average;
2255 cap_sysclk / sensor->prev_sysclk *
2256 sensor->prev_hts / cap_hts;
2290 ret = ov5640_set_gain(sensor, cap_gain16);
2297 ret = ov5640_set_vts(sensor, cap_vts);
2303 return ov5640_set_exposure(sensor, cap_shutter);
2307 * if sensor changes inside scaling or subsampling
2310 static int ov5640_set_mode_direct(struct ov5640_dev *sensor,
2317 ov5640_load_regs(sensor, mode->reg_data, mode->reg_data_size);
2318 return ov5640_set_timings(sensor, mode);
2321 static int ov5640_set_mode(struct ov5640_dev *sensor)
2323 const struct ov5640_mode_info *mode = sensor->current_mode;
2324 const struct ov5640_mode_info *orig_mode = sensor->last_mode;
2326 bool auto_gain = sensor->ctrls.auto_gain->val == 1;
2327 bool auto_exp = sensor->ctrls.auto_exp->val == V4L2_EXPOSURE_AUTO;
2335 ret = ov5640_set_autogain(sensor, false);
2341 ret = ov5640_set_autoexposure(sensor, false);
2346 if (ov5640_is_csi2(sensor))
2347 ret = ov5640_set_mipi_pclk(sensor);
2349 ret = ov5640_set_dvp_pclk(sensor);
2359 ret = ov5640_set_mode_exposure_calc(sensor, mode);
2365 ret = ov5640_set_mode_direct(sensor, mode);
2372 ov5640_set_autogain(sensor, true);
2374 ov5640_set_autoexposure(sensor, true);
2376 ret = ov5640_set_binning(sensor, dn_mode != SCALING);
2379 ret = ov5640_set_ae_target(sensor, sensor->ae_target);
2382 ret = ov5640_get_light_freq(sensor);
2385 ret = ov5640_set_bandingfilter(sensor);
2388 ret = ov5640_set_virtual_channel(sensor);
2392 sensor->pending_mode_change = false;
2393 sensor->last_mode = mode;
2399 ov5640_set_autoexposure(sensor, true);
2402 ov5640_set_autogain(sensor, true);
2407 static int ov5640_set_framefmt(struct ov5640_dev *sensor,
2411 static int ov5640_restore_mode(struct ov5640_dev *sensor)
2416 ov5640_load_regs(sensor, ov5640_init_setting,
2419 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f,
2426 ret = ov5640_set_mode(sensor);
2430 return ov5640_set_framefmt(sensor, &sensor->fmt);
2433 static void ov5640_power(struct ov5640_dev *sensor, bool enable)
2435 gpiod_set_value_cansleep(sensor->pwdn_gpio, enable ? 0 : 1);
2452 static void ov5640_powerup_sequence(struct ov5640_dev *sensor)
2454 if (sensor->pwdn_gpio) {
2455 gpiod_set_value_cansleep(sensor->reset_gpio, 1);
2458 ov5640_power(sensor, false);
2460 ov5640_power(sensor, true);
2463 gpiod_set_value_cansleep(sensor->reset_gpio, 0);
2466 ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0,
2475 ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0,
2479 static int ov5640_set_power_on(struct ov5640_dev *sensor)
2481 struct i2c_client *client = sensor->i2c_client;
2484 ret = clk_prepare_enable(sensor->xclk);
2492 sensor->supplies);
2499 ov5640_powerup_sequence(sensor);
2501 ret = ov5640_init_slave_id(sensor);
2508 ov5640_power(sensor, false);
2509 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies);
2511 clk_disable_unprepare(sensor->xclk);
2515 static void ov5640_set_power_off(struct ov5640_dev *sensor)
2517 ov5640_power(sensor, false);
2518 regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies);
2519 clk_disable_unprepare(sensor->xclk);
2522 static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on)
2528 ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);
2529 ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x04);
2530 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x00);
2544 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x44);
2555 ret = ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x24);
2567 ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x70);
2577 static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
2579 unsigned int flags = sensor->ep.bus.parallel.flags;
2580 bool bt656 = sensor->ep.bus_type == V4L2_MBUS_BT656;
2586 ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00, 0x00);
2587 ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);
2588 ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20);
2589 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00);
2590 ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00);
2634 ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,
2658 ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, polarities);
2670 ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18);
2684 ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01,
2695 return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc);
2698 static int ov5640_set_power(struct ov5640_dev *sensor, bool on)
2703 ret = ov5640_set_power_on(sensor);
2707 ret = ov5640_restore_mode(sensor);
2712 if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)
2713 ret = ov5640_set_power_mipi(sensor, on);
2715 ret = ov5640_set_power_dvp(sensor, on);
2720 ov5640_set_power_off(sensor);
2725 ov5640_set_power_off(sensor);
2747 static int ov5640_try_frame_interval(struct ov5640_dev *sensor,
2783 mode = ov5640_find_mode(sensor, mode->width, mode->height, false);
2791 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2797 mutex_lock(&sensor->lock);
2800 fmt = v4l2_subdev_get_try_format(&sensor->sd, sd_state,
2803 fmt = &sensor->fmt;
2807 mutex_unlock(&sensor->lock);
2816 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2821 mode = ov5640_find_mode(sensor, fmt->width, fmt->height, true);
2825 pixfmt = ov5640_code_to_pixfmt(sensor, fmt->code);
2853 static void __v4l2_ctrl_vblank_update(struct ov5640_dev *sensor, u32 vblank)
2855 const struct ov5640_mode_info *mode = sensor->current_mode;
2857 __v4l2_ctrl_modify_range(sensor->ctrls.vblank, OV5640_MIN_VBLANK,
2860 __v4l2_ctrl_s_ctrl(sensor->ctrls.vblank, vblank);
2863 static int ov5640_update_pixel_rate(struct ov5640_dev *sensor)
2865 const struct ov5640_mode_info *mode = sensor->current_mode;
2867 struct v4l2_mbus_framefmt *fmt = &sensor->fmt;
2868 const struct ov5640_timings *timings = ov5640_timings(sensor, mode);
2883 if (!ov5640_is_csi2(sensor)) {
2884 __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
2885 ov5640_calc_pixel_rate(sensor));
2887 __v4l2_ctrl_vblank_update(sensor, timings->vblank_def);
2899 num_lanes = sensor->ep.bus.mipi_csi2.num_data_lanes;
2900 bpp = ov5640_code_to_bpp(sensor, fmt->code);
2907 sensor->current_link_freq = link_freq;
2928 __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate, pixel_rate);
2929 __v4l2_ctrl_s_ctrl(sensor->ctrls.link_freq, i);
2932 __v4l2_ctrl_modify_range(sensor->ctrls.hblank,
2936 __v4l2_ctrl_vblank_update(sensor, vblank);
2939 exposure_val = clamp_t(s32, sensor->ctrls.exposure->val,
2940 sensor->ctrls.exposure->minimum,
2943 __v4l2_ctrl_modify_range(sensor->ctrls.exposure,
2944 sensor->ctrls.exposure->minimum,
2954 struct ov5640_dev *sensor = to_ov5640_dev(sd);
2962 mutex_lock(&sensor->lock);
2964 if (sensor->streaming) {
2978 if (new_mode != sensor->current_mode) {
2979 sensor->current_fr = new_mode->def_fps;
2980 sensor->current_mode = new_mode;
2981 sensor->pending_mode_change = true;
2983 if (mbus_fmt->code != sensor->fmt.code)
2984 sensor->pending_fmt_change = true;
2987 sensor->fmt = *mbus_fmt;
2989 ov5640_update_pixel_rate(sensor);
2992 mutex_unlock(&sensor->lock);
3000 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3001 const struct ov5640_mode_info *mode = sensor->current_mode;
3006 mutex_lock(&sensor->lock);
3007 timings = ov5640_timings(sensor, mode);
3009 mutex_unlock(&sensor->lock);
3035 static int ov5640_set_framefmt(struct ov5640_dev *sensor,
3042 pixfmt = ov5640_code_to_pixfmt(sensor, format->code);
3045 ret = ov5640_write_reg(sensor, OV5640_REG_FORMAT_CONTROL00,
3051 ret = ov5640_write_reg(sensor, OV5640_REG_ISP_FORMAT_MUX_CTRL,
3060 ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21,
3071 ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_RESET02,
3082 return ov5640_mod_reg(sensor, OV5640_REG_SYS_CLOCK_ENABLE02,
3091 static int ov5640_set_ctrl_hue(struct ov5640_dev *sensor, int value)
3096 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0,
3100 ret = ov5640_write_reg16(sensor, OV5640_REG_SDE_CTRL1, value);
3102 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(0), 0);
3108 static int ov5640_set_ctrl_contrast(struct ov5640_dev *sensor, int value)
3113 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0,
3117 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL5,
3120 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(2), 0);
3126 static int ov5640_set_ctrl_saturation(struct ov5640_dev *sensor, int value)
3131 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0,
3135 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL3,
3139 ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL4,
3142 ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(1), 0);
3148 static int ov5640_set_ctrl_white_balance(struct ov5640_dev *sensor, int awb)
3152 ret = ov5640_mod_reg(sensor, OV5640_REG_AWB_MANUAL_CTRL,
3158 u16 red = (u16)sensor->ctrls.red_balance->val;
3159 u16 blue = (u16)sensor->ctrls.blue_balance->val;
3161 ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_R_GAIN, red);
3164 ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_B_GAIN, blue);
3170 static int ov5640_set_ctrl_exposure(struct ov5640_dev *sensor,
3173 struct ov5640_ctrls *ctrls = &sensor->ctrls;
3178 ret = ov5640_set_autoexposure(sensor, auto_exp);
3186 ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_VTS,
3190 ret = ov5640_get_vts(sensor);
3197 ret = ov5640_set_exposure(sensor, ctrls->exposure->val);
3203 static int ov5640_set_ctrl_gain(struct ov5640_dev *sensor, bool auto_gain)
3205 struct ov5640_ctrls *ctrls = &sensor->ctrls;
3209 ret = ov5640_set_autogain(sensor, auto_gain);
3215 ret = ov5640_set_gain(sensor, ctrls->gain->val);
3251 static int ov5640_set_ctrl_test_pattern(struct ov5640_dev *sensor, int value)
3253 return ov5640_write_reg(sensor, OV5640_REG_PRE_ISP_TEST_SET1,
3257 static int ov5640_set_ctrl_light_freq(struct ov5640_dev *sensor, int value)
3261 ret = ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL01, BIT(7),
3267 return ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL00, BIT(2),
3272 static int ov5640_set_ctrl_hflip(struct ov5640_dev *sensor, int value)
3275 * If sensor is mounted upside down, mirror logic is inversed.
3288 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21,
3290 (!(value ^ sensor->upside_down)) ?
3294 static int ov5640_set_ctrl_vflip(struct ov5640_dev *sensor, int value)
3296 /* If sensor is mounted upside down, flip logic is inversed */
3303 return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20,
3305 (value ^ sensor->upside_down) ?
3309 static int ov5640_set_ctrl_vblank(struct ov5640_dev *sensor, int value)
3311 const struct ov5640_mode_info *mode = sensor->current_mode;
3314 return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS,
3321 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3326 if (!pm_runtime_get_if_in_use(&sensor->i2c_client->dev))
3331 val = ov5640_get_gain(sensor);
3334 sensor->ctrls.gain->val = val;
3337 val = ov5640_get_exposure(sensor);
3340 sensor->ctrls.exposure->val = val;
3344 pm_runtime_mark_last_busy(&sensor->i2c_client->dev);
3345 pm_runtime_put_autosuspend(&sensor->i2c_client->dev);
3353 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3354 const struct ov5640_mode_info *mode = sensor->current_mode;
3364 timings = ov5640_timings(sensor, mode);
3366 __v4l2_ctrl_modify_range(sensor->ctrls.exposure,
3367 sensor->ctrls.exposure->minimum,
3368 exp_max, sensor->ctrls.exposure->step,
3378 if (!pm_runtime_get_if_in_use(&sensor->i2c_client->dev))
3383 ret = ov5640_set_ctrl_gain(sensor, ctrl->val);
3386 ret = ov5640_set_ctrl_exposure(sensor, ctrl->val);
3389 ret = ov5640_set_ctrl_white_balance(sensor, ctrl->val);
3392 ret = ov5640_set_ctrl_hue(sensor, ctrl->val);
3395 ret = ov5640_set_ctrl_contrast(sensor, ctrl->val);
3398 ret = ov5640_set_ctrl_saturation(sensor, ctrl->val);
3401 ret = ov5640_set_ctrl_test_pattern(sensor, ctrl->val);
3404 ret = ov5640_set_ctrl_light_freq(sensor, ctrl->val);
3407 ret = ov5640_set_ctrl_hflip(sensor, ctrl->val);
3410 ret = ov5640_set_ctrl_vflip(sensor, ctrl->val);
3413 ret = ov5640_set_ctrl_vblank(sensor, ctrl->val);
3420 pm_runtime_mark_last_busy(&sensor->i2c_client->dev);
3421 pm_runtime_put_autosuspend(&sensor->i2c_client->dev);
3431 static int ov5640_init_controls(struct ov5640_dev *sensor)
3433 const struct ov5640_mode_info *mode = sensor->current_mode;
3435 struct ov5640_ctrls *ctrls = &sensor->ctrls;
3446 hdl->lock = &sensor->lock;
3460 timings = ov5640_timings(sensor, mode);
3517 ret = v4l2_fwnode_device_parse(&sensor->i2c_client->dev, &props);
3522 sensor->upside_down = true;
3538 sensor->sd.ctrl_handler = hdl;
3550 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3551 u32 bpp = ov5640_code_to_bpp(sensor, fse->code);
3583 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3593 mode = ov5640_find_mode(sensor, fie->width, fie->height, false);
3600 ret = ov5640_try_frame_interval(sensor, &tpf, mode);
3611 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3613 mutex_lock(&sensor->lock);
3614 fi->interval = sensor->frame_interval;
3615 mutex_unlock(&sensor->lock);
3623 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3630 mutex_lock(&sensor->lock);
3632 if (sensor->streaming) {
3637 mode = sensor->current_mode;
3639 frame_rate = ov5640_try_frame_interval(sensor, &fi->interval, mode);
3642 fi->interval = sensor->frame_interval;
3646 mode = ov5640_find_mode(sensor, mode->width, mode->height, true);
3657 if (mode != sensor->current_mode ||
3658 frame_rate != sensor->current_fr) {
3659 sensor->current_fr = frame_rate;
3660 sensor->frame_interval = fi->interval;
3661 sensor->current_mode = mode;
3662 sensor->pending_mode_change = true;
3664 ov5640_update_pixel_rate(sensor);
3667 mutex_unlock(&sensor->lock);
3675 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3679 if (ov5640_is_csi2(sensor)) {
3697 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3701 ret = pm_runtime_resume_and_get(&sensor->i2c_client->dev);
3705 ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
3707 pm_runtime_put(&sensor->i2c_client->dev);
3712 mutex_lock(&sensor->lock);
3714 if (sensor->streaming == !enable) {
3715 if (enable && sensor->pending_mode_change) {
3716 ret = ov5640_set_mode(sensor);
3721 if (enable && sensor->pending_fmt_change) {
3722 ret = ov5640_set_framefmt(sensor, &sensor->fmt);
3725 sensor->pending_fmt_change = false;
3728 if (ov5640_is_csi2(sensor))
3729 ret = ov5640_set_stream_mipi(sensor, enable);
3731 ret = ov5640_set_stream_dvp(sensor, enable);
3734 sensor->streaming = enable;
3738 mutex_unlock(&sensor->lock);
3741 pm_runtime_mark_last_busy(&sensor->i2c_client->dev);
3742 pm_runtime_put_autosuspend(&sensor->i2c_client->dev);
3751 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3756 *fmt = ov5640_is_csi2(sensor) ? ov5640_csi2_default_fmt :
3795 static int ov5640_get_regulators(struct ov5640_dev *sensor)
3800 sensor->supplies[i].supply = ov5640_supply_name[i];
3802 return devm_regulator_bulk_get(&sensor->i2c_client->dev,
3804 sensor->supplies);
3807 static int ov5640_check_chip_id(struct ov5640_dev *sensor)
3809 struct i2c_client *client = sensor->i2c_client;
3813 ret = ov5640_read_reg16(sensor, OV5640_REG_CHIP_ID, &chip_id);
3833 struct ov5640_dev *sensor;
3836 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
3837 if (!sensor)
3840 sensor->i2c_client = client;
3843 * default init sequence initialize sensor to
3846 sensor->frame_interval.numerator = 1;
3847 sensor->frame_interval.denominator = ov5640_framerates[OV5640_30_FPS];
3848 sensor->current_fr = OV5640_30_FPS;
3849 sensor->current_mode =
3851 sensor->last_mode = sensor->current_mode;
3852 sensor->current_link_freq =
3855 sensor->ae_target = 52;
3864 ret = v4l2_fwnode_endpoint_parse(endpoint, &sensor->ep);
3871 if (sensor->ep.bus_type != V4L2_MBUS_PARALLEL &&
3872 sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY &&
3873 sensor->ep.bus_type != V4L2_MBUS_BT656) {
3874 dev_err(dev, "Unsupported bus type %d\n", sensor->ep.bus_type);
3878 sensor->fmt = ov5640_is_csi2(sensor) ? ov5640_csi2_default_fmt :
3882 sensor->xclk = devm_clk_get(dev, "xclk");
3883 if (IS_ERR(sensor->xclk)) {
3885 return PTR_ERR(sensor->xclk);
3888 sensor->xclk_freq = clk_get_rate(sensor->xclk);
3889 if (sensor->xclk_freq < OV5640_XCLK_MIN ||
3890 sensor->xclk_freq > OV5640_XCLK_MAX) {
3892 sensor->xclk_freq);
3897 sensor->pwdn_gpio = devm_gpiod_get_optional(dev, "powerdown",
3899 if (IS_ERR(sensor->pwdn_gpio))
3900 return PTR_ERR(sensor->pwdn_gpio);
3903 sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset",
3905 if (IS_ERR(sensor->reset_gpio))
3906 return PTR_ERR(sensor->reset_gpio);
3908 v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops);
3910 sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
3912 sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
3913 sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
3914 ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad);
3918 ret = ov5640_get_regulators(sensor);
3922 mutex_init(&sensor->lock);
3924 ret = ov5640_init_controls(sensor);
3938 ret = ov5640_check_chip_id(sensor);
3942 ret = v4l2_async_register_subdev_sensor(&sensor->sd);
3958 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
3960 media_entity_cleanup(&sensor->sd.entity);
3961 mutex_destroy(&sensor->lock);
3968 struct ov5640_dev *sensor = to_ov5640_dev(sd);
3976 v4l2_async_unregister_subdev(&sensor->sd);
3977 media_entity_cleanup(&sensor->sd.entity);
3978 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
3979 mutex_destroy(&sensor->lock);