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