Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Copyright (C) 2020 Bootlin
0004  * Author: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
0005  */
0006 
0007 #include <linux/clk.h>
0008 #include <linux/delay.h>
0009 #include <linux/device.h>
0010 #include <linux/i2c.h>
0011 #include <linux/module.h>
0012 #include <linux/of_graph.h>
0013 #include <linux/pm_runtime.h>
0014 #include <linux/regulator/consumer.h>
0015 #include <linux/videodev2.h>
0016 #include <media/v4l2-ctrls.h>
0017 #include <media/v4l2-device.h>
0018 #include <media/v4l2-fwnode.h>
0019 #include <media/v4l2-image-sizes.h>
0020 #include <media/v4l2-mediabus.h>
0021 
0022 /* Clock rate */
0023 
0024 #define OV5648_XVCLK_RATE           24000000
0025 
0026 /* Register definitions */
0027 
0028 /* System */
0029 
0030 #define OV5648_SW_STANDBY_REG           0x100
0031 #define OV5648_SW_STANDBY_STREAM_ON     BIT(0)
0032 
0033 #define OV5648_SW_RESET_REG         0x103
0034 #define OV5648_SW_RESET_RESET           BIT(0)
0035 
0036 #define OV5648_PAD_OEN0_REG         0x3000
0037 #define OV5648_PAD_OEN1_REG         0x3001
0038 #define OV5648_PAD_OEN2_REG         0x3002
0039 #define OV5648_PAD_OUT0_REG         0x3008
0040 #define OV5648_PAD_OUT1_REG         0x3009
0041 
0042 #define OV5648_CHIP_ID_H_REG            0x300a
0043 #define OV5648_CHIP_ID_H_VALUE          0x56
0044 #define OV5648_CHIP_ID_L_REG            0x300b
0045 #define OV5648_CHIP_ID_L_VALUE          0x48
0046 
0047 #define OV5648_PAD_OUT2_REG         0x300d
0048 #define OV5648_PAD_SEL0_REG         0x300e
0049 #define OV5648_PAD_SEL1_REG         0x300f
0050 #define OV5648_PAD_SEL2_REG         0x3010
0051 #define OV5648_PAD_PK_REG           0x3011
0052 #define OV5648_PAD_PK_PD_DATO_EN        BIT(7)
0053 #define OV5648_PAD_PK_DRIVE_STRENGTH_1X     (0 << 5)
0054 #define OV5648_PAD_PK_DRIVE_STRENGTH_2X     (2 << 5)
0055 #define OV5648_PAD_PK_FREX_N            BIT(1)
0056 
0057 #define OV5648_A_PWC_PK_O0_REG          0x3013
0058 #define OV5648_A_PWC_PK_O0_BP_REGULATOR_N   BIT(3)
0059 #define OV5648_A_PWC_PK_O1_REG          0x3014
0060 
0061 #define OV5648_MIPI_PHY0_REG            0x3016
0062 #define OV5648_MIPI_PHY1_REG            0x3017
0063 #define OV5648_MIPI_SC_CTRL0_REG        0x3018
0064 #define OV5648_MIPI_SC_CTRL0_MIPI_LANES(v)  (((v) << 5) & GENMASK(7, 5))
0065 #define OV5648_MIPI_SC_CTRL0_PHY_HS_TX_PD   BIT(4)
0066 #define OV5648_MIPI_SC_CTRL0_PHY_LP_RX_PD   BIT(3)
0067 #define OV5648_MIPI_SC_CTRL0_MIPI_EN        BIT(2)
0068 #define OV5648_MIPI_SC_CTRL0_MIPI_SUSP      BIT(1)
0069 #define OV5648_MIPI_SC_CTRL0_LANE_DIS_OP    BIT(0)
0070 #define OV5648_MIPI_SC_CTRL1_REG        0x3019
0071 #define OV5648_MISC_CTRL0_REG           0x3021
0072 #define OV5648_MIPI_SC_CTRL2_REG        0x3022
0073 #define OV5648_SUB_ID_REG           0x302a
0074 
0075 #define OV5648_PLL_CTRL0_REG            0x3034
0076 #define OV5648_PLL_CTRL0_PLL_CHARGE_PUMP(v) (((v) << 4) & GENMASK(6, 4))
0077 #define OV5648_PLL_CTRL0_BITS(v)        ((v) & GENMASK(3, 0))
0078 #define OV5648_PLL_CTRL1_REG            0x3035
0079 #define OV5648_PLL_CTRL1_SYS_DIV(v)     (((v) << 4) & GENMASK(7, 4))
0080 #define OV5648_PLL_CTRL1_MIPI_DIV(v)        ((v) & GENMASK(3, 0))
0081 #define OV5648_PLL_MUL_REG          0x3036
0082 #define OV5648_PLL_MUL(v)           ((v) & GENMASK(7, 0))
0083 #define OV5648_PLL_DIV_REG          0x3037
0084 #define OV5648_PLL_DIV_ROOT_DIV(v)      ((((v) - 1) << 4) & BIT(4))
0085 #define OV5648_PLL_DIV_PLL_PRE_DIV(v)       ((v) & GENMASK(3, 0))
0086 #define OV5648_PLL_DEBUG_REG            0x3038
0087 #define OV5648_PLL_BYPASS_REG           0x3039
0088 
0089 #define OV5648_PLLS_BYPASS_REG          0x303a
0090 #define OV5648_PLLS_MUL_REG         0x303b
0091 #define OV5648_PLLS_MUL(v)          ((v) & GENMASK(4, 0))
0092 #define OV5648_PLLS_CTRL_REG            0x303c
0093 #define OV5648_PLLS_CTRL_PLL_CHARGE_PUMP(v) (((v) << 4) & GENMASK(6, 4))
0094 #define OV5648_PLLS_CTRL_SYS_DIV(v)     ((v) & GENMASK(3, 0))
0095 #define OV5648_PLLS_DIV_REG         0x303d
0096 #define OV5648_PLLS_DIV_PLLS_PRE_DIV(v)     (((v) << 4) & GENMASK(5, 4))
0097 #define OV5648_PLLS_DIV_PLLS_DIV_R(v)       ((((v) - 1) << 2) & BIT(2))
0098 #define OV5648_PLLS_DIV_PLLS_SEL_DIV(v)     ((v) & GENMASK(1, 0))
0099 
0100 #define OV5648_SRB_CTRL_REG         0x3106
0101 #define OV5648_SRB_CTRL_SCLK_DIV(v)     (((v) << 2) & GENMASK(3, 2))
0102 #define OV5648_SRB_CTRL_RESET_ARBITER_EN    BIT(1)
0103 #define OV5648_SRB_CTRL_SCLK_ARBITER_EN     BIT(0)
0104 
0105 /* Group Hold */
0106 
0107 #define OV5648_GROUP_ADR0_REG           0x3200
0108 #define OV5648_GROUP_ADR1_REG           0x3201
0109 #define OV5648_GROUP_ADR2_REG           0x3202
0110 #define OV5648_GROUP_ADR3_REG           0x3203
0111 #define OV5648_GROUP_LEN0_REG           0x3204
0112 #define OV5648_GROUP_LEN1_REG           0x3205
0113 #define OV5648_GROUP_LEN2_REG           0x3206
0114 #define OV5648_GROUP_LEN3_REG           0x3207
0115 #define OV5648_GROUP_ACCESS_REG         0x3208
0116 
0117 /* Exposure/gain/banding */
0118 
0119 #define OV5648_EXPOSURE_CTRL_HH_REG     0x3500
0120 #define OV5648_EXPOSURE_CTRL_HH(v)      (((v) & GENMASK(19, 16)) >> 16)
0121 #define OV5648_EXPOSURE_CTRL_HH_VALUE(v)    (((v) << 16) & GENMASK(19, 16))
0122 #define OV5648_EXPOSURE_CTRL_H_REG      0x3501
0123 #define OV5648_EXPOSURE_CTRL_H(v)       (((v) & GENMASK(15, 8)) >> 8)
0124 #define OV5648_EXPOSURE_CTRL_H_VALUE(v)     (((v) << 8) & GENMASK(15, 8))
0125 #define OV5648_EXPOSURE_CTRL_L_REG      0x3502
0126 #define OV5648_EXPOSURE_CTRL_L(v)       ((v) & GENMASK(7, 0))
0127 #define OV5648_EXPOSURE_CTRL_L_VALUE(v)     ((v) & GENMASK(7, 0))
0128 #define OV5648_MANUAL_CTRL_REG          0x3503
0129 #define OV5648_MANUAL_CTRL_FRAME_DELAY(v)   (((v) << 4) & GENMASK(5, 4))
0130 #define OV5648_MANUAL_CTRL_AGC_MANUAL_EN    BIT(1)
0131 #define OV5648_MANUAL_CTRL_AEC_MANUAL_EN    BIT(0)
0132 #define OV5648_GAIN_CTRL_H_REG          0x350a
0133 #define OV5648_GAIN_CTRL_H(v)           (((v) & GENMASK(9, 8)) >> 8)
0134 #define OV5648_GAIN_CTRL_H_VALUE(v)     (((v) << 8) & GENMASK(9, 8))
0135 #define OV5648_GAIN_CTRL_L_REG          0x350b
0136 #define OV5648_GAIN_CTRL_L(v)           ((v) & GENMASK(7, 0))
0137 #define OV5648_GAIN_CTRL_L_VALUE(v)     ((v) & GENMASK(7, 0))
0138 
0139 #define OV5648_ANALOG_CTRL0_REG_BASE        0x3600
0140 #define OV5648_ANALOG_CTRL1_REG_BASE        0x3700
0141 
0142 #define OV5648_AEC_CTRL0_REG            0x3a00
0143 #define OV5648_AEC_CTRL0_DEBUG          BIT(6)
0144 #define OV5648_AEC_CTRL0_DEBAND_EN      BIT(5)
0145 #define OV5648_AEC_CTRL0_DEBAND_LOW_LIMIT_EN    BIT(4)
0146 #define OV5648_AEC_CTRL0_START_SEL_EN       BIT(3)
0147 #define OV5648_AEC_CTRL0_NIGHT_MODE_EN      BIT(2)
0148 #define OV5648_AEC_CTRL0_FREEZE_EN      BIT(0)
0149 #define OV5648_EXPOSURE_MIN_REG         0x3a01
0150 #define OV5648_EXPOSURE_MAX_60_H_REG        0x3a02
0151 #define OV5648_EXPOSURE_MAX_60_L_REG        0x3a03
0152 #define OV5648_AEC_CTRL5_REG            0x3a05
0153 #define OV5648_AEC_CTRL6_REG            0x3a06
0154 #define OV5648_AEC_CTRL7_REG            0x3a07
0155 #define OV5648_BANDING_STEP_50_H_REG        0x3a08
0156 #define OV5648_BANDING_STEP_50_L_REG        0x3a09
0157 #define OV5648_BANDING_STEP_60_H_REG        0x3a0a
0158 #define OV5648_BANDING_STEP_60_L_REG        0x3a0b
0159 #define OV5648_AEC_CTRLC_REG            0x3a0c
0160 #define OV5648_BANDING_MAX_60_REG       0x3a0d
0161 #define OV5648_BANDING_MAX_50_REG       0x3a0e
0162 #define OV5648_WPT_REG              0x3a0f
0163 #define OV5648_BPT_REG              0x3a10
0164 #define OV5648_VPT_HIGH_REG         0x3a11
0165 #define OV5648_AVG_MANUAL_REG           0x3a12
0166 #define OV5648_PRE_GAIN_REG         0x3a13
0167 #define OV5648_EXPOSURE_MAX_50_H_REG        0x3a14
0168 #define OV5648_EXPOSURE_MAX_50_L_REG        0x3a15
0169 #define OV5648_GAIN_BASE_NIGHT_REG      0x3a17
0170 #define OV5648_AEC_GAIN_CEILING_H_REG       0x3a18
0171 #define OV5648_AEC_GAIN_CEILING_L_REG       0x3a19
0172 #define OV5648_DIFF_MAX_REG         0x3a1a
0173 #define OV5648_WPT2_REG             0x3a1b
0174 #define OV5648_LED_ADD_ROW_H_REG        0x3a1c
0175 #define OV5648_LED_ADD_ROW_L_REG        0x3a1d
0176 #define OV5648_BPT2_REG             0x3a1e
0177 #define OV5648_VPT_LOW_REG          0x3a1f
0178 #define OV5648_AEC_CTRL20_REG           0x3a20
0179 #define OV5648_AEC_CTRL21_REG           0x3a21
0180 
0181 #define OV5648_AVG_START_X_H_REG        0x5680
0182 #define OV5648_AVG_START_X_L_REG        0x5681
0183 #define OV5648_AVG_START_Y_H_REG        0x5682
0184 #define OV5648_AVG_START_Y_L_REG        0x5683
0185 #define OV5648_AVG_WINDOW_X_H_REG       0x5684
0186 #define OV5648_AVG_WINDOW_X_L_REG       0x5685
0187 #define OV5648_AVG_WINDOW_Y_H_REG       0x5686
0188 #define OV5648_AVG_WINDOW_Y_L_REG       0x5687
0189 #define OV5648_AVG_WEIGHT00_REG         0x5688
0190 #define OV5648_AVG_WEIGHT01_REG         0x5689
0191 #define OV5648_AVG_WEIGHT02_REG         0x568a
0192 #define OV5648_AVG_WEIGHT03_REG         0x568b
0193 #define OV5648_AVG_WEIGHT04_REG         0x568c
0194 #define OV5648_AVG_WEIGHT05_REG         0x568d
0195 #define OV5648_AVG_WEIGHT06_REG         0x568e
0196 #define OV5648_AVG_WEIGHT07_REG         0x568f
0197 #define OV5648_AVG_CTRL10_REG           0x5690
0198 #define OV5648_AVG_WEIGHT_SUM_REG       0x5691
0199 #define OV5648_AVG_READOUT_REG          0x5693
0200 
0201 #define OV5648_DIG_CTRL0_REG            0x5a00
0202 #define OV5648_DIG_COMP_MAN_H_REG       0x5a02
0203 #define OV5648_DIG_COMP_MAN_L_REG       0x5a03
0204 
0205 #define OV5648_GAINC_MAN_H_REG          0x5a20
0206 #define OV5648_GAINC_MAN_L_REG          0x5a21
0207 #define OV5648_GAINC_DGC_MAN_H_REG      0x5a22
0208 #define OV5648_GAINC_DGC_MAN_L_REG      0x5a23
0209 #define OV5648_GAINC_CTRL0_REG          0x5a24
0210 
0211 #define OV5648_GAINF_ANA_NUM_REG        0x5a40
0212 #define OV5648_GAINF_DIG_GAIN_REG       0x5a41
0213 
0214 /* Timing */
0215 
0216 #define OV5648_CROP_START_X_H_REG       0x3800
0217 #define OV5648_CROP_START_X_H(v)        (((v) & GENMASK(11, 8)) >> 8)
0218 #define OV5648_CROP_START_X_L_REG       0x3801
0219 #define OV5648_CROP_START_X_L(v)        ((v) & GENMASK(7, 0))
0220 #define OV5648_CROP_START_Y_H_REG       0x3802
0221 #define OV5648_CROP_START_Y_H(v)        (((v) & GENMASK(11, 8)) >> 8)
0222 #define OV5648_CROP_START_Y_L_REG       0x3803
0223 #define OV5648_CROP_START_Y_L(v)        ((v) & GENMASK(7, 0))
0224 #define OV5648_CROP_END_X_H_REG         0x3804
0225 #define OV5648_CROP_END_X_H(v)          (((v) & GENMASK(11, 8)) >> 8)
0226 #define OV5648_CROP_END_X_L_REG         0x3805
0227 #define OV5648_CROP_END_X_L(v)          ((v) & GENMASK(7, 0))
0228 #define OV5648_CROP_END_Y_H_REG         0x3806
0229 #define OV5648_CROP_END_Y_H(v)          (((v) & GENMASK(11, 8)) >> 8)
0230 #define OV5648_CROP_END_Y_L_REG         0x3807
0231 #define OV5648_CROP_END_Y_L(v)          ((v) & GENMASK(7, 0))
0232 #define OV5648_OUTPUT_SIZE_X_H_REG      0x3808
0233 #define OV5648_OUTPUT_SIZE_X_H(v)       (((v) & GENMASK(11, 8)) >> 8)
0234 #define OV5648_OUTPUT_SIZE_X_L_REG      0x3809
0235 #define OV5648_OUTPUT_SIZE_X_L(v)       ((v) & GENMASK(7, 0))
0236 #define OV5648_OUTPUT_SIZE_Y_H_REG      0x380a
0237 #define OV5648_OUTPUT_SIZE_Y_H(v)       (((v) & GENMASK(11, 8)) >> 8)
0238 #define OV5648_OUTPUT_SIZE_Y_L_REG      0x380b
0239 #define OV5648_OUTPUT_SIZE_Y_L(v)       ((v) & GENMASK(7, 0))
0240 #define OV5648_HTS_H_REG            0x380c
0241 #define OV5648_HTS_H(v)             (((v) & GENMASK(12, 8)) >> 8)
0242 #define OV5648_HTS_L_REG            0x380d
0243 #define OV5648_HTS_L(v)             ((v) & GENMASK(7, 0))
0244 #define OV5648_VTS_H_REG            0x380e
0245 #define OV5648_VTS_H(v)             (((v) & GENMASK(15, 8)) >> 8)
0246 #define OV5648_VTS_L_REG            0x380f
0247 #define OV5648_VTS_L(v)             ((v) & GENMASK(7, 0))
0248 #define OV5648_OFFSET_X_H_REG           0x3810
0249 #define OV5648_OFFSET_X_H(v)            (((v) & GENMASK(11, 8)) >> 8)
0250 #define OV5648_OFFSET_X_L_REG           0x3811
0251 #define OV5648_OFFSET_X_L(v)            ((v) & GENMASK(7, 0))
0252 #define OV5648_OFFSET_Y_H_REG           0x3812
0253 #define OV5648_OFFSET_Y_H(v)            (((v) & GENMASK(11, 8)) >> 8)
0254 #define OV5648_OFFSET_Y_L_REG           0x3813
0255 #define OV5648_OFFSET_Y_L(v)            ((v) & GENMASK(7, 0))
0256 #define OV5648_SUB_INC_X_REG            0x3814
0257 #define OV5648_SUB_INC_X_ODD(v)         (((v) << 4) & GENMASK(7, 4))
0258 #define OV5648_SUB_INC_X_EVEN(v)        ((v) & GENMASK(3, 0))
0259 #define OV5648_SUB_INC_Y_REG            0x3815
0260 #define OV5648_SUB_INC_Y_ODD(v)         (((v) << 4) & GENMASK(7, 4))
0261 #define OV5648_SUB_INC_Y_EVEN(v)        ((v) & GENMASK(3, 0))
0262 #define OV5648_HSYNCST_H_REG            0x3816
0263 #define OV5648_HSYNCST_H(v)         (((v) >> 8) & 0xf)
0264 #define OV5648_HSYNCST_L_REG            0x3817
0265 #define OV5648_HSYNCST_L(v)         ((v) & GENMASK(7, 0))
0266 #define OV5648_HSYNCW_H_REG         0x3818
0267 #define OV5648_HSYNCW_H(v)          (((v) >> 8) & 0xf)
0268 #define OV5648_HSYNCW_L_REG         0x3819
0269 #define OV5648_HSYNCW_L(v)          ((v) & GENMASK(7, 0))
0270 
0271 #define OV5648_TC20_REG             0x3820
0272 #define OV5648_TC20_DEBUG           BIT(6)
0273 #define OV5648_TC20_FLIP_VERT_ISP_EN        BIT(2)
0274 #define OV5648_TC20_FLIP_VERT_SENSOR_EN     BIT(1)
0275 #define OV5648_TC20_BINNING_VERT_EN     BIT(0)
0276 #define OV5648_TC21_REG             0x3821
0277 #define OV5648_TC21_FLIP_HORZ_ISP_EN        BIT(2)
0278 #define OV5648_TC21_FLIP_HORZ_SENSOR_EN     BIT(1)
0279 #define OV5648_TC21_BINNING_HORZ_EN     BIT(0)
0280 
0281 /* Strobe/exposure */
0282 
0283 #define OV5648_STROBE_REG           0x3b00
0284 #define OV5648_FREX_EXP_HH_REG          0x3b01
0285 #define OV5648_SHUTTER_DLY_H_REG        0x3b02
0286 #define OV5648_SHUTTER_DLY_L_REG        0x3b03
0287 #define OV5648_FREX_EXP_H_REG           0x3b04
0288 #define OV5648_FREX_EXP_L_REG           0x3b05
0289 #define OV5648_FREX_CTRL_REG            0x3b06
0290 #define OV5648_FREX_MODE_SEL_REG        0x3b07
0291 #define OV5648_FREX_MODE_SEL_FREX_SA1       BIT(4)
0292 #define OV5648_FREX_MODE_SEL_FX1_FM_EN      BIT(3)
0293 #define OV5648_FREX_MODE_SEL_FREX_INV       BIT(2)
0294 #define OV5648_FREX_MODE_SEL_MODE1      0x0
0295 #define OV5648_FREX_MODE_SEL_MODE2      0x1
0296 #define OV5648_FREX_MODE_SEL_ROLLING        0x2
0297 #define OV5648_FREX_EXP_REQ_REG         0x3b08
0298 #define OV5648_FREX_SHUTTER_DLY_REG     0x3b09
0299 #define OV5648_FREX_RST_LEN_REG         0x3b0a
0300 #define OV5648_STROBE_WIDTH_HH_REG      0x3b0b
0301 #define OV5648_STROBE_WIDTH_H_REG       0x3b0c
0302 
0303 /* OTP */
0304 
0305 #define OV5648_OTP_DATA_REG_BASE        0x3d00
0306 #define OV5648_OTP_PROGRAM_CTRL_REG     0x3d80
0307 #define OV5648_OTP_LOAD_CTRL_REG        0x3d81
0308 
0309 /* PSRAM */
0310 
0311 #define OV5648_PSRAM_CTRL1_REG          0x3f01
0312 #define OV5648_PSRAM_CTRLF_REG          0x3f0f
0313 
0314 /* Black Level */
0315 
0316 #define OV5648_BLC_CTRL0_REG            0x4000
0317 #define OV5648_BLC_CTRL1_REG            0x4001
0318 #define OV5648_BLC_CTRL1_START_LINE(v)      ((v) & GENMASK(5, 0))
0319 #define OV5648_BLC_CTRL2_REG            0x4002
0320 #define OV5648_BLC_CTRL2_AUTO_EN        BIT(6)
0321 #define OV5648_BLC_CTRL2_RESET_FRAME_NUM(v) ((v) & GENMASK(5, 0))
0322 #define OV5648_BLC_CTRL3_REG            0x4003
0323 #define OV5648_BLC_LINE_NUM_REG         0x4004
0324 #define OV5648_BLC_LINE_NUM(v)          ((v) & GENMASK(7, 0))
0325 #define OV5648_BLC_CTRL5_REG            0x4005
0326 #define OV5648_BLC_CTRL5_UPDATE_EN      BIT(1)
0327 #define OV5648_BLC_LEVEL_REG            0x4009
0328 
0329 /* Frame */
0330 
0331 #define OV5648_FRAME_CTRL_REG           0x4200
0332 #define OV5648_FRAME_ON_NUM_REG         0x4201
0333 #define OV5648_FRAME_OFF_NUM_REG        0x4202
0334 
0335 /* MIPI CSI-2 */
0336 
0337 #define OV5648_MIPI_CTRL0_REG           0x4800
0338 #define OV5648_MIPI_CTRL0_CLK_LANE_AUTOGATE BIT(5)
0339 #define OV5648_MIPI_CTRL0_LANE_SYNC_EN      BIT(4)
0340 #define OV5648_MIPI_CTRL0_LANE_SELECT_LANE1 0
0341 #define OV5648_MIPI_CTRL0_LANE_SELECT_LANE2 BIT(3)
0342 #define OV5648_MIPI_CTRL0_IDLE_LP00     0
0343 #define OV5648_MIPI_CTRL0_IDLE_LP11     BIT(2)
0344 
0345 #define OV5648_MIPI_CTRL1_REG           0x4801
0346 #define OV5648_MIPI_CTRL2_REG           0x4802
0347 #define OV5648_MIPI_CTRL3_REG           0x4803
0348 #define OV5648_MIPI_CTRL4_REG           0x4804
0349 #define OV5648_MIPI_CTRL5_REG           0x4805
0350 #define OV5648_MIPI_MAX_FRAME_COUNT_H_REG   0x4810
0351 #define OV5648_MIPI_MAX_FRAME_COUNT_L_REG   0x4811
0352 #define OV5648_MIPI_CTRL14_REG          0x4814
0353 #define OV5648_MIPI_DT_SPKT_REG         0x4815
0354 #define OV5648_MIPI_HS_ZERO_MIN_H_REG       0x4818
0355 #define OV5648_MIPI_HS_ZERO_MIN_L_REG       0x4819
0356 #define OV5648_MIPI_HS_TRAIN_MIN_H_REG      0x481a
0357 #define OV5648_MIPI_HS_TRAIN_MIN_L_REG      0x481b
0358 #define OV5648_MIPI_CLK_ZERO_MIN_H_REG      0x481c
0359 #define OV5648_MIPI_CLK_ZERO_MIN_L_REG      0x481d
0360 #define OV5648_MIPI_CLK_PREPARE_MIN_H_REG   0x481e
0361 #define OV5648_MIPI_CLK_PREPARE_MIN_L_REG   0x481f
0362 #define OV5648_MIPI_CLK_POST_MIN_H_REG      0x4820
0363 #define OV5648_MIPI_CLK_POST_MIN_L_REG      0x4821
0364 #define OV5648_MIPI_CLK_TRAIL_MIN_H_REG     0x4822
0365 #define OV5648_MIPI_CLK_TRAIL_MIN_L_REG     0x4823
0366 #define OV5648_MIPI_LPX_P_MIN_H_REG     0x4824
0367 #define OV5648_MIPI_LPX_P_MIN_L_REG     0x4825
0368 #define OV5648_MIPI_HS_PREPARE_MIN_H_REG    0x4826
0369 #define OV5648_MIPI_HS_PREPARE_MIN_L_REG    0x4827
0370 #define OV5648_MIPI_HS_EXIT_MIN_H_REG       0x4828
0371 #define OV5648_MIPI_HS_EXIT_MIN_L_REG       0x4829
0372 #define OV5648_MIPI_HS_ZERO_MIN_UI_REG      0x482a
0373 #define OV5648_MIPI_HS_TRAIL_MIN_UI_REG     0x482b
0374 #define OV5648_MIPI_CLK_ZERO_MIN_UI_REG     0x482c
0375 #define OV5648_MIPI_CLK_PREPARE_MIN_UI_REG  0x482d
0376 #define OV5648_MIPI_CLK_POST_MIN_UI_REG     0x482e
0377 #define OV5648_MIPI_CLK_TRAIL_MIN_UI_REG    0x482f
0378 #define OV5648_MIPI_LPX_P_MIN_UI_REG        0x4830
0379 #define OV5648_MIPI_HS_PREPARE_MIN_UI_REG   0x4831
0380 #define OV5648_MIPI_HS_EXIT_MIN_UI_REG      0x4832
0381 #define OV5648_MIPI_REG_MIN_H_REG       0x4833
0382 #define OV5648_MIPI_REG_MIN_L_REG       0x4834
0383 #define OV5648_MIPI_REG_MAX_H_REG       0x4835
0384 #define OV5648_MIPI_REG_MAX_L_REG       0x4836
0385 #define OV5648_MIPI_PCLK_PERIOD_REG     0x4837
0386 #define OV5648_MIPI_WKUP_DLY_REG        0x4838
0387 #define OV5648_MIPI_LP_GPIO_REG         0x483b
0388 #define OV5648_MIPI_SNR_PCLK_DIV_REG        0x4843
0389 
0390 /* ISP */
0391 
0392 #define OV5648_ISP_CTRL0_REG            0x5000
0393 #define OV5648_ISP_CTRL0_BLACK_CORRECT_EN   BIT(2)
0394 #define OV5648_ISP_CTRL0_WHITE_CORRECT_EN   BIT(1)
0395 #define OV5648_ISP_CTRL1_REG            0x5001
0396 #define OV5648_ISP_CTRL1_AWB_EN         BIT(0)
0397 #define OV5648_ISP_CTRL2_REG            0x5002
0398 #define OV5648_ISP_CTRL2_WIN_EN         BIT(6)
0399 #define OV5648_ISP_CTRL2_OTP_EN         BIT(1)
0400 #define OV5648_ISP_CTRL2_AWB_GAIN_EN        BIT(0)
0401 #define OV5648_ISP_CTRL3_REG            0x5003
0402 #define OV5648_ISP_CTRL3_BUF_EN         BIT(3)
0403 #define OV5648_ISP_CTRL3_BIN_MAN_SET        BIT(2)
0404 #define OV5648_ISP_CTRL3_BIN_AUTO_EN        BIT(1)
0405 #define OV5648_ISP_CTRL4_REG            0x5004
0406 #define OV5648_ISP_CTRL5_REG            0x5005
0407 #define OV5648_ISP_CTRL6_REG            0x5006
0408 #define OV5648_ISP_CTRL7_REG            0x5007
0409 #define OV5648_ISP_MAN_OFFSET_X_H_REG       0x5008
0410 #define OV5648_ISP_MAN_OFFSET_X_L_REG       0x5009
0411 #define OV5648_ISP_MAN_OFFSET_Y_H_REG       0x500a
0412 #define OV5648_ISP_MAN_OFFSET_Y_L_REG       0x500b
0413 #define OV5648_ISP_MAN_WIN_OFFSET_X_H_REG   0x500c
0414 #define OV5648_ISP_MAN_WIN_OFFSET_X_L_REG   0x500d
0415 #define OV5648_ISP_MAN_WIN_OFFSET_Y_H_REG   0x500e
0416 #define OV5648_ISP_MAN_WIN_OFFSET_Y_L_REG   0x500f
0417 #define OV5648_ISP_MAN_WIN_OUTPUT_X_H_REG   0x5010
0418 #define OV5648_ISP_MAN_WIN_OUTPUT_X_L_REG   0x5011
0419 #define OV5648_ISP_MAN_WIN_OUTPUT_Y_H_REG   0x5012
0420 #define OV5648_ISP_MAN_WIN_OUTPUT_Y_L_REG   0x5013
0421 #define OV5648_ISP_MAN_INPUT_X_H_REG        0x5014
0422 #define OV5648_ISP_MAN_INPUT_X_L_REG        0x5015
0423 #define OV5648_ISP_MAN_INPUT_Y_H_REG        0x5016
0424 #define OV5648_ISP_MAN_INPUT_Y_L_REG        0x5017
0425 #define OV5648_ISP_CTRL18_REG           0x5018
0426 #define OV5648_ISP_CTRL19_REG           0x5019
0427 #define OV5648_ISP_CTRL1A_REG           0x501a
0428 #define OV5648_ISP_CTRL1D_REG           0x501d
0429 #define OV5648_ISP_CTRL1F_REG           0x501f
0430 #define OV5648_ISP_CTRL1F_OUTPUT_EN     3
0431 #define OV5648_ISP_CTRL25_REG           0x5025
0432 
0433 #define OV5648_ISP_CTRL3D_REG           0x503d
0434 #define OV5648_ISP_CTRL3D_PATTERN_EN        BIT(7)
0435 #define OV5648_ISP_CTRL3D_ROLLING_BAR_EN    BIT(6)
0436 #define OV5648_ISP_CTRL3D_TRANSPARENT_MODE  BIT(5)
0437 #define OV5648_ISP_CTRL3D_SQUARES_BW_MODE   BIT(4)
0438 #define OV5648_ISP_CTRL3D_PATTERN_COLOR_BARS    0
0439 #define OV5648_ISP_CTRL3D_PATTERN_RANDOM_DATA   1
0440 #define OV5648_ISP_CTRL3D_PATTERN_COLOR_SQUARES 2
0441 #define OV5648_ISP_CTRL3D_PATTERN_INPUT     3
0442 
0443 #define OV5648_ISP_CTRL3E_REG           0x503e
0444 #define OV5648_ISP_CTRL4B_REG           0x504b
0445 #define OV5648_ISP_CTRL4B_POST_BIN_H_EN     BIT(5)
0446 #define OV5648_ISP_CTRL4B_POST_BIN_V_EN     BIT(4)
0447 #define OV5648_ISP_CTRL4C_REG           0x504c
0448 #define OV5648_ISP_CTRL57_REG           0x5057
0449 #define OV5648_ISP_CTRL58_REG           0x5058
0450 #define OV5648_ISP_CTRL59_REG           0x5059
0451 
0452 #define OV5648_ISP_WINDOW_START_X_H_REG     0x5980
0453 #define OV5648_ISP_WINDOW_START_X_L_REG     0x5981
0454 #define OV5648_ISP_WINDOW_START_Y_H_REG     0x5982
0455 #define OV5648_ISP_WINDOW_START_Y_L_REG     0x5983
0456 #define OV5648_ISP_WINDOW_WIN_X_H_REG       0x5984
0457 #define OV5648_ISP_WINDOW_WIN_X_L_REG       0x5985
0458 #define OV5648_ISP_WINDOW_WIN_Y_H_REG       0x5986
0459 #define OV5648_ISP_WINDOW_WIN_Y_L_REG       0x5987
0460 #define OV5648_ISP_WINDOW_MAN_REG       0x5988
0461 
0462 /* White Balance */
0463 
0464 #define OV5648_AWB_CTRL_REG         0x5180
0465 #define OV5648_AWB_CTRL_FAST_AWB        BIT(6)
0466 #define OV5648_AWB_CTRL_GAIN_FREEZE_EN      BIT(5)
0467 #define OV5648_AWB_CTRL_SUM_FREEZE_EN       BIT(4)
0468 #define OV5648_AWB_CTRL_GAIN_MANUAL_EN      BIT(3)
0469 
0470 #define OV5648_AWB_DELTA_REG            0x5181
0471 #define OV5648_AWB_STABLE_RANGE_REG     0x5182
0472 #define OV5648_AWB_STABLE_RANGE_WIDE_REG    0x5183
0473 #define OV5648_HSIZE_MAN_REG            0x5185
0474 
0475 #define OV5648_GAIN_RED_MAN_H_REG       0x5186
0476 #define OV5648_GAIN_RED_MAN_H(v)        (((v) & GENMASK(11, 8)) >> 8)
0477 #define OV5648_GAIN_RED_MAN_L_REG       0x5187
0478 #define OV5648_GAIN_RED_MAN_L(v)        ((v) & GENMASK(7, 0))
0479 #define OV5648_GAIN_GREEN_MAN_H_REG     0x5188
0480 #define OV5648_GAIN_GREEN_MAN_H(v)      (((v) & GENMASK(11, 8)) >> 8)
0481 #define OV5648_GAIN_GREEN_MAN_L_REG     0x5189
0482 #define OV5648_GAIN_GREEN_MAN_L(v)      ((v) & GENMASK(7, 0))
0483 #define OV5648_GAIN_BLUE_MAN_H_REG      0x518a
0484 #define OV5648_GAIN_BLUE_MAN_H(v)       (((v) & GENMASK(11, 8)) >> 8)
0485 #define OV5648_GAIN_BLUE_MAN_L_REG      0x518b
0486 #define OV5648_GAIN_BLUE_MAN_L(v)       ((v) & GENMASK(7, 0))
0487 #define OV5648_GAIN_RED_LIMIT_REG       0x518c
0488 #define OV5648_GAIN_GREEN_LIMIT_REG     0x518d
0489 #define OV5648_GAIN_BLUE_LIMIT_REG      0x518e
0490 #define OV5648_AWB_FRAME_COUNT_REG      0x518f
0491 #define OV5648_AWB_BASE_MAN_REG         0x51df
0492 
0493 /* Macros */
0494 
0495 #define ov5648_subdev_sensor(s) \
0496     container_of(s, struct ov5648_sensor, subdev)
0497 
0498 #define ov5648_ctrl_subdev(c) \
0499     (&container_of((c)->handler, struct ov5648_sensor, \
0500                ctrls.handler)->subdev)
0501 
0502 /* Data structures */
0503 
0504 struct ov5648_register_value {
0505     u16 address;
0506     u8 value;
0507     unsigned int delay_ms;
0508 };
0509 
0510 /*
0511  * PLL1 Clock Tree:
0512  *
0513  * +-< XVCLK
0514  * |
0515  * +-+ pll_pre_div (0x3037 [3:0], special values: 5: 1.5, 7: 2.5)
0516  *   |
0517  *   +-+ pll_mul (0x3036 [7:0])
0518  *     |
0519  *     +-+ sys_div (0x3035 [7:4])
0520  *       |
0521  *       +-+ mipi_div (0x3035 [3:0])
0522  *       | |
0523  *       | +-> MIPI_SCLK
0524  *       | |
0525  *       | +-+ mipi_phy_div (2)
0526  *       |   |
0527  *       |   +-> MIPI_CLK
0528  *       |
0529  *       +-+ root_div (0x3037 [4])
0530  *         |
0531  *         +-+ bit_div (0x3034 [3:0], 8 bits: 2, 10 bits: 2.5, other: 1)
0532  *           |
0533  *           +-+ sclk_div (0x3106 [3:2])
0534  *             |
0535  *             +-> SCLK
0536  *             |
0537  *             +-+ mipi_div (0x3035, 1: PCLK = SCLK)
0538  *               |
0539  *               +-> PCLK
0540  */
0541 
0542 struct ov5648_pll1_config {
0543     unsigned int pll_pre_div;
0544     unsigned int pll_mul;
0545     unsigned int sys_div;
0546     unsigned int root_div;
0547     unsigned int sclk_div;
0548     unsigned int mipi_div;
0549 };
0550 
0551 /*
0552  * PLL2 Clock Tree:
0553  *
0554  * +-< XVCLK
0555  * |
0556  * +-+ plls_pre_div (0x303d [5:4], special values: 0: 1, 1: 1.5)
0557  *   |
0558  *   +-+ plls_div_r (0x303d [2])
0559  *     |
0560  *     +-+ plls_mul (0x303b [4:0])
0561  *       |
0562  *       +-+ sys_div (0x303c [3:0])
0563  *         |
0564  *         +-+ sel_div (0x303d [1:0], special values: 0: 1, 3: 2.5)
0565  *           |
0566  *           +-> ADCLK
0567  */
0568 
0569 struct ov5648_pll2_config {
0570     unsigned int plls_pre_div;
0571     unsigned int plls_div_r;
0572     unsigned int plls_mul;
0573     unsigned int sys_div;
0574     unsigned int sel_div;
0575 };
0576 
0577 /*
0578  * General formulas for (array-centered) mode calculation:
0579  * - photo_array_width = 2624
0580  * - crop_start_x = (photo_array_width - output_size_x) / 2
0581  * - crop_end_x = crop_start_x + offset_x + output_size_x - 1
0582  *
0583  * - photo_array_height = 1956
0584  * - crop_start_y = (photo_array_height - output_size_y) / 2
0585  * - crop_end_y = crop_start_y + offset_y + output_size_y - 1
0586  */
0587 
0588 struct ov5648_mode {
0589     unsigned int crop_start_x;
0590     unsigned int offset_x;
0591     unsigned int output_size_x;
0592     unsigned int crop_end_x;
0593     unsigned int hts;
0594 
0595     unsigned int crop_start_y;
0596     unsigned int offset_y;
0597     unsigned int output_size_y;
0598     unsigned int crop_end_y;
0599     unsigned int vts;
0600 
0601     bool binning_x;
0602     bool binning_y;
0603 
0604     unsigned int inc_x_odd;
0605     unsigned int inc_x_even;
0606     unsigned int inc_y_odd;
0607     unsigned int inc_y_even;
0608 
0609     /* 8-bit frame interval followed by 10-bit frame interval. */
0610     struct v4l2_fract frame_interval[2];
0611 
0612     /* 8-bit config followed by 10-bit config. */
0613     const struct ov5648_pll1_config *pll1_config[2];
0614     const struct ov5648_pll2_config *pll2_config;
0615 
0616     const struct ov5648_register_value *register_values;
0617     unsigned int register_values_count;
0618 };
0619 
0620 struct ov5648_state {
0621     const struct ov5648_mode *mode;
0622     u32 mbus_code;
0623 
0624     bool streaming;
0625 };
0626 
0627 struct ov5648_ctrls {
0628     struct v4l2_ctrl *exposure_auto;
0629     struct v4l2_ctrl *exposure;
0630 
0631     struct v4l2_ctrl *gain_auto;
0632     struct v4l2_ctrl *gain;
0633 
0634     struct v4l2_ctrl *white_balance_auto;
0635     struct v4l2_ctrl *red_balance;
0636     struct v4l2_ctrl *blue_balance;
0637 
0638     struct v4l2_ctrl *link_freq;
0639     struct v4l2_ctrl *pixel_rate;
0640 
0641     struct v4l2_ctrl_handler handler;
0642 };
0643 
0644 struct ov5648_sensor {
0645     struct device *dev;
0646     struct i2c_client *i2c_client;
0647     struct gpio_desc *reset;
0648     struct gpio_desc *powerdown;
0649     struct regulator *avdd;
0650     struct regulator *dvdd;
0651     struct regulator *dovdd;
0652     struct clk *xvclk;
0653 
0654     struct v4l2_fwnode_endpoint endpoint;
0655     struct v4l2_subdev subdev;
0656     struct media_pad pad;
0657 
0658     struct mutex mutex;
0659 
0660     struct ov5648_state state;
0661     struct ov5648_ctrls ctrls;
0662 };
0663 
0664 /* Static definitions */
0665 
0666 /*
0667  * XVCLK = 24 MHz
0668  * SCLK  = 84 MHz
0669  * PCLK  = 84 MHz
0670  */
0671 static const struct ov5648_pll1_config ov5648_pll1_config_native_8_bits = {
0672     .pll_pre_div    = 3,
0673     .pll_mul    = 84,
0674     .sys_div    = 2,
0675     .root_div   = 1,
0676     .sclk_div   = 1,
0677     .mipi_div   = 1,
0678 };
0679 
0680 /*
0681  * XVCLK = 24 MHz
0682  * SCLK  = 84 MHz
0683  * PCLK  = 84 MHz
0684  */
0685 static const struct ov5648_pll1_config ov5648_pll1_config_native_10_bits = {
0686     .pll_pre_div    = 3,
0687     .pll_mul    = 105,
0688     .sys_div    = 2,
0689     .root_div   = 1,
0690     .sclk_div   = 1,
0691     .mipi_div   = 1,
0692 };
0693 
0694 /*
0695  * XVCLK = 24 MHz
0696  * ADCLK = 200 MHz
0697  */
0698 static const struct ov5648_pll2_config ov5648_pll2_config_native = {
0699     .plls_pre_div   = 3,
0700     .plls_div_r = 1,
0701     .plls_mul   = 25,
0702     .sys_div    = 1,
0703     .sel_div    = 1,
0704 };
0705 
0706 static const struct ov5648_mode ov5648_modes[] = {
0707     /* 2592x1944 */
0708     {
0709         /* Horizontal */
0710         .crop_start_x   = 16,
0711         .offset_x   = 0,
0712         .output_size_x  = 2592,
0713         .crop_end_x = 2607,
0714         .hts        = 2816,
0715 
0716         /* Vertical */
0717         .crop_start_y   = 6,
0718         .offset_y   = 0,
0719         .output_size_y  = 1944,
0720         .crop_end_y = 1949,
0721         .vts        = 1984,
0722 
0723         /* Subsample increase */
0724         .inc_x_odd  = 1,
0725         .inc_x_even = 1,
0726         .inc_y_odd  = 1,
0727         .inc_y_even = 1,
0728 
0729         /* Frame Interval */
0730         .frame_interval = {
0731             { 1,    15 },
0732             { 1,    15 },
0733         },
0734 
0735         /* PLL */
0736         .pll1_config    = {
0737             &ov5648_pll1_config_native_8_bits,
0738             &ov5648_pll1_config_native_10_bits,
0739         },
0740         .pll2_config    = &ov5648_pll2_config_native,
0741     },
0742     /* 1600x1200 (UXGA) */
0743     {
0744         /* Horizontal */
0745         .crop_start_x   = 512,
0746         .offset_x   = 0,
0747         .output_size_x  = 1600,
0748         .crop_end_x = 2111,
0749         .hts        = 2816,
0750 
0751         /* Vertical */
0752         .crop_start_y   = 378,
0753         .offset_y   = 0,
0754         .output_size_y  = 1200,
0755         .crop_end_y = 1577,
0756         .vts        = 1984,
0757 
0758         /* Subsample increase */
0759         .inc_x_odd  = 1,
0760         .inc_x_even = 1,
0761         .inc_y_odd  = 1,
0762         .inc_y_even = 1,
0763 
0764         /* Frame Interval */
0765         .frame_interval = {
0766             { 1,    15 },
0767             { 1,    15 },
0768         },
0769 
0770         /* PLL */
0771         .pll1_config    = {
0772             &ov5648_pll1_config_native_8_bits,
0773             &ov5648_pll1_config_native_10_bits,
0774         },
0775         .pll2_config    = &ov5648_pll2_config_native,
0776     },
0777     /* 1920x1080 (Full HD) */
0778     {
0779         /* Horizontal */
0780         .crop_start_x   = 352,
0781         .offset_x   = 0,
0782         .output_size_x  = 1920,
0783         .crop_end_x = 2271,
0784         .hts        = 2816,
0785 
0786         /* Vertical */
0787         .crop_start_y   = 438,
0788         .offset_y   = 0,
0789         .output_size_y  = 1080,
0790         .crop_end_y = 1517,
0791         .vts        = 1984,
0792 
0793         /* Subsample increase */
0794         .inc_x_odd  = 1,
0795         .inc_x_even = 1,
0796         .inc_y_odd  = 1,
0797         .inc_y_even = 1,
0798 
0799         /* Frame Interval */
0800         .frame_interval = {
0801             { 1,    15 },
0802             { 1,    15 },
0803         },
0804 
0805         /* PLL */
0806         .pll1_config    = {
0807             &ov5648_pll1_config_native_8_bits,
0808             &ov5648_pll1_config_native_10_bits,
0809         },
0810         .pll2_config    = &ov5648_pll2_config_native,
0811     },
0812     /* 1280x960 */
0813     {
0814         /* Horizontal */
0815         .crop_start_x   = 16,
0816         .offset_x   = 8,
0817         .output_size_x  = 1280,
0818         .crop_end_x = 2607,
0819         .hts        = 1912,
0820 
0821         /* Vertical */
0822         .crop_start_y   = 6,
0823         .offset_y   = 6,
0824         .output_size_y  = 960,
0825         .crop_end_y = 1949,
0826         .vts        = 1496,
0827 
0828         /* Binning */
0829         .binning_x  = true,
0830 
0831         /* Subsample increase */
0832         .inc_x_odd  = 3,
0833         .inc_x_even = 1,
0834         .inc_y_odd  = 3,
0835         .inc_y_even = 1,
0836 
0837         /* Frame Interval */
0838         .frame_interval = {
0839             { 1,    30 },
0840             { 1,    30 },
0841         },
0842 
0843         /* PLL */
0844         .pll1_config    = {
0845             &ov5648_pll1_config_native_8_bits,
0846             &ov5648_pll1_config_native_10_bits,
0847         },
0848         .pll2_config    = &ov5648_pll2_config_native,
0849     },
0850     /* 1280x720 (HD) */
0851     {
0852         /* Horizontal */
0853         .crop_start_x   = 16,
0854         .offset_x   = 8,
0855         .output_size_x  = 1280,
0856         .crop_end_x = 2607,
0857         .hts        = 1912,
0858 
0859         /* Vertical */
0860         .crop_start_y   = 254,
0861         .offset_y   = 2,
0862         .output_size_y  = 720,
0863         .crop_end_y = 1701,
0864         .vts        = 1496,
0865 
0866         /* Binning */
0867         .binning_x  = true,
0868 
0869         /* Subsample increase */
0870         .inc_x_odd  = 3,
0871         .inc_x_even = 1,
0872         .inc_y_odd  = 3,
0873         .inc_y_even = 1,
0874 
0875         /* Frame Interval */
0876         .frame_interval = {
0877             { 1,    30 },
0878             { 1,    30 },
0879         },
0880 
0881         /* PLL */
0882         .pll1_config    = {
0883             &ov5648_pll1_config_native_8_bits,
0884             &ov5648_pll1_config_native_10_bits,
0885         },
0886         .pll2_config    = &ov5648_pll2_config_native,
0887     },
0888     /* 640x480 (VGA) */
0889     {
0890         /* Horizontal */
0891         .crop_start_x   = 0,
0892         .offset_x   = 8,
0893         .output_size_x  = 640,
0894         .crop_end_x = 2623,
0895         .hts        = 1896,
0896 
0897         /* Vertical */
0898         .crop_start_y   = 0,
0899         .offset_y   = 2,
0900         .output_size_y  = 480,
0901         .crop_end_y = 1953,
0902         .vts        = 984,
0903 
0904         /* Binning */
0905         .binning_x  = true,
0906 
0907         /* Subsample increase */
0908         .inc_x_odd  = 7,
0909         .inc_x_even = 1,
0910         .inc_y_odd  = 7,
0911         .inc_y_even = 1,
0912 
0913         /* Frame Interval */
0914         .frame_interval = {
0915             { 1,    30 },
0916             { 1,    30 },
0917         },
0918 
0919         /* PLL */
0920         .pll1_config    = {
0921             &ov5648_pll1_config_native_8_bits,
0922             &ov5648_pll1_config_native_10_bits,
0923         },
0924         .pll2_config    = &ov5648_pll2_config_native,
0925     },
0926 };
0927 
0928 static const u32 ov5648_mbus_codes[] = {
0929     MEDIA_BUS_FMT_SBGGR8_1X8,
0930     MEDIA_BUS_FMT_SBGGR10_1X10,
0931 };
0932 
0933 static const struct ov5648_register_value ov5648_init_sequence[] = {
0934     /* PSRAM */
0935     { OV5648_PSRAM_CTRL1_REG, 0x0d },
0936     { OV5648_PSRAM_CTRLF_REG, 0xf5 },
0937 };
0938 
0939 static const s64 ov5648_link_freq_menu[] = {
0940     210000000,
0941     168000000,
0942 };
0943 
0944 static const char *const ov5648_test_pattern_menu[] = {
0945     "Disabled",
0946     "Random data",
0947     "Color bars",
0948     "Color bars with rolling bar",
0949     "Color squares",
0950     "Color squares with rolling bar"
0951 };
0952 
0953 static const u8 ov5648_test_pattern_bits[] = {
0954     0,
0955     OV5648_ISP_CTRL3D_PATTERN_EN | OV5648_ISP_CTRL3D_PATTERN_RANDOM_DATA,
0956     OV5648_ISP_CTRL3D_PATTERN_EN | OV5648_ISP_CTRL3D_PATTERN_COLOR_BARS,
0957     OV5648_ISP_CTRL3D_PATTERN_EN | OV5648_ISP_CTRL3D_ROLLING_BAR_EN |
0958     OV5648_ISP_CTRL3D_PATTERN_COLOR_BARS,
0959     OV5648_ISP_CTRL3D_PATTERN_EN | OV5648_ISP_CTRL3D_PATTERN_COLOR_SQUARES,
0960     OV5648_ISP_CTRL3D_PATTERN_EN | OV5648_ISP_CTRL3D_ROLLING_BAR_EN |
0961     OV5648_ISP_CTRL3D_PATTERN_COLOR_SQUARES,
0962 };
0963 
0964 /* Input/Output */
0965 
0966 static int ov5648_read(struct ov5648_sensor *sensor, u16 address, u8 *value)
0967 {
0968     unsigned char data[2] = { address >> 8, address & 0xff };
0969     struct i2c_client *client = sensor->i2c_client;
0970     int ret;
0971 
0972     ret = i2c_master_send(client, data, sizeof(data));
0973     if (ret < 0) {
0974         dev_dbg(&client->dev, "i2c send error at address %#04x\n",
0975             address);
0976         return ret;
0977     }
0978 
0979     ret = i2c_master_recv(client, value, 1);
0980     if (ret < 0) {
0981         dev_dbg(&client->dev, "i2c recv error at address %#04x\n",
0982             address);
0983         return ret;
0984     }
0985 
0986     return 0;
0987 }
0988 
0989 static int ov5648_write(struct ov5648_sensor *sensor, u16 address, u8 value)
0990 {
0991     unsigned char data[3] = { address >> 8, address & 0xff, value };
0992     struct i2c_client *client = sensor->i2c_client;
0993     int ret;
0994 
0995     ret = i2c_master_send(client, data, sizeof(data));
0996     if (ret < 0) {
0997         dev_dbg(&client->dev, "i2c send error at address %#04x\n",
0998             address);
0999         return ret;
1000     }
1001 
1002     return 0;
1003 }
1004 
1005 static int ov5648_write_sequence(struct ov5648_sensor *sensor,
1006                  const struct ov5648_register_value *sequence,
1007                  unsigned int sequence_count)
1008 {
1009     unsigned int i;
1010     int ret = 0;
1011 
1012     for (i = 0; i < sequence_count; i++) {
1013         ret = ov5648_write(sensor, sequence[i].address,
1014                    sequence[i].value);
1015         if (ret)
1016             break;
1017 
1018         if (sequence[i].delay_ms)
1019             msleep(sequence[i].delay_ms);
1020     }
1021 
1022     return ret;
1023 }
1024 
1025 static int ov5648_update_bits(struct ov5648_sensor *sensor, u16 address,
1026                   u8 mask, u8 bits)
1027 {
1028     u8 value = 0;
1029     int ret;
1030 
1031     ret = ov5648_read(sensor, address, &value);
1032     if (ret)
1033         return ret;
1034 
1035     value &= ~mask;
1036     value |= bits;
1037 
1038     ret = ov5648_write(sensor, address, value);
1039     if (ret)
1040         return ret;
1041 
1042     return 0;
1043 }
1044 
1045 /* Sensor */
1046 
1047 static int ov5648_sw_reset(struct ov5648_sensor *sensor)
1048 {
1049     return ov5648_write(sensor, OV5648_SW_RESET_REG, OV5648_SW_RESET_RESET);
1050 }
1051 
1052 static int ov5648_sw_standby(struct ov5648_sensor *sensor, int standby)
1053 {
1054     u8 value = 0;
1055 
1056     if (!standby)
1057         value = OV5648_SW_STANDBY_STREAM_ON;
1058 
1059     return ov5648_write(sensor, OV5648_SW_STANDBY_REG, value);
1060 }
1061 
1062 static int ov5648_chip_id_check(struct ov5648_sensor *sensor)
1063 {
1064     u16 regs[] = { OV5648_CHIP_ID_H_REG, OV5648_CHIP_ID_L_REG };
1065     u8 values[] = { OV5648_CHIP_ID_H_VALUE, OV5648_CHIP_ID_L_VALUE };
1066     unsigned int i;
1067     u8 value;
1068     int ret;
1069 
1070     for (i = 0; i < ARRAY_SIZE(regs); i++) {
1071         ret = ov5648_read(sensor, regs[i], &value);
1072         if (ret < 0)
1073             return ret;
1074 
1075         if (value != values[i]) {
1076             dev_err(sensor->dev,
1077                 "chip id value mismatch: %#x instead of %#x\n",
1078                 value, values[i]);
1079             return -EINVAL;
1080         }
1081     }
1082 
1083     return 0;
1084 }
1085 
1086 static int ov5648_avdd_internal_power(struct ov5648_sensor *sensor, int on)
1087 {
1088     return ov5648_write(sensor, OV5648_A_PWC_PK_O0_REG,
1089                 on ? 0 : OV5648_A_PWC_PK_O0_BP_REGULATOR_N);
1090 }
1091 
1092 static int ov5648_pad_configure(struct ov5648_sensor *sensor)
1093 {
1094     int ret;
1095 
1096     /* Configure pads as input. */
1097 
1098     ret = ov5648_write(sensor, OV5648_PAD_OEN1_REG, 0);
1099     if (ret)
1100         return ret;
1101 
1102     ret = ov5648_write(sensor, OV5648_PAD_OEN2_REG, 0);
1103     if (ret)
1104         return ret;
1105 
1106     /* Disable FREX pin. */
1107 
1108     return ov5648_write(sensor, OV5648_PAD_PK_REG,
1109                 OV5648_PAD_PK_DRIVE_STRENGTH_1X |
1110                 OV5648_PAD_PK_FREX_N);
1111 }
1112 
1113 static int ov5648_mipi_configure(struct ov5648_sensor *sensor)
1114 {
1115     struct v4l2_mbus_config_mipi_csi2 *bus_mipi_csi2 =
1116         &sensor->endpoint.bus.mipi_csi2;
1117     unsigned int lanes_count = bus_mipi_csi2->num_data_lanes;
1118     int ret;
1119 
1120     ret = ov5648_write(sensor, OV5648_MIPI_CTRL0_REG,
1121                OV5648_MIPI_CTRL0_CLK_LANE_AUTOGATE |
1122                OV5648_MIPI_CTRL0_LANE_SELECT_LANE1 |
1123                OV5648_MIPI_CTRL0_IDLE_LP11);
1124     if (ret)
1125         return ret;
1126 
1127     return ov5648_write(sensor, OV5648_MIPI_SC_CTRL0_REG,
1128                 OV5648_MIPI_SC_CTRL0_MIPI_LANES(lanes_count) |
1129                 OV5648_MIPI_SC_CTRL0_PHY_LP_RX_PD |
1130                 OV5648_MIPI_SC_CTRL0_MIPI_EN);
1131 }
1132 
1133 static int ov5648_black_level_configure(struct ov5648_sensor *sensor)
1134 {
1135     int ret;
1136 
1137     /* Up to 6 lines are available for black level calibration. */
1138 
1139     ret = ov5648_write(sensor, OV5648_BLC_CTRL1_REG,
1140                OV5648_BLC_CTRL1_START_LINE(2));
1141     if (ret)
1142         return ret;
1143 
1144     ret = ov5648_write(sensor, OV5648_BLC_CTRL2_REG,
1145                OV5648_BLC_CTRL2_AUTO_EN |
1146                OV5648_BLC_CTRL2_RESET_FRAME_NUM(5));
1147     if (ret)
1148         return ret;
1149 
1150     ret = ov5648_write(sensor, OV5648_BLC_LINE_NUM_REG,
1151                OV5648_BLC_LINE_NUM(4));
1152     if (ret)
1153         return ret;
1154 
1155     return ov5648_update_bits(sensor, OV5648_BLC_CTRL5_REG,
1156                   OV5648_BLC_CTRL5_UPDATE_EN,
1157                   OV5648_BLC_CTRL5_UPDATE_EN);
1158 }
1159 
1160 static int ov5648_isp_configure(struct ov5648_sensor *sensor)
1161 {
1162     u8 bits;
1163     int ret;
1164 
1165     /* Enable black and white level correction. */
1166     bits = OV5648_ISP_CTRL0_BLACK_CORRECT_EN |
1167            OV5648_ISP_CTRL0_WHITE_CORRECT_EN;
1168 
1169     ret = ov5648_update_bits(sensor, OV5648_ISP_CTRL0_REG, bits, bits);
1170     if (ret)
1171         return ret;
1172 
1173     /* Enable AWB. */
1174     ret = ov5648_write(sensor, OV5648_ISP_CTRL1_REG,
1175                OV5648_ISP_CTRL1_AWB_EN);
1176     if (ret)
1177         return ret;
1178 
1179     /* Enable AWB gain and windowing. */
1180     ret = ov5648_write(sensor, OV5648_ISP_CTRL2_REG,
1181                OV5648_ISP_CTRL2_WIN_EN |
1182                OV5648_ISP_CTRL2_AWB_GAIN_EN);
1183     if (ret)
1184         return ret;
1185 
1186     /* Enable buffering and auto-binning. */
1187     ret = ov5648_write(sensor, OV5648_ISP_CTRL3_REG,
1188                OV5648_ISP_CTRL3_BUF_EN |
1189                OV5648_ISP_CTRL3_BIN_AUTO_EN);
1190     if (ret)
1191         return ret;
1192 
1193     ret = ov5648_write(sensor, OV5648_ISP_CTRL4_REG, 0);
1194     if (ret)
1195         return ret;
1196 
1197     ret = ov5648_write(sensor, OV5648_ISP_CTRL1F_REG,
1198                OV5648_ISP_CTRL1F_OUTPUT_EN);
1199     if (ret)
1200         return ret;
1201 
1202     /* Enable post-binning filters. */
1203     ret = ov5648_write(sensor, OV5648_ISP_CTRL4B_REG,
1204                OV5648_ISP_CTRL4B_POST_BIN_H_EN |
1205                OV5648_ISP_CTRL4B_POST_BIN_V_EN);
1206     if (ret)
1207         return ret;
1208 
1209     /* Disable debanding and night mode. Debug bit seems necessary. */
1210     ret = ov5648_write(sensor, OV5648_AEC_CTRL0_REG,
1211                OV5648_AEC_CTRL0_DEBUG |
1212                OV5648_AEC_CTRL0_START_SEL_EN);
1213     if (ret)
1214         return ret;
1215 
1216     return ov5648_write(sensor, OV5648_MANUAL_CTRL_REG,
1217                 OV5648_MANUAL_CTRL_FRAME_DELAY(1));
1218 }
1219 
1220 static unsigned long ov5648_mode_pll1_rate(struct ov5648_sensor *sensor,
1221                        const struct ov5648_pll1_config *config)
1222 {
1223     unsigned long xvclk_rate;
1224     unsigned long pll1_rate;
1225 
1226     xvclk_rate = clk_get_rate(sensor->xvclk);
1227     pll1_rate = xvclk_rate * config->pll_mul;
1228 
1229     switch (config->pll_pre_div) {
1230     case 5:
1231         pll1_rate *= 3;
1232         pll1_rate /= 2;
1233         break;
1234     case 7:
1235         pll1_rate *= 5;
1236         pll1_rate /= 2;
1237         break;
1238     default:
1239         pll1_rate /= config->pll_pre_div;
1240         break;
1241     }
1242 
1243     return pll1_rate;
1244 }
1245 
1246 static int ov5648_mode_pll1_configure(struct ov5648_sensor *sensor,
1247                       const struct ov5648_mode *mode,
1248                       u32 mbus_code)
1249 {
1250     const struct ov5648_pll1_config *config;
1251     u8 value;
1252     int ret;
1253 
1254     value = OV5648_PLL_CTRL0_PLL_CHARGE_PUMP(1);
1255 
1256     switch (mbus_code) {
1257     case MEDIA_BUS_FMT_SBGGR8_1X8:
1258         config = mode->pll1_config[0];
1259         value |= OV5648_PLL_CTRL0_BITS(8);
1260         break;
1261     case MEDIA_BUS_FMT_SBGGR10_1X10:
1262         config = mode->pll1_config[1];
1263         value |= OV5648_PLL_CTRL0_BITS(10);
1264         break;
1265     default:
1266         return -EINVAL;
1267     }
1268 
1269     ret = ov5648_write(sensor, OV5648_PLL_CTRL0_REG, value);
1270     if (ret)
1271         return ret;
1272 
1273     ret = ov5648_write(sensor, OV5648_PLL_DIV_REG,
1274                OV5648_PLL_DIV_ROOT_DIV(config->root_div) |
1275                OV5648_PLL_DIV_PLL_PRE_DIV(config->pll_pre_div));
1276     if (ret)
1277         return ret;
1278 
1279     ret = ov5648_write(sensor, OV5648_PLL_MUL_REG,
1280                OV5648_PLL_MUL(config->pll_mul));
1281     if (ret)
1282         return ret;
1283 
1284     ret = ov5648_write(sensor, OV5648_PLL_CTRL1_REG,
1285                OV5648_PLL_CTRL1_SYS_DIV(config->sys_div) |
1286                OV5648_PLL_CTRL1_MIPI_DIV(config->mipi_div));
1287     if (ret)
1288         return ret;
1289 
1290     return ov5648_write(sensor, OV5648_SRB_CTRL_REG,
1291                 OV5648_SRB_CTRL_SCLK_DIV(config->sclk_div) |
1292                 OV5648_SRB_CTRL_SCLK_ARBITER_EN);
1293 }
1294 
1295 static int ov5648_mode_pll2_configure(struct ov5648_sensor *sensor,
1296                       const struct ov5648_mode *mode)
1297 {
1298     const struct ov5648_pll2_config *config = mode->pll2_config;
1299     int ret;
1300 
1301     ret = ov5648_write(sensor, OV5648_PLLS_DIV_REG,
1302                OV5648_PLLS_DIV_PLLS_PRE_DIV(config->plls_pre_div) |
1303                OV5648_PLLS_DIV_PLLS_DIV_R(config->plls_div_r) |
1304                OV5648_PLLS_DIV_PLLS_SEL_DIV(config->sel_div));
1305     if (ret)
1306         return ret;
1307 
1308     ret = ov5648_write(sensor, OV5648_PLLS_MUL_REG,
1309                OV5648_PLLS_MUL(config->plls_mul));
1310     if (ret)
1311         return ret;
1312 
1313     return ov5648_write(sensor, OV5648_PLLS_CTRL_REG,
1314                 OV5648_PLLS_CTRL_PLL_CHARGE_PUMP(1) |
1315                 OV5648_PLLS_CTRL_SYS_DIV(config->sys_div));
1316 }
1317 
1318 static int ov5648_mode_configure(struct ov5648_sensor *sensor,
1319                  const struct ov5648_mode *mode, u32 mbus_code)
1320 {
1321     int ret;
1322 
1323     /* Crop Start X */
1324 
1325     ret = ov5648_write(sensor, OV5648_CROP_START_X_H_REG,
1326                OV5648_CROP_START_X_H(mode->crop_start_x));
1327     if (ret)
1328         return ret;
1329 
1330     ret = ov5648_write(sensor, OV5648_CROP_START_X_L_REG,
1331                OV5648_CROP_START_X_L(mode->crop_start_x));
1332     if (ret)
1333         return ret;
1334 
1335     /* Offset X */
1336 
1337     ret = ov5648_write(sensor, OV5648_OFFSET_X_H_REG,
1338                OV5648_OFFSET_X_H(mode->offset_x));
1339     if (ret)
1340         return ret;
1341 
1342     ret = ov5648_write(sensor, OV5648_OFFSET_X_L_REG,
1343                OV5648_OFFSET_X_L(mode->offset_x));
1344     if (ret)
1345         return ret;
1346 
1347     /* Output Size X */
1348 
1349     ret = ov5648_write(sensor, OV5648_OUTPUT_SIZE_X_H_REG,
1350                OV5648_OUTPUT_SIZE_X_H(mode->output_size_x));
1351     if (ret)
1352         return ret;
1353 
1354     ret = ov5648_write(sensor, OV5648_OUTPUT_SIZE_X_L_REG,
1355                OV5648_OUTPUT_SIZE_X_L(mode->output_size_x));
1356     if (ret)
1357         return ret;
1358 
1359     /* Crop End X */
1360 
1361     ret = ov5648_write(sensor, OV5648_CROP_END_X_H_REG,
1362                OV5648_CROP_END_X_H(mode->crop_end_x));
1363     if (ret)
1364         return ret;
1365 
1366     ret = ov5648_write(sensor, OV5648_CROP_END_X_L_REG,
1367                OV5648_CROP_END_X_L(mode->crop_end_x));
1368     if (ret)
1369         return ret;
1370 
1371     /* Horizontal Total Size */
1372 
1373     ret = ov5648_write(sensor, OV5648_HTS_H_REG, OV5648_HTS_H(mode->hts));
1374     if (ret)
1375         return ret;
1376 
1377     ret = ov5648_write(sensor, OV5648_HTS_L_REG, OV5648_HTS_L(mode->hts));
1378     if (ret)
1379         return ret;
1380 
1381     /* Crop Start Y */
1382 
1383     ret = ov5648_write(sensor, OV5648_CROP_START_Y_H_REG,
1384                OV5648_CROP_START_Y_H(mode->crop_start_y));
1385     if (ret)
1386         return ret;
1387 
1388     ret = ov5648_write(sensor, OV5648_CROP_START_Y_L_REG,
1389                OV5648_CROP_START_Y_L(mode->crop_start_y));
1390     if (ret)
1391         return ret;
1392 
1393     /* Offset Y */
1394 
1395     ret = ov5648_write(sensor, OV5648_OFFSET_Y_H_REG,
1396                OV5648_OFFSET_Y_H(mode->offset_y));
1397     if (ret)
1398         return ret;
1399 
1400     ret = ov5648_write(sensor, OV5648_OFFSET_Y_L_REG,
1401                OV5648_OFFSET_Y_L(mode->offset_y));
1402     if (ret)
1403         return ret;
1404 
1405     /* Output Size Y */
1406 
1407     ret = ov5648_write(sensor, OV5648_OUTPUT_SIZE_Y_H_REG,
1408                OV5648_OUTPUT_SIZE_Y_H(mode->output_size_y));
1409     if (ret)
1410         return ret;
1411 
1412     ret = ov5648_write(sensor, OV5648_OUTPUT_SIZE_Y_L_REG,
1413                OV5648_OUTPUT_SIZE_Y_L(mode->output_size_y));
1414     if (ret)
1415         return ret;
1416 
1417     /* Crop End Y */
1418 
1419     ret = ov5648_write(sensor, OV5648_CROP_END_Y_H_REG,
1420                OV5648_CROP_END_Y_H(mode->crop_end_y));
1421     if (ret)
1422         return ret;
1423 
1424     ret = ov5648_write(sensor, OV5648_CROP_END_Y_L_REG,
1425                OV5648_CROP_END_Y_L(mode->crop_end_y));
1426     if (ret)
1427         return ret;
1428 
1429     /* Vertical Total Size */
1430 
1431     ret = ov5648_write(sensor, OV5648_VTS_H_REG, OV5648_VTS_H(mode->vts));
1432     if (ret)
1433         return ret;
1434 
1435     ret = ov5648_write(sensor, OV5648_VTS_L_REG, OV5648_VTS_L(mode->vts));
1436     if (ret)
1437         return ret;
1438 
1439     /* Flip/Mirror/Binning */
1440 
1441     /*
1442      * A debug bit is enabled by default and needs to be cleared for
1443      * subsampling to work.
1444      */
1445     ret = ov5648_update_bits(sensor, OV5648_TC20_REG,
1446                  OV5648_TC20_DEBUG |
1447                  OV5648_TC20_BINNING_VERT_EN,
1448                  mode->binning_y ? OV5648_TC20_BINNING_VERT_EN :
1449                  0);
1450     if (ret)
1451         return ret;
1452 
1453     ret = ov5648_update_bits(sensor, OV5648_TC21_REG,
1454                  OV5648_TC21_BINNING_HORZ_EN,
1455                  mode->binning_x ? OV5648_TC21_BINNING_HORZ_EN :
1456                  0);
1457     if (ret)
1458         return ret;
1459 
1460     ret = ov5648_write(sensor, OV5648_SUB_INC_X_REG,
1461                OV5648_SUB_INC_X_ODD(mode->inc_x_odd) |
1462                OV5648_SUB_INC_X_EVEN(mode->inc_x_even));
1463     if (ret)
1464         return ret;
1465 
1466     ret = ov5648_write(sensor, OV5648_SUB_INC_Y_REG,
1467                OV5648_SUB_INC_Y_ODD(mode->inc_y_odd) |
1468                OV5648_SUB_INC_Y_EVEN(mode->inc_y_even));
1469     if (ret)
1470         return ret;
1471 
1472     /* PLLs */
1473 
1474     ret = ov5648_mode_pll1_configure(sensor, mode, mbus_code);
1475     if (ret)
1476         return ret;
1477 
1478     ret = ov5648_mode_pll2_configure(sensor, mode);
1479     if (ret)
1480         return ret;
1481 
1482     /* Extra registers */
1483 
1484     if (mode->register_values) {
1485         ret = ov5648_write_sequence(sensor, mode->register_values,
1486                         mode->register_values_count);
1487         if (ret)
1488             return ret;
1489     }
1490 
1491     return 0;
1492 }
1493 
1494 static unsigned long ov5648_mode_mipi_clk_rate(struct ov5648_sensor *sensor,
1495                            const struct ov5648_mode *mode,
1496                            u32 mbus_code)
1497 {
1498     const struct ov5648_pll1_config *config;
1499     unsigned long pll1_rate;
1500 
1501     switch (mbus_code) {
1502     case MEDIA_BUS_FMT_SBGGR8_1X8:
1503         config = mode->pll1_config[0];
1504         break;
1505     case MEDIA_BUS_FMT_SBGGR10_1X10:
1506         config = mode->pll1_config[1];
1507         break;
1508     default:
1509         return 0;
1510     }
1511 
1512     pll1_rate = ov5648_mode_pll1_rate(sensor, config);
1513 
1514     return pll1_rate / config->sys_div / config->mipi_div / 2;
1515 }
1516 
1517 /* Exposure */
1518 
1519 static int ov5648_exposure_auto_configure(struct ov5648_sensor *sensor,
1520                       bool enable)
1521 {
1522     return ov5648_update_bits(sensor, OV5648_MANUAL_CTRL_REG,
1523                   OV5648_MANUAL_CTRL_AEC_MANUAL_EN,
1524                   enable ? 0 : OV5648_MANUAL_CTRL_AEC_MANUAL_EN);
1525 }
1526 
1527 static int ov5648_exposure_configure(struct ov5648_sensor *sensor, u32 exposure)
1528 {
1529     struct ov5648_ctrls *ctrls = &sensor->ctrls;
1530     int ret;
1531 
1532     if (ctrls->exposure_auto->val != V4L2_EXPOSURE_MANUAL)
1533         return -EINVAL;
1534 
1535     ret = ov5648_write(sensor, OV5648_EXPOSURE_CTRL_HH_REG,
1536                OV5648_EXPOSURE_CTRL_HH(exposure));
1537     if (ret)
1538         return ret;
1539 
1540     ret = ov5648_write(sensor, OV5648_EXPOSURE_CTRL_H_REG,
1541                OV5648_EXPOSURE_CTRL_H(exposure));
1542     if (ret)
1543         return ret;
1544 
1545     return ov5648_write(sensor, OV5648_EXPOSURE_CTRL_L_REG,
1546                 OV5648_EXPOSURE_CTRL_L(exposure));
1547 }
1548 
1549 static int ov5648_exposure_value(struct ov5648_sensor *sensor,
1550                  u32 *exposure)
1551 {
1552     u8 exposure_hh = 0, exposure_h = 0, exposure_l = 0;
1553     int ret;
1554 
1555     ret = ov5648_read(sensor, OV5648_EXPOSURE_CTRL_HH_REG, &exposure_hh);
1556     if (ret)
1557         return ret;
1558 
1559     ret = ov5648_read(sensor, OV5648_EXPOSURE_CTRL_H_REG, &exposure_h);
1560     if (ret)
1561         return ret;
1562 
1563     ret = ov5648_read(sensor, OV5648_EXPOSURE_CTRL_L_REG, &exposure_l);
1564     if (ret)
1565         return ret;
1566 
1567     *exposure = OV5648_EXPOSURE_CTRL_HH_VALUE((u32)exposure_hh) |
1568             OV5648_EXPOSURE_CTRL_H_VALUE((u32)exposure_h) |
1569             OV5648_EXPOSURE_CTRL_L_VALUE((u32)exposure_l);
1570 
1571     return 0;
1572 }
1573 
1574 /* Gain */
1575 
1576 static int ov5648_gain_auto_configure(struct ov5648_sensor *sensor, bool enable)
1577 {
1578     return ov5648_update_bits(sensor, OV5648_MANUAL_CTRL_REG,
1579                   OV5648_MANUAL_CTRL_AGC_MANUAL_EN,
1580                   enable ? 0 : OV5648_MANUAL_CTRL_AGC_MANUAL_EN);
1581 }
1582 
1583 static int ov5648_gain_configure(struct ov5648_sensor *sensor, u32 gain)
1584 {
1585     struct ov5648_ctrls *ctrls = &sensor->ctrls;
1586     int ret;
1587 
1588     if (ctrls->gain_auto->val)
1589         return -EINVAL;
1590 
1591     ret = ov5648_write(sensor, OV5648_GAIN_CTRL_H_REG,
1592                OV5648_GAIN_CTRL_H(gain));
1593     if (ret)
1594         return ret;
1595 
1596     return ov5648_write(sensor, OV5648_GAIN_CTRL_L_REG,
1597                 OV5648_GAIN_CTRL_L(gain));
1598 }
1599 
1600 static int ov5648_gain_value(struct ov5648_sensor *sensor, u32 *gain)
1601 {
1602     u8 gain_h = 0, gain_l = 0;
1603     int ret;
1604 
1605     ret = ov5648_read(sensor, OV5648_GAIN_CTRL_H_REG, &gain_h);
1606     if (ret)
1607         return ret;
1608 
1609     ret = ov5648_read(sensor, OV5648_GAIN_CTRL_L_REG, &gain_l);
1610     if (ret)
1611         return ret;
1612 
1613     *gain = OV5648_GAIN_CTRL_H_VALUE((u32)gain_h) |
1614         OV5648_GAIN_CTRL_L_VALUE((u32)gain_l);
1615 
1616     return 0;
1617 }
1618 
1619 /* White Balance */
1620 
1621 static int ov5648_white_balance_auto_configure(struct ov5648_sensor *sensor,
1622                            bool enable)
1623 {
1624     return ov5648_write(sensor, OV5648_AWB_CTRL_REG,
1625                 enable ? 0 : OV5648_AWB_CTRL_GAIN_MANUAL_EN);
1626 }
1627 
1628 static int ov5648_white_balance_configure(struct ov5648_sensor *sensor,
1629                       u32 red_balance, u32 blue_balance)
1630 {
1631     struct ov5648_ctrls *ctrls = &sensor->ctrls;
1632     int ret;
1633 
1634     if (ctrls->white_balance_auto->val)
1635         return -EINVAL;
1636 
1637     ret = ov5648_write(sensor, OV5648_GAIN_RED_MAN_H_REG,
1638                OV5648_GAIN_RED_MAN_H(red_balance));
1639     if (ret)
1640         return ret;
1641 
1642     ret = ov5648_write(sensor, OV5648_GAIN_RED_MAN_L_REG,
1643                OV5648_GAIN_RED_MAN_L(red_balance));
1644     if (ret)
1645         return ret;
1646 
1647     ret = ov5648_write(sensor, OV5648_GAIN_BLUE_MAN_H_REG,
1648                OV5648_GAIN_BLUE_MAN_H(blue_balance));
1649     if (ret)
1650         return ret;
1651 
1652     return ov5648_write(sensor, OV5648_GAIN_BLUE_MAN_L_REG,
1653                 OV5648_GAIN_BLUE_MAN_L(blue_balance));
1654 }
1655 
1656 /* Flip */
1657 
1658 static int ov5648_flip_vert_configure(struct ov5648_sensor *sensor, bool enable)
1659 {
1660     u8 bits = OV5648_TC20_FLIP_VERT_ISP_EN |
1661           OV5648_TC20_FLIP_VERT_SENSOR_EN;
1662 
1663     return ov5648_update_bits(sensor, OV5648_TC20_REG, bits,
1664                   enable ? bits : 0);
1665 }
1666 
1667 static int ov5648_flip_horz_configure(struct ov5648_sensor *sensor, bool enable)
1668 {
1669     u8 bits = OV5648_TC21_FLIP_HORZ_ISP_EN |
1670           OV5648_TC21_FLIP_HORZ_SENSOR_EN;
1671 
1672     return ov5648_update_bits(sensor, OV5648_TC21_REG, bits,
1673                   enable ? bits : 0);
1674 }
1675 
1676 /* Test Pattern */
1677 
1678 static int ov5648_test_pattern_configure(struct ov5648_sensor *sensor,
1679                      unsigned int index)
1680 {
1681     if (index >= ARRAY_SIZE(ov5648_test_pattern_bits))
1682         return -EINVAL;
1683 
1684     return ov5648_write(sensor, OV5648_ISP_CTRL3D_REG,
1685                 ov5648_test_pattern_bits[index]);
1686 }
1687 
1688 /* State */
1689 
1690 static int ov5648_state_mipi_configure(struct ov5648_sensor *sensor,
1691                        const struct ov5648_mode *mode,
1692                        u32 mbus_code)
1693 {
1694     struct ov5648_ctrls *ctrls = &sensor->ctrls;
1695     struct v4l2_mbus_config_mipi_csi2 *bus_mipi_csi2 =
1696         &sensor->endpoint.bus.mipi_csi2;
1697     unsigned long mipi_clk_rate;
1698     unsigned int bits_per_sample;
1699     unsigned int lanes_count;
1700     unsigned int i, j;
1701     s64 mipi_pixel_rate;
1702 
1703     mipi_clk_rate = ov5648_mode_mipi_clk_rate(sensor, mode, mbus_code);
1704     if (!mipi_clk_rate)
1705         return -EINVAL;
1706 
1707     for (i = 0; i < ARRAY_SIZE(ov5648_link_freq_menu); i++) {
1708         s64 freq = ov5648_link_freq_menu[i];
1709 
1710         if (freq == mipi_clk_rate)
1711             break;
1712     }
1713 
1714     for (j = 0; j < sensor->endpoint.nr_of_link_frequencies; j++) {
1715         u64 freq = sensor->endpoint.link_frequencies[j];
1716 
1717         if (freq == mipi_clk_rate)
1718             break;
1719     }
1720 
1721     if (i == ARRAY_SIZE(ov5648_link_freq_menu)) {
1722         dev_err(sensor->dev,
1723             "failed to find %lu clk rate in link freq\n",
1724             mipi_clk_rate);
1725     } else if (j == sensor->endpoint.nr_of_link_frequencies) {
1726         dev_err(sensor->dev,
1727             "failed to find %lu clk rate in endpoint link-frequencies\n",
1728             mipi_clk_rate);
1729     } else {
1730         __v4l2_ctrl_s_ctrl(ctrls->link_freq, i);
1731     }
1732 
1733     switch (mbus_code) {
1734     case MEDIA_BUS_FMT_SBGGR8_1X8:
1735         bits_per_sample = 8;
1736         break;
1737     case MEDIA_BUS_FMT_SBGGR10_1X10:
1738         bits_per_sample = 10;
1739         break;
1740     default:
1741         return -EINVAL;
1742     }
1743 
1744     lanes_count = bus_mipi_csi2->num_data_lanes;
1745     mipi_pixel_rate = mipi_clk_rate * 2 * lanes_count / bits_per_sample;
1746 
1747     __v4l2_ctrl_s_ctrl_int64(ctrls->pixel_rate, mipi_pixel_rate);
1748 
1749     return 0;
1750 }
1751 
1752 static int ov5648_state_configure(struct ov5648_sensor *sensor,
1753                   const struct ov5648_mode *mode,
1754                   u32 mbus_code)
1755 {
1756     int ret;
1757 
1758     if (sensor->state.streaming)
1759         return -EBUSY;
1760 
1761     /* State will be configured at first power on otherwise. */
1762     if (pm_runtime_enabled(sensor->dev) &&
1763         !pm_runtime_suspended(sensor->dev)) {
1764         ret = ov5648_mode_configure(sensor, mode, mbus_code);
1765         if (ret)
1766             return ret;
1767     }
1768 
1769     ret = ov5648_state_mipi_configure(sensor, mode, mbus_code);
1770     if (ret)
1771         return ret;
1772 
1773     sensor->state.mode = mode;
1774     sensor->state.mbus_code = mbus_code;
1775 
1776     return 0;
1777 }
1778 
1779 static int ov5648_state_init(struct ov5648_sensor *sensor)
1780 {
1781     int ret;
1782 
1783     mutex_lock(&sensor->mutex);
1784     ret = ov5648_state_configure(sensor, &ov5648_modes[0],
1785                      ov5648_mbus_codes[0]);
1786     mutex_unlock(&sensor->mutex);
1787 
1788     return ret;
1789 }
1790 
1791 /* Sensor Base */
1792 
1793 static int ov5648_sensor_init(struct ov5648_sensor *sensor)
1794 {
1795     int ret;
1796 
1797     ret = ov5648_sw_reset(sensor);
1798     if (ret) {
1799         dev_err(sensor->dev, "failed to perform sw reset\n");
1800         return ret;
1801     }
1802 
1803     ret = ov5648_sw_standby(sensor, 1);
1804     if (ret) {
1805         dev_err(sensor->dev, "failed to set sensor standby\n");
1806         return ret;
1807     }
1808 
1809     ret = ov5648_chip_id_check(sensor);
1810     if (ret) {
1811         dev_err(sensor->dev, "failed to check sensor chip id\n");
1812         return ret;
1813     }
1814 
1815     ret = ov5648_avdd_internal_power(sensor, !sensor->avdd);
1816     if (ret) {
1817         dev_err(sensor->dev, "failed to set internal avdd power\n");
1818         return ret;
1819     }
1820 
1821     ret = ov5648_write_sequence(sensor, ov5648_init_sequence,
1822                     ARRAY_SIZE(ov5648_init_sequence));
1823     if (ret) {
1824         dev_err(sensor->dev, "failed to write init sequence\n");
1825         return ret;
1826     }
1827 
1828     ret = ov5648_pad_configure(sensor);
1829     if (ret) {
1830         dev_err(sensor->dev, "failed to configure pad\n");
1831         return ret;
1832     }
1833 
1834     ret = ov5648_mipi_configure(sensor);
1835     if (ret) {
1836         dev_err(sensor->dev, "failed to configure MIPI\n");
1837         return ret;
1838     }
1839 
1840     ret = ov5648_isp_configure(sensor);
1841     if (ret) {
1842         dev_err(sensor->dev, "failed to configure ISP\n");
1843         return ret;
1844     }
1845 
1846     ret = ov5648_black_level_configure(sensor);
1847     if (ret) {
1848         dev_err(sensor->dev, "failed to configure black level\n");
1849         return ret;
1850     }
1851 
1852     /* Configure current mode. */
1853     ret = ov5648_state_configure(sensor, sensor->state.mode,
1854                      sensor->state.mbus_code);
1855     if (ret) {
1856         dev_err(sensor->dev, "failed to configure state\n");
1857         return ret;
1858     }
1859 
1860     return 0;
1861 }
1862 
1863 static int ov5648_sensor_power(struct ov5648_sensor *sensor, bool on)
1864 {
1865     /* Keep initialized to zero for disable label. */
1866     int ret = 0;
1867 
1868     /*
1869      * General notes about the power sequence:
1870      * - power-down GPIO must be active (low) during power-on;
1871      * - reset GPIO state does not matter during power-on;
1872      * - XVCLK must be provided 1 ms before register access;
1873      * - 10 ms are needed between power-down deassert and register access.
1874      */
1875 
1876     /* Note that regulator-and-GPIO-based power is untested. */
1877     if (on) {
1878         gpiod_set_value_cansleep(sensor->reset, 1);
1879         gpiod_set_value_cansleep(sensor->powerdown, 1);
1880 
1881         ret = regulator_enable(sensor->dovdd);
1882         if (ret) {
1883             dev_err(sensor->dev,
1884                 "failed to enable DOVDD regulator\n");
1885             goto disable;
1886         }
1887 
1888         if (sensor->avdd) {
1889             ret = regulator_enable(sensor->avdd);
1890             if (ret) {
1891                 dev_err(sensor->dev,
1892                     "failed to enable AVDD regulator\n");
1893                 goto disable;
1894             }
1895         }
1896 
1897         ret = regulator_enable(sensor->dvdd);
1898         if (ret) {
1899             dev_err(sensor->dev,
1900                 "failed to enable DVDD regulator\n");
1901             goto disable;
1902         }
1903 
1904         /* According to OV5648 power up diagram. */
1905         usleep_range(5000, 10000);
1906 
1907         ret = clk_prepare_enable(sensor->xvclk);
1908         if (ret) {
1909             dev_err(sensor->dev, "failed to enable XVCLK clock\n");
1910             goto disable;
1911         }
1912 
1913         gpiod_set_value_cansleep(sensor->reset, 0);
1914         gpiod_set_value_cansleep(sensor->powerdown, 0);
1915 
1916         usleep_range(20000, 25000);
1917     } else {
1918 disable:
1919         gpiod_set_value_cansleep(sensor->powerdown, 1);
1920         gpiod_set_value_cansleep(sensor->reset, 1);
1921 
1922         clk_disable_unprepare(sensor->xvclk);
1923 
1924         regulator_disable(sensor->dvdd);
1925 
1926         if (sensor->avdd)
1927             regulator_disable(sensor->avdd);
1928 
1929         regulator_disable(sensor->dovdd);
1930     }
1931 
1932     return ret;
1933 }
1934 
1935 /* Controls */
1936 
1937 static int ov5648_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
1938 {
1939     struct v4l2_subdev *subdev = ov5648_ctrl_subdev(ctrl);
1940     struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
1941     struct ov5648_ctrls *ctrls = &sensor->ctrls;
1942     int ret;
1943 
1944     switch (ctrl->id) {
1945     case V4L2_CID_EXPOSURE_AUTO:
1946         ret = ov5648_exposure_value(sensor, &ctrls->exposure->val);
1947         if (ret)
1948             return ret;
1949         break;
1950     case V4L2_CID_AUTOGAIN:
1951         ret = ov5648_gain_value(sensor, &ctrls->gain->val);
1952         if (ret)
1953             return ret;
1954         break;
1955     default:
1956         return -EINVAL;
1957     }
1958 
1959     return 0;
1960 }
1961 
1962 static int ov5648_s_ctrl(struct v4l2_ctrl *ctrl)
1963 {
1964     struct v4l2_subdev *subdev = ov5648_ctrl_subdev(ctrl);
1965     struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
1966     struct ov5648_ctrls *ctrls = &sensor->ctrls;
1967     unsigned int index;
1968     bool enable;
1969     int ret;
1970 
1971     /* Wait for the sensor to be on before setting controls. */
1972     if (pm_runtime_suspended(sensor->dev))
1973         return 0;
1974 
1975     switch (ctrl->id) {
1976     case V4L2_CID_EXPOSURE_AUTO:
1977         enable = ctrl->val == V4L2_EXPOSURE_AUTO;
1978 
1979         ret = ov5648_exposure_auto_configure(sensor, enable);
1980         if (ret)
1981             return ret;
1982 
1983         if (!enable && ctrls->exposure->is_new) {
1984             ret = ov5648_exposure_configure(sensor,
1985                             ctrls->exposure->val);
1986             if (ret)
1987                 return ret;
1988         }
1989         break;
1990     case V4L2_CID_AUTOGAIN:
1991         enable = !!ctrl->val;
1992 
1993         ret = ov5648_gain_auto_configure(sensor, enable);
1994         if (ret)
1995             return ret;
1996 
1997         if (!enable) {
1998             ret = ov5648_gain_configure(sensor, ctrls->gain->val);
1999             if (ret)
2000                 return ret;
2001         }
2002         break;
2003     case V4L2_CID_AUTO_WHITE_BALANCE:
2004         enable = !!ctrl->val;
2005 
2006         ret = ov5648_white_balance_auto_configure(sensor, enable);
2007         if (ret)
2008             return ret;
2009 
2010         if (!enable) {
2011             ret = ov5648_white_balance_configure(sensor,
2012                                  ctrls->red_balance->val,
2013                                  ctrls->blue_balance->val);
2014             if (ret)
2015                 return ret;
2016         }
2017         break;
2018     case V4L2_CID_HFLIP:
2019         enable = !!ctrl->val;
2020         return ov5648_flip_horz_configure(sensor, enable);
2021     case V4L2_CID_VFLIP:
2022         enable = !!ctrl->val;
2023         return ov5648_flip_vert_configure(sensor, enable);
2024     case V4L2_CID_TEST_PATTERN:
2025         index = (unsigned int)ctrl->val;
2026         return ov5648_test_pattern_configure(sensor, index);
2027     default:
2028         return -EINVAL;
2029     }
2030 
2031     return 0;
2032 }
2033 
2034 static const struct v4l2_ctrl_ops ov5648_ctrl_ops = {
2035     .g_volatile_ctrl    = ov5648_g_volatile_ctrl,
2036     .s_ctrl         = ov5648_s_ctrl,
2037 };
2038 
2039 static int ov5648_ctrls_init(struct ov5648_sensor *sensor)
2040 {
2041     struct ov5648_ctrls *ctrls = &sensor->ctrls;
2042     struct v4l2_ctrl_handler *handler = &ctrls->handler;
2043     const struct v4l2_ctrl_ops *ops = &ov5648_ctrl_ops;
2044     int ret;
2045 
2046     v4l2_ctrl_handler_init(handler, 32);
2047 
2048     /* Use our mutex for ctrl locking. */
2049     handler->lock = &sensor->mutex;
2050 
2051     /* Exposure */
2052 
2053     ctrls->exposure_auto = v4l2_ctrl_new_std_menu(handler, ops,
2054                               V4L2_CID_EXPOSURE_AUTO,
2055                               V4L2_EXPOSURE_MANUAL, 0,
2056                               V4L2_EXPOSURE_AUTO);
2057 
2058     ctrls->exposure = v4l2_ctrl_new_std(handler, ops, V4L2_CID_EXPOSURE,
2059                         16, 1048575, 16, 512);
2060 
2061     v4l2_ctrl_auto_cluster(2, &ctrls->exposure_auto, 1, true);
2062 
2063     /* Gain */
2064 
2065     ctrls->gain_auto =
2066         v4l2_ctrl_new_std(handler, ops, V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
2067 
2068     ctrls->gain = v4l2_ctrl_new_std(handler, ops, V4L2_CID_GAIN, 16, 1023,
2069                     16, 16);
2070 
2071     v4l2_ctrl_auto_cluster(2, &ctrls->gain_auto, 0, true);
2072 
2073     /* White Balance */
2074 
2075     ctrls->white_balance_auto =
2076         v4l2_ctrl_new_std(handler, ops, V4L2_CID_AUTO_WHITE_BALANCE, 0,
2077                   1, 1, 1);
2078 
2079     ctrls->red_balance = v4l2_ctrl_new_std(handler, ops,
2080                            V4L2_CID_RED_BALANCE, 0, 4095,
2081                            1, 1024);
2082 
2083     ctrls->blue_balance = v4l2_ctrl_new_std(handler, ops,
2084                         V4L2_CID_BLUE_BALANCE, 0, 4095,
2085                         1, 1024);
2086 
2087     v4l2_ctrl_auto_cluster(3, &ctrls->white_balance_auto, 0, false);
2088 
2089     /* Flip */
2090 
2091     v4l2_ctrl_new_std(handler, ops, V4L2_CID_HFLIP, 0, 1, 1, 0);
2092     v4l2_ctrl_new_std(handler, ops, V4L2_CID_VFLIP, 0, 1, 1, 0);
2093 
2094     /* Test Pattern */
2095 
2096     v4l2_ctrl_new_std_menu_items(handler, ops, V4L2_CID_TEST_PATTERN,
2097                      ARRAY_SIZE(ov5648_test_pattern_menu) - 1,
2098                      0, 0, ov5648_test_pattern_menu);
2099 
2100     /* MIPI CSI-2 */
2101 
2102     ctrls->link_freq =
2103         v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
2104                        ARRAY_SIZE(ov5648_link_freq_menu) - 1,
2105                        0, ov5648_link_freq_menu);
2106 
2107     ctrls->pixel_rate =
2108         v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE, 1,
2109                   INT_MAX, 1, 1);
2110 
2111     if (handler->error) {
2112         ret = handler->error;
2113         goto error_ctrls;
2114     }
2115 
2116     ctrls->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
2117     ctrls->gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
2118 
2119     ctrls->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2120     ctrls->pixel_rate->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2121 
2122     sensor->subdev.ctrl_handler = handler;
2123 
2124     return 0;
2125 
2126 error_ctrls:
2127     v4l2_ctrl_handler_free(handler);
2128 
2129     return ret;
2130 }
2131 
2132 /* Subdev Video Operations */
2133 
2134 static int ov5648_s_stream(struct v4l2_subdev *subdev, int enable)
2135 {
2136     struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2137     struct ov5648_state *state = &sensor->state;
2138     int ret;
2139 
2140     if (enable) {
2141         ret = pm_runtime_resume_and_get(sensor->dev);
2142         if (ret < 0)
2143             return ret;
2144     }
2145 
2146     mutex_lock(&sensor->mutex);
2147     ret = ov5648_sw_standby(sensor, !enable);
2148     mutex_unlock(&sensor->mutex);
2149 
2150     if (ret)
2151         return ret;
2152 
2153     state->streaming = !!enable;
2154 
2155     if (!enable)
2156         pm_runtime_put(sensor->dev);
2157 
2158     return 0;
2159 }
2160 
2161 static int ov5648_g_frame_interval(struct v4l2_subdev *subdev,
2162                    struct v4l2_subdev_frame_interval *interval)
2163 {
2164     struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2165     const struct ov5648_mode *mode;
2166     int ret = 0;
2167 
2168     mutex_lock(&sensor->mutex);
2169 
2170     mode = sensor->state.mode;
2171 
2172     switch (sensor->state.mbus_code) {
2173     case MEDIA_BUS_FMT_SBGGR8_1X8:
2174         interval->interval = mode->frame_interval[0];
2175         break;
2176     case MEDIA_BUS_FMT_SBGGR10_1X10:
2177         interval->interval = mode->frame_interval[1];
2178         break;
2179     default:
2180         ret = -EINVAL;
2181     }
2182 
2183     mutex_unlock(&sensor->mutex);
2184 
2185     return ret;
2186 }
2187 
2188 static const struct v4l2_subdev_video_ops ov5648_subdev_video_ops = {
2189     .s_stream       = ov5648_s_stream,
2190     .g_frame_interval   = ov5648_g_frame_interval,
2191     .s_frame_interval   = ov5648_g_frame_interval,
2192 };
2193 
2194 /* Subdev Pad Operations */
2195 
2196 static int ov5648_enum_mbus_code(struct v4l2_subdev *subdev,
2197                  struct v4l2_subdev_state *sd_state,
2198                  struct v4l2_subdev_mbus_code_enum *code_enum)
2199 {
2200     if (code_enum->index >= ARRAY_SIZE(ov5648_mbus_codes))
2201         return -EINVAL;
2202 
2203     code_enum->code = ov5648_mbus_codes[code_enum->index];
2204 
2205     return 0;
2206 }
2207 
2208 static void ov5648_mbus_format_fill(struct v4l2_mbus_framefmt *mbus_format,
2209                     u32 mbus_code,
2210                     const struct ov5648_mode *mode)
2211 {
2212     mbus_format->width = mode->output_size_x;
2213     mbus_format->height = mode->output_size_y;
2214     mbus_format->code = mbus_code;
2215 
2216     mbus_format->field = V4L2_FIELD_NONE;
2217     mbus_format->colorspace = V4L2_COLORSPACE_RAW;
2218     mbus_format->ycbcr_enc =
2219         V4L2_MAP_YCBCR_ENC_DEFAULT(mbus_format->colorspace);
2220     mbus_format->quantization = V4L2_QUANTIZATION_FULL_RANGE;
2221     mbus_format->xfer_func =
2222         V4L2_MAP_XFER_FUNC_DEFAULT(mbus_format->colorspace);
2223 }
2224 
2225 static int ov5648_get_fmt(struct v4l2_subdev *subdev,
2226               struct v4l2_subdev_state *sd_state,
2227               struct v4l2_subdev_format *format)
2228 {
2229     struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2230     struct v4l2_mbus_framefmt *mbus_format = &format->format;
2231 
2232     mutex_lock(&sensor->mutex);
2233 
2234     if (format->which == V4L2_SUBDEV_FORMAT_TRY)
2235         *mbus_format = *v4l2_subdev_get_try_format(subdev, sd_state,
2236                                format->pad);
2237     else
2238         ov5648_mbus_format_fill(mbus_format, sensor->state.mbus_code,
2239                     sensor->state.mode);
2240 
2241     mutex_unlock(&sensor->mutex);
2242 
2243     return 0;
2244 }
2245 
2246 static int ov5648_set_fmt(struct v4l2_subdev *subdev,
2247               struct v4l2_subdev_state *sd_state,
2248               struct v4l2_subdev_format *format)
2249 {
2250     struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2251     struct v4l2_mbus_framefmt *mbus_format = &format->format;
2252     const struct ov5648_mode *mode;
2253     u32 mbus_code = 0;
2254     unsigned int index;
2255     int ret = 0;
2256 
2257     mutex_lock(&sensor->mutex);
2258 
2259     if (sensor->state.streaming) {
2260         ret = -EBUSY;
2261         goto complete;
2262     }
2263 
2264     /* Try to find requested mbus code. */
2265     for (index = 0; index < ARRAY_SIZE(ov5648_mbus_codes); index++) {
2266         if (ov5648_mbus_codes[index] == mbus_format->code) {
2267             mbus_code = mbus_format->code;
2268             break;
2269         }
2270     }
2271 
2272     /* Fallback to default. */
2273     if (!mbus_code)
2274         mbus_code = ov5648_mbus_codes[0];
2275 
2276     /* Find the mode with nearest dimensions. */
2277     mode = v4l2_find_nearest_size(ov5648_modes, ARRAY_SIZE(ov5648_modes),
2278                       output_size_x, output_size_y,
2279                       mbus_format->width, mbus_format->height);
2280     if (!mode) {
2281         ret = -EINVAL;
2282         goto complete;
2283     }
2284 
2285     ov5648_mbus_format_fill(mbus_format, mbus_code, mode);
2286 
2287     if (format->which == V4L2_SUBDEV_FORMAT_TRY)
2288         *v4l2_subdev_get_try_format(subdev, sd_state, format->pad) =
2289             *mbus_format;
2290     else if (sensor->state.mode != mode ||
2291          sensor->state.mbus_code != mbus_code)
2292         ret = ov5648_state_configure(sensor, mode, mbus_code);
2293 
2294 complete:
2295     mutex_unlock(&sensor->mutex);
2296 
2297     return ret;
2298 }
2299 
2300 static int ov5648_enum_frame_size(struct v4l2_subdev *subdev,
2301                   struct v4l2_subdev_state *sd_state,
2302                   struct v4l2_subdev_frame_size_enum *size_enum)
2303 {
2304     const struct ov5648_mode *mode;
2305 
2306     if (size_enum->index >= ARRAY_SIZE(ov5648_modes))
2307         return -EINVAL;
2308 
2309     mode = &ov5648_modes[size_enum->index];
2310 
2311     size_enum->min_width = size_enum->max_width = mode->output_size_x;
2312     size_enum->min_height = size_enum->max_height = mode->output_size_y;
2313 
2314     return 0;
2315 }
2316 
2317 static int ov5648_enum_frame_interval(struct v4l2_subdev *subdev,
2318                       struct v4l2_subdev_state *sd_state,
2319                       struct v4l2_subdev_frame_interval_enum *interval_enum)
2320 {
2321     const struct ov5648_mode *mode = NULL;
2322     unsigned int mode_index;
2323     unsigned int interval_index;
2324 
2325     if (interval_enum->index > 0)
2326         return -EINVAL;
2327 
2328     /*
2329      * Multiple modes with the same dimensions may have different frame
2330      * intervals, so look up each relevant mode.
2331      */
2332     for (mode_index = 0, interval_index = 0;
2333          mode_index < ARRAY_SIZE(ov5648_modes); mode_index++) {
2334         mode = &ov5648_modes[mode_index];
2335 
2336         if (mode->output_size_x == interval_enum->width &&
2337             mode->output_size_y == interval_enum->height) {
2338             if (interval_index == interval_enum->index)
2339                 break;
2340 
2341             interval_index++;
2342         }
2343     }
2344 
2345     if (mode_index == ARRAY_SIZE(ov5648_modes))
2346         return -EINVAL;
2347 
2348     switch (interval_enum->code) {
2349     case MEDIA_BUS_FMT_SBGGR8_1X8:
2350         interval_enum->interval = mode->frame_interval[0];
2351         break;
2352     case MEDIA_BUS_FMT_SBGGR10_1X10:
2353         interval_enum->interval = mode->frame_interval[1];
2354         break;
2355     default:
2356         return -EINVAL;
2357     }
2358 
2359     return 0;
2360 }
2361 
2362 static const struct v4l2_subdev_pad_ops ov5648_subdev_pad_ops = {
2363     .enum_mbus_code     = ov5648_enum_mbus_code,
2364     .get_fmt        = ov5648_get_fmt,
2365     .set_fmt        = ov5648_set_fmt,
2366     .enum_frame_size    = ov5648_enum_frame_size,
2367     .enum_frame_interval    = ov5648_enum_frame_interval,
2368 };
2369 
2370 static const struct v4l2_subdev_ops ov5648_subdev_ops = {
2371     .video      = &ov5648_subdev_video_ops,
2372     .pad        = &ov5648_subdev_pad_ops,
2373 };
2374 
2375 static int ov5648_suspend(struct device *dev)
2376 {
2377     struct i2c_client *client = to_i2c_client(dev);
2378     struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2379     struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2380     struct ov5648_state *state = &sensor->state;
2381     int ret = 0;
2382 
2383     mutex_lock(&sensor->mutex);
2384 
2385     if (state->streaming) {
2386         ret = ov5648_sw_standby(sensor, true);
2387         if (ret)
2388             goto complete;
2389     }
2390 
2391     ret = ov5648_sensor_power(sensor, false);
2392     if (ret)
2393         ov5648_sw_standby(sensor, false);
2394 
2395 complete:
2396     mutex_unlock(&sensor->mutex);
2397 
2398     return ret;
2399 }
2400 
2401 static int ov5648_resume(struct device *dev)
2402 {
2403     struct i2c_client *client = to_i2c_client(dev);
2404     struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2405     struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2406     struct ov5648_state *state = &sensor->state;
2407     int ret = 0;
2408 
2409     mutex_lock(&sensor->mutex);
2410 
2411     ret = ov5648_sensor_power(sensor, true);
2412     if (ret)
2413         goto complete;
2414 
2415     ret = ov5648_sensor_init(sensor);
2416     if (ret)
2417         goto error_power;
2418 
2419     ret = __v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
2420     if (ret)
2421         goto error_power;
2422 
2423     if (state->streaming) {
2424         ret = ov5648_sw_standby(sensor, false);
2425         if (ret)
2426             goto error_power;
2427     }
2428 
2429     goto complete;
2430 
2431 error_power:
2432     ov5648_sensor_power(sensor, false);
2433 
2434 complete:
2435     mutex_unlock(&sensor->mutex);
2436 
2437     return ret;
2438 }
2439 
2440 static int ov5648_probe(struct i2c_client *client)
2441 {
2442     struct device *dev = &client->dev;
2443     struct fwnode_handle *handle;
2444     struct ov5648_sensor *sensor;
2445     struct v4l2_subdev *subdev;
2446     struct media_pad *pad;
2447     unsigned long rate;
2448     int ret;
2449 
2450     sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
2451     if (!sensor)
2452         return -ENOMEM;
2453 
2454     sensor->dev = dev;
2455     sensor->i2c_client = client;
2456 
2457     /* Graph Endpoint */
2458 
2459     handle = fwnode_graph_get_next_endpoint(dev_fwnode(dev), NULL);
2460     if (!handle) {
2461         dev_err(dev, "unable to find endpoint node\n");
2462         return -EINVAL;
2463     }
2464 
2465     sensor->endpoint.bus_type = V4L2_MBUS_CSI2_DPHY;
2466 
2467     ret = v4l2_fwnode_endpoint_alloc_parse(handle, &sensor->endpoint);
2468     fwnode_handle_put(handle);
2469     if (ret) {
2470         dev_err(dev, "failed to parse endpoint node\n");
2471         return ret;
2472     }
2473 
2474     /* GPIOs */
2475 
2476     sensor->powerdown = devm_gpiod_get_optional(dev, "powerdown",
2477                             GPIOD_OUT_HIGH);
2478     if (IS_ERR(sensor->powerdown)) {
2479         ret = PTR_ERR(sensor->powerdown);
2480         goto error_endpoint;
2481     }
2482 
2483     sensor->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
2484     if (IS_ERR(sensor->reset)) {
2485         ret = PTR_ERR(sensor->reset);
2486         goto error_endpoint;
2487     }
2488 
2489     /* Regulators */
2490 
2491     /* DVDD: digital core */
2492     sensor->dvdd = devm_regulator_get(dev, "dvdd");
2493     if (IS_ERR(sensor->dvdd)) {
2494         dev_err(dev, "cannot get DVDD (digital core) regulator\n");
2495         ret = PTR_ERR(sensor->dvdd);
2496         goto error_endpoint;
2497     }
2498 
2499     /* DOVDD: digital I/O */
2500     sensor->dovdd = devm_regulator_get(dev, "dovdd");
2501     if (IS_ERR(sensor->dovdd)) {
2502         dev_err(dev, "cannot get DOVDD (digital I/O) regulator\n");
2503         ret = PTR_ERR(sensor->dovdd);
2504         goto error_endpoint;
2505     }
2506 
2507     /* AVDD: analog */
2508     sensor->avdd = devm_regulator_get_optional(dev, "avdd");
2509     if (IS_ERR(sensor->avdd)) {
2510         dev_info(dev, "no AVDD regulator provided, using internal\n");
2511         sensor->avdd = NULL;
2512     }
2513 
2514     /* External Clock */
2515 
2516     sensor->xvclk = devm_clk_get(dev, NULL);
2517     if (IS_ERR(sensor->xvclk)) {
2518         dev_err(dev, "failed to get external clock\n");
2519         ret = PTR_ERR(sensor->xvclk);
2520         goto error_endpoint;
2521     }
2522 
2523     rate = clk_get_rate(sensor->xvclk);
2524     if (rate != OV5648_XVCLK_RATE) {
2525         dev_err(dev, "clock rate %lu Hz is unsupported\n", rate);
2526         ret = -EINVAL;
2527         goto error_endpoint;
2528     }
2529 
2530     /* Subdev, entity and pad */
2531 
2532     subdev = &sensor->subdev;
2533     v4l2_i2c_subdev_init(subdev, client, &ov5648_subdev_ops);
2534 
2535     subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
2536     subdev->entity.function = MEDIA_ENT_F_CAM_SENSOR;
2537 
2538     pad = &sensor->pad;
2539     pad->flags = MEDIA_PAD_FL_SOURCE;
2540 
2541     ret = media_entity_pads_init(&subdev->entity, 1, pad);
2542     if (ret)
2543         goto error_entity;
2544 
2545     /* Mutex */
2546 
2547     mutex_init(&sensor->mutex);
2548 
2549     /* Sensor */
2550 
2551     ret = ov5648_ctrls_init(sensor);
2552     if (ret)
2553         goto error_mutex;
2554 
2555     ret = ov5648_state_init(sensor);
2556     if (ret)
2557         goto error_ctrls;
2558 
2559     /* Runtime PM */
2560 
2561     pm_runtime_enable(sensor->dev);
2562     pm_runtime_set_suspended(sensor->dev);
2563 
2564     /* V4L2 subdev register */
2565 
2566     ret = v4l2_async_register_subdev_sensor(subdev);
2567     if (ret)
2568         goto error_pm;
2569 
2570     return 0;
2571 
2572 error_pm:
2573     pm_runtime_disable(sensor->dev);
2574 
2575 error_ctrls:
2576     v4l2_ctrl_handler_free(&sensor->ctrls.handler);
2577 
2578 error_mutex:
2579     mutex_destroy(&sensor->mutex);
2580 
2581 error_entity:
2582     media_entity_cleanup(&sensor->subdev.entity);
2583 
2584 error_endpoint:
2585     v4l2_fwnode_endpoint_free(&sensor->endpoint);
2586 
2587     return ret;
2588 }
2589 
2590 static int ov5648_remove(struct i2c_client *client)
2591 {
2592     struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2593     struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2594 
2595     v4l2_async_unregister_subdev(subdev);
2596     pm_runtime_disable(sensor->dev);
2597     v4l2_ctrl_handler_free(&sensor->ctrls.handler);
2598     mutex_destroy(&sensor->mutex);
2599     media_entity_cleanup(&subdev->entity);
2600 
2601     return 0;
2602 }
2603 
2604 static const struct dev_pm_ops ov5648_pm_ops = {
2605     SET_RUNTIME_PM_OPS(ov5648_suspend, ov5648_resume, NULL)
2606 };
2607 
2608 static const struct of_device_id ov5648_of_match[] = {
2609     { .compatible = "ovti,ov5648" },
2610     { }
2611 };
2612 MODULE_DEVICE_TABLE(of, ov5648_of_match);
2613 
2614 static struct i2c_driver ov5648_driver = {
2615     .driver = {
2616         .name = "ov5648",
2617         .of_match_table = ov5648_of_match,
2618         .pm = &ov5648_pm_ops,
2619     },
2620     .probe_new = ov5648_probe,
2621     .remove  = ov5648_remove,
2622 };
2623 
2624 module_i2c_driver(ov5648_driver);
2625 
2626 MODULE_AUTHOR("Paul Kocialkowski <paul.kocialkowski@bootlin.com>");
2627 MODULE_DESCRIPTION("V4L2 driver for the OmniVision OV5648 image sensor");
2628 MODULE_LICENSE("GPL v2");