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