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