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