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