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