This source file includes following definitions.
- smiapp_read_frame_fmt
- smiapp_pll_configure
- smiapp_pll_try
- smiapp_pll_update
- __smiapp_update_exposure_limits
- smiapp_pixel_order
- smiapp_update_mbus_formats
- smiapp_set_ctrl
- smiapp_init_controls
- smiapp_init_late_controls
- smiapp_free_controls
- smiapp_get_limits
- smiapp_get_all_limits
- smiapp_get_limits_binning
- smiapp_get_mbus_formats
- smiapp_update_blanking
- smiapp_update_mode
- smiapp_read_nvm
- smiapp_change_cci_addr
- smiapp_setup_flash_strobe
- smiapp_power_on
- smiapp_power_off
- smiapp_start_streaming
- smiapp_stop_streaming
- smiapp_set_stream
- smiapp_enum_mbus_code
- __smiapp_get_mbus_code
- __smiapp_get_format
- smiapp_get_format
- smiapp_get_crop_compose
- smiapp_propagate
- smiapp_validate_csi_data_format
- smiapp_set_format_source
- smiapp_set_format
- scaling_goodness
- smiapp_set_compose_binner
- smiapp_set_compose_scaler
- smiapp_set_compose
- __smiapp_sel_supported
- smiapp_set_crop
- smiapp_get_native_size
- __smiapp_get_selection
- smiapp_get_selection
- smiapp_set_selection
- smiapp_get_skip_frames
- smiapp_get_skip_top_lines
- smiapp_sysfs_nvm_read
- smiapp_sysfs_ident_read
- smiapp_identify_module
- smiapp_register_subdev
- smiapp_unregistered
- smiapp_registered
- smiapp_cleanup
- smiapp_create_subdev
- smiapp_open
- smiapp_suspend
- smiapp_resume
- smiapp_get_hwconfig
- smiapp_probe
- smiapp_remove
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <linux/clk.h>
16 #include <linux/delay.h>
17 #include <linux/device.h>
18 #include <linux/gpio.h>
19 #include <linux/gpio/consumer.h>
20 #include <linux/module.h>
21 #include <linux/pm_runtime.h>
22 #include <linux/property.h>
23 #include <linux/regulator/consumer.h>
24 #include <linux/slab.h>
25 #include <linux/smiapp.h>
26 #include <linux/v4l2-mediabus.h>
27 #include <media/v4l2-fwnode.h>
28 #include <media/v4l2-device.h>
29
30 #include "smiapp.h"
31
32 #define SMIAPP_ALIGN_DIM(dim, flags) \
33 ((flags) & V4L2_SEL_FLAG_GE \
34 ? ALIGN((dim), 2) \
35 : (dim) & ~1)
36
37
38
39
40 static const struct smiapp_module_ident smiapp_module_idents[] = {
41 SMIAPP_IDENT_L(0x01, 0x022b, -1, "vs6555"),
42 SMIAPP_IDENT_L(0x01, 0x022e, -1, "vw6558"),
43 SMIAPP_IDENT_L(0x07, 0x7698, -1, "ovm7698"),
44 SMIAPP_IDENT_L(0x0b, 0x4242, -1, "smiapp-003"),
45 SMIAPP_IDENT_L(0x0c, 0x208a, -1, "tcm8330md"),
46 SMIAPP_IDENT_LQ(0x0c, 0x2134, -1, "tcm8500md", &smiapp_tcm8500md_quirk),
47 SMIAPP_IDENT_L(0x0c, 0x213e, -1, "et8en2"),
48 SMIAPP_IDENT_L(0x0c, 0x2184, -1, "tcm8580md"),
49 SMIAPP_IDENT_LQ(0x0c, 0x560f, -1, "jt8ew9", &smiapp_jt8ew9_quirk),
50 SMIAPP_IDENT_LQ(0x10, 0x4141, -1, "jt8ev1", &smiapp_jt8ev1_quirk),
51 SMIAPP_IDENT_LQ(0x10, 0x4241, -1, "imx125es", &smiapp_imx125es_quirk),
52 };
53
54
55
56
57
58
59
60 static int smiapp_read_frame_fmt(struct smiapp_sensor *sensor)
61 {
62 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
63 u32 fmt_model_type, fmt_model_subtype, ncol_desc, nrow_desc;
64 unsigned int i;
65 int pixel_count = 0;
66 int line_count = 0;
67 int rval;
68
69 rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_TYPE,
70 &fmt_model_type);
71 if (rval)
72 return rval;
73
74 rval = smiapp_read(sensor, SMIAPP_REG_U8_FRAME_FORMAT_MODEL_SUBTYPE,
75 &fmt_model_subtype);
76 if (rval)
77 return rval;
78
79 ncol_desc = (fmt_model_subtype
80 & SMIAPP_FRAME_FORMAT_MODEL_SUBTYPE_NCOLS_MASK)
81 >> SMIAPP_FRAME_FORMAT_MODEL_SUBTYPE_NCOLS_SHIFT;
82 nrow_desc = fmt_model_subtype
83 & SMIAPP_FRAME_FORMAT_MODEL_SUBTYPE_NROWS_MASK;
84
85 dev_dbg(&client->dev, "format_model_type %s\n",
86 fmt_model_type == SMIAPP_FRAME_FORMAT_MODEL_TYPE_2BYTE
87 ? "2 byte" :
88 fmt_model_type == SMIAPP_FRAME_FORMAT_MODEL_TYPE_4BYTE
89 ? "4 byte" : "is simply bad");
90
91 for (i = 0; i < ncol_desc + nrow_desc; i++) {
92 u32 desc;
93 u32 pixelcode;
94 u32 pixels;
95 char *which;
96 char *what;
97 u32 reg;
98
99 if (fmt_model_type == SMIAPP_FRAME_FORMAT_MODEL_TYPE_2BYTE) {
100 reg = SMIAPP_REG_U16_FRAME_FORMAT_DESCRIPTOR_2(i);
101 rval = smiapp_read(sensor, reg, &desc);
102 if (rval)
103 return rval;
104
105 pixelcode =
106 (desc
107 & SMIAPP_FRAME_FORMAT_DESC_2_PIXELCODE_MASK)
108 >> SMIAPP_FRAME_FORMAT_DESC_2_PIXELCODE_SHIFT;
109 pixels = desc & SMIAPP_FRAME_FORMAT_DESC_2_PIXELS_MASK;
110 } else if (fmt_model_type
111 == SMIAPP_FRAME_FORMAT_MODEL_TYPE_4BYTE) {
112 reg = SMIAPP_REG_U32_FRAME_FORMAT_DESCRIPTOR_4(i);
113 rval = smiapp_read(sensor, reg, &desc);
114 if (rval)
115 return rval;
116
117 pixelcode =
118 (desc
119 & SMIAPP_FRAME_FORMAT_DESC_4_PIXELCODE_MASK)
120 >> SMIAPP_FRAME_FORMAT_DESC_4_PIXELCODE_SHIFT;
121 pixels = desc & SMIAPP_FRAME_FORMAT_DESC_4_PIXELS_MASK;
122 } else {
123 dev_dbg(&client->dev,
124 "invalid frame format model type %d\n",
125 fmt_model_type);
126 return -EINVAL;
127 }
128
129 if (i < ncol_desc)
130 which = "columns";
131 else
132 which = "rows";
133
134 switch (pixelcode) {
135 case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_EMBEDDED:
136 what = "embedded";
137 break;
138 case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_DUMMY:
139 what = "dummy";
140 break;
141 case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_BLACK:
142 what = "black";
143 break;
144 case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_DARK:
145 what = "dark";
146 break;
147 case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_VISIBLE:
148 what = "visible";
149 break;
150 default:
151 what = "invalid";
152 break;
153 }
154
155 dev_dbg(&client->dev,
156 "0x%8.8x %s pixels: %d %s (pixelcode %u)\n", reg,
157 what, pixels, which, pixelcode);
158
159 if (i < ncol_desc) {
160 if (pixelcode ==
161 SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_VISIBLE)
162 sensor->visible_pixel_start = pixel_count;
163 pixel_count += pixels;
164 continue;
165 }
166
167
168 switch (pixelcode) {
169 case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_EMBEDDED:
170 if (sensor->embedded_end)
171 break;
172 sensor->embedded_start = line_count;
173 sensor->embedded_end = line_count + pixels;
174 break;
175 case SMIAPP_FRAME_FORMAT_DESC_PIXELCODE_VISIBLE:
176 sensor->image_start = line_count;
177 break;
178 }
179 line_count += pixels;
180 }
181
182 if (sensor->embedded_end > sensor->image_start) {
183 dev_dbg(&client->dev,
184 "adjusting image start line to %u (was %u)\n",
185 sensor->embedded_end, sensor->image_start);
186 sensor->image_start = sensor->embedded_end;
187 }
188
189 dev_dbg(&client->dev, "embedded data from lines %d to %d\n",
190 sensor->embedded_start, sensor->embedded_end);
191 dev_dbg(&client->dev, "image data starts at line %d\n",
192 sensor->image_start);
193
194 return 0;
195 }
196
197 static int smiapp_pll_configure(struct smiapp_sensor *sensor)
198 {
199 struct smiapp_pll *pll = &sensor->pll;
200 int rval;
201
202 rval = smiapp_write(
203 sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt.pix_clk_div);
204 if (rval < 0)
205 return rval;
206
207 rval = smiapp_write(
208 sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt.sys_clk_div);
209 if (rval < 0)
210 return rval;
211
212 rval = smiapp_write(
213 sensor, SMIAPP_REG_U16_PRE_PLL_CLK_DIV, pll->pre_pll_clk_div);
214 if (rval < 0)
215 return rval;
216
217 rval = smiapp_write(
218 sensor, SMIAPP_REG_U16_PLL_MULTIPLIER, pll->pll_multiplier);
219 if (rval < 0)
220 return rval;
221
222
223 rval = smiapp_write(
224 sensor, SMIAPP_REG_U32_REQUESTED_LINK_BIT_RATE_MBPS,
225 DIV_ROUND_UP(pll->op.sys_clk_freq_hz, 1000000 / 256 / 256));
226 if (rval < 0 || sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
227 return rval;
228
229 rval = smiapp_write(
230 sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op.pix_clk_div);
231 if (rval < 0)
232 return rval;
233
234 return smiapp_write(
235 sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op.sys_clk_div);
236 }
237
238 static int smiapp_pll_try(struct smiapp_sensor *sensor,
239 struct smiapp_pll *pll)
240 {
241 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
242 struct smiapp_pll_limits lim = {
243 .min_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_PRE_PLL_CLK_DIV],
244 .max_pre_pll_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_PRE_PLL_CLK_DIV],
245 .min_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_IP_FREQ_HZ],
246 .max_pll_ip_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_IP_FREQ_HZ],
247 .min_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MIN_PLL_MULTIPLIER],
248 .max_pll_multiplier = sensor->limits[SMIAPP_LIMIT_MAX_PLL_MULTIPLIER],
249 .min_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_OP_FREQ_HZ],
250 .max_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_OP_FREQ_HZ],
251
252 .op.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV],
253 .op.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV],
254 .op.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV],
255 .op.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV],
256 .op.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_FREQ_HZ],
257 .op.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_FREQ_HZ],
258 .op.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_FREQ_HZ],
259 .op.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_FREQ_HZ],
260
261 .vt.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_DIV],
262 .vt.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_DIV],
263 .vt.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_DIV],
264 .vt.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_DIV],
265 .vt.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_FREQ_HZ],
266 .vt.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_FREQ_HZ],
267 .vt.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_FREQ_HZ],
268 .vt.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_FREQ_HZ],
269
270 .min_line_length_pck_bin = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN],
271 .min_line_length_pck = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK],
272 };
273
274 return smiapp_pll_calculate(&client->dev, &lim, pll);
275 }
276
277 static int smiapp_pll_update(struct smiapp_sensor *sensor)
278 {
279 struct smiapp_pll *pll = &sensor->pll;
280 int rval;
281
282 pll->binning_horizontal = sensor->binning_horizontal;
283 pll->binning_vertical = sensor->binning_vertical;
284 pll->link_freq =
285 sensor->link_freq->qmenu_int[sensor->link_freq->val];
286 pll->scale_m = sensor->scale_m;
287 pll->bits_per_pixel = sensor->csi_format->compressed;
288
289 rval = smiapp_pll_try(sensor, pll);
290 if (rval < 0)
291 return rval;
292
293 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray,
294 pll->pixel_rate_pixel_array);
295 __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi);
296
297 return 0;
298 }
299
300
301
302
303
304
305
306
307 static void __smiapp_update_exposure_limits(struct smiapp_sensor *sensor)
308 {
309 struct v4l2_ctrl *ctrl = sensor->exposure;
310 int max;
311
312 max = sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height
313 + sensor->vblank->val
314 - sensor->limits[SMIAPP_LIMIT_COARSE_INTEGRATION_TIME_MAX_MARGIN];
315
316 __v4l2_ctrl_modify_range(ctrl, ctrl->minimum, max, ctrl->step, max);
317 }
318
319
320
321
322
323
324
325
326
327 static const struct smiapp_csi_data_format smiapp_csi_data_formats[] = {
328 { MEDIA_BUS_FMT_SGRBG16_1X16, 16, 16, SMIAPP_PIXEL_ORDER_GRBG, },
329 { MEDIA_BUS_FMT_SRGGB16_1X16, 16, 16, SMIAPP_PIXEL_ORDER_RGGB, },
330 { MEDIA_BUS_FMT_SBGGR16_1X16, 16, 16, SMIAPP_PIXEL_ORDER_BGGR, },
331 { MEDIA_BUS_FMT_SGBRG16_1X16, 16, 16, SMIAPP_PIXEL_ORDER_GBRG, },
332 { MEDIA_BUS_FMT_SGRBG14_1X14, 14, 14, SMIAPP_PIXEL_ORDER_GRBG, },
333 { MEDIA_BUS_FMT_SRGGB14_1X14, 14, 14, SMIAPP_PIXEL_ORDER_RGGB, },
334 { MEDIA_BUS_FMT_SBGGR14_1X14, 14, 14, SMIAPP_PIXEL_ORDER_BGGR, },
335 { MEDIA_BUS_FMT_SGBRG14_1X14, 14, 14, SMIAPP_PIXEL_ORDER_GBRG, },
336 { MEDIA_BUS_FMT_SGRBG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GRBG, },
337 { MEDIA_BUS_FMT_SRGGB12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_RGGB, },
338 { MEDIA_BUS_FMT_SBGGR12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_BGGR, },
339 { MEDIA_BUS_FMT_SGBRG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GBRG, },
340 { MEDIA_BUS_FMT_SGRBG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GRBG, },
341 { MEDIA_BUS_FMT_SRGGB10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_RGGB, },
342 { MEDIA_BUS_FMT_SBGGR10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_BGGR, },
343 { MEDIA_BUS_FMT_SGBRG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GBRG, },
344 { MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GRBG, },
345 { MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_RGGB, },
346 { MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_BGGR, },
347 { MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GBRG, },
348 { MEDIA_BUS_FMT_SGRBG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GRBG, },
349 { MEDIA_BUS_FMT_SRGGB8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_RGGB, },
350 { MEDIA_BUS_FMT_SBGGR8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_BGGR, },
351 { MEDIA_BUS_FMT_SGBRG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GBRG, },
352 };
353
354 static const char *pixel_order_str[] = { "GRBG", "RGGB", "BGGR", "GBRG" };
355
356 #define to_csi_format_idx(fmt) (((unsigned long)(fmt) \
357 - (unsigned long)smiapp_csi_data_formats) \
358 / sizeof(*smiapp_csi_data_formats))
359
360 static u32 smiapp_pixel_order(struct smiapp_sensor *sensor)
361 {
362 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
363 int flip = 0;
364
365 if (sensor->hflip) {
366 if (sensor->hflip->val)
367 flip |= SMIAPP_IMAGE_ORIENTATION_HFLIP;
368
369 if (sensor->vflip->val)
370 flip |= SMIAPP_IMAGE_ORIENTATION_VFLIP;
371 }
372
373 flip ^= sensor->hvflip_inv_mask;
374
375 dev_dbg(&client->dev, "flip %d\n", flip);
376 return sensor->default_pixel_order ^ flip;
377 }
378
379 static void smiapp_update_mbus_formats(struct smiapp_sensor *sensor)
380 {
381 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
382 unsigned int csi_format_idx =
383 to_csi_format_idx(sensor->csi_format) & ~3;
384 unsigned int internal_csi_format_idx =
385 to_csi_format_idx(sensor->internal_csi_format) & ~3;
386 unsigned int pixel_order = smiapp_pixel_order(sensor);
387
388 sensor->mbus_frame_fmts =
389 sensor->default_mbus_frame_fmts << pixel_order;
390 sensor->csi_format =
391 &smiapp_csi_data_formats[csi_format_idx + pixel_order];
392 sensor->internal_csi_format =
393 &smiapp_csi_data_formats[internal_csi_format_idx
394 + pixel_order];
395
396 BUG_ON(max(internal_csi_format_idx, csi_format_idx) + pixel_order
397 >= ARRAY_SIZE(smiapp_csi_data_formats));
398
399 dev_dbg(&client->dev, "new pixel order %s\n",
400 pixel_order_str[pixel_order]);
401 }
402
403 static const char * const smiapp_test_patterns[] = {
404 "Disabled",
405 "Solid Colour",
406 "Eight Vertical Colour Bars",
407 "Colour Bars With Fade to Grey",
408 "Pseudorandom Sequence (PN9)",
409 };
410
411 static int smiapp_set_ctrl(struct v4l2_ctrl *ctrl)
412 {
413 struct smiapp_sensor *sensor =
414 container_of(ctrl->handler, struct smiapp_subdev, ctrl_handler)
415 ->sensor;
416 u32 orient = 0;
417 int exposure;
418 int rval;
419
420 switch (ctrl->id) {
421 case V4L2_CID_ANALOGUE_GAIN:
422 return smiapp_write(
423 sensor,
424 SMIAPP_REG_U16_ANALOGUE_GAIN_CODE_GLOBAL, ctrl->val);
425
426 case V4L2_CID_EXPOSURE:
427 return smiapp_write(
428 sensor,
429 SMIAPP_REG_U16_COARSE_INTEGRATION_TIME, ctrl->val);
430
431 case V4L2_CID_HFLIP:
432 case V4L2_CID_VFLIP:
433 if (sensor->streaming)
434 return -EBUSY;
435
436 if (sensor->hflip->val)
437 orient |= SMIAPP_IMAGE_ORIENTATION_HFLIP;
438
439 if (sensor->vflip->val)
440 orient |= SMIAPP_IMAGE_ORIENTATION_VFLIP;
441
442 orient ^= sensor->hvflip_inv_mask;
443 rval = smiapp_write(sensor, SMIAPP_REG_U8_IMAGE_ORIENTATION,
444 orient);
445 if (rval < 0)
446 return rval;
447
448 smiapp_update_mbus_formats(sensor);
449
450 return 0;
451
452 case V4L2_CID_VBLANK:
453 exposure = sensor->exposure->val;
454
455 __smiapp_update_exposure_limits(sensor);
456
457 if (exposure > sensor->exposure->maximum) {
458 sensor->exposure->val = sensor->exposure->maximum;
459 rval = smiapp_set_ctrl(sensor->exposure);
460 if (rval < 0)
461 return rval;
462 }
463
464 return smiapp_write(
465 sensor, SMIAPP_REG_U16_FRAME_LENGTH_LINES,
466 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height
467 + ctrl->val);
468
469 case V4L2_CID_HBLANK:
470 return smiapp_write(
471 sensor, SMIAPP_REG_U16_LINE_LENGTH_PCK,
472 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width
473 + ctrl->val);
474
475 case V4L2_CID_LINK_FREQ:
476 if (sensor->streaming)
477 return -EBUSY;
478
479 return smiapp_pll_update(sensor);
480
481 case V4L2_CID_TEST_PATTERN: {
482 unsigned int i;
483
484 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
485 v4l2_ctrl_activate(
486 sensor->test_data[i],
487 ctrl->val ==
488 V4L2_SMIAPP_TEST_PATTERN_MODE_SOLID_COLOUR);
489
490 return smiapp_write(
491 sensor, SMIAPP_REG_U16_TEST_PATTERN_MODE, ctrl->val);
492 }
493
494 case V4L2_CID_TEST_PATTERN_RED:
495 return smiapp_write(
496 sensor, SMIAPP_REG_U16_TEST_DATA_RED, ctrl->val);
497
498 case V4L2_CID_TEST_PATTERN_GREENR:
499 return smiapp_write(
500 sensor, SMIAPP_REG_U16_TEST_DATA_GREENR, ctrl->val);
501
502 case V4L2_CID_TEST_PATTERN_BLUE:
503 return smiapp_write(
504 sensor, SMIAPP_REG_U16_TEST_DATA_BLUE, ctrl->val);
505
506 case V4L2_CID_TEST_PATTERN_GREENB:
507 return smiapp_write(
508 sensor, SMIAPP_REG_U16_TEST_DATA_GREENB, ctrl->val);
509
510 case V4L2_CID_PIXEL_RATE:
511
512 return 0;
513
514 default:
515 return -EINVAL;
516 }
517 }
518
519 static const struct v4l2_ctrl_ops smiapp_ctrl_ops = {
520 .s_ctrl = smiapp_set_ctrl,
521 };
522
523 static int smiapp_init_controls(struct smiapp_sensor *sensor)
524 {
525 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
526 int rval;
527
528 rval = v4l2_ctrl_handler_init(&sensor->pixel_array->ctrl_handler, 12);
529 if (rval)
530 return rval;
531
532 sensor->pixel_array->ctrl_handler.lock = &sensor->mutex;
533
534 sensor->analog_gain = v4l2_ctrl_new_std(
535 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
536 V4L2_CID_ANALOGUE_GAIN,
537 sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN],
538 sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MAX],
539 max(sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_STEP], 1U),
540 sensor->limits[SMIAPP_LIMIT_ANALOGUE_GAIN_CODE_MIN]);
541
542
543 sensor->exposure = v4l2_ctrl_new_std(
544 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
545 V4L2_CID_EXPOSURE, 0, 0, 1, 0);
546
547 sensor->hflip = v4l2_ctrl_new_std(
548 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
549 V4L2_CID_HFLIP, 0, 1, 1, 0);
550 sensor->vflip = v4l2_ctrl_new_std(
551 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
552 V4L2_CID_VFLIP, 0, 1, 1, 0);
553
554 sensor->vblank = v4l2_ctrl_new_std(
555 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
556 V4L2_CID_VBLANK, 0, 1, 1, 0);
557
558 if (sensor->vblank)
559 sensor->vblank->flags |= V4L2_CTRL_FLAG_UPDATE;
560
561 sensor->hblank = v4l2_ctrl_new_std(
562 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
563 V4L2_CID_HBLANK, 0, 1, 1, 0);
564
565 if (sensor->hblank)
566 sensor->hblank->flags |= V4L2_CTRL_FLAG_UPDATE;
567
568 sensor->pixel_rate_parray = v4l2_ctrl_new_std(
569 &sensor->pixel_array->ctrl_handler, &smiapp_ctrl_ops,
570 V4L2_CID_PIXEL_RATE, 1, INT_MAX, 1, 1);
571
572 v4l2_ctrl_new_std_menu_items(&sensor->pixel_array->ctrl_handler,
573 &smiapp_ctrl_ops, V4L2_CID_TEST_PATTERN,
574 ARRAY_SIZE(smiapp_test_patterns) - 1,
575 0, 0, smiapp_test_patterns);
576
577 if (sensor->pixel_array->ctrl_handler.error) {
578 dev_err(&client->dev,
579 "pixel array controls initialization failed (%d)\n",
580 sensor->pixel_array->ctrl_handler.error);
581 return sensor->pixel_array->ctrl_handler.error;
582 }
583
584 sensor->pixel_array->sd.ctrl_handler =
585 &sensor->pixel_array->ctrl_handler;
586
587 v4l2_ctrl_cluster(2, &sensor->hflip);
588
589 rval = v4l2_ctrl_handler_init(&sensor->src->ctrl_handler, 0);
590 if (rval)
591 return rval;
592
593 sensor->src->ctrl_handler.lock = &sensor->mutex;
594
595 sensor->pixel_rate_csi = v4l2_ctrl_new_std(
596 &sensor->src->ctrl_handler, &smiapp_ctrl_ops,
597 V4L2_CID_PIXEL_RATE, 1, INT_MAX, 1, 1);
598
599 if (sensor->src->ctrl_handler.error) {
600 dev_err(&client->dev,
601 "src controls initialization failed (%d)\n",
602 sensor->src->ctrl_handler.error);
603 return sensor->src->ctrl_handler.error;
604 }
605
606 sensor->src->sd.ctrl_handler = &sensor->src->ctrl_handler;
607
608 return 0;
609 }
610
611
612
613
614
615 static int smiapp_init_late_controls(struct smiapp_sensor *sensor)
616 {
617 unsigned long *valid_link_freqs = &sensor->valid_link_freqs[
618 sensor->csi_format->compressed - sensor->compressed_min_bpp];
619 unsigned int i;
620
621 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) {
622 int max_value = (1 << sensor->csi_format->width) - 1;
623
624 sensor->test_data[i] = v4l2_ctrl_new_std(
625 &sensor->pixel_array->ctrl_handler,
626 &smiapp_ctrl_ops, V4L2_CID_TEST_PATTERN_RED + i,
627 0, max_value, 1, max_value);
628 }
629
630 sensor->link_freq = v4l2_ctrl_new_int_menu(
631 &sensor->src->ctrl_handler, &smiapp_ctrl_ops,
632 V4L2_CID_LINK_FREQ, __fls(*valid_link_freqs),
633 __ffs(*valid_link_freqs), sensor->hwcfg->op_sys_clock);
634
635 return sensor->src->ctrl_handler.error;
636 }
637
638 static void smiapp_free_controls(struct smiapp_sensor *sensor)
639 {
640 unsigned int i;
641
642 for (i = 0; i < sensor->ssds_used; i++)
643 v4l2_ctrl_handler_free(&sensor->ssds[i].ctrl_handler);
644 }
645
646 static int smiapp_get_limits(struct smiapp_sensor *sensor, int const *limit,
647 unsigned int n)
648 {
649 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
650 unsigned int i;
651 u32 val;
652 int rval;
653
654 for (i = 0; i < n; i++) {
655 rval = smiapp_read(
656 sensor, smiapp_reg_limits[limit[i]].addr, &val);
657 if (rval)
658 return rval;
659 sensor->limits[limit[i]] = val;
660 dev_dbg(&client->dev, "0x%8.8x \"%s\" = %u, 0x%x\n",
661 smiapp_reg_limits[limit[i]].addr,
662 smiapp_reg_limits[limit[i]].what, val, val);
663 }
664
665 return 0;
666 }
667
668 static int smiapp_get_all_limits(struct smiapp_sensor *sensor)
669 {
670 unsigned int i;
671 int rval;
672
673 for (i = 0; i < SMIAPP_LIMIT_LAST; i++) {
674 rval = smiapp_get_limits(sensor, &i, 1);
675 if (rval < 0)
676 return rval;
677 }
678
679 if (sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] == 0)
680 smiapp_replace_limit(sensor, SMIAPP_LIMIT_SCALER_N_MIN, 16);
681
682 return 0;
683 }
684
685 static int smiapp_get_limits_binning(struct smiapp_sensor *sensor)
686 {
687 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
688 static u32 const limits[] = {
689 SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN,
690 SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN,
691 SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN,
692 SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN,
693 SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN,
694 SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MIN_BIN,
695 SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MAX_MARGIN_BIN,
696 };
697 static u32 const limits_replace[] = {
698 SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES,
699 SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES,
700 SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK,
701 SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK,
702 SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK,
703 SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MIN,
704 SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MAX_MARGIN,
705 };
706 unsigned int i;
707 int rval;
708
709 if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY] ==
710 SMIAPP_BINNING_CAPABILITY_NO) {
711 for (i = 0; i < ARRAY_SIZE(limits); i++)
712 sensor->limits[limits[i]] =
713 sensor->limits[limits_replace[i]];
714
715 return 0;
716 }
717
718 rval = smiapp_get_limits(sensor, limits, ARRAY_SIZE(limits));
719 if (rval < 0)
720 return rval;
721
722
723
724
725
726 if (sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN]
727 && sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN]
728 && sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN])
729 return 0;
730
731 for (i = 0; i < ARRAY_SIZE(limits); i++) {
732 dev_dbg(&client->dev,
733 "replace limit 0x%8.8x \"%s\" = %d, 0x%x\n",
734 smiapp_reg_limits[limits[i]].addr,
735 smiapp_reg_limits[limits[i]].what,
736 sensor->limits[limits_replace[i]],
737 sensor->limits[limits_replace[i]]);
738 sensor->limits[limits[i]] =
739 sensor->limits[limits_replace[i]];
740 }
741
742 return 0;
743 }
744
745 static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor)
746 {
747 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
748 struct smiapp_pll *pll = &sensor->pll;
749 u8 compressed_max_bpp = 0;
750 unsigned int type, n;
751 unsigned int i, pixel_order;
752 int rval;
753
754 rval = smiapp_read(
755 sensor, SMIAPP_REG_U8_DATA_FORMAT_MODEL_TYPE, &type);
756 if (rval)
757 return rval;
758
759 dev_dbg(&client->dev, "data_format_model_type %d\n", type);
760
761 rval = smiapp_read(sensor, SMIAPP_REG_U8_PIXEL_ORDER,
762 &pixel_order);
763 if (rval)
764 return rval;
765
766 if (pixel_order >= ARRAY_SIZE(pixel_order_str)) {
767 dev_dbg(&client->dev, "bad pixel order %d\n", pixel_order);
768 return -EINVAL;
769 }
770
771 dev_dbg(&client->dev, "pixel order %d (%s)\n", pixel_order,
772 pixel_order_str[pixel_order]);
773
774 switch (type) {
775 case SMIAPP_DATA_FORMAT_MODEL_TYPE_NORMAL:
776 n = SMIAPP_DATA_FORMAT_MODEL_TYPE_NORMAL_N;
777 break;
778 case SMIAPP_DATA_FORMAT_MODEL_TYPE_EXTENDED:
779 n = SMIAPP_DATA_FORMAT_MODEL_TYPE_EXTENDED_N;
780 break;
781 default:
782 return -EINVAL;
783 }
784
785 sensor->default_pixel_order = pixel_order;
786 sensor->mbus_frame_fmts = 0;
787
788 for (i = 0; i < n; i++) {
789 unsigned int fmt, j;
790
791 rval = smiapp_read(
792 sensor,
793 SMIAPP_REG_U16_DATA_FORMAT_DESCRIPTOR(i), &fmt);
794 if (rval)
795 return rval;
796
797 dev_dbg(&client->dev, "%u: bpp %u, compressed %u\n",
798 i, fmt >> 8, (u8)fmt);
799
800 for (j = 0; j < ARRAY_SIZE(smiapp_csi_data_formats); j++) {
801 const struct smiapp_csi_data_format *f =
802 &smiapp_csi_data_formats[j];
803
804 if (f->pixel_order != SMIAPP_PIXEL_ORDER_GRBG)
805 continue;
806
807 if (f->width != fmt >> 8 || f->compressed != (u8)fmt)
808 continue;
809
810 dev_dbg(&client->dev, "jolly good! %d\n", j);
811
812 sensor->default_mbus_frame_fmts |= 1 << j;
813 }
814 }
815
816
817 pll->binning_horizontal = 1;
818 pll->binning_vertical = 1;
819 pll->scale_m = sensor->scale_m;
820
821 for (i = 0; i < ARRAY_SIZE(smiapp_csi_data_formats); i++) {
822 sensor->compressed_min_bpp =
823 min(smiapp_csi_data_formats[i].compressed,
824 sensor->compressed_min_bpp);
825 compressed_max_bpp =
826 max(smiapp_csi_data_formats[i].compressed,
827 compressed_max_bpp);
828 }
829
830 sensor->valid_link_freqs = devm_kcalloc(
831 &client->dev,
832 compressed_max_bpp - sensor->compressed_min_bpp + 1,
833 sizeof(*sensor->valid_link_freqs), GFP_KERNEL);
834 if (!sensor->valid_link_freqs)
835 return -ENOMEM;
836
837 for (i = 0; i < ARRAY_SIZE(smiapp_csi_data_formats); i++) {
838 const struct smiapp_csi_data_format *f =
839 &smiapp_csi_data_formats[i];
840 unsigned long *valid_link_freqs =
841 &sensor->valid_link_freqs[
842 f->compressed - sensor->compressed_min_bpp];
843 unsigned int j;
844
845 if (!(sensor->default_mbus_frame_fmts & 1 << i))
846 continue;
847
848 pll->bits_per_pixel = f->compressed;
849
850 for (j = 0; sensor->hwcfg->op_sys_clock[j]; j++) {
851 pll->link_freq = sensor->hwcfg->op_sys_clock[j];
852
853 rval = smiapp_pll_try(sensor, pll);
854 dev_dbg(&client->dev, "link freq %u Hz, bpp %u %s\n",
855 pll->link_freq, pll->bits_per_pixel,
856 rval ? "not ok" : "ok");
857 if (rval)
858 continue;
859
860 set_bit(j, valid_link_freqs);
861 }
862
863 if (!*valid_link_freqs) {
864 dev_info(&client->dev,
865 "no valid link frequencies for %u bpp\n",
866 f->compressed);
867 sensor->default_mbus_frame_fmts &= ~BIT(i);
868 continue;
869 }
870
871 if (!sensor->csi_format
872 || f->width > sensor->csi_format->width
873 || (f->width == sensor->csi_format->width
874 && f->compressed > sensor->csi_format->compressed)) {
875 sensor->csi_format = f;
876 sensor->internal_csi_format = f;
877 }
878 }
879
880 if (!sensor->csi_format) {
881 dev_err(&client->dev, "no supported mbus code found\n");
882 return -EINVAL;
883 }
884
885 smiapp_update_mbus_formats(sensor);
886
887 return 0;
888 }
889
890 static void smiapp_update_blanking(struct smiapp_sensor *sensor)
891 {
892 struct v4l2_ctrl *vblank = sensor->vblank;
893 struct v4l2_ctrl *hblank = sensor->hblank;
894 int min, max;
895
896 min = max_t(int,
897 sensor->limits[SMIAPP_LIMIT_MIN_FRAME_BLANKING_LINES],
898 sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN] -
899 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height);
900 max = sensor->limits[SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN] -
901 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height;
902
903 __v4l2_ctrl_modify_range(vblank, min, max, vblank->step, min);
904
905 min = max_t(int,
906 sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN] -
907 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width,
908 sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN]);
909 max = sensor->limits[SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN] -
910 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width;
911
912 __v4l2_ctrl_modify_range(hblank, min, max, hblank->step, min);
913
914 __smiapp_update_exposure_limits(sensor);
915 }
916
917 static int smiapp_update_mode(struct smiapp_sensor *sensor)
918 {
919 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
920 unsigned int binning_mode;
921 int rval;
922
923
924 if (sensor->binning_horizontal == 1 &&
925 sensor->binning_vertical == 1) {
926 binning_mode = 0;
927 } else {
928 u8 binning_type =
929 (sensor->binning_horizontal << 4)
930 | sensor->binning_vertical;
931
932 rval = smiapp_write(
933 sensor, SMIAPP_REG_U8_BINNING_TYPE, binning_type);
934 if (rval < 0)
935 return rval;
936
937 binning_mode = 1;
938 }
939 rval = smiapp_write(sensor, SMIAPP_REG_U8_BINNING_MODE, binning_mode);
940 if (rval < 0)
941 return rval;
942
943
944 rval = smiapp_get_limits_binning(sensor);
945 if (rval < 0)
946 return rval;
947
948 rval = smiapp_pll_update(sensor);
949 if (rval < 0)
950 return rval;
951
952
953 smiapp_update_blanking(sensor);
954
955 dev_dbg(&client->dev, "vblank\t\t%d\n", sensor->vblank->val);
956 dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val);
957
958 dev_dbg(&client->dev, "real timeperframe\t100/%d\n",
959 sensor->pll.pixel_rate_pixel_array /
960 ((sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width
961 + sensor->hblank->val) *
962 (sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height
963 + sensor->vblank->val) / 100));
964
965 return 0;
966 }
967
968
969
970
971
972
973 static int smiapp_read_nvm(struct smiapp_sensor *sensor,
974 unsigned char *nvm)
975 {
976 u32 i, s, p, np, v;
977 int rval = 0, rval2;
978
979 np = sensor->nvm_size / SMIAPP_NVM_PAGE_SIZE;
980 for (p = 0; p < np; p++) {
981 rval = smiapp_write(
982 sensor,
983 SMIAPP_REG_U8_DATA_TRANSFER_IF_1_PAGE_SELECT, p);
984 if (rval)
985 goto out;
986
987 rval = smiapp_write(sensor,
988 SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL,
989 SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN |
990 SMIAPP_DATA_TRANSFER_IF_1_CTRL_RD_EN);
991 if (rval)
992 goto out;
993
994 for (i = 1000; i > 0; i--) {
995 rval = smiapp_read(
996 sensor,
997 SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s);
998
999 if (rval)
1000 goto out;
1001
1002 if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY)
1003 break;
1004
1005 }
1006 if (!i) {
1007 rval = -ETIMEDOUT;
1008 goto out;
1009 }
1010
1011 for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) {
1012 rval = smiapp_read(
1013 sensor,
1014 SMIAPP_REG_U8_DATA_TRANSFER_IF_1_DATA_0 + i,
1015 &v);
1016 if (rval)
1017 goto out;
1018
1019 *nvm++ = v;
1020 }
1021 }
1022
1023 out:
1024 rval2 = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL, 0);
1025 if (rval < 0)
1026 return rval;
1027 else
1028 return rval2;
1029 }
1030
1031
1032
1033
1034
1035
1036 static int smiapp_change_cci_addr(struct smiapp_sensor *sensor)
1037 {
1038 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1039 int rval;
1040 u32 val;
1041
1042 client->addr = sensor->hwcfg->i2c_addr_dfl;
1043
1044 rval = smiapp_write(sensor,
1045 SMIAPP_REG_U8_CCI_ADDRESS_CONTROL,
1046 sensor->hwcfg->i2c_addr_alt << 1);
1047 if (rval)
1048 return rval;
1049
1050 client->addr = sensor->hwcfg->i2c_addr_alt;
1051
1052
1053 rval = smiapp_read(sensor, SMIAPP_REG_U8_CCI_ADDRESS_CONTROL, &val);
1054 if (rval)
1055 return rval;
1056
1057 if (val != sensor->hwcfg->i2c_addr_alt << 1)
1058 return -ENODEV;
1059
1060 return 0;
1061 }
1062
1063
1064
1065
1066
1067
1068 static int smiapp_setup_flash_strobe(struct smiapp_sensor *sensor)
1069 {
1070 struct smiapp_flash_strobe_parms *strobe_setup;
1071 unsigned int ext_freq = sensor->hwcfg->ext_clk;
1072 u32 tmp;
1073 u32 strobe_adjustment;
1074 u32 strobe_width_high_rs;
1075 int rval;
1076
1077 strobe_setup = sensor->hwcfg->strobe_setup;
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148 tmp = div_u64(1000000ULL * ((1 << 16) - 1) * ((1 << 8) - 1) -
1149 1000000 + 1, ext_freq);
1150 strobe_setup->strobe_width_high_us =
1151 clamp_t(u32, strobe_setup->strobe_width_high_us, 1, tmp);
1152
1153 tmp = div_u64(((u64)strobe_setup->strobe_width_high_us * (u64)ext_freq +
1154 1000000 - 1), 1000000ULL);
1155 strobe_adjustment = (tmp + (1 << 16) - 1 - 1) / ((1 << 16) - 1);
1156 strobe_width_high_rs = (tmp + strobe_adjustment - 1) /
1157 strobe_adjustment;
1158
1159 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_MODE_RS,
1160 strobe_setup->mode);
1161 if (rval < 0)
1162 goto out;
1163
1164 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_STROBE_ADJUSTMENT,
1165 strobe_adjustment);
1166 if (rval < 0)
1167 goto out;
1168
1169 rval = smiapp_write(
1170 sensor, SMIAPP_REG_U16_TFLASH_STROBE_WIDTH_HIGH_RS_CTRL,
1171 strobe_width_high_rs);
1172 if (rval < 0)
1173 goto out;
1174
1175 rval = smiapp_write(sensor, SMIAPP_REG_U16_TFLASH_STROBE_DELAY_RS_CTRL,
1176 strobe_setup->strobe_delay);
1177 if (rval < 0)
1178 goto out;
1179
1180 rval = smiapp_write(sensor, SMIAPP_REG_U16_FLASH_STROBE_START_POINT,
1181 strobe_setup->stobe_start_point);
1182 if (rval < 0)
1183 goto out;
1184
1185 rval = smiapp_write(sensor, SMIAPP_REG_U8_FLASH_TRIGGER_RS,
1186 strobe_setup->trigger);
1187
1188 out:
1189 sensor->hwcfg->strobe_setup->trigger = 0;
1190
1191 return rval;
1192 }
1193
1194
1195
1196
1197
1198 static int smiapp_power_on(struct device *dev)
1199 {
1200 struct i2c_client *client = to_i2c_client(dev);
1201 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
1202 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1203
1204
1205
1206
1207 struct smiapp_sensor *sensor =
1208 container_of(ssd, struct smiapp_sensor, ssds[0]);
1209 unsigned int sleep;
1210 int rval;
1211
1212 rval = regulator_enable(sensor->vana);
1213 if (rval) {
1214 dev_err(&client->dev, "failed to enable vana regulator\n");
1215 return rval;
1216 }
1217 usleep_range(1000, 1000);
1218
1219 rval = clk_prepare_enable(sensor->ext_clk);
1220 if (rval < 0) {
1221 dev_dbg(&client->dev, "failed to enable xclk\n");
1222 goto out_xclk_fail;
1223 }
1224 usleep_range(1000, 1000);
1225
1226 gpiod_set_value(sensor->xshutdown, 1);
1227
1228 sleep = SMIAPP_RESET_DELAY(sensor->hwcfg->ext_clk);
1229 usleep_range(sleep, sleep);
1230
1231 mutex_lock(&sensor->mutex);
1232
1233 sensor->active = true;
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246 if (sensor->hwcfg->i2c_addr_alt) {
1247 rval = smiapp_change_cci_addr(sensor);
1248 if (rval) {
1249 dev_err(&client->dev, "cci address change error\n");
1250 goto out_cci_addr_fail;
1251 }
1252 }
1253
1254 rval = smiapp_write(sensor, SMIAPP_REG_U8_SOFTWARE_RESET,
1255 SMIAPP_SOFTWARE_RESET);
1256 if (rval < 0) {
1257 dev_err(&client->dev, "software reset failed\n");
1258 goto out_cci_addr_fail;
1259 }
1260
1261 if (sensor->hwcfg->i2c_addr_alt) {
1262 rval = smiapp_change_cci_addr(sensor);
1263 if (rval) {
1264 dev_err(&client->dev, "cci address change error\n");
1265 goto out_cci_addr_fail;
1266 }
1267 }
1268
1269 rval = smiapp_write(sensor, SMIAPP_REG_U16_COMPRESSION_MODE,
1270 SMIAPP_COMPRESSION_MODE_SIMPLE_PREDICTOR);
1271 if (rval) {
1272 dev_err(&client->dev, "compression mode set failed\n");
1273 goto out_cci_addr_fail;
1274 }
1275
1276 rval = smiapp_write(
1277 sensor, SMIAPP_REG_U16_EXTCLK_FREQUENCY_MHZ,
1278 sensor->hwcfg->ext_clk / (1000000 / (1 << 8)));
1279 if (rval) {
1280 dev_err(&client->dev, "extclk frequency set failed\n");
1281 goto out_cci_addr_fail;
1282 }
1283
1284 rval = smiapp_write(sensor, SMIAPP_REG_U8_CSI_LANE_MODE,
1285 sensor->hwcfg->lanes - 1);
1286 if (rval) {
1287 dev_err(&client->dev, "csi lane mode set failed\n");
1288 goto out_cci_addr_fail;
1289 }
1290
1291 rval = smiapp_write(sensor, SMIAPP_REG_U8_FAST_STANDBY_CTRL,
1292 SMIAPP_FAST_STANDBY_CTRL_IMMEDIATE);
1293 if (rval) {
1294 dev_err(&client->dev, "fast standby set failed\n");
1295 goto out_cci_addr_fail;
1296 }
1297
1298 rval = smiapp_write(sensor, SMIAPP_REG_U8_CSI_SIGNALLING_MODE,
1299 sensor->hwcfg->csi_signalling_mode);
1300 if (rval) {
1301 dev_err(&client->dev, "csi signalling mode set failed\n");
1302 goto out_cci_addr_fail;
1303 }
1304
1305
1306 rval = smiapp_write(sensor, SMIAPP_REG_U8_DPHY_CTRL,
1307 SMIAPP_DPHY_CTRL_UI);
1308 if (rval < 0)
1309 goto out_cci_addr_fail;
1310
1311 rval = smiapp_call_quirk(sensor, post_poweron);
1312 if (rval) {
1313 dev_err(&client->dev, "post_poweron quirks failed\n");
1314 goto out_cci_addr_fail;
1315 }
1316
1317
1318 if (sensor->pixel_array) {
1319 rval = __v4l2_ctrl_handler_setup(
1320 &sensor->pixel_array->ctrl_handler);
1321 if (rval)
1322 goto out_cci_addr_fail;
1323
1324 rval = __v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler);
1325 if (rval)
1326 goto out_cci_addr_fail;
1327
1328 rval = smiapp_update_mode(sensor);
1329 if (rval < 0)
1330 goto out_cci_addr_fail;
1331 }
1332
1333 mutex_unlock(&sensor->mutex);
1334
1335 return 0;
1336
1337 out_cci_addr_fail:
1338 mutex_unlock(&sensor->mutex);
1339 gpiod_set_value(sensor->xshutdown, 0);
1340 clk_disable_unprepare(sensor->ext_clk);
1341
1342 out_xclk_fail:
1343 regulator_disable(sensor->vana);
1344
1345 return rval;
1346 }
1347
1348 static int smiapp_power_off(struct device *dev)
1349 {
1350 struct i2c_client *client = to_i2c_client(dev);
1351 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
1352 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1353 struct smiapp_sensor *sensor =
1354 container_of(ssd, struct smiapp_sensor, ssds[0]);
1355
1356 mutex_lock(&sensor->mutex);
1357
1358
1359
1360
1361
1362
1363
1364
1365 if (sensor->hwcfg->i2c_addr_alt)
1366 smiapp_write(sensor,
1367 SMIAPP_REG_U8_SOFTWARE_RESET,
1368 SMIAPP_SOFTWARE_RESET);
1369
1370 sensor->active = false;
1371
1372 mutex_unlock(&sensor->mutex);
1373
1374 gpiod_set_value(sensor->xshutdown, 0);
1375 clk_disable_unprepare(sensor->ext_clk);
1376 usleep_range(5000, 5000);
1377 regulator_disable(sensor->vana);
1378 sensor->streaming = false;
1379
1380 return 0;
1381 }
1382
1383
1384
1385
1386
1387 static int smiapp_start_streaming(struct smiapp_sensor *sensor)
1388 {
1389 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1390 int rval;
1391
1392 mutex_lock(&sensor->mutex);
1393
1394 rval = smiapp_write(sensor, SMIAPP_REG_U16_CSI_DATA_FORMAT,
1395 (sensor->csi_format->width << 8) |
1396 sensor->csi_format->compressed);
1397 if (rval)
1398 goto out;
1399
1400 rval = smiapp_pll_configure(sensor);
1401 if (rval)
1402 goto out;
1403
1404
1405 rval = smiapp_write(sensor, SMIAPP_REG_U16_X_ADDR_START,
1406 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left);
1407 if (rval < 0)
1408 goto out;
1409
1410 rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_ADDR_START,
1411 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top);
1412 if (rval < 0)
1413 goto out;
1414
1415
1416 rval = smiapp_write(
1417 sensor, SMIAPP_REG_U16_X_ADDR_END,
1418 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].left
1419 + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width - 1);
1420 if (rval < 0)
1421 goto out;
1422
1423 rval = smiapp_write(
1424 sensor, SMIAPP_REG_U16_Y_ADDR_END,
1425 sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].top
1426 + sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height - 1);
1427 if (rval < 0)
1428 goto out;
1429
1430
1431
1432
1433
1434
1435
1436 if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY]
1437 == SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
1438 rval = smiapp_write(
1439 sensor, SMIAPP_REG_U16_DIGITAL_CROP_X_OFFSET,
1440 sensor->scaler->crop[SMIAPP_PAD_SINK].left);
1441 if (rval < 0)
1442 goto out;
1443
1444 rval = smiapp_write(
1445 sensor, SMIAPP_REG_U16_DIGITAL_CROP_Y_OFFSET,
1446 sensor->scaler->crop[SMIAPP_PAD_SINK].top);
1447 if (rval < 0)
1448 goto out;
1449
1450 rval = smiapp_write(
1451 sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_WIDTH,
1452 sensor->scaler->crop[SMIAPP_PAD_SINK].width);
1453 if (rval < 0)
1454 goto out;
1455
1456 rval = smiapp_write(
1457 sensor, SMIAPP_REG_U16_DIGITAL_CROP_IMAGE_HEIGHT,
1458 sensor->scaler->crop[SMIAPP_PAD_SINK].height);
1459 if (rval < 0)
1460 goto out;
1461 }
1462
1463
1464 if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
1465 != SMIAPP_SCALING_CAPABILITY_NONE) {
1466 rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALING_MODE,
1467 sensor->scaling_mode);
1468 if (rval < 0)
1469 goto out;
1470
1471 rval = smiapp_write(sensor, SMIAPP_REG_U16_SCALE_M,
1472 sensor->scale_m);
1473 if (rval < 0)
1474 goto out;
1475 }
1476
1477
1478 rval = smiapp_write(sensor, SMIAPP_REG_U16_X_OUTPUT_SIZE,
1479 sensor->src->crop[SMIAPP_PAD_SRC].width);
1480 if (rval < 0)
1481 goto out;
1482 rval = smiapp_write(sensor, SMIAPP_REG_U16_Y_OUTPUT_SIZE,
1483 sensor->src->crop[SMIAPP_PAD_SRC].height);
1484 if (rval < 0)
1485 goto out;
1486
1487 if ((sensor->limits[SMIAPP_LIMIT_FLASH_MODE_CAPABILITY] &
1488 (SMIAPP_FLASH_MODE_CAPABILITY_SINGLE_STROBE |
1489 SMIAPP_FLASH_MODE_CAPABILITY_MULTIPLE_STROBE)) &&
1490 sensor->hwcfg->strobe_setup != NULL &&
1491 sensor->hwcfg->strobe_setup->trigger != 0) {
1492 rval = smiapp_setup_flash_strobe(sensor);
1493 if (rval)
1494 goto out;
1495 }
1496
1497 rval = smiapp_call_quirk(sensor, pre_streamon);
1498 if (rval) {
1499 dev_err(&client->dev, "pre_streamon quirks failed\n");
1500 goto out;
1501 }
1502
1503 rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT,
1504 SMIAPP_MODE_SELECT_STREAMING);
1505
1506 out:
1507 mutex_unlock(&sensor->mutex);
1508
1509 return rval;
1510 }
1511
1512 static int smiapp_stop_streaming(struct smiapp_sensor *sensor)
1513 {
1514 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1515 int rval;
1516
1517 mutex_lock(&sensor->mutex);
1518 rval = smiapp_write(sensor, SMIAPP_REG_U8_MODE_SELECT,
1519 SMIAPP_MODE_SELECT_SOFTWARE_STANDBY);
1520 if (rval)
1521 goto out;
1522
1523 rval = smiapp_call_quirk(sensor, post_streamoff);
1524 if (rval)
1525 dev_err(&client->dev, "post_streamoff quirks failed\n");
1526
1527 out:
1528 mutex_unlock(&sensor->mutex);
1529 return rval;
1530 }
1531
1532
1533
1534
1535
1536 static int smiapp_set_stream(struct v4l2_subdev *subdev, int enable)
1537 {
1538 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1539 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
1540 int rval;
1541
1542 if (sensor->streaming == enable)
1543 return 0;
1544
1545 if (enable) {
1546 rval = pm_runtime_get_sync(&client->dev);
1547 if (rval < 0) {
1548 if (rval != -EBUSY && rval != -EAGAIN)
1549 pm_runtime_set_active(&client->dev);
1550 pm_runtime_put(&client->dev);
1551 return rval;
1552 }
1553
1554 sensor->streaming = true;
1555
1556 rval = smiapp_start_streaming(sensor);
1557 if (rval < 0)
1558 sensor->streaming = false;
1559 } else {
1560 rval = smiapp_stop_streaming(sensor);
1561 sensor->streaming = false;
1562 pm_runtime_mark_last_busy(&client->dev);
1563 pm_runtime_put_autosuspend(&client->dev);
1564 }
1565
1566 return rval;
1567 }
1568
1569 static int smiapp_enum_mbus_code(struct v4l2_subdev *subdev,
1570 struct v4l2_subdev_pad_config *cfg,
1571 struct v4l2_subdev_mbus_code_enum *code)
1572 {
1573 struct i2c_client *client = v4l2_get_subdevdata(subdev);
1574 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1575 unsigned int i;
1576 int idx = -1;
1577 int rval = -EINVAL;
1578
1579 mutex_lock(&sensor->mutex);
1580
1581 dev_err(&client->dev, "subdev %s, pad %d, index %d\n",
1582 subdev->name, code->pad, code->index);
1583
1584 if (subdev != &sensor->src->sd || code->pad != SMIAPP_PAD_SRC) {
1585 if (code->index)
1586 goto out;
1587
1588 code->code = sensor->internal_csi_format->code;
1589 rval = 0;
1590 goto out;
1591 }
1592
1593 for (i = 0; i < ARRAY_SIZE(smiapp_csi_data_formats); i++) {
1594 if (sensor->mbus_frame_fmts & (1 << i))
1595 idx++;
1596
1597 if (idx == code->index) {
1598 code->code = smiapp_csi_data_formats[i].code;
1599 dev_err(&client->dev, "found index %d, i %d, code %x\n",
1600 code->index, i, code->code);
1601 rval = 0;
1602 break;
1603 }
1604 }
1605
1606 out:
1607 mutex_unlock(&sensor->mutex);
1608
1609 return rval;
1610 }
1611
1612 static u32 __smiapp_get_mbus_code(struct v4l2_subdev *subdev,
1613 unsigned int pad)
1614 {
1615 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1616
1617 if (subdev == &sensor->src->sd && pad == SMIAPP_PAD_SRC)
1618 return sensor->csi_format->code;
1619 else
1620 return sensor->internal_csi_format->code;
1621 }
1622
1623 static int __smiapp_get_format(struct v4l2_subdev *subdev,
1624 struct v4l2_subdev_pad_config *cfg,
1625 struct v4l2_subdev_format *fmt)
1626 {
1627 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1628
1629 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1630 fmt->format = *v4l2_subdev_get_try_format(subdev, cfg,
1631 fmt->pad);
1632 } else {
1633 struct v4l2_rect *r;
1634
1635 if (fmt->pad == ssd->source_pad)
1636 r = &ssd->crop[ssd->source_pad];
1637 else
1638 r = &ssd->sink_fmt;
1639
1640 fmt->format.code = __smiapp_get_mbus_code(subdev, fmt->pad);
1641 fmt->format.width = r->width;
1642 fmt->format.height = r->height;
1643 fmt->format.field = V4L2_FIELD_NONE;
1644 }
1645
1646 return 0;
1647 }
1648
1649 static int smiapp_get_format(struct v4l2_subdev *subdev,
1650 struct v4l2_subdev_pad_config *cfg,
1651 struct v4l2_subdev_format *fmt)
1652 {
1653 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1654 int rval;
1655
1656 mutex_lock(&sensor->mutex);
1657 rval = __smiapp_get_format(subdev, cfg, fmt);
1658 mutex_unlock(&sensor->mutex);
1659
1660 return rval;
1661 }
1662
1663 static void smiapp_get_crop_compose(struct v4l2_subdev *subdev,
1664 struct v4l2_subdev_pad_config *cfg,
1665 struct v4l2_rect **crops,
1666 struct v4l2_rect **comps, int which)
1667 {
1668 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1669 unsigned int i;
1670
1671 if (which == V4L2_SUBDEV_FORMAT_ACTIVE) {
1672 if (crops)
1673 for (i = 0; i < subdev->entity.num_pads; i++)
1674 crops[i] = &ssd->crop[i];
1675 if (comps)
1676 *comps = &ssd->compose;
1677 } else {
1678 if (crops) {
1679 for (i = 0; i < subdev->entity.num_pads; i++) {
1680 crops[i] = v4l2_subdev_get_try_crop(subdev, cfg, i);
1681 BUG_ON(!crops[i]);
1682 }
1683 }
1684 if (comps) {
1685 *comps = v4l2_subdev_get_try_compose(subdev, cfg,
1686 SMIAPP_PAD_SINK);
1687 BUG_ON(!*comps);
1688 }
1689 }
1690 }
1691
1692
1693 static void smiapp_propagate(struct v4l2_subdev *subdev,
1694 struct v4l2_subdev_pad_config *cfg, int which,
1695 int target)
1696 {
1697 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1698 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1699 struct v4l2_rect *comp, *crops[SMIAPP_PADS];
1700
1701 smiapp_get_crop_compose(subdev, cfg, crops, &comp, which);
1702
1703 switch (target) {
1704 case V4L2_SEL_TGT_CROP:
1705 comp->width = crops[SMIAPP_PAD_SINK]->width;
1706 comp->height = crops[SMIAPP_PAD_SINK]->height;
1707 if (which == V4L2_SUBDEV_FORMAT_ACTIVE) {
1708 if (ssd == sensor->scaler) {
1709 sensor->scale_m =
1710 sensor->limits[
1711 SMIAPP_LIMIT_SCALER_N_MIN];
1712 sensor->scaling_mode =
1713 SMIAPP_SCALING_MODE_NONE;
1714 } else if (ssd == sensor->binner) {
1715 sensor->binning_horizontal = 1;
1716 sensor->binning_vertical = 1;
1717 }
1718 }
1719
1720 case V4L2_SEL_TGT_COMPOSE:
1721 *crops[SMIAPP_PAD_SRC] = *comp;
1722 break;
1723 default:
1724 BUG();
1725 }
1726 }
1727
1728 static const struct smiapp_csi_data_format
1729 *smiapp_validate_csi_data_format(struct smiapp_sensor *sensor, u32 code)
1730 {
1731 unsigned int i;
1732
1733 for (i = 0; i < ARRAY_SIZE(smiapp_csi_data_formats); i++) {
1734 if (sensor->mbus_frame_fmts & (1 << i)
1735 && smiapp_csi_data_formats[i].code == code)
1736 return &smiapp_csi_data_formats[i];
1737 }
1738
1739 return sensor->csi_format;
1740 }
1741
1742 static int smiapp_set_format_source(struct v4l2_subdev *subdev,
1743 struct v4l2_subdev_pad_config *cfg,
1744 struct v4l2_subdev_format *fmt)
1745 {
1746 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1747 const struct smiapp_csi_data_format *csi_format,
1748 *old_csi_format = sensor->csi_format;
1749 unsigned long *valid_link_freqs;
1750 u32 code = fmt->format.code;
1751 unsigned int i;
1752 int rval;
1753
1754 rval = __smiapp_get_format(subdev, cfg, fmt);
1755 if (rval)
1756 return rval;
1757
1758
1759
1760
1761
1762 if (subdev != &sensor->src->sd)
1763 return 0;
1764
1765 csi_format = smiapp_validate_csi_data_format(sensor, code);
1766
1767 fmt->format.code = csi_format->code;
1768
1769 if (fmt->which != V4L2_SUBDEV_FORMAT_ACTIVE)
1770 return 0;
1771
1772 sensor->csi_format = csi_format;
1773
1774 if (csi_format->width != old_csi_format->width)
1775 for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
1776 __v4l2_ctrl_modify_range(
1777 sensor->test_data[i], 0,
1778 (1 << csi_format->width) - 1, 1, 0);
1779
1780 if (csi_format->compressed == old_csi_format->compressed)
1781 return 0;
1782
1783 valid_link_freqs =
1784 &sensor->valid_link_freqs[sensor->csi_format->compressed
1785 - sensor->compressed_min_bpp];
1786
1787 __v4l2_ctrl_modify_range(
1788 sensor->link_freq, 0,
1789 __fls(*valid_link_freqs), ~*valid_link_freqs,
1790 __ffs(*valid_link_freqs));
1791
1792 return smiapp_pll_update(sensor);
1793 }
1794
1795 static int smiapp_set_format(struct v4l2_subdev *subdev,
1796 struct v4l2_subdev_pad_config *cfg,
1797 struct v4l2_subdev_format *fmt)
1798 {
1799 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1800 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
1801 struct v4l2_rect *crops[SMIAPP_PADS];
1802
1803 mutex_lock(&sensor->mutex);
1804
1805 if (fmt->pad == ssd->source_pad) {
1806 int rval;
1807
1808 rval = smiapp_set_format_source(subdev, cfg, fmt);
1809
1810 mutex_unlock(&sensor->mutex);
1811
1812 return rval;
1813 }
1814
1815
1816 fmt->format.code = __smiapp_get_mbus_code(subdev, fmt->pad);
1817 fmt->format.width &= ~1;
1818 fmt->format.height &= ~1;
1819 fmt->format.field = V4L2_FIELD_NONE;
1820
1821 fmt->format.width =
1822 clamp(fmt->format.width,
1823 sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE],
1824 sensor->limits[SMIAPP_LIMIT_MAX_X_OUTPUT_SIZE]);
1825 fmt->format.height =
1826 clamp(fmt->format.height,
1827 sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE],
1828 sensor->limits[SMIAPP_LIMIT_MAX_Y_OUTPUT_SIZE]);
1829
1830 smiapp_get_crop_compose(subdev, cfg, crops, NULL, fmt->which);
1831
1832 crops[ssd->sink_pad]->left = 0;
1833 crops[ssd->sink_pad]->top = 0;
1834 crops[ssd->sink_pad]->width = fmt->format.width;
1835 crops[ssd->sink_pad]->height = fmt->format.height;
1836 if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE)
1837 ssd->sink_fmt = *crops[ssd->sink_pad];
1838 smiapp_propagate(subdev, cfg, fmt->which,
1839 V4L2_SEL_TGT_CROP);
1840
1841 mutex_unlock(&sensor->mutex);
1842
1843 return 0;
1844 }
1845
1846
1847
1848
1849
1850 #define SCALING_GOODNESS 100000
1851 #define SCALING_GOODNESS_EXTREME 100000000
1852 static int scaling_goodness(struct v4l2_subdev *subdev, int w, int ask_w,
1853 int h, int ask_h, u32 flags)
1854 {
1855 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1856 struct i2c_client *client = v4l2_get_subdevdata(subdev);
1857 int val = 0;
1858
1859 w &= ~1;
1860 ask_w &= ~1;
1861 h &= ~1;
1862 ask_h &= ~1;
1863
1864 if (flags & V4L2_SEL_FLAG_GE) {
1865 if (w < ask_w)
1866 val -= SCALING_GOODNESS;
1867 if (h < ask_h)
1868 val -= SCALING_GOODNESS;
1869 }
1870
1871 if (flags & V4L2_SEL_FLAG_LE) {
1872 if (w > ask_w)
1873 val -= SCALING_GOODNESS;
1874 if (h > ask_h)
1875 val -= SCALING_GOODNESS;
1876 }
1877
1878 val -= abs(w - ask_w);
1879 val -= abs(h - ask_h);
1880
1881 if (w < sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE])
1882 val -= SCALING_GOODNESS_EXTREME;
1883
1884 dev_dbg(&client->dev, "w %d ask_w %d h %d ask_h %d goodness %d\n",
1885 w, ask_w, h, ask_h, val);
1886
1887 return val;
1888 }
1889
1890 static void smiapp_set_compose_binner(struct v4l2_subdev *subdev,
1891 struct v4l2_subdev_pad_config *cfg,
1892 struct v4l2_subdev_selection *sel,
1893 struct v4l2_rect **crops,
1894 struct v4l2_rect *comp)
1895 {
1896 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1897 unsigned int i;
1898 unsigned int binh = 1, binv = 1;
1899 int best = scaling_goodness(
1900 subdev,
1901 crops[SMIAPP_PAD_SINK]->width, sel->r.width,
1902 crops[SMIAPP_PAD_SINK]->height, sel->r.height, sel->flags);
1903
1904 for (i = 0; i < sensor->nbinning_subtypes; i++) {
1905 int this = scaling_goodness(
1906 subdev,
1907 crops[SMIAPP_PAD_SINK]->width
1908 / sensor->binning_subtypes[i].horizontal,
1909 sel->r.width,
1910 crops[SMIAPP_PAD_SINK]->height
1911 / sensor->binning_subtypes[i].vertical,
1912 sel->r.height, sel->flags);
1913
1914 if (this > best) {
1915 binh = sensor->binning_subtypes[i].horizontal;
1916 binv = sensor->binning_subtypes[i].vertical;
1917 best = this;
1918 }
1919 }
1920 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
1921 sensor->binning_vertical = binv;
1922 sensor->binning_horizontal = binh;
1923 }
1924
1925 sel->r.width = (crops[SMIAPP_PAD_SINK]->width / binh) & ~1;
1926 sel->r.height = (crops[SMIAPP_PAD_SINK]->height / binv) & ~1;
1927 }
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938 static void smiapp_set_compose_scaler(struct v4l2_subdev *subdev,
1939 struct v4l2_subdev_pad_config *cfg,
1940 struct v4l2_subdev_selection *sel,
1941 struct v4l2_rect **crops,
1942 struct v4l2_rect *comp)
1943 {
1944 struct i2c_client *client = v4l2_get_subdevdata(subdev);
1945 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
1946 u32 min, max, a, b, max_m;
1947 u32 scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
1948 int mode = SMIAPP_SCALING_MODE_HORIZONTAL;
1949 u32 try[4];
1950 u32 ntry = 0;
1951 unsigned int i;
1952 int best = INT_MIN;
1953
1954 sel->r.width = min_t(unsigned int, sel->r.width,
1955 crops[SMIAPP_PAD_SINK]->width);
1956 sel->r.height = min_t(unsigned int, sel->r.height,
1957 crops[SMIAPP_PAD_SINK]->height);
1958
1959 a = crops[SMIAPP_PAD_SINK]->width
1960 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.width;
1961 b = crops[SMIAPP_PAD_SINK]->height
1962 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN] / sel->r.height;
1963 max_m = crops[SMIAPP_PAD_SINK]->width
1964 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]
1965 / sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE];
1966
1967 a = clamp(a, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN],
1968 sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]);
1969 b = clamp(b, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN],
1970 sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]);
1971 max_m = clamp(max_m, sensor->limits[SMIAPP_LIMIT_SCALER_M_MIN],
1972 sensor->limits[SMIAPP_LIMIT_SCALER_M_MAX]);
1973
1974 dev_dbg(&client->dev, "scaling: a %d b %d max_m %d\n", a, b, max_m);
1975
1976 min = min(max_m, min(a, b));
1977 max = min(max_m, max(a, b));
1978
1979 try[ntry] = min;
1980 ntry++;
1981 if (min != max) {
1982 try[ntry] = max;
1983 ntry++;
1984 }
1985 if (max != max_m) {
1986 try[ntry] = min + 1;
1987 ntry++;
1988 if (min != max) {
1989 try[ntry] = max + 1;
1990 ntry++;
1991 }
1992 }
1993
1994 for (i = 0; i < ntry; i++) {
1995 int this = scaling_goodness(
1996 subdev,
1997 crops[SMIAPP_PAD_SINK]->width
1998 / try[i]
1999 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN],
2000 sel->r.width,
2001 crops[SMIAPP_PAD_SINK]->height,
2002 sel->r.height,
2003 sel->flags);
2004
2005 dev_dbg(&client->dev, "trying factor %d (%d)\n", try[i], i);
2006
2007 if (this > best) {
2008 scale_m = try[i];
2009 mode = SMIAPP_SCALING_MODE_HORIZONTAL;
2010 best = this;
2011 }
2012
2013 if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
2014 == SMIAPP_SCALING_CAPABILITY_HORIZONTAL)
2015 continue;
2016
2017 this = scaling_goodness(
2018 subdev, crops[SMIAPP_PAD_SINK]->width
2019 / try[i]
2020 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN],
2021 sel->r.width,
2022 crops[SMIAPP_PAD_SINK]->height
2023 / try[i]
2024 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN],
2025 sel->r.height,
2026 sel->flags);
2027
2028 if (this > best) {
2029 scale_m = try[i];
2030 mode = SMIAPP_SCALING_MODE_BOTH;
2031 best = this;
2032 }
2033 }
2034
2035 sel->r.width =
2036 (crops[SMIAPP_PAD_SINK]->width
2037 / scale_m
2038 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]) & ~1;
2039 if (mode == SMIAPP_SCALING_MODE_BOTH)
2040 sel->r.height =
2041 (crops[SMIAPP_PAD_SINK]->height
2042 / scale_m
2043 * sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN])
2044 & ~1;
2045 else
2046 sel->r.height = crops[SMIAPP_PAD_SINK]->height;
2047
2048 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2049 sensor->scale_m = scale_m;
2050 sensor->scaling_mode = mode;
2051 }
2052 }
2053
2054 static int smiapp_set_compose(struct v4l2_subdev *subdev,
2055 struct v4l2_subdev_pad_config *cfg,
2056 struct v4l2_subdev_selection *sel)
2057 {
2058 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2059 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
2060 struct v4l2_rect *comp, *crops[SMIAPP_PADS];
2061
2062 smiapp_get_crop_compose(subdev, cfg, crops, &comp, sel->which);
2063
2064 sel->r.top = 0;
2065 sel->r.left = 0;
2066
2067 if (ssd == sensor->binner)
2068 smiapp_set_compose_binner(subdev, cfg, sel, crops, comp);
2069 else
2070 smiapp_set_compose_scaler(subdev, cfg, sel, crops, comp);
2071
2072 *comp = sel->r;
2073 smiapp_propagate(subdev, cfg, sel->which, V4L2_SEL_TGT_COMPOSE);
2074
2075 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE)
2076 return smiapp_update_mode(sensor);
2077
2078 return 0;
2079 }
2080
2081 static int __smiapp_sel_supported(struct v4l2_subdev *subdev,
2082 struct v4l2_subdev_selection *sel)
2083 {
2084 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2085 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
2086
2087
2088 switch (sel->target) {
2089 case V4L2_SEL_TGT_CROP:
2090 case V4L2_SEL_TGT_CROP_BOUNDS:
2091 if (ssd == sensor->pixel_array
2092 && sel->pad == SMIAPP_PA_PAD_SRC)
2093 return 0;
2094 if (ssd == sensor->src
2095 && sel->pad == SMIAPP_PAD_SRC)
2096 return 0;
2097 if (ssd == sensor->scaler
2098 && sel->pad == SMIAPP_PAD_SINK
2099 && sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY]
2100 == SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP)
2101 return 0;
2102 return -EINVAL;
2103 case V4L2_SEL_TGT_NATIVE_SIZE:
2104 if (ssd == sensor->pixel_array
2105 && sel->pad == SMIAPP_PA_PAD_SRC)
2106 return 0;
2107 return -EINVAL;
2108 case V4L2_SEL_TGT_COMPOSE:
2109 case V4L2_SEL_TGT_COMPOSE_BOUNDS:
2110 if (sel->pad == ssd->source_pad)
2111 return -EINVAL;
2112 if (ssd == sensor->binner)
2113 return 0;
2114 if (ssd == sensor->scaler
2115 && sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
2116 != SMIAPP_SCALING_CAPABILITY_NONE)
2117 return 0;
2118
2119 default:
2120 return -EINVAL;
2121 }
2122 }
2123
2124 static int smiapp_set_crop(struct v4l2_subdev *subdev,
2125 struct v4l2_subdev_pad_config *cfg,
2126 struct v4l2_subdev_selection *sel)
2127 {
2128 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2129 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
2130 struct v4l2_rect *src_size, *crops[SMIAPP_PADS];
2131 struct v4l2_rect _r;
2132
2133 smiapp_get_crop_compose(subdev, cfg, crops, NULL, sel->which);
2134
2135 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2136 if (sel->pad == ssd->sink_pad)
2137 src_size = &ssd->sink_fmt;
2138 else
2139 src_size = &ssd->compose;
2140 } else {
2141 if (sel->pad == ssd->sink_pad) {
2142 _r.left = 0;
2143 _r.top = 0;
2144 _r.width = v4l2_subdev_get_try_format(subdev, cfg, sel->pad)
2145 ->width;
2146 _r.height = v4l2_subdev_get_try_format(subdev, cfg, sel->pad)
2147 ->height;
2148 src_size = &_r;
2149 } else {
2150 src_size = v4l2_subdev_get_try_compose(
2151 subdev, cfg, ssd->sink_pad);
2152 }
2153 }
2154
2155 if (ssd == sensor->src && sel->pad == SMIAPP_PAD_SRC) {
2156 sel->r.left = 0;
2157 sel->r.top = 0;
2158 }
2159
2160 sel->r.width = min(sel->r.width, src_size->width);
2161 sel->r.height = min(sel->r.height, src_size->height);
2162
2163 sel->r.left = min_t(int, sel->r.left, src_size->width - sel->r.width);
2164 sel->r.top = min_t(int, sel->r.top, src_size->height - sel->r.height);
2165
2166 *crops[sel->pad] = sel->r;
2167
2168 if (ssd != sensor->pixel_array && sel->pad == SMIAPP_PAD_SINK)
2169 smiapp_propagate(subdev, cfg, sel->which,
2170 V4L2_SEL_TGT_CROP);
2171
2172 return 0;
2173 }
2174
2175 static void smiapp_get_native_size(struct smiapp_subdev *ssd,
2176 struct v4l2_rect *r)
2177 {
2178 r->top = 0;
2179 r->left = 0;
2180 r->width = ssd->sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1;
2181 r->height = ssd->sensor->limits[SMIAPP_LIMIT_Y_ADDR_MAX] + 1;
2182 }
2183
2184 static int __smiapp_get_selection(struct v4l2_subdev *subdev,
2185 struct v4l2_subdev_pad_config *cfg,
2186 struct v4l2_subdev_selection *sel)
2187 {
2188 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2189 struct smiapp_subdev *ssd = to_smiapp_subdev(subdev);
2190 struct v4l2_rect *comp, *crops[SMIAPP_PADS];
2191 struct v4l2_rect sink_fmt;
2192 int ret;
2193
2194 ret = __smiapp_sel_supported(subdev, sel);
2195 if (ret)
2196 return ret;
2197
2198 smiapp_get_crop_compose(subdev, cfg, crops, &comp, sel->which);
2199
2200 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
2201 sink_fmt = ssd->sink_fmt;
2202 } else {
2203 struct v4l2_mbus_framefmt *fmt =
2204 v4l2_subdev_get_try_format(subdev, cfg, ssd->sink_pad);
2205
2206 sink_fmt.left = 0;
2207 sink_fmt.top = 0;
2208 sink_fmt.width = fmt->width;
2209 sink_fmt.height = fmt->height;
2210 }
2211
2212 switch (sel->target) {
2213 case V4L2_SEL_TGT_CROP_BOUNDS:
2214 case V4L2_SEL_TGT_NATIVE_SIZE:
2215 if (ssd == sensor->pixel_array)
2216 smiapp_get_native_size(ssd, &sel->r);
2217 else if (sel->pad == ssd->sink_pad)
2218 sel->r = sink_fmt;
2219 else
2220 sel->r = *comp;
2221 break;
2222 case V4L2_SEL_TGT_CROP:
2223 case V4L2_SEL_TGT_COMPOSE_BOUNDS:
2224 sel->r = *crops[sel->pad];
2225 break;
2226 case V4L2_SEL_TGT_COMPOSE:
2227 sel->r = *comp;
2228 break;
2229 }
2230
2231 return 0;
2232 }
2233
2234 static int smiapp_get_selection(struct v4l2_subdev *subdev,
2235 struct v4l2_subdev_pad_config *cfg,
2236 struct v4l2_subdev_selection *sel)
2237 {
2238 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2239 int rval;
2240
2241 mutex_lock(&sensor->mutex);
2242 rval = __smiapp_get_selection(subdev, cfg, sel);
2243 mutex_unlock(&sensor->mutex);
2244
2245 return rval;
2246 }
2247 static int smiapp_set_selection(struct v4l2_subdev *subdev,
2248 struct v4l2_subdev_pad_config *cfg,
2249 struct v4l2_subdev_selection *sel)
2250 {
2251 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2252 int ret;
2253
2254 ret = __smiapp_sel_supported(subdev, sel);
2255 if (ret)
2256 return ret;
2257
2258 mutex_lock(&sensor->mutex);
2259
2260 sel->r.left = max(0, sel->r.left & ~1);
2261 sel->r.top = max(0, sel->r.top & ~1);
2262 sel->r.width = SMIAPP_ALIGN_DIM(sel->r.width, sel->flags);
2263 sel->r.height = SMIAPP_ALIGN_DIM(sel->r.height, sel->flags);
2264
2265 sel->r.width = max_t(unsigned int,
2266 sensor->limits[SMIAPP_LIMIT_MIN_X_OUTPUT_SIZE],
2267 sel->r.width);
2268 sel->r.height = max_t(unsigned int,
2269 sensor->limits[SMIAPP_LIMIT_MIN_Y_OUTPUT_SIZE],
2270 sel->r.height);
2271
2272 switch (sel->target) {
2273 case V4L2_SEL_TGT_CROP:
2274 ret = smiapp_set_crop(subdev, cfg, sel);
2275 break;
2276 case V4L2_SEL_TGT_COMPOSE:
2277 ret = smiapp_set_compose(subdev, cfg, sel);
2278 break;
2279 default:
2280 ret = -EINVAL;
2281 }
2282
2283 mutex_unlock(&sensor->mutex);
2284 return ret;
2285 }
2286
2287 static int smiapp_get_skip_frames(struct v4l2_subdev *subdev, u32 *frames)
2288 {
2289 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2290
2291 *frames = sensor->frame_skip;
2292 return 0;
2293 }
2294
2295 static int smiapp_get_skip_top_lines(struct v4l2_subdev *subdev, u32 *lines)
2296 {
2297 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2298
2299 *lines = sensor->image_start;
2300
2301 return 0;
2302 }
2303
2304
2305
2306
2307
2308 static ssize_t
2309 smiapp_sysfs_nvm_read(struct device *dev, struct device_attribute *attr,
2310 char *buf)
2311 {
2312 struct v4l2_subdev *subdev = i2c_get_clientdata(to_i2c_client(dev));
2313 struct i2c_client *client = v4l2_get_subdevdata(subdev);
2314 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2315 unsigned int nbytes;
2316
2317 if (!sensor->dev_init_done)
2318 return -EBUSY;
2319
2320 if (!sensor->nvm_size) {
2321 int rval;
2322
2323
2324 sensor->nvm_size = sensor->hwcfg->nvm_size;
2325
2326 rval = pm_runtime_get_sync(&client->dev);
2327 if (rval < 0) {
2328 if (rval != -EBUSY && rval != -EAGAIN)
2329 pm_runtime_set_active(&client->dev);
2330 pm_runtime_put(&client->dev);
2331 return -ENODEV;
2332 }
2333
2334 if (smiapp_read_nvm(sensor, sensor->nvm)) {
2335 dev_err(&client->dev, "nvm read failed\n");
2336 return -ENODEV;
2337 }
2338
2339 pm_runtime_mark_last_busy(&client->dev);
2340 pm_runtime_put_autosuspend(&client->dev);
2341 }
2342
2343
2344
2345
2346 nbytes = min_t(unsigned int, sensor->nvm_size, PAGE_SIZE);
2347 memcpy(buf, sensor->nvm, nbytes);
2348
2349 return nbytes;
2350 }
2351 static DEVICE_ATTR(nvm, S_IRUGO, smiapp_sysfs_nvm_read, NULL);
2352
2353 static ssize_t
2354 smiapp_sysfs_ident_read(struct device *dev, struct device_attribute *attr,
2355 char *buf)
2356 {
2357 struct v4l2_subdev *subdev = i2c_get_clientdata(to_i2c_client(dev));
2358 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2359 struct smiapp_module_info *minfo = &sensor->minfo;
2360
2361 return snprintf(buf, PAGE_SIZE, "%2.2x%4.4x%2.2x\n",
2362 minfo->manufacturer_id, minfo->model_id,
2363 minfo->revision_number_major) + 1;
2364 }
2365
2366 static DEVICE_ATTR(ident, S_IRUGO, smiapp_sysfs_ident_read, NULL);
2367
2368
2369
2370
2371
2372 static int smiapp_identify_module(struct smiapp_sensor *sensor)
2373 {
2374 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2375 struct smiapp_module_info *minfo = &sensor->minfo;
2376 unsigned int i;
2377 int rval = 0;
2378
2379 minfo->name = SMIAPP_NAME;
2380
2381
2382 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MANUFACTURER_ID,
2383 &minfo->manufacturer_id);
2384 if (!rval)
2385 rval = smiapp_read_8only(sensor, SMIAPP_REG_U16_MODEL_ID,
2386 &minfo->model_id);
2387 if (!rval)
2388 rval = smiapp_read_8only(sensor,
2389 SMIAPP_REG_U8_REVISION_NUMBER_MAJOR,
2390 &minfo->revision_number_major);
2391 if (!rval)
2392 rval = smiapp_read_8only(sensor,
2393 SMIAPP_REG_U8_REVISION_NUMBER_MINOR,
2394 &minfo->revision_number_minor);
2395 if (!rval)
2396 rval = smiapp_read_8only(sensor,
2397 SMIAPP_REG_U8_MODULE_DATE_YEAR,
2398 &minfo->module_year);
2399 if (!rval)
2400 rval = smiapp_read_8only(sensor,
2401 SMIAPP_REG_U8_MODULE_DATE_MONTH,
2402 &minfo->module_month);
2403 if (!rval)
2404 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_MODULE_DATE_DAY,
2405 &minfo->module_day);
2406
2407
2408 if (!rval)
2409 rval = smiapp_read_8only(sensor,
2410 SMIAPP_REG_U8_SENSOR_MANUFACTURER_ID,
2411 &minfo->sensor_manufacturer_id);
2412 if (!rval)
2413 rval = smiapp_read_8only(sensor,
2414 SMIAPP_REG_U16_SENSOR_MODEL_ID,
2415 &minfo->sensor_model_id);
2416 if (!rval)
2417 rval = smiapp_read_8only(sensor,
2418 SMIAPP_REG_U8_SENSOR_REVISION_NUMBER,
2419 &minfo->sensor_revision_number);
2420 if (!rval)
2421 rval = smiapp_read_8only(sensor,
2422 SMIAPP_REG_U8_SENSOR_FIRMWARE_VERSION,
2423 &minfo->sensor_firmware_version);
2424
2425
2426 if (!rval)
2427 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIA_VERSION,
2428 &minfo->smia_version);
2429 if (!rval)
2430 rval = smiapp_read_8only(sensor, SMIAPP_REG_U8_SMIAPP_VERSION,
2431 &minfo->smiapp_version);
2432
2433 if (rval) {
2434 dev_err(&client->dev, "sensor detection failed\n");
2435 return -ENODEV;
2436 }
2437
2438 dev_dbg(&client->dev, "module 0x%2.2x-0x%4.4x\n",
2439 minfo->manufacturer_id, minfo->model_id);
2440
2441 dev_dbg(&client->dev,
2442 "module revision 0x%2.2x-0x%2.2x date %2.2d-%2.2d-%2.2d\n",
2443 minfo->revision_number_major, minfo->revision_number_minor,
2444 minfo->module_year, minfo->module_month, minfo->module_day);
2445
2446 dev_dbg(&client->dev, "sensor 0x%2.2x-0x%4.4x\n",
2447 minfo->sensor_manufacturer_id, minfo->sensor_model_id);
2448
2449 dev_dbg(&client->dev,
2450 "sensor revision 0x%2.2x firmware version 0x%2.2x\n",
2451 minfo->sensor_revision_number, minfo->sensor_firmware_version);
2452
2453 dev_dbg(&client->dev, "smia version %2.2d smiapp version %2.2d\n",
2454 minfo->smia_version, minfo->smiapp_version);
2455
2456
2457
2458
2459
2460
2461 if (!minfo->manufacturer_id && !minfo->model_id) {
2462 minfo->manufacturer_id = minfo->sensor_manufacturer_id;
2463 minfo->model_id = minfo->sensor_model_id;
2464 minfo->revision_number_major = minfo->sensor_revision_number;
2465 }
2466
2467 for (i = 0; i < ARRAY_SIZE(smiapp_module_idents); i++) {
2468 if (smiapp_module_idents[i].manufacturer_id
2469 != minfo->manufacturer_id)
2470 continue;
2471 if (smiapp_module_idents[i].model_id != minfo->model_id)
2472 continue;
2473 if (smiapp_module_idents[i].flags
2474 & SMIAPP_MODULE_IDENT_FLAG_REV_LE) {
2475 if (smiapp_module_idents[i].revision_number_major
2476 < minfo->revision_number_major)
2477 continue;
2478 } else {
2479 if (smiapp_module_idents[i].revision_number_major
2480 != minfo->revision_number_major)
2481 continue;
2482 }
2483
2484 minfo->name = smiapp_module_idents[i].name;
2485 minfo->quirk = smiapp_module_idents[i].quirk;
2486 break;
2487 }
2488
2489 if (i >= ARRAY_SIZE(smiapp_module_idents))
2490 dev_warn(&client->dev,
2491 "no quirks for this module; let's hope it's fully compliant\n");
2492
2493 dev_dbg(&client->dev, "the sensor is called %s, ident %2.2x%4.4x%2.2x\n",
2494 minfo->name, minfo->manufacturer_id, minfo->model_id,
2495 minfo->revision_number_major);
2496
2497 return 0;
2498 }
2499
2500 static const struct v4l2_subdev_ops smiapp_ops;
2501 static const struct v4l2_subdev_internal_ops smiapp_internal_ops;
2502 static const struct media_entity_operations smiapp_entity_ops;
2503
2504 static int smiapp_register_subdev(struct smiapp_sensor *sensor,
2505 struct smiapp_subdev *ssd,
2506 struct smiapp_subdev *sink_ssd,
2507 u16 source_pad, u16 sink_pad, u32 link_flags)
2508 {
2509 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2510 int rval;
2511
2512 if (!sink_ssd)
2513 return 0;
2514
2515 rval = media_entity_pads_init(&ssd->sd.entity,
2516 ssd->npads, ssd->pads);
2517 if (rval) {
2518 dev_err(&client->dev,
2519 "media_entity_pads_init failed\n");
2520 return rval;
2521 }
2522
2523 rval = v4l2_device_register_subdev(sensor->src->sd.v4l2_dev,
2524 &ssd->sd);
2525 if (rval) {
2526 dev_err(&client->dev,
2527 "v4l2_device_register_subdev failed\n");
2528 return rval;
2529 }
2530
2531 rval = media_create_pad_link(&ssd->sd.entity, source_pad,
2532 &sink_ssd->sd.entity, sink_pad,
2533 link_flags);
2534 if (rval) {
2535 dev_err(&client->dev,
2536 "media_create_pad_link failed\n");
2537 v4l2_device_unregister_subdev(&ssd->sd);
2538 return rval;
2539 }
2540
2541 return 0;
2542 }
2543
2544 static void smiapp_unregistered(struct v4l2_subdev *subdev)
2545 {
2546 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2547 unsigned int i;
2548
2549 for (i = 1; i < sensor->ssds_used; i++)
2550 v4l2_device_unregister_subdev(&sensor->ssds[i].sd);
2551 }
2552
2553 static int smiapp_registered(struct v4l2_subdev *subdev)
2554 {
2555 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2556 int rval;
2557
2558 if (sensor->scaler) {
2559 rval = smiapp_register_subdev(
2560 sensor, sensor->binner, sensor->scaler,
2561 SMIAPP_PAD_SRC, SMIAPP_PAD_SINK,
2562 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
2563 if (rval < 0)
2564 return rval;
2565 }
2566
2567 rval = smiapp_register_subdev(
2568 sensor, sensor->pixel_array, sensor->binner,
2569 SMIAPP_PA_PAD_SRC, SMIAPP_PAD_SINK,
2570 MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE);
2571 if (rval)
2572 goto out_err;
2573
2574 return 0;
2575
2576 out_err:
2577 smiapp_unregistered(subdev);
2578
2579 return rval;
2580 }
2581
2582 static void smiapp_cleanup(struct smiapp_sensor *sensor)
2583 {
2584 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2585
2586 device_remove_file(&client->dev, &dev_attr_nvm);
2587 device_remove_file(&client->dev, &dev_attr_ident);
2588
2589 smiapp_free_controls(sensor);
2590 }
2591
2592 static void smiapp_create_subdev(struct smiapp_sensor *sensor,
2593 struct smiapp_subdev *ssd, const char *name,
2594 unsigned short num_pads)
2595 {
2596 struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
2597
2598 if (!ssd)
2599 return;
2600
2601 if (ssd != sensor->src)
2602 v4l2_subdev_init(&ssd->sd, &smiapp_ops);
2603
2604 ssd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
2605 ssd->sensor = sensor;
2606
2607 ssd->npads = num_pads;
2608 ssd->source_pad = num_pads - 1;
2609
2610 v4l2_i2c_subdev_set_name(&ssd->sd, client, sensor->minfo.name, name);
2611
2612 smiapp_get_native_size(ssd, &ssd->sink_fmt);
2613
2614 ssd->compose.width = ssd->sink_fmt.width;
2615 ssd->compose.height = ssd->sink_fmt.height;
2616 ssd->crop[ssd->source_pad] = ssd->compose;
2617 ssd->pads[ssd->source_pad].flags = MEDIA_PAD_FL_SOURCE;
2618 if (ssd != sensor->pixel_array) {
2619 ssd->crop[ssd->sink_pad] = ssd->compose;
2620 ssd->pads[ssd->sink_pad].flags = MEDIA_PAD_FL_SINK;
2621 }
2622
2623 ssd->sd.entity.ops = &smiapp_entity_ops;
2624
2625 if (ssd == sensor->src)
2626 return;
2627
2628 ssd->sd.internal_ops = &smiapp_internal_ops;
2629 ssd->sd.owner = THIS_MODULE;
2630 ssd->sd.dev = &client->dev;
2631 v4l2_set_subdevdata(&ssd->sd, client);
2632 }
2633
2634 static int smiapp_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
2635 {
2636 struct smiapp_subdev *ssd = to_smiapp_subdev(sd);
2637 struct smiapp_sensor *sensor = ssd->sensor;
2638 unsigned int i;
2639
2640 mutex_lock(&sensor->mutex);
2641
2642 for (i = 0; i < ssd->npads; i++) {
2643 struct v4l2_mbus_framefmt *try_fmt =
2644 v4l2_subdev_get_try_format(sd, fh->pad, i);
2645 struct v4l2_rect *try_crop =
2646 v4l2_subdev_get_try_crop(sd, fh->pad, i);
2647 struct v4l2_rect *try_comp;
2648
2649 smiapp_get_native_size(ssd, try_crop);
2650
2651 try_fmt->width = try_crop->width;
2652 try_fmt->height = try_crop->height;
2653 try_fmt->code = sensor->internal_csi_format->code;
2654 try_fmt->field = V4L2_FIELD_NONE;
2655
2656 if (ssd != sensor->pixel_array)
2657 continue;
2658
2659 try_comp = v4l2_subdev_get_try_compose(sd, fh->pad, i);
2660 *try_comp = *try_crop;
2661 }
2662
2663 mutex_unlock(&sensor->mutex);
2664
2665 return 0;
2666 }
2667
2668 static const struct v4l2_subdev_video_ops smiapp_video_ops = {
2669 .s_stream = smiapp_set_stream,
2670 };
2671
2672 static const struct v4l2_subdev_pad_ops smiapp_pad_ops = {
2673 .enum_mbus_code = smiapp_enum_mbus_code,
2674 .get_fmt = smiapp_get_format,
2675 .set_fmt = smiapp_set_format,
2676 .get_selection = smiapp_get_selection,
2677 .set_selection = smiapp_set_selection,
2678 };
2679
2680 static const struct v4l2_subdev_sensor_ops smiapp_sensor_ops = {
2681 .g_skip_frames = smiapp_get_skip_frames,
2682 .g_skip_top_lines = smiapp_get_skip_top_lines,
2683 };
2684
2685 static const struct v4l2_subdev_ops smiapp_ops = {
2686 .video = &smiapp_video_ops,
2687 .pad = &smiapp_pad_ops,
2688 .sensor = &smiapp_sensor_ops,
2689 };
2690
2691 static const struct media_entity_operations smiapp_entity_ops = {
2692 .link_validate = v4l2_subdev_link_validate,
2693 };
2694
2695 static const struct v4l2_subdev_internal_ops smiapp_internal_src_ops = {
2696 .registered = smiapp_registered,
2697 .unregistered = smiapp_unregistered,
2698 .open = smiapp_open,
2699 };
2700
2701 static const struct v4l2_subdev_internal_ops smiapp_internal_ops = {
2702 .open = smiapp_open,
2703 };
2704
2705
2706
2707
2708
2709 static int __maybe_unused smiapp_suspend(struct device *dev)
2710 {
2711 struct i2c_client *client = to_i2c_client(dev);
2712 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2713 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2714 bool streaming = sensor->streaming;
2715 int rval;
2716
2717 rval = pm_runtime_get_sync(dev);
2718 if (rval < 0) {
2719 if (rval != -EBUSY && rval != -EAGAIN)
2720 pm_runtime_set_active(&client->dev);
2721 pm_runtime_put(dev);
2722 return -EAGAIN;
2723 }
2724
2725 if (sensor->streaming)
2726 smiapp_stop_streaming(sensor);
2727
2728
2729 sensor->streaming = streaming;
2730
2731 return 0;
2732 }
2733
2734 static int __maybe_unused smiapp_resume(struct device *dev)
2735 {
2736 struct i2c_client *client = to_i2c_client(dev);
2737 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
2738 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
2739 int rval = 0;
2740
2741 pm_runtime_put(dev);
2742
2743 if (sensor->streaming)
2744 rval = smiapp_start_streaming(sensor);
2745
2746 return rval;
2747 }
2748
2749 static struct smiapp_hwconfig *smiapp_get_hwconfig(struct device *dev)
2750 {
2751 struct smiapp_hwconfig *hwcfg;
2752 struct v4l2_fwnode_endpoint bus_cfg = { .bus_type = 0 };
2753 struct fwnode_handle *ep;
2754 struct fwnode_handle *fwnode = dev_fwnode(dev);
2755 u32 rotation;
2756 int i;
2757 int rval;
2758
2759 if (!fwnode)
2760 return dev->platform_data;
2761
2762 ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
2763 if (!ep)
2764 return NULL;
2765
2766 bus_cfg.bus_type = V4L2_MBUS_CSI2_DPHY;
2767 rval = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
2768 if (rval == -ENXIO) {
2769 bus_cfg = (struct v4l2_fwnode_endpoint)
2770 { .bus_type = V4L2_MBUS_CCP2 };
2771 rval = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
2772 }
2773 if (rval)
2774 goto out_err;
2775
2776 hwcfg = devm_kzalloc(dev, sizeof(*hwcfg), GFP_KERNEL);
2777 if (!hwcfg)
2778 goto out_err;
2779
2780 switch (bus_cfg.bus_type) {
2781 case V4L2_MBUS_CSI2_DPHY:
2782 hwcfg->csi_signalling_mode = SMIAPP_CSI_SIGNALLING_MODE_CSI2;
2783 hwcfg->lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
2784 break;
2785 case V4L2_MBUS_CCP2:
2786 hwcfg->csi_signalling_mode = (bus_cfg.bus.mipi_csi1.strobe) ?
2787 SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_STROBE :
2788 SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_CLOCK;
2789 hwcfg->lanes = 1;
2790 break;
2791 default:
2792 dev_err(dev, "unsupported bus %u\n", bus_cfg.bus_type);
2793 goto out_err;
2794 }
2795
2796 dev_dbg(dev, "lanes %u\n", hwcfg->lanes);
2797
2798 rval = fwnode_property_read_u32(fwnode, "rotation", &rotation);
2799 if (!rval) {
2800 switch (rotation) {
2801 case 180:
2802 hwcfg->module_board_orient =
2803 SMIAPP_MODULE_BOARD_ORIENT_180;
2804
2805 case 0:
2806 break;
2807 default:
2808 dev_err(dev, "invalid rotation %u\n", rotation);
2809 goto out_err;
2810 }
2811 }
2812
2813
2814 fwnode_property_read_u32(fwnode, "nokia,nvm-size", &hwcfg->nvm_size);
2815
2816 rval = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
2817 &hwcfg->ext_clk);
2818 if (rval)
2819 dev_info(dev, "can't get clock-frequency\n");
2820
2821 dev_dbg(dev, "nvm %d, clk %d, mode %d\n",
2822 hwcfg->nvm_size, hwcfg->ext_clk, hwcfg->csi_signalling_mode);
2823
2824 if (!bus_cfg.nr_of_link_frequencies) {
2825 dev_warn(dev, "no link frequencies defined\n");
2826 goto out_err;
2827 }
2828
2829 hwcfg->op_sys_clock = devm_kcalloc(
2830 dev, bus_cfg.nr_of_link_frequencies + 1 ,
2831 sizeof(*hwcfg->op_sys_clock), GFP_KERNEL);
2832 if (!hwcfg->op_sys_clock)
2833 goto out_err;
2834
2835 for (i = 0; i < bus_cfg.nr_of_link_frequencies; i++) {
2836 hwcfg->op_sys_clock[i] = bus_cfg.link_frequencies[i];
2837 dev_dbg(dev, "freq %d: %lld\n", i, hwcfg->op_sys_clock[i]);
2838 }
2839
2840 v4l2_fwnode_endpoint_free(&bus_cfg);
2841 fwnode_handle_put(ep);
2842 return hwcfg;
2843
2844 out_err:
2845 v4l2_fwnode_endpoint_free(&bus_cfg);
2846 fwnode_handle_put(ep);
2847 return NULL;
2848 }
2849
2850 static int smiapp_probe(struct i2c_client *client)
2851 {
2852 struct smiapp_sensor *sensor;
2853 struct smiapp_hwconfig *hwcfg = smiapp_get_hwconfig(&client->dev);
2854 unsigned int i;
2855 int rval;
2856
2857 if (hwcfg == NULL)
2858 return -ENODEV;
2859
2860 sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL);
2861 if (sensor == NULL)
2862 return -ENOMEM;
2863
2864 sensor->hwcfg = hwcfg;
2865 mutex_init(&sensor->mutex);
2866 sensor->src = &sensor->ssds[sensor->ssds_used];
2867
2868 v4l2_i2c_subdev_init(&sensor->src->sd, client, &smiapp_ops);
2869 sensor->src->sd.internal_ops = &smiapp_internal_src_ops;
2870
2871 sensor->vana = devm_regulator_get(&client->dev, "vana");
2872 if (IS_ERR(sensor->vana)) {
2873 dev_err(&client->dev, "could not get regulator for vana\n");
2874 return PTR_ERR(sensor->vana);
2875 }
2876
2877 sensor->ext_clk = devm_clk_get(&client->dev, NULL);
2878 if (PTR_ERR(sensor->ext_clk) == -ENOENT) {
2879 dev_info(&client->dev, "no clock defined, continuing...\n");
2880 sensor->ext_clk = NULL;
2881 } else if (IS_ERR(sensor->ext_clk)) {
2882 dev_err(&client->dev, "could not get clock (%ld)\n",
2883 PTR_ERR(sensor->ext_clk));
2884 return -EPROBE_DEFER;
2885 }
2886
2887 if (sensor->ext_clk) {
2888 if (sensor->hwcfg->ext_clk) {
2889 unsigned long rate;
2890
2891 rval = clk_set_rate(sensor->ext_clk,
2892 sensor->hwcfg->ext_clk);
2893 if (rval < 0) {
2894 dev_err(&client->dev,
2895 "unable to set clock freq to %u\n",
2896 sensor->hwcfg->ext_clk);
2897 return rval;
2898 }
2899
2900 rate = clk_get_rate(sensor->ext_clk);
2901 if (rate != sensor->hwcfg->ext_clk) {
2902 dev_err(&client->dev,
2903 "can't set clock freq, asked for %u but got %lu\n",
2904 sensor->hwcfg->ext_clk, rate);
2905 return rval;
2906 }
2907 } else {
2908 sensor->hwcfg->ext_clk = clk_get_rate(sensor->ext_clk);
2909 dev_dbg(&client->dev, "obtained clock freq %u\n",
2910 sensor->hwcfg->ext_clk);
2911 }
2912 } else if (sensor->hwcfg->ext_clk) {
2913 dev_dbg(&client->dev, "assuming clock freq %u\n",
2914 sensor->hwcfg->ext_clk);
2915 } else {
2916 dev_err(&client->dev, "unable to obtain clock freq\n");
2917 return -EINVAL;
2918 }
2919
2920 sensor->xshutdown = devm_gpiod_get_optional(&client->dev, "xshutdown",
2921 GPIOD_OUT_LOW);
2922 if (IS_ERR(sensor->xshutdown))
2923 return PTR_ERR(sensor->xshutdown);
2924
2925 rval = smiapp_power_on(&client->dev);
2926 if (rval < 0)
2927 return rval;
2928
2929 rval = smiapp_identify_module(sensor);
2930 if (rval) {
2931 rval = -ENODEV;
2932 goto out_power_off;
2933 }
2934
2935 rval = smiapp_get_all_limits(sensor);
2936 if (rval) {
2937 rval = -ENODEV;
2938 goto out_power_off;
2939 }
2940
2941 rval = smiapp_read_frame_fmt(sensor);
2942 if (rval) {
2943 rval = -ENODEV;
2944 goto out_power_off;
2945 }
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960 if (sensor->hwcfg->module_board_orient ==
2961 SMIAPP_MODULE_BOARD_ORIENT_180)
2962 sensor->hvflip_inv_mask = SMIAPP_IMAGE_ORIENTATION_HFLIP |
2963 SMIAPP_IMAGE_ORIENTATION_VFLIP;
2964
2965 rval = smiapp_call_quirk(sensor, limits);
2966 if (rval) {
2967 dev_err(&client->dev, "limits quirks failed\n");
2968 goto out_power_off;
2969 }
2970
2971 if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY]) {
2972 u32 val;
2973
2974 rval = smiapp_read(sensor,
2975 SMIAPP_REG_U8_BINNING_SUBTYPES, &val);
2976 if (rval < 0) {
2977 rval = -ENODEV;
2978 goto out_power_off;
2979 }
2980 sensor->nbinning_subtypes = min_t(u8, val,
2981 SMIAPP_BINNING_SUBTYPES);
2982
2983 for (i = 0; i < sensor->nbinning_subtypes; i++) {
2984 rval = smiapp_read(
2985 sensor, SMIAPP_REG_U8_BINNING_TYPE_n(i), &val);
2986 if (rval < 0) {
2987 rval = -ENODEV;
2988 goto out_power_off;
2989 }
2990 sensor->binning_subtypes[i] =
2991 *(struct smiapp_binning_subtype *)&val;
2992
2993 dev_dbg(&client->dev, "binning %xx%x\n",
2994 sensor->binning_subtypes[i].horizontal,
2995 sensor->binning_subtypes[i].vertical);
2996 }
2997 }
2998 sensor->binning_horizontal = 1;
2999 sensor->binning_vertical = 1;
3000
3001 if (device_create_file(&client->dev, &dev_attr_ident) != 0) {
3002 dev_err(&client->dev, "sysfs ident entry creation failed\n");
3003 rval = -ENOENT;
3004 goto out_power_off;
3005 }
3006
3007
3008
3009 if (sensor->minfo.smiapp_version && sensor->hwcfg->nvm_size) {
3010 sensor->nvm = devm_kzalloc(&client->dev,
3011 sensor->hwcfg->nvm_size, GFP_KERNEL);
3012 if (sensor->nvm == NULL) {
3013 rval = -ENOMEM;
3014 goto out_cleanup;
3015 }
3016
3017 if (device_create_file(&client->dev, &dev_attr_nvm) != 0) {
3018 dev_err(&client->dev, "sysfs nvm entry failed\n");
3019 rval = -EBUSY;
3020 goto out_cleanup;
3021 }
3022 }
3023
3024
3025 if (!sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV] ||
3026 !sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV] ||
3027 !sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV] ||
3028 !sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV]) {
3029 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_0;
3030 } else if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
3031 != SMIAPP_SCALING_CAPABILITY_NONE) {
3032 if (sensor->limits[SMIAPP_LIMIT_SCALING_CAPABILITY]
3033 == SMIAPP_SCALING_CAPABILITY_HORIZONTAL)
3034 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_1;
3035 else
3036 sensor->minfo.smiapp_profile = SMIAPP_PROFILE_2;
3037 sensor->scaler = &sensor->ssds[sensor->ssds_used];
3038 sensor->ssds_used++;
3039 } else if (sensor->limits[SMIAPP_LIMIT_DIGITAL_CROP_CAPABILITY]
3040 == SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
3041 sensor->scaler = &sensor->ssds[sensor->ssds_used];
3042 sensor->ssds_used++;
3043 }
3044 sensor->binner = &sensor->ssds[sensor->ssds_used];
3045 sensor->ssds_used++;
3046 sensor->pixel_array = &sensor->ssds[sensor->ssds_used];
3047 sensor->ssds_used++;
3048
3049 sensor->scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
3050
3051
3052 sensor->pll.bus_type = SMIAPP_PLL_BUS_TYPE_CSI2;
3053 sensor->pll.csi2.lanes = sensor->hwcfg->lanes;
3054 sensor->pll.ext_clk_freq_hz = sensor->hwcfg->ext_clk;
3055 sensor->pll.scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
3056
3057 if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
3058 sensor->pll.flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS;
3059
3060 smiapp_create_subdev(sensor, sensor->scaler, " scaler", 2);
3061 smiapp_create_subdev(sensor, sensor->binner, " binner", 2);
3062 smiapp_create_subdev(sensor, sensor->pixel_array, " pixel_array", 1);
3063
3064 dev_dbg(&client->dev, "profile %d\n", sensor->minfo.smiapp_profile);
3065
3066 sensor->pixel_array->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
3067
3068 rval = smiapp_init_controls(sensor);
3069 if (rval < 0)
3070 goto out_cleanup;
3071
3072 rval = smiapp_call_quirk(sensor, init);
3073 if (rval)
3074 goto out_cleanup;
3075
3076 rval = smiapp_get_mbus_formats(sensor);
3077 if (rval) {
3078 rval = -ENODEV;
3079 goto out_cleanup;
3080 }
3081
3082 rval = smiapp_init_late_controls(sensor);
3083 if (rval) {
3084 rval = -ENODEV;
3085 goto out_cleanup;
3086 }
3087
3088 mutex_lock(&sensor->mutex);
3089 rval = smiapp_update_mode(sensor);
3090 mutex_unlock(&sensor->mutex);
3091 if (rval) {
3092 dev_err(&client->dev, "update mode failed\n");
3093 goto out_cleanup;
3094 }
3095
3096 sensor->streaming = false;
3097 sensor->dev_init_done = true;
3098
3099 rval = media_entity_pads_init(&sensor->src->sd.entity, 2,
3100 sensor->src->pads);
3101 if (rval < 0)
3102 goto out_media_entity_cleanup;
3103
3104 pm_runtime_set_active(&client->dev);
3105 pm_runtime_get_noresume(&client->dev);
3106 pm_runtime_enable(&client->dev);
3107
3108 rval = v4l2_async_register_subdev_sensor_common(&sensor->src->sd);
3109 if (rval < 0)
3110 goto out_disable_runtime_pm;
3111
3112 pm_runtime_set_autosuspend_delay(&client->dev, 1000);
3113 pm_runtime_use_autosuspend(&client->dev);
3114 pm_runtime_put_autosuspend(&client->dev);
3115
3116 return 0;
3117
3118 out_disable_runtime_pm:
3119 pm_runtime_disable(&client->dev);
3120
3121 out_media_entity_cleanup:
3122 media_entity_cleanup(&sensor->src->sd.entity);
3123
3124 out_cleanup:
3125 smiapp_cleanup(sensor);
3126
3127 out_power_off:
3128 smiapp_power_off(&client->dev);
3129
3130 return rval;
3131 }
3132
3133 static int smiapp_remove(struct i2c_client *client)
3134 {
3135 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
3136 struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
3137 unsigned int i;
3138
3139 v4l2_async_unregister_subdev(subdev);
3140
3141 pm_runtime_disable(&client->dev);
3142 if (!pm_runtime_status_suspended(&client->dev))
3143 smiapp_power_off(&client->dev);
3144 pm_runtime_set_suspended(&client->dev);
3145
3146 for (i = 0; i < sensor->ssds_used; i++) {
3147 v4l2_device_unregister_subdev(&sensor->ssds[i].sd);
3148 media_entity_cleanup(&sensor->ssds[i].sd.entity);
3149 }
3150 smiapp_cleanup(sensor);
3151
3152 return 0;
3153 }
3154
3155 static const struct of_device_id smiapp_of_table[] = {
3156 { .compatible = "nokia,smia" },
3157 { },
3158 };
3159 MODULE_DEVICE_TABLE(of, smiapp_of_table);
3160
3161 static const struct i2c_device_id smiapp_id_table[] = {
3162 { SMIAPP_NAME, 0 },
3163 { },
3164 };
3165 MODULE_DEVICE_TABLE(i2c, smiapp_id_table);
3166
3167 static const struct dev_pm_ops smiapp_pm_ops = {
3168 SET_SYSTEM_SLEEP_PM_OPS(smiapp_suspend, smiapp_resume)
3169 SET_RUNTIME_PM_OPS(smiapp_power_off, smiapp_power_on, NULL)
3170 };
3171
3172 static struct i2c_driver smiapp_i2c_driver = {
3173 .driver = {
3174 .of_match_table = smiapp_of_table,
3175 .name = SMIAPP_NAME,
3176 .pm = &smiapp_pm_ops,
3177 },
3178 .probe_new = smiapp_probe,
3179 .remove = smiapp_remove,
3180 .id_table = smiapp_id_table,
3181 };
3182
3183 module_i2c_driver(smiapp_i2c_driver);
3184
3185 MODULE_AUTHOR("Sakari Ailus <sakari.ailus@iki.fi>");
3186 MODULE_DESCRIPTION("Generic SMIA/SMIA++ camera module driver");
3187 MODULE_LICENSE("GPL v2");