xref: /linux/drivers/media/i2c/mt9m114.c (revision bca5cfbb694d66a1c482d0c347eee80f6afbc870)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * mt9m114.c onsemi MT9M114 sensor driver
4  *
5  * Copyright (c) 2020-2023 Laurent Pinchart <laurent.pinchart@ideasonboard.com>
6  * Copyright (c) 2012 Analog Devices Inc.
7  *
8  * Almost complete rewrite of work by Scott Jiang <Scott.Jiang.Linux@gmail.com>
9  * itself based on work from Andrew Chew <achew@nvidia.com>.
10  */
11 
12 #include <linux/clk.h>
13 #include <linux/delay.h>
14 #include <linux/errno.h>
15 #include <linux/gpio/consumer.h>
16 #include <linux/i2c.h>
17 #include <linux/mod_devicetable.h>
18 #include <linux/module.h>
19 #include <linux/mutex.h>
20 #include <linux/pm_runtime.h>
21 #include <linux/regmap.h>
22 #include <linux/regulator/consumer.h>
23 #include <linux/types.h>
24 #include <linux/videodev2.h>
25 
26 #include <media/v4l2-async.h>
27 #include <media/v4l2-cci.h>
28 #include <media/v4l2-ctrls.h>
29 #include <media/v4l2-device.h>
30 #include <media/v4l2-fwnode.h>
31 #include <media/v4l2-mediabus.h>
32 #include <media/v4l2-subdev.h>
33 
34 /* Sysctl registers */
35 #define MT9M114_CHIP_ID					CCI_REG16(0x0000)
36 #define MT9M114_COMMAND_REGISTER			CCI_REG16(0x0080)
37 #define MT9M114_COMMAND_REGISTER_APPLY_PATCH			BIT(0)
38 #define MT9M114_COMMAND_REGISTER_SET_STATE			BIT(1)
39 #define MT9M114_COMMAND_REGISTER_REFRESH			BIT(2)
40 #define MT9M114_COMMAND_REGISTER_WAIT_FOR_EVENT			BIT(3)
41 #define MT9M114_COMMAND_REGISTER_OK				BIT(15)
42 #define MT9M114_RESET_AND_MISC_CONTROL			CCI_REG16(0x001a)
43 #define MT9M114_RESET_SOC					BIT(0)
44 #define MT9M114_PAD_SLEW				CCI_REG16(0x001e)
45 #define MT9M114_PAD_CONTROL				CCI_REG16(0x0032)
46 
47 /* XDMA registers */
48 #define MT9M114_ACCESS_CTL_STAT				CCI_REG16(0x0982)
49 #define MT9M114_PHYSICAL_ADDRESS_ACCESS			CCI_REG16(0x098a)
50 #define MT9M114_LOGICAL_ADDRESS_ACCESS			CCI_REG16(0x098e)
51 
52 /* Sensor Core registers */
53 #define MT9M114_COARSE_INTEGRATION_TIME			CCI_REG16(0x3012)
54 #define MT9M114_FINE_INTEGRATION_TIME			CCI_REG16(0x3014)
55 #define MT9M114_RESET_REGISTER				CCI_REG16(0x301a)
56 #define MT9M114_RESET_REGISTER_LOCK_REG				BIT(3)
57 #define MT9M114_RESET_REGISTER_MASK_BAD				BIT(9)
58 #define MT9M114_FLASH					CCI_REG16(0x3046)
59 #define MT9M114_GREEN1_GAIN				CCI_REG16(0x3056)
60 #define MT9M114_BLUE_GAIN				CCI_REG16(0x3058)
61 #define MT9M114_RED_GAIN				CCI_REG16(0x305a)
62 #define MT9M114_GREEN2_GAIN				CCI_REG16(0x305c)
63 #define MT9M114_GLOBAL_GAIN				CCI_REG16(0x305e)
64 #define MT9M114_GAIN_DIGITAL_GAIN(n)				((n) << 12)
65 #define MT9M114_GAIN_DIGITAL_GAIN_MASK				(0xf << 12)
66 #define MT9M114_GAIN_ANALOG_GAIN(n)				((n) << 0)
67 #define MT9M114_GAIN_ANALOG_GAIN_MASK				(0xff << 0)
68 #define MT9M114_CUSTOMER_REV				CCI_REG16(0x31fe)
69 
70 /* Monitor registers */
71 #define MT9M114_MON_MAJOR_VERSION			CCI_REG16(0x8000)
72 #define MT9M114_MON_MINOR_VERSION			CCI_REG16(0x8002)
73 #define MT9M114_MON_RELEASE_VERSION			CCI_REG16(0x8004)
74 
75 /* Auto-Exposure Track registers */
76 #define MT9M114_AE_TRACK_ALGO				CCI_REG16(0xa804)
77 #define MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE		BIT(0)
78 #define MT9M114_AE_TRACK_AE_TRACKING_DAMPENING_SPEED	CCI_REG8(0xa80a)
79 
80 /* Color Correction Matrix registers */
81 #define MT9M114_CCM_ALGO				CCI_REG16(0xb404)
82 #define MT9M114_CCM_EXEC_CALC_CCM_MATRIX			BIT(4)
83 #define MT9M114_CCM_DELTA_GAIN				CCI_REG8(0xb42a)
84 
85 /* Camera Control registers */
86 #define MT9M114_CAM_SENSOR_CFG_Y_ADDR_START		CCI_REG16(0xc800)
87 #define MT9M114_CAM_SENSOR_CFG_X_ADDR_START		CCI_REG16(0xc802)
88 #define MT9M114_CAM_SENSOR_CFG_Y_ADDR_END		CCI_REG16(0xc804)
89 #define MT9M114_CAM_SENSOR_CFG_X_ADDR_END		CCI_REG16(0xc806)
90 #define MT9M114_CAM_SENSOR_CFG_PIXCLK			CCI_REG32(0xc808)
91 #define MT9M114_CAM_SENSOR_CFG_ROW_SPEED		CCI_REG16(0xc80c)
92 #define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MIN	CCI_REG16(0xc80e)
93 #define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX	CCI_REG16(0xc810)
94 #define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES	CCI_REG16(0xc812)
95 #define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX		65535
96 #define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK		CCI_REG16(0xc814)
97 #define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX		8191
98 #define MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION		CCI_REG16(0xc816)
99 #define MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW		CCI_REG16(0xc818)
100 #define MT9M114_CAM_SENSOR_CFG_REG_0_DATA		CCI_REG16(0xc826)
101 #define MT9M114_CAM_SENSOR_CONTROL_READ_MODE		CCI_REG16(0xc834)
102 #define MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN		BIT(0)
103 #define MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN			BIT(1)
104 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_NORMAL		(0 << 4)
105 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SKIPPING		(1 << 4)
106 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_AVERAGE		(2 << 4)
107 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SUMMING		(3 << 4)
108 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_MASK		(3 << 4)
109 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_NORMAL		(0 << 8)
110 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SKIPPING		(1 << 8)
111 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SUMMING		(3 << 8)
112 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_MASK		(3 << 8)
113 #define MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN		CCI_REG16(0xc836)
114 #define MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME	CCI_REG16(0xc83c)
115 #define MT9M114_CAM_SENSOR_CONTROL_FINE_INTEGRATION_TIME	CCI_REG16(0xc83e)
116 #define MT9M114_CAM_MODE_SELECT				CCI_REG8(0xc84c)
117 #define MT9M114_CAM_MODE_SELECT_NORMAL				(0 << 0)
118 #define MT9M114_CAM_MODE_SELECT_LENS_CALIBRATION		(1 << 0)
119 #define MT9M114_CAM_MODE_SELECT_TEST_PATTERN			(2 << 0)
120 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT		CCI_REG8(0xc84d)
121 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID		(1 << 0)
122 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS		(4 << 0)
123 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM		(5 << 0)
124 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS	(8 << 0)
125 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B	(10 << 0)
126 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B	(11 << 0)
127 #define MT9M114_CAM_MODE_TEST_PATTERN_RED		CCI_REG16(0xc84e)
128 #define MT9M114_CAM_MODE_TEST_PATTERN_GREEN		CCI_REG16(0xc850)
129 #define MT9M114_CAM_MODE_TEST_PATTERN_BLUE		CCI_REG16(0xc852)
130 #define MT9M114_CAM_CROP_WINDOW_XOFFSET			CCI_REG16(0xc854)
131 #define MT9M114_CAM_CROP_WINDOW_YOFFSET			CCI_REG16(0xc856)
132 #define MT9M114_CAM_CROP_WINDOW_WIDTH			CCI_REG16(0xc858)
133 #define MT9M114_CAM_CROP_WINDOW_HEIGHT			CCI_REG16(0xc85a)
134 #define MT9M114_CAM_CROP_CROPMODE			CCI_REG8(0xc85c)
135 #define MT9M114_CAM_CROP_MODE_AE_AUTO_CROP_EN			BIT(0)
136 #define MT9M114_CAM_CROP_MODE_AWB_AUTO_CROP_EN			BIT(1)
137 #define MT9M114_CAM_OUTPUT_WIDTH			CCI_REG16(0xc868)
138 #define MT9M114_CAM_OUTPUT_HEIGHT			CCI_REG16(0xc86a)
139 #define MT9M114_CAM_OUTPUT_FORMAT			CCI_REG16(0xc86c)
140 #define MT9M114_CAM_OUTPUT_FORMAT_SWAP_RED_BLUE			BIT(0)
141 #define MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES			BIT(1)
142 #define MT9M114_CAM_OUTPUT_FORMAT_MONO_ENABLE			BIT(2)
143 #define MT9M114_CAM_OUTPUT_FORMAT_BT656_ENABLE			BIT(3)
144 #define MT9M114_CAM_OUTPUT_FORMAT_BT656_CROP_SCALE_DISABLE	BIT(4)
145 #define MT9M114_CAM_OUTPUT_FORMAT_FVLV_DISABLE			BIT(5)
146 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV			(0 << 8)
147 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB			(1 << 8)
148 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER			(2 << 8)
149 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_NONE			(3 << 8)
150 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_MASK			(3 << 8)
151 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_RAWR10		(0 << 10)
152 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PRELSC_8_2	(1 << 10)
153 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_POSTLSC_8_2	(2 << 10)
154 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PROCESSED8	(3 << 10)
155 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_MASK		(3 << 10)
156 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB		(0 << 12)
157 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_555RGB		(1 << 12)
158 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444xRGB		(2 << 12)
159 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444RGBx		(3 << 12)
160 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_MASK		(3 << 12)
161 #define MT9M114_CAM_OUTPUT_FORMAT_YUV			CCI_REG16(0xc86e)
162 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_CLIP			BIT(5)
163 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_AUV_OFFSET		BIT(4)
164 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SELECT_601		BIT(3)
165 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_NORMALISE			BIT(2)
166 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVEN_UV		(0 << 0)
167 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_ODD_UV		(1 << 0)
168 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVENU_ODDV	(2 << 0)
169 #define MT9M114_CAM_OUTPUT_Y_OFFSET			CCI_REG8(0xc870)
170 #define MT9M114_CAM_AET_AEMODE				CCI_REG8(0xc878)
171 #define MT9M114_CAM_AET_EXEC_SET_INDOOR				BIT(0)
172 #define MT9M114_CAM_AET_DISCRETE_FRAMERATE			BIT(1)
173 #define MT9M114_CAM_AET_ADAPTATIVE_TARGET_LUMA			BIT(2)
174 #define MT9M114_CAM_AET_ADAPTATIVE_SKIP_FRAMES			BIT(3)
175 #define MT9M114_CAM_AET_SKIP_FRAMES			CCI_REG8(0xc879)
176 #define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA		CCI_REG8(0xc87a)
177 #define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA_DARK	CCI_REG8(0xc87b)
178 #define MT9M114_CAM_AET_BLACK_CLIPPING_TARGET		CCI_REG16(0xc87c)
179 #define MT9M114_CAM_AET_AE_MIN_VIRT_INT_TIME_PCLK	CCI_REG16(0xc87e)
180 #define MT9M114_CAM_AET_AE_MIN_VIRT_DGAIN		CCI_REG16(0xc880)
181 #define MT9M114_CAM_AET_AE_MAX_VIRT_DGAIN		CCI_REG16(0xc882)
182 #define MT9M114_CAM_AET_AE_MIN_VIRT_AGAIN		CCI_REG16(0xc884)
183 #define MT9M114_CAM_AET_AE_MAX_VIRT_AGAIN		CCI_REG16(0xc886)
184 #define MT9M114_CAM_AET_AE_VIRT_GAIN_TH_EG		CCI_REG16(0xc888)
185 #define MT9M114_CAM_AET_AE_EG_GATE_PERCENTAGE		CCI_REG8(0xc88a)
186 #define MT9M114_CAM_AET_FLICKER_FREQ_HZ			CCI_REG8(0xc88b)
187 #define MT9M114_CAM_AET_MAX_FRAME_RATE			CCI_REG16(0xc88c)
188 #define MT9M114_CAM_AET_MIN_FRAME_RATE			CCI_REG16(0xc88e)
189 #define MT9M114_CAM_AET_TARGET_GAIN			CCI_REG16(0xc890)
190 #define MT9M114_CAM_AWB_CCM_L(n)			CCI_REG16(0xc892 + (n) * 2)
191 #define MT9M114_CAM_AWB_CCM_M(n)			CCI_REG16(0xc8a4 + (n) * 2)
192 #define MT9M114_CAM_AWB_CCM_R(n)			CCI_REG16(0xc8b6 + (n) * 2)
193 #define MT9M114_CAM_AWB_CCM_L_RG_GAIN			CCI_REG16(0xc8c8)
194 #define MT9M114_CAM_AWB_CCM_L_BG_GAIN			CCI_REG16(0xc8ca)
195 #define MT9M114_CAM_AWB_CCM_M_RG_GAIN			CCI_REG16(0xc8cc)
196 #define MT9M114_CAM_AWB_CCM_M_BG_GAIN			CCI_REG16(0xc8ce)
197 #define MT9M114_CAM_AWB_CCM_R_RG_GAIN			CCI_REG16(0xc8d0)
198 #define MT9M114_CAM_AWB_CCM_R_BG_GAIN			CCI_REG16(0xc8d2)
199 #define MT9M114_CAM_AWB_CCM_L_CTEMP			CCI_REG16(0xc8d4)
200 #define MT9M114_CAM_AWB_CCM_M_CTEMP			CCI_REG16(0xc8d6)
201 #define MT9M114_CAM_AWB_CCM_R_CTEMP			CCI_REG16(0xc8d8)
202 #define MT9M114_CAM_AWB_AWB_XSCALE			CCI_REG8(0xc8f2)
203 #define MT9M114_CAM_AWB_AWB_YSCALE			CCI_REG8(0xc8f3)
204 #define MT9M114_CAM_AWB_AWB_WEIGHTS(n)			CCI_REG16(0xc8f4 + (n) * 2)
205 #define MT9M114_CAM_AWB_AWB_XSHIFT_PRE_ADJ		CCI_REG16(0xc904)
206 #define MT9M114_CAM_AWB_AWB_YSHIFT_PRE_ADJ		CCI_REG16(0xc906)
207 #define MT9M114_CAM_AWB_AWBMODE				CCI_REG8(0xc909)
208 #define MT9M114_CAM_AWB_MODE_AUTO				BIT(1)
209 #define MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE			BIT(0)
210 #define MT9M114_CAM_AWB_K_R_L				CCI_REG8(0xc90c)
211 #define MT9M114_CAM_AWB_K_G_L				CCI_REG8(0xc90d)
212 #define MT9M114_CAM_AWB_K_B_L				CCI_REG8(0xc90e)
213 #define MT9M114_CAM_AWB_K_R_R				CCI_REG8(0xc90f)
214 #define MT9M114_CAM_AWB_K_G_R				CCI_REG8(0xc910)
215 #define MT9M114_CAM_AWB_K_B_R				CCI_REG8(0xc911)
216 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART		CCI_REG16(0xc914)
217 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART		CCI_REG16(0xc916)
218 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND		CCI_REG16(0xc918)
219 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YEND		CCI_REG16(0xc91a)
220 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XSTART	CCI_REG16(0xc91c)
221 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YSTART	CCI_REG16(0xc91e)
222 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XEND		CCI_REG16(0xc920)
223 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YEND		CCI_REG16(0xc922)
224 #define MT9M114_CAM_LL_LLMODE				CCI_REG16(0xc924)
225 #define MT9M114_CAM_LL_START_BRIGHTNESS			CCI_REG16(0xc926)
226 #define MT9M114_CAM_LL_STOP_BRIGHTNESS			CCI_REG16(0xc928)
227 #define MT9M114_CAM_LL_START_SATURATION			CCI_REG8(0xc92a)
228 #define MT9M114_CAM_LL_END_SATURATION			CCI_REG8(0xc92b)
229 #define MT9M114_CAM_LL_START_DESATURATION		CCI_REG8(0xc92c)
230 #define MT9M114_CAM_LL_END_DESATURATION			CCI_REG8(0xc92d)
231 #define MT9M114_CAM_LL_START_DEMOSAICING		CCI_REG8(0xc92e)
232 #define MT9M114_CAM_LL_START_AP_GAIN			CCI_REG8(0xc92f)
233 #define MT9M114_CAM_LL_START_AP_THRESH			CCI_REG8(0xc930)
234 #define MT9M114_CAM_LL_STOP_DEMOSAICING			CCI_REG8(0xc931)
235 #define MT9M114_CAM_LL_STOP_AP_GAIN			CCI_REG8(0xc932)
236 #define MT9M114_CAM_LL_STOP_AP_THRESH			CCI_REG8(0xc933)
237 #define MT9M114_CAM_LL_START_NR_RED			CCI_REG8(0xc934)
238 #define MT9M114_CAM_LL_START_NR_GREEN			CCI_REG8(0xc935)
239 #define MT9M114_CAM_LL_START_NR_BLUE			CCI_REG8(0xc936)
240 #define MT9M114_CAM_LL_START_NR_THRESH			CCI_REG8(0xc937)
241 #define MT9M114_CAM_LL_STOP_NR_RED			CCI_REG8(0xc938)
242 #define MT9M114_CAM_LL_STOP_NR_GREEN			CCI_REG8(0xc939)
243 #define MT9M114_CAM_LL_STOP_NR_BLUE			CCI_REG8(0xc93a)
244 #define MT9M114_CAM_LL_STOP_NR_THRESH			CCI_REG8(0xc93b)
245 #define MT9M114_CAM_LL_START_CONTRAST_BM		CCI_REG16(0xc93c)
246 #define MT9M114_CAM_LL_STOP_CONTRAST_BM			CCI_REG16(0xc93e)
247 #define MT9M114_CAM_LL_GAMMA				CCI_REG16(0xc940)
248 #define MT9M114_CAM_LL_START_CONTRAST_GRADIENT		CCI_REG8(0xc942)
249 #define MT9M114_CAM_LL_STOP_CONTRAST_GRADIENT		CCI_REG8(0xc943)
250 #define MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE	CCI_REG8(0xc944)
251 #define MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE	CCI_REG8(0xc945)
252 #define MT9M114_CAM_LL_START_GAIN_METRIC		CCI_REG16(0xc946)
253 #define MT9M114_CAM_LL_STOP_GAIN_METRIC			CCI_REG16(0xc948)
254 #define MT9M114_CAM_LL_START_FADE_TO_BLACK_LUMA		CCI_REG16(0xc94a)
255 #define MT9M114_CAM_LL_STOP_FADE_TO_BLACK_LUMA		CCI_REG16(0xc94c)
256 #define MT9M114_CAM_LL_CLUSTER_DC_TH_BM			CCI_REG16(0xc94e)
257 #define MT9M114_CAM_LL_CLUSTER_DC_GATE_PERCENTAGE	CCI_REG8(0xc950)
258 #define MT9M114_CAM_LL_SUMMING_SENSITIVITY_FACTOR	CCI_REG8(0xc951)
259 #define MT9M114_CAM_LL_START_TARGET_LUMA_BM		CCI_REG16(0xc952)
260 #define MT9M114_CAM_LL_STOP_TARGET_LUMA_BM		CCI_REG16(0xc954)
261 #define MT9M114_CAM_PGA_PGA_CONTROL			CCI_REG16(0xc95e)
262 #define MT9M114_CAM_SYSCTL_PLL_ENABLE			CCI_REG8(0xc97e)
263 #define MT9M114_CAM_SYSCTL_PLL_ENABLE_VALUE			BIT(0)
264 #define MT9M114_CAM_SYSCTL_PLL_DISABLE_VALUE			0x00
265 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_M_N		CCI_REG16(0xc980)
266 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_VALUE(m, n)		(((n) << 8) | (m))
267 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P		CCI_REG16(0xc982)
268 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P_VALUE(p)		((p) << 8)
269 #define MT9M114_CAM_PORT_OUTPUT_CONTROL			CCI_REG16(0xc984)
270 #define MT9M114_CAM_PORT_PORT_SELECT_PARALLEL			(0 << 0)
271 #define MT9M114_CAM_PORT_PORT_SELECT_MIPI			(1 << 0)
272 #define MT9M114_CAM_PORT_CLOCK_SLOWDOWN				BIT(3)
273 #define MT9M114_CAM_PORT_TRUNCATE_RAW_BAYER			BIT(4)
274 #define MT9M114_CAM_PORT_PIXCLK_GATE				BIT(5)
275 #define MT9M114_CAM_PORT_CONT_MIPI_CLK				BIT(6)
276 #define MT9M114_CAM_PORT_CHAN_NUM(vc)				((vc) << 8)
277 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO		CCI_REG16(0xc988)
278 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO_VALUE(n)		((n) << 8)
279 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_TRAIL	CCI_REG16(0xc98a)
280 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_VALUE(n)		((n) << 8)
281 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_TRAIL_VALUE(n)	((n) << 0)
282 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_PRE	CCI_REG16(0xc98c)
283 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_VALUE(n)	((n) << 8)
284 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_PRE_VALUE(n)		((n) << 0)
285 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_ZERO	CCI_REG16(0xc98e)
286 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_VALUE(n)	((n) << 8)
287 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_ZERO_VALUE(n)	((n) << 0)
288 
289 /* System Manager registers */
290 #define MT9M114_SYSMGR_NEXT_STATE			CCI_REG8(0xdc00)
291 #define MT9M114_SYSMGR_CURRENT_STATE			CCI_REG8(0xdc01)
292 #define MT9M114_SYSMGR_CMD_STATUS			CCI_REG8(0xdc02)
293 
294 /* Patch Loader registers */
295 #define MT9M114_PATCHLDR_LOADER_ADDRESS			CCI_REG16(0xe000)
296 #define MT9M114_PATCHLDR_PATCH_ID			CCI_REG16(0xe002)
297 #define MT9M114_PATCHLDR_FIRMWARE_ID			CCI_REG32(0xe004)
298 #define MT9M114_PATCHLDR_APPLY_STATUS			CCI_REG8(0xe008)
299 #define MT9M114_PATCHLDR_NUM_PATCHES			CCI_REG8(0xe009)
300 #define MT9M114_PATCHLDR_PATCH_ID_0			CCI_REG16(0xe00a)
301 #define MT9M114_PATCHLDR_PATCH_ID_1			CCI_REG16(0xe00c)
302 #define MT9M114_PATCHLDR_PATCH_ID_2			CCI_REG16(0xe00e)
303 #define MT9M114_PATCHLDR_PATCH_ID_3			CCI_REG16(0xe010)
304 #define MT9M114_PATCHLDR_PATCH_ID_4			CCI_REG16(0xe012)
305 #define MT9M114_PATCHLDR_PATCH_ID_5			CCI_REG16(0xe014)
306 #define MT9M114_PATCHLDR_PATCH_ID_6			CCI_REG16(0xe016)
307 #define MT9M114_PATCHLDR_PATCH_ID_7			CCI_REG16(0xe018)
308 
309 /* SYS_STATE values (for SYSMGR_NEXT_STATE and SYSMGR_CURRENT_STATE) */
310 #define MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE		0x28
311 #define MT9M114_SYS_STATE_STREAMING			0x31
312 #define MT9M114_SYS_STATE_START_STREAMING		0x34
313 #define MT9M114_SYS_STATE_ENTER_SUSPEND			0x40
314 #define MT9M114_SYS_STATE_SUSPENDED			0x41
315 #define MT9M114_SYS_STATE_ENTER_STANDBY			0x50
316 #define MT9M114_SYS_STATE_STANDBY			0x52
317 #define MT9M114_SYS_STATE_LEAVE_STANDBY			0x54
318 
319 /* Result status of last SET_STATE comamnd */
320 #define MT9M114_SET_STATE_RESULT_ENOERR			0x00
321 #define MT9M114_SET_STATE_RESULT_EINVAL			0x0c
322 #define MT9M114_SET_STATE_RESULT_ENOSPC			0x0d
323 
324 /*
325  * The minimum amount of horizontal and vertical blanking is undocumented. The
326  * minimum values that have been seen in register lists are 303 and 38, use
327  * them.
328  *
329  * Set the default to achieve 1280x960 at 30fps.
330  */
331 #define MT9M114_MIN_HBLANK				303
332 #define MT9M114_MIN_VBLANK				38
333 #define MT9M114_DEF_HBLANK				323
334 #define MT9M114_DEF_VBLANK				39
335 
336 #define MT9M114_DEF_FRAME_RATE				30
337 #define MT9M114_MAX_FRAME_RATE				120
338 
339 #define MT9M114_PIXEL_ARRAY_WIDTH			1296U
340 #define MT9M114_PIXEL_ARRAY_HEIGHT			976U
341 
342 /*
343  * These values are not well documented and are semi-arbitrary. The pixel array
344  * minimum output size is 8 pixels larger than the minimum scaler cropped input
345  * width to account for the demosaicing.
346  */
347 #define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH		(32U + 8U)
348 #define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT		(32U + 8U)
349 #define MT9M114_SCALER_CROPPED_INPUT_WIDTH		32U
350 #define MT9M114_SCALER_CROPPED_INPUT_HEIGHT		32U
351 
352 /* Indices into the mt9m114.ifp.tpg array. */
353 #define MT9M114_TPG_PATTERN				0
354 #define MT9M114_TPG_RED					1
355 #define MT9M114_TPG_GREEN				2
356 #define MT9M114_TPG_BLUE				3
357 
358 /* -----------------------------------------------------------------------------
359  * Data Structures
360  */
361 
362 enum mt9m114_format_flag {
363 	MT9M114_FMT_FLAG_PARALLEL = BIT(0),
364 	MT9M114_FMT_FLAG_CSI2 = BIT(1),
365 };
366 
367 struct mt9m114_format_info {
368 	u32 code;
369 	u32 output_format;
370 	u32 flags;
371 };
372 
373 struct mt9m114 {
374 	struct i2c_client *client;
375 	struct regmap *regmap;
376 
377 	struct clk *clk;
378 	struct gpio_desc *reset;
379 	struct regulator_bulk_data supplies[3];
380 	struct v4l2_fwnode_endpoint bus_cfg;
381 	bool bypass_pll;
382 
383 	struct {
384 		unsigned int m;
385 		unsigned int n;
386 		unsigned int p;
387 	} pll;
388 
389 	unsigned int pixrate;
390 	bool streaming;
391 
392 	/* Pixel Array */
393 	struct {
394 		struct v4l2_subdev sd;
395 		struct media_pad pad;
396 
397 		struct v4l2_ctrl_handler hdl;
398 		struct v4l2_ctrl *exposure;
399 		struct v4l2_ctrl *gain;
400 		struct v4l2_ctrl *hblank;
401 		struct v4l2_ctrl *vblank;
402 	} pa;
403 
404 	/* Image Flow Processor */
405 	struct {
406 		struct v4l2_subdev sd;
407 		struct media_pad pads[2];
408 
409 		struct v4l2_ctrl_handler hdl;
410 		unsigned int frame_rate;
411 
412 		struct v4l2_ctrl *tpg[4];
413 	} ifp;
414 };
415 
416 /* -----------------------------------------------------------------------------
417  * Formats
418  */
419 
420 static const struct mt9m114_format_info mt9m114_format_infos[] = {
421 	{
422 		/*
423 		 * The first two entries are used as defaults, for parallel and
424 		 * CSI-2 buses respectively. Keep them in that order.
425 		 */
426 		.code = MEDIA_BUS_FMT_UYVY8_2X8,
427 		.flags = MT9M114_FMT_FLAG_PARALLEL,
428 		.output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV,
429 	}, {
430 		.code = MEDIA_BUS_FMT_UYVY8_1X16,
431 		.flags = MT9M114_FMT_FLAG_CSI2,
432 		.output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV,
433 	}, {
434 		.code = MEDIA_BUS_FMT_YUYV8_2X8,
435 		.flags = MT9M114_FMT_FLAG_PARALLEL,
436 		.output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV
437 			       | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES,
438 	}, {
439 		.code = MEDIA_BUS_FMT_YUYV8_1X16,
440 		.flags = MT9M114_FMT_FLAG_CSI2,
441 		.output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV
442 			       | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES,
443 	}, {
444 		.code = MEDIA_BUS_FMT_RGB565_2X8_LE,
445 		.flags = MT9M114_FMT_FLAG_PARALLEL,
446 		.output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB
447 			       | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB
448 			       | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES,
449 	}, {
450 		.code = MEDIA_BUS_FMT_RGB565_2X8_BE,
451 		.flags = MT9M114_FMT_FLAG_PARALLEL,
452 		.output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB
453 			       | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB,
454 	}, {
455 		.code = MEDIA_BUS_FMT_RGB565_1X16,
456 		.flags = MT9M114_FMT_FLAG_CSI2,
457 		.output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB
458 			       | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB,
459 	}, {
460 		.code = MEDIA_BUS_FMT_SGRBG8_1X8,
461 		.output_format = MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PROCESSED8
462 			       | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER,
463 		.flags = MT9M114_FMT_FLAG_PARALLEL | MT9M114_FMT_FLAG_CSI2,
464 	}, {
465 		/* Keep the format compatible with the IFP sink pad last. */
466 		.code = MEDIA_BUS_FMT_SGRBG10_1X10,
467 		.output_format = MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_RAWR10
468 			| MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER,
469 		.flags = MT9M114_FMT_FLAG_PARALLEL | MT9M114_FMT_FLAG_CSI2,
470 	}
471 };
472 
473 static const struct mt9m114_format_info *
474 mt9m114_default_format_info(struct mt9m114 *sensor)
475 {
476 	if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY)
477 		return &mt9m114_format_infos[1];
478 	else
479 		return &mt9m114_format_infos[0];
480 }
481 
482 static const struct mt9m114_format_info *
483 mt9m114_format_info(struct mt9m114 *sensor, unsigned int pad, u32 code)
484 {
485 	const unsigned int num_formats = ARRAY_SIZE(mt9m114_format_infos);
486 	unsigned int flag;
487 	unsigned int i;
488 
489 	switch (pad) {
490 	case 0:
491 		return &mt9m114_format_infos[num_formats - 1];
492 
493 	case 1:
494 		if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY)
495 			flag = MT9M114_FMT_FLAG_CSI2;
496 		else
497 			flag = MT9M114_FMT_FLAG_PARALLEL;
498 
499 		for (i = 0; i < num_formats; ++i) {
500 			const struct mt9m114_format_info *info =
501 				&mt9m114_format_infos[i];
502 
503 			if (info->code == code && info->flags & flag)
504 				return info;
505 		}
506 
507 		return mt9m114_default_format_info(sensor);
508 
509 	default:
510 		return NULL;
511 	}
512 }
513 
514 /* -----------------------------------------------------------------------------
515  * Initialization
516  */
517 
518 static const struct cci_reg_sequence mt9m114_init[] = {
519 	{ MT9M114_RESET_REGISTER, MT9M114_RESET_REGISTER_MASK_BAD |
520 				  MT9M114_RESET_REGISTER_LOCK_REG |
521 				  0x0010 },
522 
523 	/* Sensor optimization */
524 	{ CCI_REG16(0x316a), 0x8270 },
525 	{ CCI_REG16(0x316c), 0x8270 },
526 	{ CCI_REG16(0x3ed0), 0x2305 },
527 	{ CCI_REG16(0x3ed2), 0x77cf },
528 	{ CCI_REG16(0x316e), 0x8202 },
529 	{ CCI_REG16(0x3180), 0x87ff },
530 	{ CCI_REG16(0x30d4), 0x6080 },
531 	{ CCI_REG16(0xa802), 0x0008 },
532 
533 	{ CCI_REG16(0x3e14), 0xff39 },
534 
535 	/* APGA */
536 	{ MT9M114_CAM_PGA_PGA_CONTROL,			0x0000 },
537 
538 	/* Automatic White balance */
539 	{ MT9M114_CAM_AWB_CCM_L(0),			0x0267 },
540 	{ MT9M114_CAM_AWB_CCM_L(1),			0xff1a },
541 	{ MT9M114_CAM_AWB_CCM_L(2),			0xffb3 },
542 	{ MT9M114_CAM_AWB_CCM_L(3),			0xff80 },
543 	{ MT9M114_CAM_AWB_CCM_L(4),			0x0166 },
544 	{ MT9M114_CAM_AWB_CCM_L(5),			0x0003 },
545 	{ MT9M114_CAM_AWB_CCM_L(6),			0xff9a },
546 	{ MT9M114_CAM_AWB_CCM_L(7),			0xfeb4 },
547 	{ MT9M114_CAM_AWB_CCM_L(8),			0x024d },
548 	{ MT9M114_CAM_AWB_CCM_M(0),			0x01bf },
549 	{ MT9M114_CAM_AWB_CCM_M(1),			0xff01 },
550 	{ MT9M114_CAM_AWB_CCM_M(2),			0xfff3 },
551 	{ MT9M114_CAM_AWB_CCM_M(3),			0xff75 },
552 	{ MT9M114_CAM_AWB_CCM_M(4),			0x0198 },
553 	{ MT9M114_CAM_AWB_CCM_M(5),			0xfffd },
554 	{ MT9M114_CAM_AWB_CCM_M(6),			0xff9a },
555 	{ MT9M114_CAM_AWB_CCM_M(7),			0xfee7 },
556 	{ MT9M114_CAM_AWB_CCM_M(8),			0x02a8 },
557 	{ MT9M114_CAM_AWB_CCM_R(0),			0x01d9 },
558 	{ MT9M114_CAM_AWB_CCM_R(1),			0xff26 },
559 	{ MT9M114_CAM_AWB_CCM_R(2),			0xfff3 },
560 	{ MT9M114_CAM_AWB_CCM_R(3),			0xffb3 },
561 	{ MT9M114_CAM_AWB_CCM_R(4),			0x0132 },
562 	{ MT9M114_CAM_AWB_CCM_R(5),			0xffe8 },
563 	{ MT9M114_CAM_AWB_CCM_R(6),			0xffda },
564 	{ MT9M114_CAM_AWB_CCM_R(7),			0xfecd },
565 	{ MT9M114_CAM_AWB_CCM_R(8),			0x02c2 },
566 	{ MT9M114_CAM_AWB_CCM_L_RG_GAIN,		0x0075 },
567 	{ MT9M114_CAM_AWB_CCM_L_BG_GAIN,		0x011c },
568 	{ MT9M114_CAM_AWB_CCM_M_RG_GAIN,		0x009a },
569 	{ MT9M114_CAM_AWB_CCM_M_BG_GAIN,		0x0105 },
570 	{ MT9M114_CAM_AWB_CCM_R_RG_GAIN,		0x00a4 },
571 	{ MT9M114_CAM_AWB_CCM_R_BG_GAIN,		0x00ac },
572 	{ MT9M114_CAM_AWB_CCM_L_CTEMP,			0x0a8c },
573 	{ MT9M114_CAM_AWB_CCM_M_CTEMP,			0x0f0a },
574 	{ MT9M114_CAM_AWB_CCM_R_CTEMP,			0x1964 },
575 	{ MT9M114_CAM_AWB_AWB_XSHIFT_PRE_ADJ,		51 },
576 	{ MT9M114_CAM_AWB_AWB_YSHIFT_PRE_ADJ,		60 },
577 	{ MT9M114_CAM_AWB_AWB_XSCALE,			3 },
578 	{ MT9M114_CAM_AWB_AWB_YSCALE,			2 },
579 	{ MT9M114_CAM_AWB_AWB_WEIGHTS(0),		0x0000 },
580 	{ MT9M114_CAM_AWB_AWB_WEIGHTS(1),		0x0000 },
581 	{ MT9M114_CAM_AWB_AWB_WEIGHTS(2),		0x0000 },
582 	{ MT9M114_CAM_AWB_AWB_WEIGHTS(3),		0xe724 },
583 	{ MT9M114_CAM_AWB_AWB_WEIGHTS(4),		0x1583 },
584 	{ MT9M114_CAM_AWB_AWB_WEIGHTS(5),		0x2045 },
585 	{ MT9M114_CAM_AWB_AWB_WEIGHTS(6),		0x03ff },
586 	{ MT9M114_CAM_AWB_AWB_WEIGHTS(7),		0x007c },
587 	{ MT9M114_CAM_AWB_K_R_L,			0x80 },
588 	{ MT9M114_CAM_AWB_K_G_L,			0x80 },
589 	{ MT9M114_CAM_AWB_K_B_L,			0x80 },
590 	{ MT9M114_CAM_AWB_K_R_R,			0x88 },
591 	{ MT9M114_CAM_AWB_K_G_R,			0x80 },
592 	{ MT9M114_CAM_AWB_K_B_R,			0x80 },
593 
594 	/* Low-Light Image Enhancements */
595 	{ MT9M114_CAM_LL_START_BRIGHTNESS,		0x0020 },
596 	{ MT9M114_CAM_LL_STOP_BRIGHTNESS,		0x009a },
597 	{ MT9M114_CAM_LL_START_GAIN_METRIC,		0x0070 },
598 	{ MT9M114_CAM_LL_STOP_GAIN_METRIC,		0x00f3 },
599 	{ MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE, 0x20 },
600 	{ MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE,	0x9a },
601 	{ MT9M114_CAM_LL_START_SATURATION,		0x80 },
602 	{ MT9M114_CAM_LL_END_SATURATION,		0x4b },
603 	{ MT9M114_CAM_LL_START_DESATURATION,		0x00 },
604 	{ MT9M114_CAM_LL_END_DESATURATION,		0xff },
605 	{ MT9M114_CAM_LL_START_DEMOSAICING,		0x3c },
606 	{ MT9M114_CAM_LL_START_AP_GAIN,			0x02 },
607 	{ MT9M114_CAM_LL_START_AP_THRESH,		0x06 },
608 	{ MT9M114_CAM_LL_STOP_DEMOSAICING,		0x64 },
609 	{ MT9M114_CAM_LL_STOP_AP_GAIN,			0x01 },
610 	{ MT9M114_CAM_LL_STOP_AP_THRESH,		0x0c },
611 	{ MT9M114_CAM_LL_START_NR_RED,			0x3c },
612 	{ MT9M114_CAM_LL_START_NR_GREEN,		0x3c },
613 	{ MT9M114_CAM_LL_START_NR_BLUE,			0x3c },
614 	{ MT9M114_CAM_LL_START_NR_THRESH,		0x0f },
615 	{ MT9M114_CAM_LL_STOP_NR_RED,			0x64 },
616 	{ MT9M114_CAM_LL_STOP_NR_GREEN,			0x64 },
617 	{ MT9M114_CAM_LL_STOP_NR_BLUE,			0x64 },
618 	{ MT9M114_CAM_LL_STOP_NR_THRESH,		0x32 },
619 	{ MT9M114_CAM_LL_START_CONTRAST_BM,		0x0020 },
620 	{ MT9M114_CAM_LL_STOP_CONTRAST_BM,		0x009a },
621 	{ MT9M114_CAM_LL_GAMMA,				0x00dc },
622 	{ MT9M114_CAM_LL_START_CONTRAST_GRADIENT,	0x38 },
623 	{ MT9M114_CAM_LL_STOP_CONTRAST_GRADIENT,	0x30 },
624 	{ MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE, 0x50 },
625 	{ MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE,	0x19 },
626 	{ MT9M114_CAM_LL_START_FADE_TO_BLACK_LUMA,	0x0230 },
627 	{ MT9M114_CAM_LL_STOP_FADE_TO_BLACK_LUMA,	0x0010 },
628 	{ MT9M114_CAM_LL_CLUSTER_DC_TH_BM,		0x01cd },
629 	{ MT9M114_CAM_LL_CLUSTER_DC_GATE_PERCENTAGE,	0x05 },
630 	{ MT9M114_CAM_LL_SUMMING_SENSITIVITY_FACTOR,	0x40 },
631 
632 	/* Auto-Exposure */
633 	{ MT9M114_CAM_AET_TARGET_AVERAGE_LUMA_DARK,	0x1b },
634 	{ MT9M114_CAM_AET_AEMODE,			0x00 },
635 	{ MT9M114_CAM_AET_TARGET_GAIN,			0x0080 },
636 	{ MT9M114_CAM_AET_AE_MAX_VIRT_AGAIN,		0x0100 },
637 	{ MT9M114_CAM_AET_BLACK_CLIPPING_TARGET,	0x005a },
638 
639 	{ MT9M114_CCM_DELTA_GAIN,			0x05 },
640 	{ MT9M114_AE_TRACK_AE_TRACKING_DAMPENING_SPEED,	0x20 },
641 
642 	/* Pixel array timings and integration time */
643 	{ MT9M114_CAM_SENSOR_CFG_ROW_SPEED,		1 },
644 	{ MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MIN,	219 },
645 	{ MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX,	1459 },
646 	{ MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION,	96 },
647 	{ MT9M114_CAM_SENSOR_CFG_REG_0_DATA,		32 },
648 
649 	/* Miscellaneous settings */
650 	{ MT9M114_PAD_SLEW,				0x0777 },
651 };
652 
653 /* -----------------------------------------------------------------------------
654  * Hardware Configuration
655  */
656 
657 /* Wait for a command to complete. */
658 static int mt9m114_poll_command(struct mt9m114 *sensor, u32 command)
659 {
660 	unsigned int i;
661 	u64 value;
662 	int ret;
663 
664 	for (i = 0; i < 100; ++i) {
665 		ret = cci_read(sensor->regmap, MT9M114_COMMAND_REGISTER, &value,
666 			       NULL);
667 		if (ret < 0)
668 			return ret;
669 
670 		if (!(value & command))
671 			break;
672 
673 		usleep_range(5000, 6000);
674 	}
675 
676 	if (value & command) {
677 		dev_err(&sensor->client->dev, "Command %u completion timeout\n",
678 			command);
679 		return -ETIMEDOUT;
680 	}
681 
682 	if (!(value & MT9M114_COMMAND_REGISTER_OK)) {
683 		dev_err(&sensor->client->dev, "Command %u failed\n", command);
684 		return -EIO;
685 	}
686 
687 	return 0;
688 }
689 
690 /* Wait for a state to be entered. */
691 static int mt9m114_poll_state(struct mt9m114 *sensor, u32 state)
692 {
693 	unsigned int i;
694 	u64 value;
695 	int ret;
696 
697 	for (i = 0; i < 100; ++i) {
698 		ret = cci_read(sensor->regmap, MT9M114_SYSMGR_CURRENT_STATE,
699 			       &value, NULL);
700 		if (ret < 0)
701 			return ret;
702 
703 		if (value == state)
704 			return 0;
705 
706 		usleep_range(1000, 1500);
707 	}
708 
709 	dev_err(&sensor->client->dev, "Timeout waiting for state 0x%02x\n",
710 		state);
711 	return -ETIMEDOUT;
712 }
713 
714 static int mt9m114_set_state(struct mt9m114 *sensor, u8 next_state)
715 {
716 	int ret = 0;
717 
718 	/* Set the next desired state and start the state transition. */
719 	cci_write(sensor->regmap, MT9M114_SYSMGR_NEXT_STATE, next_state, &ret);
720 	cci_write(sensor->regmap, MT9M114_COMMAND_REGISTER,
721 		  MT9M114_COMMAND_REGISTER_OK |
722 		  MT9M114_COMMAND_REGISTER_SET_STATE, &ret);
723 	if (ret < 0)
724 		return ret;
725 
726 	/* Wait for the state transition to complete. */
727 	ret = mt9m114_poll_command(sensor, MT9M114_COMMAND_REGISTER_SET_STATE);
728 	if (ret < 0)
729 		return ret;
730 
731 	return 0;
732 }
733 
734 static int mt9m114_initialize(struct mt9m114 *sensor)
735 {
736 	u32 value;
737 	int ret;
738 
739 	ret = cci_multi_reg_write(sensor->regmap, mt9m114_init,
740 				  ARRAY_SIZE(mt9m114_init), NULL);
741 	if (ret < 0) {
742 		dev_err(&sensor->client->dev,
743 			"Failed to initialize the sensor\n");
744 		return ret;
745 	}
746 
747 	/* Configure the PLL. */
748 	if (sensor->bypass_pll) {
749 		cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_ENABLE,
750 			  MT9M114_CAM_SYSCTL_PLL_DISABLE_VALUE, &ret);
751 	} else {
752 		cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_ENABLE,
753 			  MT9M114_CAM_SYSCTL_PLL_ENABLE_VALUE, &ret);
754 		cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_DIVIDER_M_N,
755 			  MT9M114_CAM_SYSCTL_PLL_DIVIDER_VALUE(sensor->pll.m,
756 							       sensor->pll.n),
757 			  &ret);
758 		cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_DIVIDER_P,
759 			  MT9M114_CAM_SYSCTL_PLL_DIVIDER_P_VALUE(sensor->pll.p),
760 			  &ret);
761 	}
762 
763 	cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_PIXCLK,
764 		  sensor->pixrate, &ret);
765 
766 	/* Configure the output mode. */
767 	if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) {
768 		value = MT9M114_CAM_PORT_PORT_SELECT_MIPI
769 		      | MT9M114_CAM_PORT_CHAN_NUM(0)
770 		      | 0x8000;
771 		if (!(sensor->bus_cfg.bus.mipi_csi2.flags &
772 		      V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK))
773 			value |= MT9M114_CAM_PORT_CONT_MIPI_CLK;
774 	} else {
775 		value = MT9M114_CAM_PORT_PORT_SELECT_PARALLEL
776 		      | 0x8000;
777 	}
778 	cci_write(sensor->regmap, MT9M114_CAM_PORT_OUTPUT_CONTROL, value, &ret);
779 	if (ret < 0)
780 		return ret;
781 
782 	ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE);
783 	if (ret < 0)
784 		return ret;
785 
786 	ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_SUSPEND);
787 	if (ret < 0)
788 		return ret;
789 
790 	return 0;
791 }
792 
793 static int mt9m114_configure_pa(struct mt9m114 *sensor,
794 				struct v4l2_subdev_state *state)
795 {
796 	const struct v4l2_mbus_framefmt *format;
797 	const struct v4l2_rect *crop;
798 	unsigned int hratio, vratio;
799 	u64 read_mode;
800 	int ret;
801 
802 	format = v4l2_subdev_state_get_format(state, 0);
803 	crop = v4l2_subdev_state_get_crop(state, 0);
804 
805 	ret = cci_read(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_READ_MODE,
806 		       &read_mode, NULL);
807 	if (ret < 0)
808 		return ret;
809 
810 	hratio = crop->width / format->width;
811 	vratio = crop->height / format->height;
812 
813 	/*
814 	 * Pixel array crop and binning. The CAM_SENSOR_CFG_CPIPE_LAST_ROW
815 	 * register isn't clearly documented, but is always set to the number
816 	 * of active rows minus 4 divided by the vertical binning factor in all
817 	 * example sensor modes.
818 	 */
819 	cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_X_ADDR_START,
820 		  crop->left, &ret);
821 	cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_Y_ADDR_START,
822 		  crop->top, &ret);
823 	cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_X_ADDR_END,
824 		  crop->width + crop->left - 1, &ret);
825 	cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_Y_ADDR_END,
826 		  crop->height + crop->top - 1, &ret);
827 	cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW,
828 		  (crop->height - 4) / vratio - 1, &ret);
829 
830 	read_mode &= ~(MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_MASK |
831 		       MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_MASK);
832 
833 	if (hratio > 1)
834 		read_mode |= MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SUMMING;
835 	if (vratio > 1)
836 		read_mode |= MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SUMMING;
837 
838 	cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_READ_MODE,
839 		  read_mode, &ret);
840 
841 	return ret;
842 }
843 
844 static int mt9m114_configure_ifp(struct mt9m114 *sensor,
845 				 struct v4l2_subdev_state *state)
846 {
847 	const struct mt9m114_format_info *info;
848 	const struct v4l2_mbus_framefmt *format;
849 	const struct v4l2_rect *crop;
850 	const struct v4l2_rect *compose;
851 	u64 output_format;
852 	int ret = 0;
853 
854 	format = v4l2_subdev_state_get_format(state, 1);
855 	info = mt9m114_format_info(sensor, 1, format->code);
856 	crop = v4l2_subdev_state_get_crop(state, 0);
857 	compose = v4l2_subdev_state_get_compose(state, 0);
858 
859 	ret = cci_read(sensor->regmap, MT9M114_CAM_OUTPUT_FORMAT,
860 		       &output_format, NULL);
861 	if (ret < 0)
862 		return ret;
863 
864 	/*
865 	 * Color pipeline (IFP) cropping and scaling. Subtract 4 from the left
866 	 * and top coordinates to compensate for the lines and columns removed
867 	 * by demosaicing that are taken into account in the crop rectangle but
868 	 * not in the hardware.
869 	 */
870 	cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_XOFFSET,
871 		  crop->left - 4, &ret);
872 	cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_YOFFSET,
873 		  crop->top - 4, &ret);
874 	cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_WIDTH,
875 		  crop->width, &ret);
876 	cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_HEIGHT,
877 		  crop->height, &ret);
878 
879 	cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_WIDTH,
880 		  compose->width, &ret);
881 	cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_HEIGHT,
882 		  compose->height, &ret);
883 
884 	/* AWB and AE windows, use the full frame. */
885 	cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART,
886 		  0, &ret);
887 	cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART,
888 		  0, &ret);
889 	cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND,
890 		  compose->width - 1, &ret);
891 	cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YEND,
892 		  compose->height - 1, &ret);
893 
894 	cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XSTART,
895 		  0, &ret);
896 	cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YSTART,
897 		  0, &ret);
898 	cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XEND,
899 		  compose->width / 5 - 1, &ret);
900 	cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YEND,
901 		  compose->height / 5 - 1, &ret);
902 
903 	cci_write(sensor->regmap, MT9M114_CAM_CROP_CROPMODE,
904 		  MT9M114_CAM_CROP_MODE_AWB_AUTO_CROP_EN |
905 		  MT9M114_CAM_CROP_MODE_AE_AUTO_CROP_EN, &ret);
906 
907 	/* Set the media bus code. */
908 	output_format &= ~(MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_MASK |
909 			   MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_MASK |
910 			   MT9M114_CAM_OUTPUT_FORMAT_FORMAT_MASK |
911 			   MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES |
912 			   MT9M114_CAM_OUTPUT_FORMAT_SWAP_RED_BLUE);
913 	output_format |= info->output_format;
914 
915 	cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_FORMAT,
916 		  output_format, &ret);
917 
918 	return ret;
919 }
920 
921 static int mt9m114_set_frame_rate(struct mt9m114 *sensor)
922 {
923 	u16 frame_rate = sensor->ifp.frame_rate << 8;
924 	int ret = 0;
925 
926 	cci_write(sensor->regmap, MT9M114_CAM_AET_MIN_FRAME_RATE,
927 		  frame_rate, &ret);
928 	cci_write(sensor->regmap, MT9M114_CAM_AET_MAX_FRAME_RATE,
929 		  frame_rate, &ret);
930 
931 	return ret;
932 }
933 
934 static int mt9m114_start_streaming(struct mt9m114 *sensor,
935 				   struct v4l2_subdev_state *pa_state,
936 				   struct v4l2_subdev_state *ifp_state)
937 {
938 	int ret;
939 
940 	ret = pm_runtime_resume_and_get(&sensor->client->dev);
941 	if (ret)
942 		return ret;
943 
944 	ret = mt9m114_configure_ifp(sensor, ifp_state);
945 	if (ret)
946 		goto error;
947 
948 	ret = mt9m114_configure_pa(sensor, pa_state);
949 	if (ret)
950 		goto error;
951 
952 	ret = mt9m114_set_frame_rate(sensor);
953 	if (ret)
954 		goto error;
955 
956 	ret = __v4l2_ctrl_handler_setup(&sensor->pa.hdl);
957 	if (ret)
958 		goto error;
959 
960 	ret = __v4l2_ctrl_handler_setup(&sensor->ifp.hdl);
961 	if (ret)
962 		goto error;
963 
964 	/*
965 	 * The Change-Config state is transient and moves to the streaming
966 	 * state automatically.
967 	 */
968 	ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE);
969 	if (ret)
970 		goto error;
971 
972 	sensor->streaming = true;
973 
974 	return 0;
975 
976 error:
977 	pm_runtime_mark_last_busy(&sensor->client->dev);
978 	pm_runtime_put_autosuspend(&sensor->client->dev);
979 
980 	return ret;
981 }
982 
983 static int mt9m114_stop_streaming(struct mt9m114 *sensor)
984 {
985 	int ret;
986 
987 	sensor->streaming = false;
988 
989 	ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_SUSPEND);
990 
991 	pm_runtime_mark_last_busy(&sensor->client->dev);
992 	pm_runtime_put_autosuspend(&sensor->client->dev);
993 
994 	return ret;
995 }
996 
997 /* -----------------------------------------------------------------------------
998  * Common Subdev Operations
999  */
1000 
1001 static const struct media_entity_operations mt9m114_entity_ops = {
1002 	.link_validate = v4l2_subdev_link_validate,
1003 };
1004 
1005 /* -----------------------------------------------------------------------------
1006  * Pixel Array Control Operations
1007  */
1008 
1009 static inline struct mt9m114 *pa_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl)
1010 {
1011 	return container_of(ctrl->handler, struct mt9m114, pa.hdl);
1012 }
1013 
1014 static int mt9m114_pa_g_ctrl(struct v4l2_ctrl *ctrl)
1015 {
1016 	struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl);
1017 	u64 value;
1018 	int ret;
1019 
1020 	if (!pm_runtime_get_if_in_use(&sensor->client->dev))
1021 		return 0;
1022 
1023 	switch (ctrl->id) {
1024 	case V4L2_CID_EXPOSURE:
1025 		ret = cci_read(sensor->regmap,
1026 			       MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME,
1027 			       &value, NULL);
1028 		if (ret)
1029 			break;
1030 
1031 		ctrl->val = value;
1032 		break;
1033 
1034 	case V4L2_CID_ANALOGUE_GAIN:
1035 		ret = cci_read(sensor->regmap,
1036 			       MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN,
1037 			       &value, NULL);
1038 		if (ret)
1039 			break;
1040 
1041 		ctrl->val = value;
1042 		break;
1043 
1044 	default:
1045 		ret = -EINVAL;
1046 		break;
1047 	}
1048 
1049 	pm_runtime_mark_last_busy(&sensor->client->dev);
1050 	pm_runtime_put_autosuspend(&sensor->client->dev);
1051 
1052 	return ret;
1053 }
1054 
1055 static int mt9m114_pa_s_ctrl(struct v4l2_ctrl *ctrl)
1056 {
1057 	struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl);
1058 	const struct v4l2_mbus_framefmt *format;
1059 	struct v4l2_subdev_state *state;
1060 	int ret = 0;
1061 	u64 mask;
1062 
1063 	/* V4L2 controls values are applied only when power is up. */
1064 	if (!pm_runtime_get_if_in_use(&sensor->client->dev))
1065 		return 0;
1066 
1067 	state = v4l2_subdev_get_locked_active_state(&sensor->pa.sd);
1068 	format = v4l2_subdev_state_get_format(state, 0);
1069 
1070 	switch (ctrl->id) {
1071 	case V4L2_CID_HBLANK:
1072 		cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK,
1073 			  ctrl->val + format->width, &ret);
1074 		break;
1075 
1076 	case V4L2_CID_VBLANK:
1077 		cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES,
1078 			  ctrl->val + format->height, &ret);
1079 		break;
1080 
1081 	case V4L2_CID_EXPOSURE:
1082 		cci_write(sensor->regmap,
1083 			  MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME,
1084 			  ctrl->val, &ret);
1085 		break;
1086 
1087 	case V4L2_CID_ANALOGUE_GAIN:
1088 		/*
1089 		 * The CAM_SENSOR_CONTROL_ANALOG_GAIN contains linear analog
1090 		 * gain values that are mapped to the GLOBAL_GAIN register
1091 		 * values by the sensor firmware.
1092 		 */
1093 		cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN,
1094 			  ctrl->val, &ret);
1095 		break;
1096 
1097 	case V4L2_CID_HFLIP:
1098 		mask = MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN;
1099 		ret = cci_update_bits(sensor->regmap,
1100 				      MT9M114_CAM_SENSOR_CONTROL_READ_MODE,
1101 				      mask, ctrl->val ? mask : 0, NULL);
1102 		break;
1103 
1104 	case V4L2_CID_VFLIP:
1105 		mask = MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN;
1106 		ret = cci_update_bits(sensor->regmap,
1107 				      MT9M114_CAM_SENSOR_CONTROL_READ_MODE,
1108 				      mask, ctrl->val ? mask : 0, NULL);
1109 		break;
1110 
1111 	default:
1112 		ret = -EINVAL;
1113 		break;
1114 	}
1115 
1116 	pm_runtime_mark_last_busy(&sensor->client->dev);
1117 	pm_runtime_put_autosuspend(&sensor->client->dev);
1118 
1119 	return ret;
1120 }
1121 
1122 static const struct v4l2_ctrl_ops mt9m114_pa_ctrl_ops = {
1123 	.g_volatile_ctrl = mt9m114_pa_g_ctrl,
1124 	.s_ctrl = mt9m114_pa_s_ctrl,
1125 };
1126 
1127 static void mt9m114_pa_ctrl_update_exposure(struct mt9m114 *sensor, bool manual)
1128 {
1129 	/*
1130 	 * Update the volatile flag on the manual exposure and gain controls.
1131 	 * If the controls have switched to manual, read their current value
1132 	 * from the hardware to ensure that control read and write operations
1133 	 * will behave correctly
1134 	 */
1135 	if (manual) {
1136 		mt9m114_pa_g_ctrl(sensor->pa.exposure);
1137 		sensor->pa.exposure->cur.val = sensor->pa.exposure->val;
1138 		sensor->pa.exposure->flags &= ~V4L2_CTRL_FLAG_VOLATILE;
1139 
1140 		mt9m114_pa_g_ctrl(sensor->pa.gain);
1141 		sensor->pa.gain->cur.val = sensor->pa.gain->val;
1142 		sensor->pa.gain->flags &= ~V4L2_CTRL_FLAG_VOLATILE;
1143 	} else {
1144 		sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
1145 		sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
1146 	}
1147 }
1148 
1149 static void mt9m114_pa_ctrl_update_blanking(struct mt9m114 *sensor,
1150 					    const struct v4l2_mbus_framefmt *format)
1151 {
1152 	unsigned int max_blank;
1153 
1154 	/* Update the blanking controls ranges based on the output size. */
1155 	max_blank = MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX
1156 		  - format->width;
1157 	__v4l2_ctrl_modify_range(sensor->pa.hblank, MT9M114_MIN_HBLANK,
1158 				 max_blank, 1, MT9M114_DEF_HBLANK);
1159 
1160 	max_blank = MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX
1161 		  - format->height;
1162 	__v4l2_ctrl_modify_range(sensor->pa.vblank, MT9M114_MIN_VBLANK,
1163 				 max_blank, 1, MT9M114_DEF_VBLANK);
1164 }
1165 
1166 /* -----------------------------------------------------------------------------
1167  * Pixel Array Subdev Operations
1168  */
1169 
1170 static inline struct mt9m114 *pa_to_mt9m114(struct v4l2_subdev *sd)
1171 {
1172 	return container_of(sd, struct mt9m114, pa.sd);
1173 }
1174 
1175 static int mt9m114_pa_init_state(struct v4l2_subdev *sd,
1176 				 struct v4l2_subdev_state *state)
1177 {
1178 	struct v4l2_mbus_framefmt *format;
1179 	struct v4l2_rect *crop;
1180 
1181 	crop = v4l2_subdev_state_get_crop(state, 0);
1182 
1183 	crop->left = 0;
1184 	crop->top = 0;
1185 	crop->width = MT9M114_PIXEL_ARRAY_WIDTH;
1186 	crop->height = MT9M114_PIXEL_ARRAY_HEIGHT;
1187 
1188 	format = v4l2_subdev_state_get_format(state, 0);
1189 
1190 	format->width = MT9M114_PIXEL_ARRAY_WIDTH;
1191 	format->height = MT9M114_PIXEL_ARRAY_HEIGHT;
1192 	format->code = MEDIA_BUS_FMT_SGRBG10_1X10;
1193 	format->field = V4L2_FIELD_NONE;
1194 	format->colorspace = V4L2_COLORSPACE_RAW;
1195 	format->ycbcr_enc = V4L2_YCBCR_ENC_601;
1196 	format->quantization = V4L2_QUANTIZATION_FULL_RANGE;
1197 	format->xfer_func = V4L2_XFER_FUNC_NONE;
1198 
1199 	return 0;
1200 }
1201 
1202 static int mt9m114_pa_enum_mbus_code(struct v4l2_subdev *sd,
1203 				     struct v4l2_subdev_state *state,
1204 				     struct v4l2_subdev_mbus_code_enum *code)
1205 {
1206 	if (code->index > 0)
1207 		return -EINVAL;
1208 
1209 	code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
1210 
1211 	return 0;
1212 }
1213 
1214 static int mt9m114_pa_enum_framesizes(struct v4l2_subdev *sd,
1215 				      struct v4l2_subdev_state *state,
1216 				      struct v4l2_subdev_frame_size_enum *fse)
1217 {
1218 	if (fse->index > 1)
1219 		return -EINVAL;
1220 
1221 	if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
1222 		return -EINVAL;
1223 
1224 	/* Report binning capability through frame size enumeration. */
1225 	fse->min_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1);
1226 	fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1);
1227 	fse->min_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1);
1228 	fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1);
1229 
1230 	return 0;
1231 }
1232 
1233 static int mt9m114_pa_set_fmt(struct v4l2_subdev *sd,
1234 			      struct v4l2_subdev_state *state,
1235 			      struct v4l2_subdev_format *fmt)
1236 {
1237 	struct mt9m114 *sensor = pa_to_mt9m114(sd);
1238 	struct v4l2_mbus_framefmt *format;
1239 	struct v4l2_rect *crop;
1240 	unsigned int hscale;
1241 	unsigned int vscale;
1242 
1243 	crop = v4l2_subdev_state_get_crop(state, fmt->pad);
1244 	format = v4l2_subdev_state_get_format(state, fmt->pad);
1245 
1246 	/* The sensor can bin horizontally and vertically. */
1247 	hscale = DIV_ROUND_CLOSEST(crop->width, fmt->format.width ? : 1);
1248 	vscale = DIV_ROUND_CLOSEST(crop->height, fmt->format.height ? : 1);
1249 	format->width = crop->width / clamp(hscale, 1U, 2U);
1250 	format->height = crop->height / clamp(vscale, 1U, 2U);
1251 
1252 	fmt->format = *format;
1253 
1254 	if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE)
1255 		mt9m114_pa_ctrl_update_blanking(sensor, format);
1256 
1257 	return 0;
1258 }
1259 
1260 static int mt9m114_pa_get_selection(struct v4l2_subdev *sd,
1261 				    struct v4l2_subdev_state *state,
1262 				    struct v4l2_subdev_selection *sel)
1263 {
1264 	switch (sel->target) {
1265 	case V4L2_SEL_TGT_CROP:
1266 		sel->r = *v4l2_subdev_state_get_crop(state, sel->pad);
1267 		return 0;
1268 
1269 	case V4L2_SEL_TGT_CROP_DEFAULT:
1270 	case V4L2_SEL_TGT_CROP_BOUNDS:
1271 	case V4L2_SEL_TGT_NATIVE_SIZE:
1272 		sel->r.left = 0;
1273 		sel->r.top = 0;
1274 		sel->r.width = MT9M114_PIXEL_ARRAY_WIDTH;
1275 		sel->r.height = MT9M114_PIXEL_ARRAY_HEIGHT;
1276 		return 0;
1277 
1278 	default:
1279 		return -EINVAL;
1280 	}
1281 }
1282 
1283 static int mt9m114_pa_set_selection(struct v4l2_subdev *sd,
1284 				    struct v4l2_subdev_state *state,
1285 				    struct v4l2_subdev_selection *sel)
1286 {
1287 	struct mt9m114 *sensor = pa_to_mt9m114(sd);
1288 	struct v4l2_mbus_framefmt *format;
1289 	struct v4l2_rect *crop;
1290 
1291 	if (sel->target != V4L2_SEL_TGT_CROP)
1292 		return -EINVAL;
1293 
1294 	crop = v4l2_subdev_state_get_crop(state, sel->pad);
1295 	format = v4l2_subdev_state_get_format(state, sel->pad);
1296 
1297 	/*
1298 	 * Clamp the crop rectangle. The vertical coordinates must be even, and
1299 	 * the horizontal coordinates must be a multiple of 4.
1300 	 *
1301 	 * FIXME: The horizontal coordinates must be a multiple of 8 when
1302 	 * binning, but binning is configured after setting the selection, so
1303 	 * we can't know tell here if it will be used.
1304 	 */
1305 	crop->left = ALIGN(sel->r.left, 4);
1306 	crop->top = ALIGN(sel->r.top, 2);
1307 	crop->width = clamp_t(unsigned int, ALIGN(sel->r.width, 4),
1308 			      MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH,
1309 			      MT9M114_PIXEL_ARRAY_WIDTH - crop->left);
1310 	crop->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
1311 			       MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT,
1312 			       MT9M114_PIXEL_ARRAY_HEIGHT - crop->top);
1313 
1314 	sel->r = *crop;
1315 
1316 	/* Reset the format. */
1317 	format->width = crop->width;
1318 	format->height = crop->height;
1319 
1320 	if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE)
1321 		mt9m114_pa_ctrl_update_blanking(sensor, format);
1322 
1323 	return 0;
1324 }
1325 
1326 static const struct v4l2_subdev_pad_ops mt9m114_pa_pad_ops = {
1327 	.enum_mbus_code = mt9m114_pa_enum_mbus_code,
1328 	.enum_frame_size = mt9m114_pa_enum_framesizes,
1329 	.get_fmt = v4l2_subdev_get_fmt,
1330 	.set_fmt = mt9m114_pa_set_fmt,
1331 	.get_selection = mt9m114_pa_get_selection,
1332 	.set_selection = mt9m114_pa_set_selection,
1333 };
1334 
1335 static const struct v4l2_subdev_ops mt9m114_pa_ops = {
1336 	.pad = &mt9m114_pa_pad_ops,
1337 };
1338 
1339 static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops = {
1340 	.init_state = mt9m114_pa_init_state,
1341 };
1342 
1343 static int mt9m114_pa_init(struct mt9m114 *sensor)
1344 {
1345 	struct v4l2_ctrl_handler *hdl = &sensor->pa.hdl;
1346 	struct v4l2_subdev *sd = &sensor->pa.sd;
1347 	struct media_pad *pads = &sensor->pa.pad;
1348 	const struct v4l2_mbus_framefmt *format;
1349 	struct v4l2_subdev_state *state;
1350 	unsigned int max_exposure;
1351 	int ret;
1352 
1353 	/* Initialize the subdev. */
1354 	v4l2_subdev_init(sd, &mt9m114_pa_ops);
1355 	sd->internal_ops = &mt9m114_pa_internal_ops;
1356 	v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " pixel array");
1357 
1358 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1359 	sd->owner = THIS_MODULE;
1360 	sd->dev = &sensor->client->dev;
1361 	v4l2_set_subdevdata(sd, sensor->client);
1362 
1363 	/* Initialize the media entity. */
1364 	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
1365 	sd->entity.ops = &mt9m114_entity_ops;
1366 	pads[0].flags = MEDIA_PAD_FL_SOURCE;
1367 	ret = media_entity_pads_init(&sd->entity, 1, pads);
1368 	if (ret < 0)
1369 		return ret;
1370 
1371 	/* Initialize the control handler. */
1372 	v4l2_ctrl_handler_init(hdl, 7);
1373 
1374 	/* The range of the HBLANK and VBLANK controls will be updated below. */
1375 	sensor->pa.hblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
1376 					      V4L2_CID_HBLANK,
1377 					      MT9M114_DEF_HBLANK,
1378 					      MT9M114_DEF_HBLANK, 1,
1379 					      MT9M114_DEF_HBLANK);
1380 	sensor->pa.vblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
1381 					      V4L2_CID_VBLANK,
1382 					      MT9M114_DEF_VBLANK,
1383 					      MT9M114_DEF_VBLANK, 1,
1384 					      MT9M114_DEF_VBLANK);
1385 
1386 	/*
1387 	 * The maximum coarse integration time is the frame length in lines
1388 	 * minus two. The default is taken directly from the datasheet, but
1389 	 * makes little sense as auto-exposure is enabled by default.
1390 	 */
1391 	max_exposure = MT9M114_PIXEL_ARRAY_HEIGHT + MT9M114_MIN_VBLANK - 2;
1392 	sensor->pa.exposure = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
1393 						V4L2_CID_EXPOSURE, 1,
1394 						max_exposure, 1, 16);
1395 	if (sensor->pa.exposure)
1396 		sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
1397 
1398 	sensor->pa.gain = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
1399 					    V4L2_CID_ANALOGUE_GAIN, 1,
1400 					    511, 1, 32);
1401 	if (sensor->pa.gain)
1402 		sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
1403 
1404 	v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
1405 			  V4L2_CID_PIXEL_RATE,
1406 			  sensor->pixrate, sensor->pixrate, 1,
1407 			  sensor->pixrate);
1408 
1409 	v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
1410 			  V4L2_CID_HFLIP,
1411 			  0, 1, 1, 0);
1412 	v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
1413 			  V4L2_CID_VFLIP,
1414 			  0, 1, 1, 0);
1415 
1416 	if (hdl->error) {
1417 		ret = hdl->error;
1418 		goto error;
1419 	}
1420 
1421 	sd->state_lock = hdl->lock;
1422 
1423 	ret = v4l2_subdev_init_finalize(sd);
1424 	if (ret)
1425 		goto error;
1426 
1427 	/* Update the range of the blanking controls based on the format. */
1428 	state = v4l2_subdev_lock_and_get_active_state(sd);
1429 	format = v4l2_subdev_state_get_format(state, 0);
1430 	mt9m114_pa_ctrl_update_blanking(sensor, format);
1431 	v4l2_subdev_unlock_state(state);
1432 
1433 	sd->ctrl_handler = hdl;
1434 
1435 	return 0;
1436 
1437 error:
1438 	v4l2_ctrl_handler_free(&sensor->pa.hdl);
1439 	media_entity_cleanup(&sensor->pa.sd.entity);
1440 	return ret;
1441 }
1442 
1443 static void mt9m114_pa_cleanup(struct mt9m114 *sensor)
1444 {
1445 	v4l2_ctrl_handler_free(&sensor->pa.hdl);
1446 	media_entity_cleanup(&sensor->pa.sd.entity);
1447 }
1448 
1449 /* -----------------------------------------------------------------------------
1450  * Image Flow Processor Control Operations
1451  */
1452 
1453 static const char * const mt9m114_test_pattern_menu[] = {
1454 	"Disabled",
1455 	"Solid Color",
1456 	"100% Color Bars",
1457 	"Pseudo-Random",
1458 	"Fade-to-Gray Color Bars",
1459 	"Walking Ones 10-bit",
1460 	"Walking Ones 8-bit",
1461 };
1462 
1463 /* Keep in sync with mt9m114_test_pattern_menu */
1464 static const unsigned int mt9m114_test_pattern_value[] = {
1465 	MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID,
1466 	MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS,
1467 	MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM,
1468 	MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS,
1469 	MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B,
1470 	MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B,
1471 };
1472 
1473 static inline struct mt9m114 *ifp_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl)
1474 {
1475 	return container_of(ctrl->handler, struct mt9m114, ifp.hdl);
1476 }
1477 
1478 static int mt9m114_ifp_s_ctrl(struct v4l2_ctrl *ctrl)
1479 {
1480 	struct mt9m114 *sensor = ifp_ctrl_to_mt9m114(ctrl);
1481 	u32 value;
1482 	int ret = 0;
1483 
1484 	if (ctrl->id == V4L2_CID_EXPOSURE_AUTO)
1485 		mt9m114_pa_ctrl_update_exposure(sensor,
1486 						ctrl->val != V4L2_EXPOSURE_AUTO);
1487 
1488 	/* V4L2 controls values are applied only when power is up. */
1489 	if (!pm_runtime_get_if_in_use(&sensor->client->dev))
1490 		return 0;
1491 
1492 	switch (ctrl->id) {
1493 	case V4L2_CID_AUTO_WHITE_BALANCE:
1494 		/* Control both the AWB mode and the CCM algorithm. */
1495 		if (ctrl->val)
1496 			value = MT9M114_CAM_AWB_MODE_AUTO
1497 			      | MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE;
1498 		else
1499 			value = 0;
1500 
1501 		cci_write(sensor->regmap, MT9M114_CAM_AWB_AWBMODE, value, &ret);
1502 
1503 		if (ctrl->val)
1504 			value = MT9M114_CCM_EXEC_CALC_CCM_MATRIX | 0x22;
1505 		else
1506 			value = 0;
1507 
1508 		cci_write(sensor->regmap, MT9M114_CCM_ALGO, value, &ret);
1509 		break;
1510 
1511 	case V4L2_CID_EXPOSURE_AUTO:
1512 		if (ctrl->val == V4L2_EXPOSURE_AUTO)
1513 			value = MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE
1514 			      | 0x00fe;
1515 		else
1516 			value = 0;
1517 
1518 		cci_write(sensor->regmap, MT9M114_AE_TRACK_ALGO, value, &ret);
1519 		if (ret)
1520 			break;
1521 
1522 		break;
1523 
1524 	case V4L2_CID_TEST_PATTERN:
1525 	case V4L2_CID_TEST_PATTERN_RED:
1526 	case V4L2_CID_TEST_PATTERN_GREENR:
1527 	case V4L2_CID_TEST_PATTERN_BLUE: {
1528 		unsigned int pattern = sensor->ifp.tpg[MT9M114_TPG_PATTERN]->val;
1529 
1530 		if (pattern) {
1531 			cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT,
1532 				  MT9M114_CAM_MODE_SELECT_TEST_PATTERN, &ret);
1533 			cci_write(sensor->regmap,
1534 				  MT9M114_CAM_MODE_TEST_PATTERN_SELECT,
1535 				  mt9m114_test_pattern_value[pattern - 1], &ret);
1536 			cci_write(sensor->regmap,
1537 				  MT9M114_CAM_MODE_TEST_PATTERN_RED,
1538 				  sensor->ifp.tpg[MT9M114_TPG_RED]->val, &ret);
1539 			cci_write(sensor->regmap,
1540 				  MT9M114_CAM_MODE_TEST_PATTERN_GREEN,
1541 				  sensor->ifp.tpg[MT9M114_TPG_GREEN]->val, &ret);
1542 			cci_write(sensor->regmap,
1543 				  MT9M114_CAM_MODE_TEST_PATTERN_BLUE,
1544 				  sensor->ifp.tpg[MT9M114_TPG_BLUE]->val, &ret);
1545 		} else {
1546 			cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT,
1547 				  MT9M114_CAM_MODE_SELECT_NORMAL, &ret);
1548 		}
1549 
1550 		/*
1551 		 * A Config-Change needs to be issued for the change to take
1552 		 * effect. If we're not streaming ignore this, the change will
1553 		 * be applied when the stream is started.
1554 		 */
1555 		if (ret || !sensor->streaming)
1556 			break;
1557 
1558 		ret = mt9m114_set_state(sensor,
1559 					MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE);
1560 		break;
1561 	}
1562 
1563 	default:
1564 		ret = -EINVAL;
1565 		break;
1566 	}
1567 
1568 	pm_runtime_mark_last_busy(&sensor->client->dev);
1569 	pm_runtime_put_autosuspend(&sensor->client->dev);
1570 
1571 	return ret;
1572 }
1573 
1574 static const struct v4l2_ctrl_ops mt9m114_ifp_ctrl_ops = {
1575 	.s_ctrl = mt9m114_ifp_s_ctrl,
1576 };
1577 
1578 /* -----------------------------------------------------------------------------
1579  * Image Flow Processor Subdev Operations
1580  */
1581 
1582 static inline struct mt9m114 *ifp_to_mt9m114(struct v4l2_subdev *sd)
1583 {
1584 	return container_of(sd, struct mt9m114, ifp.sd);
1585 }
1586 
1587 static int mt9m114_ifp_s_stream(struct v4l2_subdev *sd, int enable)
1588 {
1589 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1590 	struct v4l2_subdev_state *pa_state;
1591 	struct v4l2_subdev_state *ifp_state;
1592 	int ret;
1593 
1594 	if (!enable)
1595 		return mt9m114_stop_streaming(sensor);
1596 
1597 	ifp_state = v4l2_subdev_lock_and_get_active_state(&sensor->ifp.sd);
1598 	pa_state = v4l2_subdev_lock_and_get_active_state(&sensor->pa.sd);
1599 
1600 	ret = mt9m114_start_streaming(sensor, pa_state, ifp_state);
1601 
1602 	v4l2_subdev_unlock_state(pa_state);
1603 	v4l2_subdev_unlock_state(ifp_state);
1604 
1605 	return ret;
1606 }
1607 
1608 static int mt9m114_ifp_get_frame_interval(struct v4l2_subdev *sd,
1609 					  struct v4l2_subdev_state *sd_state,
1610 					  struct v4l2_subdev_frame_interval *interval)
1611 {
1612 	struct v4l2_fract *ival = &interval->interval;
1613 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1614 
1615 	/*
1616 	 * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2
1617 	 * subdev active state API.
1618 	 */
1619 	if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE)
1620 		return -EINVAL;
1621 
1622 	ival->numerator = 1;
1623 	ival->denominator = sensor->ifp.frame_rate;
1624 
1625 	return 0;
1626 }
1627 
1628 static int mt9m114_ifp_set_frame_interval(struct v4l2_subdev *sd,
1629 					  struct v4l2_subdev_state *sd_state,
1630 					  struct v4l2_subdev_frame_interval *interval)
1631 {
1632 	struct v4l2_fract *ival = &interval->interval;
1633 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1634 	int ret = 0;
1635 
1636 	/*
1637 	 * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2
1638 	 * subdev active state API.
1639 	 */
1640 	if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE)
1641 		return -EINVAL;
1642 
1643 	if (ival->numerator != 0 && ival->denominator != 0)
1644 		sensor->ifp.frame_rate = min_t(unsigned int,
1645 					       ival->denominator / ival->numerator,
1646 					       MT9M114_MAX_FRAME_RATE);
1647 	else
1648 		sensor->ifp.frame_rate = MT9M114_MAX_FRAME_RATE;
1649 
1650 	ival->numerator = 1;
1651 	ival->denominator = sensor->ifp.frame_rate;
1652 
1653 	if (sensor->streaming)
1654 		ret = mt9m114_set_frame_rate(sensor);
1655 
1656 	return ret;
1657 }
1658 
1659 static int mt9m114_ifp_init_state(struct v4l2_subdev *sd,
1660 				  struct v4l2_subdev_state *state)
1661 {
1662 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1663 	struct v4l2_mbus_framefmt *format;
1664 	struct v4l2_rect *crop;
1665 	struct v4l2_rect *compose;
1666 
1667 	format = v4l2_subdev_state_get_format(state, 0);
1668 
1669 	format->width = MT9M114_PIXEL_ARRAY_WIDTH;
1670 	format->height = MT9M114_PIXEL_ARRAY_HEIGHT;
1671 	format->code = MEDIA_BUS_FMT_SGRBG10_1X10;
1672 	format->field = V4L2_FIELD_NONE;
1673 	format->colorspace = V4L2_COLORSPACE_RAW;
1674 	format->ycbcr_enc = V4L2_YCBCR_ENC_601;
1675 	format->quantization = V4L2_QUANTIZATION_FULL_RANGE;
1676 	format->xfer_func = V4L2_XFER_FUNC_NONE;
1677 
1678 	crop = v4l2_subdev_state_get_crop(state, 0);
1679 
1680 	crop->left = 4;
1681 	crop->top = 4;
1682 	crop->width = format->width - 8;
1683 	crop->height = format->height - 8;
1684 
1685 	compose = v4l2_subdev_state_get_compose(state, 0);
1686 
1687 	compose->left = 0;
1688 	compose->top = 0;
1689 	compose->width = crop->width;
1690 	compose->height = crop->height;
1691 
1692 	format = v4l2_subdev_state_get_format(state, 1);
1693 
1694 	format->width = compose->width;
1695 	format->height = compose->height;
1696 	format->code = mt9m114_default_format_info(sensor)->code;
1697 	format->field = V4L2_FIELD_NONE;
1698 	format->colorspace = V4L2_COLORSPACE_SRGB;
1699 	format->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
1700 	format->quantization = V4L2_QUANTIZATION_DEFAULT;
1701 	format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
1702 
1703 	return 0;
1704 }
1705 
1706 static int mt9m114_ifp_enum_mbus_code(struct v4l2_subdev *sd,
1707 				      struct v4l2_subdev_state *state,
1708 				      struct v4l2_subdev_mbus_code_enum *code)
1709 {
1710 	const unsigned int num_formats = ARRAY_SIZE(mt9m114_format_infos);
1711 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1712 	unsigned int index = 0;
1713 	unsigned int flag;
1714 	unsigned int i;
1715 
1716 	switch (code->pad) {
1717 	case 0:
1718 		if (code->index != 0)
1719 			return -EINVAL;
1720 
1721 		code->code = mt9m114_format_infos[num_formats - 1].code;
1722 		return 0;
1723 
1724 	case 1:
1725 		if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY)
1726 			flag = MT9M114_FMT_FLAG_CSI2;
1727 		else
1728 			flag = MT9M114_FMT_FLAG_PARALLEL;
1729 
1730 		for (i = 0; i < num_formats; ++i) {
1731 			const struct mt9m114_format_info *info =
1732 				&mt9m114_format_infos[i];
1733 
1734 			if (info->flags & flag) {
1735 				if (index == code->index) {
1736 					code->code = info->code;
1737 					return 0;
1738 				}
1739 
1740 				index++;
1741 			}
1742 		}
1743 
1744 		return -EINVAL;
1745 
1746 	default:
1747 		return -EINVAL;
1748 	}
1749 }
1750 
1751 static int mt9m114_ifp_enum_framesizes(struct v4l2_subdev *sd,
1752 				       struct v4l2_subdev_state *state,
1753 				       struct v4l2_subdev_frame_size_enum *fse)
1754 {
1755 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1756 	const struct mt9m114_format_info *info;
1757 
1758 	if (fse->index > 0)
1759 		return -EINVAL;
1760 
1761 	info = mt9m114_format_info(sensor, fse->pad, fse->code);
1762 	if (!info || info->code != fse->code)
1763 		return -EINVAL;
1764 
1765 	if (fse->pad == 0) {
1766 		fse->min_width = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH;
1767 		fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH;
1768 		fse->min_height = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT;
1769 		fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT;
1770 	} else {
1771 		const struct v4l2_rect *crop;
1772 
1773 		crop = v4l2_subdev_state_get_crop(state, 0);
1774 
1775 		fse->max_width = crop->width;
1776 		fse->max_height = crop->height;
1777 
1778 		fse->min_width = fse->max_width / 4;
1779 		fse->min_height = fse->max_height / 4;
1780 	}
1781 
1782 	return 0;
1783 }
1784 
1785 static int mt9m114_ifp_enum_frameintervals(struct v4l2_subdev *sd,
1786 					   struct v4l2_subdev_state *state,
1787 					   struct v4l2_subdev_frame_interval_enum *fie)
1788 {
1789 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1790 	const struct mt9m114_format_info *info;
1791 
1792 	if (fie->index > 0)
1793 		return -EINVAL;
1794 
1795 	info = mt9m114_format_info(sensor, fie->pad, fie->code);
1796 	if (!info || info->code != fie->code)
1797 		return -EINVAL;
1798 
1799 	fie->interval.numerator = 1;
1800 	fie->interval.denominator = MT9M114_MAX_FRAME_RATE;
1801 
1802 	return 0;
1803 }
1804 
1805 static int mt9m114_ifp_set_fmt(struct v4l2_subdev *sd,
1806 			       struct v4l2_subdev_state *state,
1807 			       struct v4l2_subdev_format *fmt)
1808 {
1809 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1810 	struct v4l2_mbus_framefmt *format;
1811 
1812 	format = v4l2_subdev_state_get_format(state, fmt->pad);
1813 
1814 	if (fmt->pad == 0) {
1815 		/* Only the size can be changed on the sink pad. */
1816 		format->width = clamp(ALIGN(fmt->format.width, 8),
1817 				      MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH,
1818 				      MT9M114_PIXEL_ARRAY_WIDTH);
1819 		format->height = clamp(ALIGN(fmt->format.height, 8),
1820 				       MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT,
1821 				       MT9M114_PIXEL_ARRAY_HEIGHT);
1822 	} else {
1823 		const struct mt9m114_format_info *info;
1824 
1825 		/* Only the media bus code can be changed on the source pad. */
1826 		info = mt9m114_format_info(sensor, 1, fmt->format.code);
1827 
1828 		format->code = info->code;
1829 
1830 		/* If the output format is RAW10, bypass the scaler. */
1831 		if (format->code == MEDIA_BUS_FMT_SGRBG10_1X10)
1832 			*format = *v4l2_subdev_state_get_format(state, 0);
1833 	}
1834 
1835 	fmt->format = *format;
1836 
1837 	return 0;
1838 }
1839 
1840 static int mt9m114_ifp_get_selection(struct v4l2_subdev *sd,
1841 				     struct v4l2_subdev_state *state,
1842 				     struct v4l2_subdev_selection *sel)
1843 {
1844 	const struct v4l2_mbus_framefmt *format;
1845 	const struct v4l2_rect *crop;
1846 	int ret = 0;
1847 
1848 	/* Crop and compose are only supported on the sink pad. */
1849 	if (sel->pad != 0)
1850 		return -EINVAL;
1851 
1852 	switch (sel->target) {
1853 	case V4L2_SEL_TGT_CROP:
1854 		sel->r = *v4l2_subdev_state_get_crop(state, 0);
1855 		break;
1856 
1857 	case V4L2_SEL_TGT_CROP_DEFAULT:
1858 	case V4L2_SEL_TGT_CROP_BOUNDS:
1859 		/*
1860 		 * The crop default and bounds are equal to the sink
1861 		 * format size minus 4 pixels on each side for demosaicing.
1862 		 */
1863 		format = v4l2_subdev_state_get_format(state, 0);
1864 
1865 		sel->r.left = 4;
1866 		sel->r.top = 4;
1867 		sel->r.width = format->width - 8;
1868 		sel->r.height = format->height - 8;
1869 		break;
1870 
1871 	case V4L2_SEL_TGT_COMPOSE:
1872 		sel->r = *v4l2_subdev_state_get_compose(state, 0);
1873 		break;
1874 
1875 	case V4L2_SEL_TGT_COMPOSE_DEFAULT:
1876 	case V4L2_SEL_TGT_COMPOSE_BOUNDS:
1877 		/*
1878 		 * The compose default and bounds sizes are equal to the sink
1879 		 * crop rectangle size.
1880 		 */
1881 		crop = v4l2_subdev_state_get_crop(state, 0);
1882 		sel->r.left = 0;
1883 		sel->r.top = 0;
1884 		sel->r.width = crop->width;
1885 		sel->r.height = crop->height;
1886 		break;
1887 
1888 	default:
1889 		ret = -EINVAL;
1890 		break;
1891 	}
1892 
1893 	return ret;
1894 }
1895 
1896 static int mt9m114_ifp_set_selection(struct v4l2_subdev *sd,
1897 				     struct v4l2_subdev_state *state,
1898 				     struct v4l2_subdev_selection *sel)
1899 {
1900 	struct v4l2_mbus_framefmt *format;
1901 	struct v4l2_rect *crop;
1902 	struct v4l2_rect *compose;
1903 
1904 	if (sel->target != V4L2_SEL_TGT_CROP &&
1905 	    sel->target != V4L2_SEL_TGT_COMPOSE)
1906 		return -EINVAL;
1907 
1908 	/* Crop and compose are only supported on the sink pad. */
1909 	if (sel->pad != 0)
1910 		return -EINVAL;
1911 
1912 	format = v4l2_subdev_state_get_format(state, 0);
1913 	crop = v4l2_subdev_state_get_crop(state, 0);
1914 	compose = v4l2_subdev_state_get_compose(state, 0);
1915 
1916 	if (sel->target == V4L2_SEL_TGT_CROP) {
1917 		/*
1918 		 * Clamp the crop rectangle. Demosaicing removes 4 pixels on
1919 		 * each side of the image.
1920 		 */
1921 		crop->left = clamp_t(unsigned int, ALIGN(sel->r.left, 2), 4,
1922 				     format->width - 4 -
1923 				     MT9M114_SCALER_CROPPED_INPUT_WIDTH);
1924 		crop->top = clamp_t(unsigned int, ALIGN(sel->r.top, 2), 4,
1925 				    format->height - 4 -
1926 				    MT9M114_SCALER_CROPPED_INPUT_HEIGHT);
1927 		crop->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2),
1928 				      MT9M114_SCALER_CROPPED_INPUT_WIDTH,
1929 				      format->width - 4 - crop->left);
1930 		crop->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
1931 				       MT9M114_SCALER_CROPPED_INPUT_HEIGHT,
1932 				       format->height - 4 - crop->top);
1933 
1934 		sel->r = *crop;
1935 
1936 		/* Propagate to the compose rectangle. */
1937 		compose->width = crop->width;
1938 		compose->height = crop->height;
1939 	} else {
1940 		/*
1941 		 * Clamp the compose rectangle. The scaler can only downscale.
1942 		 */
1943 		compose->left = 0;
1944 		compose->top = 0;
1945 		compose->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2),
1946 					 MT9M114_SCALER_CROPPED_INPUT_WIDTH,
1947 					 crop->width);
1948 		compose->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
1949 					  MT9M114_SCALER_CROPPED_INPUT_HEIGHT,
1950 					  crop->height);
1951 
1952 		sel->r = *compose;
1953 	}
1954 
1955 	/* Propagate the compose rectangle to the source format. */
1956 	format = v4l2_subdev_state_get_format(state, 1);
1957 	format->width = compose->width;
1958 	format->height = compose->height;
1959 
1960 	return 0;
1961 }
1962 
1963 static void mt9m114_ifp_unregistered(struct v4l2_subdev *sd)
1964 {
1965 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1966 
1967 	v4l2_device_unregister_subdev(&sensor->pa.sd);
1968 }
1969 
1970 static int mt9m114_ifp_registered(struct v4l2_subdev *sd)
1971 {
1972 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
1973 	int ret;
1974 
1975 	ret = v4l2_device_register_subdev(sd->v4l2_dev, &sensor->pa.sd);
1976 	if (ret < 0) {
1977 		dev_err(&sensor->client->dev,
1978 			"Failed to register pixel array subdev\n");
1979 		return ret;
1980 	}
1981 
1982 	ret = media_create_pad_link(&sensor->pa.sd.entity, 0,
1983 				    &sensor->ifp.sd.entity, 0,
1984 				    MEDIA_LNK_FL_ENABLED |
1985 				    MEDIA_LNK_FL_IMMUTABLE);
1986 	if (ret < 0) {
1987 		dev_err(&sensor->client->dev,
1988 			"Failed to link pixel array to ifp\n");
1989 		v4l2_device_unregister_subdev(&sensor->pa.sd);
1990 		return ret;
1991 	}
1992 
1993 	return 0;
1994 }
1995 
1996 static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops = {
1997 	.s_stream = mt9m114_ifp_s_stream,
1998 };
1999 
2000 static const struct v4l2_subdev_pad_ops mt9m114_ifp_pad_ops = {
2001 	.enum_mbus_code = mt9m114_ifp_enum_mbus_code,
2002 	.enum_frame_size = mt9m114_ifp_enum_framesizes,
2003 	.enum_frame_interval = mt9m114_ifp_enum_frameintervals,
2004 	.get_fmt = v4l2_subdev_get_fmt,
2005 	.set_fmt = mt9m114_ifp_set_fmt,
2006 	.get_selection = mt9m114_ifp_get_selection,
2007 	.set_selection = mt9m114_ifp_set_selection,
2008 	.get_frame_interval = mt9m114_ifp_get_frame_interval,
2009 	.set_frame_interval = mt9m114_ifp_set_frame_interval,
2010 };
2011 
2012 static const struct v4l2_subdev_ops mt9m114_ifp_ops = {
2013 	.video = &mt9m114_ifp_video_ops,
2014 	.pad = &mt9m114_ifp_pad_ops,
2015 };
2016 
2017 static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops = {
2018 	.init_state = mt9m114_ifp_init_state,
2019 	.registered = mt9m114_ifp_registered,
2020 	.unregistered = mt9m114_ifp_unregistered,
2021 };
2022 
2023 static int mt9m114_ifp_init(struct mt9m114 *sensor)
2024 {
2025 	struct v4l2_subdev *sd = &sensor->ifp.sd;
2026 	struct media_pad *pads = sensor->ifp.pads;
2027 	struct v4l2_ctrl_handler *hdl = &sensor->ifp.hdl;
2028 	struct v4l2_ctrl *link_freq;
2029 	int ret;
2030 
2031 	/* Initialize the subdev. */
2032 	v4l2_i2c_subdev_init(sd, sensor->client, &mt9m114_ifp_ops);
2033 	v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " ifp");
2034 
2035 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
2036 	sd->internal_ops = &mt9m114_ifp_internal_ops;
2037 
2038 	/* Initialize the media entity. */
2039 	sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_ISP;
2040 	sd->entity.ops = &mt9m114_entity_ops;
2041 	pads[0].flags = MEDIA_PAD_FL_SINK;
2042 	pads[1].flags = MEDIA_PAD_FL_SOURCE;
2043 	ret = media_entity_pads_init(&sd->entity, 2, pads);
2044 	if (ret < 0)
2045 		return ret;
2046 
2047 	sensor->ifp.frame_rate = MT9M114_DEF_FRAME_RATE;
2048 
2049 	/* Initialize the control handler. */
2050 	v4l2_ctrl_handler_init(hdl, 8);
2051 	v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
2052 			  V4L2_CID_AUTO_WHITE_BALANCE,
2053 			  0, 1, 1, 1);
2054 	v4l2_ctrl_new_std_menu(hdl, &mt9m114_ifp_ctrl_ops,
2055 			       V4L2_CID_EXPOSURE_AUTO,
2056 			       V4L2_EXPOSURE_MANUAL, 0,
2057 			       V4L2_EXPOSURE_AUTO);
2058 
2059 	link_freq = v4l2_ctrl_new_int_menu(hdl, &mt9m114_ifp_ctrl_ops,
2060 					   V4L2_CID_LINK_FREQ,
2061 					   sensor->bus_cfg.nr_of_link_frequencies - 1,
2062 					   0, sensor->bus_cfg.link_frequencies);
2063 	if (link_freq)
2064 		link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
2065 
2066 	v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
2067 			  V4L2_CID_PIXEL_RATE,
2068 			  sensor->pixrate, sensor->pixrate, 1,
2069 			  sensor->pixrate);
2070 
2071 	sensor->ifp.tpg[MT9M114_TPG_PATTERN] =
2072 		v4l2_ctrl_new_std_menu_items(hdl, &mt9m114_ifp_ctrl_ops,
2073 					     V4L2_CID_TEST_PATTERN,
2074 					     ARRAY_SIZE(mt9m114_test_pattern_menu) - 1,
2075 					     0, 0, mt9m114_test_pattern_menu);
2076 	sensor->ifp.tpg[MT9M114_TPG_RED] =
2077 		v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
2078 				  V4L2_CID_TEST_PATTERN_RED,
2079 				  0, 1023, 1, 1023);
2080 	sensor->ifp.tpg[MT9M114_TPG_GREEN] =
2081 		v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
2082 				  V4L2_CID_TEST_PATTERN_GREENR,
2083 				  0, 1023, 1, 1023);
2084 	sensor->ifp.tpg[MT9M114_TPG_BLUE] =
2085 		v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
2086 				  V4L2_CID_TEST_PATTERN_BLUE,
2087 				  0, 1023, 1, 1023);
2088 
2089 	v4l2_ctrl_cluster(ARRAY_SIZE(sensor->ifp.tpg), sensor->ifp.tpg);
2090 
2091 	if (hdl->error) {
2092 		ret = hdl->error;
2093 		goto error;
2094 	}
2095 
2096 	sd->ctrl_handler = hdl;
2097 	sd->state_lock = hdl->lock;
2098 
2099 	ret = v4l2_subdev_init_finalize(sd);
2100 	if (ret)
2101 		goto error;
2102 
2103 	return 0;
2104 
2105 error:
2106 	v4l2_ctrl_handler_free(&sensor->ifp.hdl);
2107 	media_entity_cleanup(&sensor->ifp.sd.entity);
2108 	return ret;
2109 }
2110 
2111 static void mt9m114_ifp_cleanup(struct mt9m114 *sensor)
2112 {
2113 	v4l2_ctrl_handler_free(&sensor->ifp.hdl);
2114 	media_entity_cleanup(&sensor->ifp.sd.entity);
2115 }
2116 
2117 /* -----------------------------------------------------------------------------
2118  * Power Management
2119  */
2120 
2121 static int mt9m114_power_on(struct mt9m114 *sensor)
2122 {
2123 	int ret;
2124 
2125 	/* Enable power and clocks. */
2126 	ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies),
2127 				    sensor->supplies);
2128 	if (ret < 0)
2129 		return ret;
2130 
2131 	ret = clk_prepare_enable(sensor->clk);
2132 	if (ret < 0)
2133 		goto error_regulator;
2134 
2135 	/* Perform a hard reset if available, or a soft reset otherwise. */
2136 	if (sensor->reset) {
2137 		long freq = clk_get_rate(sensor->clk);
2138 		unsigned int duration;
2139 
2140 		/*
2141 		 * The minimum duration is 50 clock cycles, thus typically
2142 		 * around 2µs. Double it to be safe.
2143 		 */
2144 		duration = DIV_ROUND_UP(2 * 50 * 1000000, freq);
2145 
2146 		gpiod_set_value(sensor->reset, 1);
2147 		fsleep(duration);
2148 		gpiod_set_value(sensor->reset, 0);
2149 	} else {
2150 		/*
2151 		 * The power may have just been turned on, we need to wait for
2152 		 * the sensor to be ready to accept I2C commands.
2153 		 */
2154 		usleep_range(44500, 50000);
2155 
2156 		cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL,
2157 			  MT9M114_RESET_SOC, &ret);
2158 		cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL, 0,
2159 			  &ret);
2160 
2161 		if (ret < 0) {
2162 			dev_err(&sensor->client->dev, "Soft reset failed\n");
2163 			goto error_clock;
2164 		}
2165 	}
2166 
2167 	/*
2168 	 * Wait for the sensor to be ready to accept I2C commands by polling the
2169 	 * command register to wait for initialization to complete.
2170 	 */
2171 	usleep_range(44500, 50000);
2172 
2173 	ret = mt9m114_poll_command(sensor, MT9M114_COMMAND_REGISTER_SET_STATE);
2174 	if (ret < 0)
2175 		goto error_clock;
2176 
2177 	if (sensor->bus_cfg.bus_type == V4L2_MBUS_PARALLEL) {
2178 		/*
2179 		 * In parallel mode (OE set to low), the sensor will enter the
2180 		 * streaming state after initialization. Enter the standby
2181 		 * manually to stop streaming.
2182 		 */
2183 		ret = mt9m114_set_state(sensor,
2184 					MT9M114_SYS_STATE_ENTER_STANDBY);
2185 		if (ret < 0)
2186 			goto error_clock;
2187 	}
2188 
2189 	/*
2190 	 * Before issuing any Set-State command, we must ensure that the sensor
2191 	 * reaches the standby mode (either initiated manually above in
2192 	 * parallel mode, or automatically after reset in MIPI mode).
2193 	 */
2194 	ret = mt9m114_poll_state(sensor, MT9M114_SYS_STATE_STANDBY);
2195 	if (ret < 0)
2196 		goto error_clock;
2197 
2198 	return 0;
2199 
2200 error_clock:
2201 	clk_disable_unprepare(sensor->clk);
2202 error_regulator:
2203 	regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies);
2204 	return ret;
2205 }
2206 
2207 static void mt9m114_power_off(struct mt9m114 *sensor)
2208 {
2209 	clk_disable_unprepare(sensor->clk);
2210 	regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies);
2211 }
2212 
2213 static int __maybe_unused mt9m114_runtime_resume(struct device *dev)
2214 {
2215 	struct v4l2_subdev *sd = dev_get_drvdata(dev);
2216 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
2217 	int ret;
2218 
2219 	ret = mt9m114_power_on(sensor);
2220 	if (ret)
2221 		return ret;
2222 
2223 	ret = mt9m114_initialize(sensor);
2224 	if (ret) {
2225 		mt9m114_power_off(sensor);
2226 		return ret;
2227 	}
2228 
2229 	return 0;
2230 }
2231 
2232 static int __maybe_unused mt9m114_runtime_suspend(struct device *dev)
2233 {
2234 	struct v4l2_subdev *sd = dev_get_drvdata(dev);
2235 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
2236 
2237 	mt9m114_power_off(sensor);
2238 
2239 	return 0;
2240 }
2241 
2242 static const struct dev_pm_ops mt9m114_pm_ops = {
2243 	SET_RUNTIME_PM_OPS(mt9m114_runtime_suspend, mt9m114_runtime_resume, NULL)
2244 };
2245 
2246 /* -----------------------------------------------------------------------------
2247  * Probe & Remove
2248  */
2249 
2250 static int mt9m114_verify_link_frequency(struct mt9m114 *sensor,
2251 					 unsigned int pixrate)
2252 {
2253 	unsigned int link_freq = sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY
2254 			       ? pixrate * 8 : pixrate * 2;
2255 
2256 	if (sensor->bus_cfg.nr_of_link_frequencies != 1 ||
2257 	    sensor->bus_cfg.link_frequencies[0] != link_freq)
2258 		return -EINVAL;
2259 
2260 	return 0;
2261 }
2262 
2263 static int mt9m114_clk_init(struct mt9m114 *sensor)
2264 {
2265 	unsigned int pixrate;
2266 
2267 	/* Hardcode the PLL multiplier and dividers to default settings. */
2268 	sensor->pll.m = 32;
2269 	sensor->pll.n = 1;
2270 	sensor->pll.p = 7;
2271 
2272 	/*
2273 	 * Calculate the pixel rate and link frequency. The CSI-2 bus is clocked
2274 	 * for 16-bit per pixel, transmitted in DDR over a single lane. For
2275 	 * parallel mode, the sensor ouputs one pixel in two PIXCLK cycles.
2276 	 */
2277 
2278 	/*
2279 	 * Check if EXTCLK fits the configured link frequency. Bypass the PLL
2280 	 * in this case.
2281 	 */
2282 	pixrate = clk_get_rate(sensor->clk) / 2;
2283 	if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) {
2284 		sensor->pixrate = pixrate;
2285 		sensor->bypass_pll = true;
2286 		return 0;
2287 	}
2288 
2289 	/* Check if the PLL configuration fits the configured link frequency. */
2290 	pixrate = clk_get_rate(sensor->clk) * sensor->pll.m
2291 		/ ((sensor->pll.n + 1) * (sensor->pll.p + 1));
2292 	if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) {
2293 		sensor->pixrate = pixrate;
2294 		sensor->bypass_pll = false;
2295 		return 0;
2296 	}
2297 
2298 	dev_err(&sensor->client->dev, "Unsupported DT link-frequencies\n");
2299 	return -EINVAL;
2300 }
2301 
2302 static int mt9m114_identify(struct mt9m114 *sensor)
2303 {
2304 	u64 major, minor, release, customer;
2305 	u64 value;
2306 	int ret;
2307 
2308 	ret = cci_read(sensor->regmap, MT9M114_CHIP_ID, &value, NULL);
2309 	if (ret) {
2310 		dev_err(&sensor->client->dev, "Failed to read chip ID\n");
2311 		return -ENXIO;
2312 	}
2313 
2314 	if (value != 0x2481) {
2315 		dev_err(&sensor->client->dev, "Invalid chip ID 0x%04llx\n",
2316 			value);
2317 		return -ENXIO;
2318 	}
2319 
2320 	cci_read(sensor->regmap, MT9M114_MON_MAJOR_VERSION, &major, &ret);
2321 	cci_read(sensor->regmap, MT9M114_MON_MINOR_VERSION, &minor, &ret);
2322 	cci_read(sensor->regmap, MT9M114_MON_RELEASE_VERSION, &release, &ret);
2323 	cci_read(sensor->regmap, MT9M114_CUSTOMER_REV, &customer, &ret);
2324 	if (ret) {
2325 		dev_err(&sensor->client->dev, "Failed to read version\n");
2326 		return -ENXIO;
2327 	}
2328 
2329 	dev_dbg(&sensor->client->dev,
2330 		"monitor v%llu.%llu.%04llx customer rev 0x%04llx\n",
2331 		major, minor, release, customer);
2332 
2333 	return 0;
2334 }
2335 
2336 static int mt9m114_parse_dt(struct mt9m114 *sensor)
2337 {
2338 	struct fwnode_handle *fwnode = dev_fwnode(&sensor->client->dev);
2339 	struct fwnode_handle *ep;
2340 	int ret;
2341 
2342 	ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
2343 	if (!ep) {
2344 		dev_err(&sensor->client->dev, "No endpoint found\n");
2345 		return -EINVAL;
2346 	}
2347 
2348 	sensor->bus_cfg.bus_type = V4L2_MBUS_UNKNOWN;
2349 	ret = v4l2_fwnode_endpoint_alloc_parse(ep, &sensor->bus_cfg);
2350 	fwnode_handle_put(ep);
2351 	if (ret < 0) {
2352 		dev_err(&sensor->client->dev, "Failed to parse endpoint\n");
2353 		goto error;
2354 	}
2355 
2356 	switch (sensor->bus_cfg.bus_type) {
2357 	case V4L2_MBUS_CSI2_DPHY:
2358 	case V4L2_MBUS_PARALLEL:
2359 		break;
2360 
2361 	default:
2362 		dev_err(&sensor->client->dev, "unsupported bus type %u\n",
2363 			sensor->bus_cfg.bus_type);
2364 		ret = -EINVAL;
2365 		goto error;
2366 	}
2367 
2368 	return 0;
2369 
2370 error:
2371 	v4l2_fwnode_endpoint_free(&sensor->bus_cfg);
2372 	return ret;
2373 }
2374 
2375 static int mt9m114_probe(struct i2c_client *client)
2376 {
2377 	struct device *dev = &client->dev;
2378 	struct mt9m114 *sensor;
2379 	int ret;
2380 
2381 	sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
2382 	if (!sensor)
2383 		return -ENOMEM;
2384 
2385 	sensor->client = client;
2386 
2387 	sensor->regmap = devm_cci_regmap_init_i2c(client, 16);
2388 	if (IS_ERR(sensor->regmap)) {
2389 		dev_err(dev, "Unable to initialize I2C\n");
2390 		return -ENODEV;
2391 	}
2392 
2393 	ret = mt9m114_parse_dt(sensor);
2394 	if (ret < 0)
2395 		return ret;
2396 
2397 	/* Acquire clocks, GPIOs and regulators. */
2398 	sensor->clk = devm_clk_get(dev, NULL);
2399 	if (IS_ERR(sensor->clk)) {
2400 		ret = PTR_ERR(sensor->clk);
2401 		dev_err_probe(dev, ret, "Failed to get clock\n");
2402 		goto error_ep_free;
2403 	}
2404 
2405 	sensor->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
2406 	if (IS_ERR(sensor->reset)) {
2407 		ret = PTR_ERR(sensor->reset);
2408 		dev_err_probe(dev, ret, "Failed to get reset GPIO\n");
2409 		goto error_ep_free;
2410 	}
2411 
2412 	sensor->supplies[0].supply = "vddio";
2413 	sensor->supplies[1].supply = "vdd";
2414 	sensor->supplies[2].supply = "vaa";
2415 
2416 	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(sensor->supplies),
2417 				      sensor->supplies);
2418 	if (ret < 0) {
2419 		dev_err_probe(dev, ret, "Failed to get regulators\n");
2420 		goto error_ep_free;
2421 	}
2422 
2423 	ret = mt9m114_clk_init(sensor);
2424 	if (ret)
2425 		goto error_ep_free;
2426 
2427 	/*
2428 	 * Identify the sensor. The driver supports runtime PM, but needs to
2429 	 * work when runtime PM is disabled in the kernel. To that end, power
2430 	 * the sensor on manually here, and initialize it after identification
2431 	 * to reach the same state as if resumed through runtime PM.
2432 	 */
2433 	ret = mt9m114_power_on(sensor);
2434 	if (ret < 0) {
2435 		dev_err_probe(dev, ret, "Could not power on the device\n");
2436 		goto error_ep_free;
2437 	}
2438 
2439 	ret = mt9m114_identify(sensor);
2440 	if (ret < 0)
2441 		goto error_power_off;
2442 
2443 	ret = mt9m114_initialize(sensor);
2444 	if (ret < 0)
2445 		goto error_power_off;
2446 
2447 	/*
2448 	 * Enable runtime PM with autosuspend. As the device has been powered
2449 	 * manually, mark it as active, and increase the usage count without
2450 	 * resuming the device.
2451 	 */
2452 	pm_runtime_set_active(dev);
2453 	pm_runtime_get_noresume(dev);
2454 	pm_runtime_enable(dev);
2455 	pm_runtime_set_autosuspend_delay(dev, 1000);
2456 	pm_runtime_use_autosuspend(dev);
2457 
2458 	/* Initialize the subdevices. */
2459 	ret = mt9m114_pa_init(sensor);
2460 	if (ret < 0)
2461 		goto error_pm_cleanup;
2462 
2463 	ret = mt9m114_ifp_init(sensor);
2464 	if (ret < 0)
2465 		goto error_pa_cleanup;
2466 
2467 	ret = v4l2_async_register_subdev(&sensor->ifp.sd);
2468 	if (ret < 0)
2469 		goto error_ifp_cleanup;
2470 
2471 	/*
2472 	 * Decrease the PM usage count. The device will get suspended after the
2473 	 * autosuspend delay, turning the power off.
2474 	 */
2475 	pm_runtime_mark_last_busy(dev);
2476 	pm_runtime_put_autosuspend(dev);
2477 
2478 	return 0;
2479 
2480 error_ifp_cleanup:
2481 	mt9m114_ifp_cleanup(sensor);
2482 error_pa_cleanup:
2483 	mt9m114_pa_cleanup(sensor);
2484 error_pm_cleanup:
2485 	pm_runtime_disable(dev);
2486 	pm_runtime_put_noidle(dev);
2487 error_power_off:
2488 	mt9m114_power_off(sensor);
2489 error_ep_free:
2490 	v4l2_fwnode_endpoint_free(&sensor->bus_cfg);
2491 	return ret;
2492 }
2493 
2494 static void mt9m114_remove(struct i2c_client *client)
2495 {
2496 	struct v4l2_subdev *sd = i2c_get_clientdata(client);
2497 	struct mt9m114 *sensor = ifp_to_mt9m114(sd);
2498 	struct device *dev = &client->dev;
2499 
2500 	v4l2_async_unregister_subdev(&sensor->ifp.sd);
2501 
2502 	mt9m114_ifp_cleanup(sensor);
2503 	mt9m114_pa_cleanup(sensor);
2504 	v4l2_fwnode_endpoint_free(&sensor->bus_cfg);
2505 
2506 	/*
2507 	 * Disable runtime PM. In case runtime PM is disabled in the kernel,
2508 	 * make sure to turn power off manually.
2509 	 */
2510 	pm_runtime_disable(dev);
2511 	if (!pm_runtime_status_suspended(dev))
2512 		mt9m114_power_off(sensor);
2513 	pm_runtime_set_suspended(dev);
2514 }
2515 
2516 static const struct of_device_id mt9m114_of_ids[] = {
2517 	{ .compatible = "onnn,mt9m114" },
2518 	{ /* sentinel */ },
2519 };
2520 MODULE_DEVICE_TABLE(of, mt9m114_of_ids);
2521 
2522 static struct i2c_driver mt9m114_driver = {
2523 	.driver = {
2524 		.name	= "mt9m114",
2525 		.pm	= &mt9m114_pm_ops,
2526 		.of_match_table = mt9m114_of_ids,
2527 	},
2528 	.probe		= mt9m114_probe,
2529 	.remove		= mt9m114_remove,
2530 };
2531 
2532 module_i2c_driver(mt9m114_driver);
2533 
2534 MODULE_DESCRIPTION("onsemi MT9M114 Sensor Driver");
2535 MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>");
2536 MODULE_LICENSE("GPL");
2537