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