1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Microchip Image Sensor Controller (ISC) common driver base
4  *
5  * Copyright (C) 2016-2019 Microchip Technology, Inc.
6  *
7  * Author: Songjun Wu
8  * Author: Eugen Hristev <eugen.hristev@microchip.com>
9  *
10  */
11 
12 #include <linux/clk.h>
13 #include <linux/clkdev.h>
14 #include <linux/clk-provider.h>
15 #include <linux/delay.h>
16 #include <linux/interrupt.h>
17 #include <linux/math64.h>
18 #include <linux/module.h>
19 #include <linux/of.h>
20 #include <linux/of_graph.h>
21 #include <linux/platform_device.h>
22 #include <linux/pm_runtime.h>
23 #include <linux/regmap.h>
24 #include <linux/videodev2.h>
25 
26 #include <media/v4l2-ctrls.h>
27 #include <media/v4l2-device.h>
28 #include <media/v4l2-event.h>
29 #include <media/v4l2-image-sizes.h>
30 #include <media/v4l2-ioctl.h>
31 #include <media/v4l2-fwnode.h>
32 #include <media/v4l2-subdev.h>
33 #include <media/videobuf2-dma-contig.h>
34 
35 #include "atmel-isc-regs.h"
36 #include "atmel-isc.h"
37 
38 static unsigned int debug;
39 module_param(debug, int, 0644);
40 MODULE_PARM_DESC(debug, "debug level (0-2)");
41 
42 static unsigned int sensor_preferred = 1;
43 module_param(sensor_preferred, uint, 0644);
44 MODULE_PARM_DESC(sensor_preferred,
45 		 "Sensor is preferred to output the specified format (1-on 0-off), default 1");
46 
47 /* This is a list of the formats that the ISC can *output* */
48 const struct isc_format controller_formats[] = {
49 	{
50 		.fourcc		= V4L2_PIX_FMT_ARGB444,
51 	},
52 	{
53 		.fourcc		= V4L2_PIX_FMT_ARGB555,
54 	},
55 	{
56 		.fourcc		= V4L2_PIX_FMT_RGB565,
57 	},
58 	{
59 		.fourcc		= V4L2_PIX_FMT_ABGR32,
60 	},
61 	{
62 		.fourcc		= V4L2_PIX_FMT_XBGR32,
63 	},
64 	{
65 		.fourcc		= V4L2_PIX_FMT_YUV420,
66 	},
67 	{
68 		.fourcc		= V4L2_PIX_FMT_YUYV,
69 	},
70 	{
71 		.fourcc		= V4L2_PIX_FMT_YUV422P,
72 	},
73 	{
74 		.fourcc		= V4L2_PIX_FMT_GREY,
75 	},
76 };
77 
78 /* This is a list of formats that the ISC can receive as *input* */
79 struct isc_format formats_list[] = {
80 	{
81 		.fourcc		= V4L2_PIX_FMT_SBGGR8,
82 		.mbus_code	= MEDIA_BUS_FMT_SBGGR8_1X8,
83 		.pfe_cfg0_bps	= ISC_PFE_CFG0_BPS_EIGHT,
84 		.cfa_baycfg	= ISC_BAY_CFG_BGBG,
85 	},
86 	{
87 		.fourcc		= V4L2_PIX_FMT_SGBRG8,
88 		.mbus_code	= MEDIA_BUS_FMT_SGBRG8_1X8,
89 		.pfe_cfg0_bps	= ISC_PFE_CFG0_BPS_EIGHT,
90 		.cfa_baycfg	= ISC_BAY_CFG_GBGB,
91 	},
92 	{
93 		.fourcc		= V4L2_PIX_FMT_SGRBG8,
94 		.mbus_code	= MEDIA_BUS_FMT_SGRBG8_1X8,
95 		.pfe_cfg0_bps	= ISC_PFE_CFG0_BPS_EIGHT,
96 		.cfa_baycfg	= ISC_BAY_CFG_GRGR,
97 	},
98 	{
99 		.fourcc		= V4L2_PIX_FMT_SRGGB8,
100 		.mbus_code	= MEDIA_BUS_FMT_SRGGB8_1X8,
101 		.pfe_cfg0_bps	= ISC_PFE_CFG0_BPS_EIGHT,
102 		.cfa_baycfg	= ISC_BAY_CFG_RGRG,
103 	},
104 	{
105 		.fourcc		= V4L2_PIX_FMT_SBGGR10,
106 		.mbus_code	= MEDIA_BUS_FMT_SBGGR10_1X10,
107 		.pfe_cfg0_bps	= ISC_PFG_CFG0_BPS_TEN,
108 		.cfa_baycfg	= ISC_BAY_CFG_RGRG,
109 	},
110 	{
111 		.fourcc		= V4L2_PIX_FMT_SGBRG10,
112 		.mbus_code	= MEDIA_BUS_FMT_SGBRG10_1X10,
113 		.pfe_cfg0_bps	= ISC_PFG_CFG0_BPS_TEN,
114 		.cfa_baycfg	= ISC_BAY_CFG_GBGB,
115 	},
116 	{
117 		.fourcc		= V4L2_PIX_FMT_SGRBG10,
118 		.mbus_code	= MEDIA_BUS_FMT_SGRBG10_1X10,
119 		.pfe_cfg0_bps	= ISC_PFG_CFG0_BPS_TEN,
120 		.cfa_baycfg	= ISC_BAY_CFG_GRGR,
121 	},
122 	{
123 		.fourcc		= V4L2_PIX_FMT_SRGGB10,
124 		.mbus_code	= MEDIA_BUS_FMT_SRGGB10_1X10,
125 		.pfe_cfg0_bps	= ISC_PFG_CFG0_BPS_TEN,
126 		.cfa_baycfg	= ISC_BAY_CFG_RGRG,
127 	},
128 	{
129 		.fourcc		= V4L2_PIX_FMT_SBGGR12,
130 		.mbus_code	= MEDIA_BUS_FMT_SBGGR12_1X12,
131 		.pfe_cfg0_bps	= ISC_PFG_CFG0_BPS_TWELVE,
132 		.cfa_baycfg	= ISC_BAY_CFG_BGBG,
133 	},
134 	{
135 		.fourcc		= V4L2_PIX_FMT_SGBRG12,
136 		.mbus_code	= MEDIA_BUS_FMT_SGBRG12_1X12,
137 		.pfe_cfg0_bps	= ISC_PFG_CFG0_BPS_TWELVE,
138 		.cfa_baycfg	= ISC_BAY_CFG_GBGB,
139 	},
140 	{
141 		.fourcc		= V4L2_PIX_FMT_SGRBG12,
142 		.mbus_code	= MEDIA_BUS_FMT_SGRBG12_1X12,
143 		.pfe_cfg0_bps	= ISC_PFG_CFG0_BPS_TWELVE,
144 		.cfa_baycfg	= ISC_BAY_CFG_GRGR,
145 	},
146 	{
147 		.fourcc		= V4L2_PIX_FMT_SRGGB12,
148 		.mbus_code	= MEDIA_BUS_FMT_SRGGB12_1X12,
149 		.pfe_cfg0_bps	= ISC_PFG_CFG0_BPS_TWELVE,
150 		.cfa_baycfg	= ISC_BAY_CFG_RGRG,
151 	},
152 	{
153 		.fourcc		= V4L2_PIX_FMT_GREY,
154 		.mbus_code	= MEDIA_BUS_FMT_Y8_1X8,
155 		.pfe_cfg0_bps	= ISC_PFE_CFG0_BPS_EIGHT,
156 	},
157 	{
158 		.fourcc		= V4L2_PIX_FMT_YUYV,
159 		.mbus_code	= MEDIA_BUS_FMT_YUYV8_2X8,
160 		.pfe_cfg0_bps	= ISC_PFE_CFG0_BPS_EIGHT,
161 	},
162 	{
163 		.fourcc		= V4L2_PIX_FMT_RGB565,
164 		.mbus_code	= MEDIA_BUS_FMT_RGB565_2X8_LE,
165 		.pfe_cfg0_bps	= ISC_PFE_CFG0_BPS_EIGHT,
166 	},
167 };
168 
169 /* Gamma table with gamma 1/2.2 */
170 const u32 isc_gamma_table[GAMMA_MAX + 1][GAMMA_ENTRIES] = {
171 	/* 0 --> gamma 1/1.8 */
172 	{      0x65,  0x66002F,  0x950025,  0xBB0020,  0xDB001D,  0xF8001A,
173 	  0x1130018, 0x12B0017, 0x1420016, 0x1580014, 0x16D0013, 0x1810012,
174 	  0x1940012, 0x1A60012, 0x1B80011, 0x1C90010, 0x1DA0010, 0x1EA000F,
175 	  0x1FA000F, 0x209000F, 0x218000F, 0x227000E, 0x235000E, 0x243000E,
176 	  0x251000E, 0x25F000D, 0x26C000D, 0x279000D, 0x286000D, 0x293000C,
177 	  0x2A0000C, 0x2AC000C, 0x2B8000C, 0x2C4000C, 0x2D0000B, 0x2DC000B,
178 	  0x2E7000B, 0x2F3000B, 0x2FE000B, 0x309000B, 0x314000B, 0x31F000A,
179 	  0x32A000A, 0x334000B, 0x33F000A, 0x349000A, 0x354000A, 0x35E000A,
180 	  0x368000A, 0x372000A, 0x37C000A, 0x386000A, 0x3900009, 0x399000A,
181 	  0x3A30009, 0x3AD0009, 0x3B60009, 0x3BF000A, 0x3C90009, 0x3D20009,
182 	  0x3DB0009, 0x3E40009, 0x3ED0009, 0x3F60009 },
183 
184 	/* 1 --> gamma 1/2 */
185 	{      0x7F,  0x800034,  0xB50028,  0xDE0021, 0x100001E, 0x11E001B,
186 	  0x1390019, 0x1520017, 0x16A0015, 0x1800014, 0x1940014, 0x1A80013,
187 	  0x1BB0012, 0x1CD0011, 0x1DF0010, 0x1EF0010, 0x200000F, 0x20F000F,
188 	  0x21F000E, 0x22D000F, 0x23C000E, 0x24A000E, 0x258000D, 0x265000D,
189 	  0x273000C, 0x27F000D, 0x28C000C, 0x299000C, 0x2A5000C, 0x2B1000B,
190 	  0x2BC000C, 0x2C8000B, 0x2D3000C, 0x2DF000B, 0x2EA000A, 0x2F5000A,
191 	  0x2FF000B, 0x30A000A, 0x314000B, 0x31F000A, 0x329000A, 0x333000A,
192 	  0x33D0009, 0x3470009, 0x350000A, 0x35A0009, 0x363000A, 0x36D0009,
193 	  0x3760009, 0x37F0009, 0x3880009, 0x3910009, 0x39A0009, 0x3A30009,
194 	  0x3AC0008, 0x3B40009, 0x3BD0008, 0x3C60008, 0x3CE0008, 0x3D60009,
195 	  0x3DF0008, 0x3E70008, 0x3EF0008, 0x3F70008 },
196 
197 	/* 2 --> gamma 1/2.2 */
198 	{      0x99,  0x9B0038,  0xD4002A,  0xFF0023, 0x122001F, 0x141001B,
199 	  0x15D0019, 0x1760017, 0x18E0015, 0x1A30015, 0x1B80013, 0x1CC0012,
200 	  0x1DE0011, 0x1F00010, 0x2010010, 0x2110010, 0x221000F, 0x230000F,
201 	  0x23F000E, 0x24D000E, 0x25B000D, 0x269000C, 0x276000C, 0x283000C,
202 	  0x28F000C, 0x29B000C, 0x2A7000C, 0x2B3000B, 0x2BF000B, 0x2CA000B,
203 	  0x2D5000B, 0x2E0000A, 0x2EB000A, 0x2F5000A, 0x2FF000A, 0x30A000A,
204 	  0x3140009, 0x31E0009, 0x327000A, 0x3310009, 0x33A0009, 0x3440009,
205 	  0x34D0009, 0x3560009, 0x35F0009, 0x3680008, 0x3710008, 0x3790009,
206 	  0x3820008, 0x38A0008, 0x3930008, 0x39B0008, 0x3A30008, 0x3AB0008,
207 	  0x3B30008, 0x3BB0008, 0x3C30008, 0x3CB0007, 0x3D20008, 0x3DA0007,
208 	  0x3E20007, 0x3E90007, 0x3F00008, 0x3F80007 },
209 };
210 
211 #define ISC_IS_FORMAT_RAW(mbus_code) \
212 	(((mbus_code) & 0xf000) == 0x3000)
213 
isc_update_awb_ctrls(struct isc_device * isc)214 static inline void isc_update_awb_ctrls(struct isc_device *isc)
215 {
216 	struct isc_ctrls *ctrls = &isc->ctrls;
217 
218 	regmap_write(isc->regmap, ISC_WB_O_RGR,
219 		     (ISC_WB_O_ZERO_VAL - (ctrls->offset[ISC_HIS_CFG_MODE_R])) |
220 		     ((ISC_WB_O_ZERO_VAL - ctrls->offset[ISC_HIS_CFG_MODE_GR]) << 16));
221 	regmap_write(isc->regmap, ISC_WB_O_BGB,
222 		     (ISC_WB_O_ZERO_VAL - (ctrls->offset[ISC_HIS_CFG_MODE_B])) |
223 		     ((ISC_WB_O_ZERO_VAL - ctrls->offset[ISC_HIS_CFG_MODE_GB]) << 16));
224 	regmap_write(isc->regmap, ISC_WB_G_RGR,
225 		     ctrls->gain[ISC_HIS_CFG_MODE_R] |
226 		     (ctrls->gain[ISC_HIS_CFG_MODE_GR] << 16));
227 	regmap_write(isc->regmap, ISC_WB_G_BGB,
228 		     ctrls->gain[ISC_HIS_CFG_MODE_B] |
229 		     (ctrls->gain[ISC_HIS_CFG_MODE_GB] << 16));
230 }
231 
isc_reset_awb_ctrls(struct isc_device * isc)232 static inline void isc_reset_awb_ctrls(struct isc_device *isc)
233 {
234 	unsigned int c;
235 
236 	for (c = ISC_HIS_CFG_MODE_GR; c <= ISC_HIS_CFG_MODE_B; c++) {
237 		/* gains have a fixed point at 9 decimals */
238 		isc->ctrls.gain[c] = 1 << 9;
239 		/* offsets are in 2's complements, the value
240 		 * will be substracted from ISC_WB_O_ZERO_VAL to obtain
241 		 * 2's complement of a value between 0 and
242 		 * ISC_WB_O_ZERO_VAL >> 1
243 		 */
244 		isc->ctrls.offset[c] = ISC_WB_O_ZERO_VAL;
245 	}
246 }
247 
isc_wait_clk_stable(struct clk_hw * hw)248 static int isc_wait_clk_stable(struct clk_hw *hw)
249 {
250 	struct isc_clk *isc_clk = to_isc_clk(hw);
251 	struct regmap *regmap = isc_clk->regmap;
252 	unsigned long timeout = jiffies + usecs_to_jiffies(1000);
253 	unsigned int status;
254 
255 	while (time_before(jiffies, timeout)) {
256 		regmap_read(regmap, ISC_CLKSR, &status);
257 		if (!(status & ISC_CLKSR_SIP))
258 			return 0;
259 
260 		usleep_range(10, 250);
261 	}
262 
263 	return -ETIMEDOUT;
264 }
265 
isc_clk_prepare(struct clk_hw * hw)266 static int isc_clk_prepare(struct clk_hw *hw)
267 {
268 	struct isc_clk *isc_clk = to_isc_clk(hw);
269 
270 	if (isc_clk->id == ISC_ISPCK)
271 		pm_runtime_get_sync(isc_clk->dev);
272 
273 	return isc_wait_clk_stable(hw);
274 }
275 
isc_clk_unprepare(struct clk_hw * hw)276 static void isc_clk_unprepare(struct clk_hw *hw)
277 {
278 	struct isc_clk *isc_clk = to_isc_clk(hw);
279 
280 	isc_wait_clk_stable(hw);
281 
282 	if (isc_clk->id == ISC_ISPCK)
283 		pm_runtime_put_sync(isc_clk->dev);
284 }
285 
isc_clk_enable(struct clk_hw * hw)286 static int isc_clk_enable(struct clk_hw *hw)
287 {
288 	struct isc_clk *isc_clk = to_isc_clk(hw);
289 	u32 id = isc_clk->id;
290 	struct regmap *regmap = isc_clk->regmap;
291 	unsigned long flags;
292 	unsigned int status;
293 
294 	dev_dbg(isc_clk->dev, "ISC CLK: %s, div = %d, parent id = %d\n",
295 		__func__, isc_clk->div, isc_clk->parent_id);
296 
297 	spin_lock_irqsave(&isc_clk->lock, flags);
298 	regmap_update_bits(regmap, ISC_CLKCFG,
299 			   ISC_CLKCFG_DIV_MASK(id) | ISC_CLKCFG_SEL_MASK(id),
300 			   (isc_clk->div << ISC_CLKCFG_DIV_SHIFT(id)) |
301 			   (isc_clk->parent_id << ISC_CLKCFG_SEL_SHIFT(id)));
302 
303 	regmap_write(regmap, ISC_CLKEN, ISC_CLK(id));
304 	spin_unlock_irqrestore(&isc_clk->lock, flags);
305 
306 	regmap_read(regmap, ISC_CLKSR, &status);
307 	if (status & ISC_CLK(id))
308 		return 0;
309 	else
310 		return -EINVAL;
311 }
312 
isc_clk_disable(struct clk_hw * hw)313 static void isc_clk_disable(struct clk_hw *hw)
314 {
315 	struct isc_clk *isc_clk = to_isc_clk(hw);
316 	u32 id = isc_clk->id;
317 	unsigned long flags;
318 
319 	spin_lock_irqsave(&isc_clk->lock, flags);
320 	regmap_write(isc_clk->regmap, ISC_CLKDIS, ISC_CLK(id));
321 	spin_unlock_irqrestore(&isc_clk->lock, flags);
322 }
323 
isc_clk_is_enabled(struct clk_hw * hw)324 static int isc_clk_is_enabled(struct clk_hw *hw)
325 {
326 	struct isc_clk *isc_clk = to_isc_clk(hw);
327 	u32 status;
328 
329 	if (isc_clk->id == ISC_ISPCK)
330 		pm_runtime_get_sync(isc_clk->dev);
331 
332 	regmap_read(isc_clk->regmap, ISC_CLKSR, &status);
333 
334 	if (isc_clk->id == ISC_ISPCK)
335 		pm_runtime_put_sync(isc_clk->dev);
336 
337 	return status & ISC_CLK(isc_clk->id) ? 1 : 0;
338 }
339 
340 static unsigned long
isc_clk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)341 isc_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
342 {
343 	struct isc_clk *isc_clk = to_isc_clk(hw);
344 
345 	return DIV_ROUND_CLOSEST(parent_rate, isc_clk->div + 1);
346 }
347 
isc_clk_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)348 static int isc_clk_determine_rate(struct clk_hw *hw,
349 				   struct clk_rate_request *req)
350 {
351 	struct isc_clk *isc_clk = to_isc_clk(hw);
352 	long best_rate = -EINVAL;
353 	int best_diff = -1;
354 	unsigned int i, div;
355 
356 	for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
357 		struct clk_hw *parent;
358 		unsigned long parent_rate;
359 
360 		parent = clk_hw_get_parent_by_index(hw, i);
361 		if (!parent)
362 			continue;
363 
364 		parent_rate = clk_hw_get_rate(parent);
365 		if (!parent_rate)
366 			continue;
367 
368 		for (div = 1; div < ISC_CLK_MAX_DIV + 2; div++) {
369 			unsigned long rate;
370 			int diff;
371 
372 			rate = DIV_ROUND_CLOSEST(parent_rate, div);
373 			diff = abs(req->rate - rate);
374 
375 			if (best_diff < 0 || best_diff > diff) {
376 				best_rate = rate;
377 				best_diff = diff;
378 				req->best_parent_rate = parent_rate;
379 				req->best_parent_hw = parent;
380 			}
381 
382 			if (!best_diff || rate < req->rate)
383 				break;
384 		}
385 
386 		if (!best_diff)
387 			break;
388 	}
389 
390 	dev_dbg(isc_clk->dev,
391 		"ISC CLK: %s, best_rate = %ld, parent clk: %s @ %ld\n",
392 		__func__, best_rate,
393 		__clk_get_name((req->best_parent_hw)->clk),
394 		req->best_parent_rate);
395 
396 	if (best_rate < 0)
397 		return best_rate;
398 
399 	req->rate = best_rate;
400 
401 	return 0;
402 }
403 
isc_clk_set_parent(struct clk_hw * hw,u8 index)404 static int isc_clk_set_parent(struct clk_hw *hw, u8 index)
405 {
406 	struct isc_clk *isc_clk = to_isc_clk(hw);
407 
408 	if (index >= clk_hw_get_num_parents(hw))
409 		return -EINVAL;
410 
411 	isc_clk->parent_id = index;
412 
413 	return 0;
414 }
415 
isc_clk_get_parent(struct clk_hw * hw)416 static u8 isc_clk_get_parent(struct clk_hw *hw)
417 {
418 	struct isc_clk *isc_clk = to_isc_clk(hw);
419 
420 	return isc_clk->parent_id;
421 }
422 
isc_clk_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)423 static int isc_clk_set_rate(struct clk_hw *hw,
424 			     unsigned long rate,
425 			     unsigned long parent_rate)
426 {
427 	struct isc_clk *isc_clk = to_isc_clk(hw);
428 	u32 div;
429 
430 	if (!rate)
431 		return -EINVAL;
432 
433 	div = DIV_ROUND_CLOSEST(parent_rate, rate);
434 	if (div > (ISC_CLK_MAX_DIV + 1) || !div)
435 		return -EINVAL;
436 
437 	isc_clk->div = div - 1;
438 
439 	return 0;
440 }
441 
442 static const struct clk_ops isc_clk_ops = {
443 	.prepare	= isc_clk_prepare,
444 	.unprepare	= isc_clk_unprepare,
445 	.enable		= isc_clk_enable,
446 	.disable	= isc_clk_disable,
447 	.is_enabled	= isc_clk_is_enabled,
448 	.recalc_rate	= isc_clk_recalc_rate,
449 	.determine_rate	= isc_clk_determine_rate,
450 	.set_parent	= isc_clk_set_parent,
451 	.get_parent	= isc_clk_get_parent,
452 	.set_rate	= isc_clk_set_rate,
453 };
454 
isc_clk_register(struct isc_device * isc,unsigned int id)455 static int isc_clk_register(struct isc_device *isc, unsigned int id)
456 {
457 	struct regmap *regmap = isc->regmap;
458 	struct device_node *np = isc->dev->of_node;
459 	struct isc_clk *isc_clk;
460 	struct clk_init_data init;
461 	const char *clk_name = np->name;
462 	const char *parent_names[3];
463 	int num_parents;
464 
465 	num_parents = of_clk_get_parent_count(np);
466 	if (num_parents < 1 || num_parents > 3)
467 		return -EINVAL;
468 
469 	if (num_parents > 2 && id == ISC_ISPCK)
470 		num_parents = 2;
471 
472 	of_clk_parent_fill(np, parent_names, num_parents);
473 
474 	if (id == ISC_MCK)
475 		of_property_read_string(np, "clock-output-names", &clk_name);
476 	else
477 		clk_name = "isc-ispck";
478 
479 	init.parent_names	= parent_names;
480 	init.num_parents	= num_parents;
481 	init.name		= clk_name;
482 	init.ops		= &isc_clk_ops;
483 	init.flags		= CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE;
484 
485 	isc_clk = &isc->isc_clks[id];
486 	isc_clk->hw.init	= &init;
487 	isc_clk->regmap		= regmap;
488 	isc_clk->id		= id;
489 	isc_clk->dev		= isc->dev;
490 	spin_lock_init(&isc_clk->lock);
491 
492 	isc_clk->clk = clk_register(isc->dev, &isc_clk->hw);
493 	if (IS_ERR(isc_clk->clk)) {
494 		dev_err(isc->dev, "%s: clock register fail\n", clk_name);
495 		return PTR_ERR(isc_clk->clk);
496 	} else if (id == ISC_MCK)
497 		of_clk_add_provider(np, of_clk_src_simple_get, isc_clk->clk);
498 
499 	return 0;
500 }
501 
isc_clk_init(struct isc_device * isc)502 int isc_clk_init(struct isc_device *isc)
503 {
504 	unsigned int i;
505 	int ret;
506 
507 	for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++)
508 		isc->isc_clks[i].clk = ERR_PTR(-EINVAL);
509 
510 	for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++) {
511 		ret = isc_clk_register(isc, i);
512 		if (ret)
513 			return ret;
514 	}
515 
516 	return 0;
517 }
518 
isc_clk_cleanup(struct isc_device * isc)519 void isc_clk_cleanup(struct isc_device *isc)
520 {
521 	unsigned int i;
522 
523 	of_clk_del_provider(isc->dev->of_node);
524 
525 	for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++) {
526 		struct isc_clk *isc_clk = &isc->isc_clks[i];
527 
528 		if (!IS_ERR(isc_clk->clk))
529 			clk_unregister(isc_clk->clk);
530 	}
531 }
532 
isc_queue_setup(struct vb2_queue * vq,unsigned int * nbuffers,unsigned int * nplanes,unsigned int sizes[],struct device * alloc_devs[])533 static int isc_queue_setup(struct vb2_queue *vq,
534 			    unsigned int *nbuffers, unsigned int *nplanes,
535 			    unsigned int sizes[], struct device *alloc_devs[])
536 {
537 	struct isc_device *isc = vb2_get_drv_priv(vq);
538 	unsigned int size = isc->fmt.fmt.pix.sizeimage;
539 
540 	if (*nplanes)
541 		return sizes[0] < size ? -EINVAL : 0;
542 
543 	*nplanes = 1;
544 	sizes[0] = size;
545 
546 	return 0;
547 }
548 
isc_buffer_prepare(struct vb2_buffer * vb)549 static int isc_buffer_prepare(struct vb2_buffer *vb)
550 {
551 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
552 	struct isc_device *isc = vb2_get_drv_priv(vb->vb2_queue);
553 	unsigned long size = isc->fmt.fmt.pix.sizeimage;
554 
555 	if (vb2_plane_size(vb, 0) < size) {
556 		v4l2_err(&isc->v4l2_dev, "buffer too small (%lu < %lu)\n",
557 			 vb2_plane_size(vb, 0), size);
558 		return -EINVAL;
559 	}
560 
561 	vb2_set_plane_payload(vb, 0, size);
562 
563 	vbuf->field = isc->fmt.fmt.pix.field;
564 
565 	return 0;
566 }
567 
isc_start_dma(struct isc_device * isc)568 static void isc_start_dma(struct isc_device *isc)
569 {
570 	struct regmap *regmap = isc->regmap;
571 	u32 sizeimage = isc->fmt.fmt.pix.sizeimage;
572 	u32 dctrl_dview;
573 	dma_addr_t addr0;
574 	u32 h, w;
575 
576 	h = isc->fmt.fmt.pix.height;
577 	w = isc->fmt.fmt.pix.width;
578 
579 	/*
580 	 * In case the sensor is not RAW, it will output a pixel (12-16 bits)
581 	 * with two samples on the ISC Data bus (which is 8-12)
582 	 * ISC will count each sample, so, we need to multiply these values
583 	 * by two, to get the real number of samples for the required pixels.
584 	 */
585 	if (!ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code)) {
586 		h <<= 1;
587 		w <<= 1;
588 	}
589 
590 	/*
591 	 * We limit the column/row count that the ISC will output according
592 	 * to the configured resolution that we want.
593 	 * This will avoid the situation where the sensor is misconfigured,
594 	 * sending more data, and the ISC will just take it and DMA to memory,
595 	 * causing corruption.
596 	 */
597 	regmap_write(regmap, ISC_PFE_CFG1,
598 		     (ISC_PFE_CFG1_COLMIN(0) & ISC_PFE_CFG1_COLMIN_MASK) |
599 		     (ISC_PFE_CFG1_COLMAX(w - 1) & ISC_PFE_CFG1_COLMAX_MASK));
600 
601 	regmap_write(regmap, ISC_PFE_CFG2,
602 		     (ISC_PFE_CFG2_ROWMIN(0) & ISC_PFE_CFG2_ROWMIN_MASK) |
603 		     (ISC_PFE_CFG2_ROWMAX(h - 1) & ISC_PFE_CFG2_ROWMAX_MASK));
604 
605 	regmap_update_bits(regmap, ISC_PFE_CFG0,
606 			   ISC_PFE_CFG0_COLEN | ISC_PFE_CFG0_ROWEN,
607 			   ISC_PFE_CFG0_COLEN | ISC_PFE_CFG0_ROWEN);
608 
609 	addr0 = vb2_dma_contig_plane_dma_addr(&isc->cur_frm->vb.vb2_buf, 0);
610 	regmap_write(regmap, ISC_DAD0, addr0);
611 
612 	switch (isc->config.fourcc) {
613 	case V4L2_PIX_FMT_YUV420:
614 		regmap_write(regmap, ISC_DAD1, addr0 + (sizeimage * 2) / 3);
615 		regmap_write(regmap, ISC_DAD2, addr0 + (sizeimage * 5) / 6);
616 		break;
617 	case V4L2_PIX_FMT_YUV422P:
618 		regmap_write(regmap, ISC_DAD1, addr0 + sizeimage / 2);
619 		regmap_write(regmap, ISC_DAD2, addr0 + (sizeimage * 3) / 4);
620 		break;
621 	default:
622 		break;
623 	}
624 
625 	dctrl_dview = isc->config.dctrl_dview;
626 
627 	regmap_write(regmap, ISC_DCTRL, dctrl_dview | ISC_DCTRL_IE_IS);
628 	spin_lock(&isc->awb_lock);
629 	regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_CAPTURE);
630 	spin_unlock(&isc->awb_lock);
631 }
632 
isc_set_pipeline(struct isc_device * isc,u32 pipeline)633 static void isc_set_pipeline(struct isc_device *isc, u32 pipeline)
634 {
635 	struct regmap *regmap = isc->regmap;
636 	struct isc_ctrls *ctrls = &isc->ctrls;
637 	u32 val, bay_cfg;
638 	const u32 *gamma;
639 	unsigned int i;
640 
641 	/* WB-->CFA-->CC-->GAM-->CSC-->CBC-->SUB422-->SUB420 */
642 	for (i = 0; i < ISC_PIPE_LINE_NODE_NUM; i++) {
643 		val = pipeline & BIT(i) ? 1 : 0;
644 		regmap_field_write(isc->pipeline[i], val);
645 	}
646 
647 	if (!pipeline)
648 		return;
649 
650 	bay_cfg = isc->config.sd_format->cfa_baycfg;
651 
652 	if (ctrls->awb == ISC_WB_NONE)
653 		isc_reset_awb_ctrls(isc);
654 
655 	regmap_write(regmap, ISC_WB_CFG, bay_cfg);
656 	isc_update_awb_ctrls(isc);
657 
658 	regmap_write(regmap, ISC_CFA_CFG, bay_cfg | ISC_CFA_CFG_EITPOL);
659 
660 	gamma = &isc_gamma_table[ctrls->gamma_index][0];
661 	regmap_bulk_write(regmap, ISC_GAM_BENTRY, gamma, GAMMA_ENTRIES);
662 	regmap_bulk_write(regmap, ISC_GAM_GENTRY, gamma, GAMMA_ENTRIES);
663 	regmap_bulk_write(regmap, ISC_GAM_RENTRY, gamma, GAMMA_ENTRIES);
664 
665 	/* Convert RGB to YUV */
666 	regmap_write(regmap, ISC_CSC_YR_YG, 0x42 | (0x81 << 16));
667 	regmap_write(regmap, ISC_CSC_YB_OY, 0x19 | (0x10 << 16));
668 	regmap_write(regmap, ISC_CSC_CBR_CBG, 0xFDA | (0xFB6 << 16));
669 	regmap_write(regmap, ISC_CSC_CBB_OCB, 0x70 | (0x80 << 16));
670 	regmap_write(regmap, ISC_CSC_CRR_CRG, 0x70 | (0xFA2 << 16));
671 	regmap_write(regmap, ISC_CSC_CRB_OCR, 0xFEE | (0x80 << 16));
672 
673 	regmap_write(regmap, ISC_CBC_BRIGHT, ctrls->brightness);
674 	regmap_write(regmap, ISC_CBC_CONTRAST, ctrls->contrast);
675 }
676 
isc_update_profile(struct isc_device * isc)677 static int isc_update_profile(struct isc_device *isc)
678 {
679 	struct regmap *regmap = isc->regmap;
680 	u32 sr;
681 	int counter = 100;
682 
683 	regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_UPPRO);
684 
685 	regmap_read(regmap, ISC_CTRLSR, &sr);
686 	while ((sr & ISC_CTRL_UPPRO) && counter--) {
687 		usleep_range(1000, 2000);
688 		regmap_read(regmap, ISC_CTRLSR, &sr);
689 	}
690 
691 	if (counter < 0) {
692 		v4l2_warn(&isc->v4l2_dev, "Time out to update profile\n");
693 		return -ETIMEDOUT;
694 	}
695 
696 	return 0;
697 }
698 
isc_set_histogram(struct isc_device * isc,bool enable)699 static void isc_set_histogram(struct isc_device *isc, bool enable)
700 {
701 	struct regmap *regmap = isc->regmap;
702 	struct isc_ctrls *ctrls = &isc->ctrls;
703 
704 	if (enable) {
705 		regmap_write(regmap, ISC_HIS_CFG,
706 			     ISC_HIS_CFG_MODE_GR |
707 			     (isc->config.sd_format->cfa_baycfg
708 					<< ISC_HIS_CFG_BAYSEL_SHIFT) |
709 					ISC_HIS_CFG_RAR);
710 		regmap_write(regmap, ISC_HIS_CTRL, ISC_HIS_CTRL_EN);
711 		regmap_write(regmap, ISC_INTEN, ISC_INT_HISDONE);
712 		ctrls->hist_id = ISC_HIS_CFG_MODE_GR;
713 		isc_update_profile(isc);
714 		regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_HISREQ);
715 
716 		ctrls->hist_stat = HIST_ENABLED;
717 	} else {
718 		regmap_write(regmap, ISC_INTDIS, ISC_INT_HISDONE);
719 		regmap_write(regmap, ISC_HIS_CTRL, ISC_HIS_CTRL_DIS);
720 
721 		ctrls->hist_stat = HIST_DISABLED;
722 	}
723 }
724 
isc_configure(struct isc_device * isc)725 static int isc_configure(struct isc_device *isc)
726 {
727 	struct regmap *regmap = isc->regmap;
728 	u32 pfe_cfg0, rlp_mode, dcfg, mask, pipeline;
729 	struct isc_subdev_entity *subdev = isc->current_subdev;
730 
731 	pfe_cfg0 = isc->config.sd_format->pfe_cfg0_bps;
732 	rlp_mode = isc->config.rlp_cfg_mode;
733 	pipeline = isc->config.bits_pipeline;
734 
735 	dcfg = isc->config.dcfg_imode |
736 		       ISC_DCFG_YMBSIZE_BEATS8 | ISC_DCFG_CMBSIZE_BEATS8;
737 
738 	pfe_cfg0  |= subdev->pfe_cfg0 | ISC_PFE_CFG0_MODE_PROGRESSIVE;
739 	mask = ISC_PFE_CFG0_BPS_MASK | ISC_PFE_CFG0_HPOL_LOW |
740 	       ISC_PFE_CFG0_VPOL_LOW | ISC_PFE_CFG0_PPOL_LOW |
741 	       ISC_PFE_CFG0_MODE_MASK | ISC_PFE_CFG0_CCIR_CRC |
742 		   ISC_PFE_CFG0_CCIR656;
743 
744 	regmap_update_bits(regmap, ISC_PFE_CFG0, mask, pfe_cfg0);
745 
746 	regmap_update_bits(regmap, ISC_RLP_CFG, ISC_RLP_CFG_MODE_MASK,
747 			   rlp_mode);
748 
749 	regmap_write(regmap, ISC_DCFG, dcfg);
750 
751 	/* Set the pipeline */
752 	isc_set_pipeline(isc, pipeline);
753 
754 	/*
755 	 * The current implemented histogram is available for RAW R, B, GB, GR
756 	 * channels. We need to check if sensor is outputting RAW BAYER
757 	 */
758 	if (isc->ctrls.awb &&
759 	    ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code))
760 		isc_set_histogram(isc, true);
761 	else
762 		isc_set_histogram(isc, false);
763 
764 	/* Update profile */
765 	return isc_update_profile(isc);
766 }
767 
isc_start_streaming(struct vb2_queue * vq,unsigned int count)768 static int isc_start_streaming(struct vb2_queue *vq, unsigned int count)
769 {
770 	struct isc_device *isc = vb2_get_drv_priv(vq);
771 	struct regmap *regmap = isc->regmap;
772 	struct isc_buffer *buf;
773 	unsigned long flags;
774 	int ret;
775 
776 	/* Enable stream on the sub device */
777 	ret = v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 1);
778 	if (ret && ret != -ENOIOCTLCMD) {
779 		v4l2_err(&isc->v4l2_dev, "stream on failed in subdev %d\n",
780 			 ret);
781 		goto err_start_stream;
782 	}
783 
784 	pm_runtime_get_sync(isc->dev);
785 
786 	ret = isc_configure(isc);
787 	if (unlikely(ret))
788 		goto err_configure;
789 
790 	/* Enable DMA interrupt */
791 	regmap_write(regmap, ISC_INTEN, ISC_INT_DDONE);
792 
793 	spin_lock_irqsave(&isc->dma_queue_lock, flags);
794 
795 	isc->sequence = 0;
796 	isc->stop = false;
797 	reinit_completion(&isc->comp);
798 
799 	isc->cur_frm = list_first_entry(&isc->dma_queue,
800 					struct isc_buffer, list);
801 	list_del(&isc->cur_frm->list);
802 
803 	isc_start_dma(isc);
804 
805 	spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
806 
807 	/* if we streaming from RAW, we can do one-shot white balance adj */
808 	if (ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code))
809 		v4l2_ctrl_activate(isc->do_wb_ctrl, true);
810 
811 	return 0;
812 
813 err_configure:
814 	pm_runtime_put_sync(isc->dev);
815 
816 	v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0);
817 
818 err_start_stream:
819 	spin_lock_irqsave(&isc->dma_queue_lock, flags);
820 	list_for_each_entry(buf, &isc->dma_queue, list)
821 		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED);
822 	INIT_LIST_HEAD(&isc->dma_queue);
823 	spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
824 
825 	return ret;
826 }
827 
isc_stop_streaming(struct vb2_queue * vq)828 static void isc_stop_streaming(struct vb2_queue *vq)
829 {
830 	struct isc_device *isc = vb2_get_drv_priv(vq);
831 	unsigned long flags;
832 	struct isc_buffer *buf;
833 	int ret;
834 
835 	v4l2_ctrl_activate(isc->do_wb_ctrl, false);
836 
837 	isc->stop = true;
838 
839 	/* Wait until the end of the current frame */
840 	if (isc->cur_frm && !wait_for_completion_timeout(&isc->comp, 5 * HZ))
841 		v4l2_err(&isc->v4l2_dev,
842 			 "Timeout waiting for end of the capture\n");
843 
844 	/* Disable DMA interrupt */
845 	regmap_write(isc->regmap, ISC_INTDIS, ISC_INT_DDONE);
846 
847 	pm_runtime_put_sync(isc->dev);
848 
849 	/* Disable stream on the sub device */
850 	ret = v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0);
851 	if (ret && ret != -ENOIOCTLCMD)
852 		v4l2_err(&isc->v4l2_dev, "stream off failed in subdev\n");
853 
854 	/* Release all active buffers */
855 	spin_lock_irqsave(&isc->dma_queue_lock, flags);
856 	if (unlikely(isc->cur_frm)) {
857 		vb2_buffer_done(&isc->cur_frm->vb.vb2_buf,
858 				VB2_BUF_STATE_ERROR);
859 		isc->cur_frm = NULL;
860 	}
861 	list_for_each_entry(buf, &isc->dma_queue, list)
862 		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
863 	INIT_LIST_HEAD(&isc->dma_queue);
864 	spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
865 }
866 
isc_buffer_queue(struct vb2_buffer * vb)867 static void isc_buffer_queue(struct vb2_buffer *vb)
868 {
869 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
870 	struct isc_buffer *buf = container_of(vbuf, struct isc_buffer, vb);
871 	struct isc_device *isc = vb2_get_drv_priv(vb->vb2_queue);
872 	unsigned long flags;
873 
874 	spin_lock_irqsave(&isc->dma_queue_lock, flags);
875 	if (!isc->cur_frm && list_empty(&isc->dma_queue) &&
876 		vb2_is_streaming(vb->vb2_queue)) {
877 		isc->cur_frm = buf;
878 		isc_start_dma(isc);
879 	} else
880 		list_add_tail(&buf->list, &isc->dma_queue);
881 	spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
882 }
883 
find_format_by_fourcc(struct isc_device * isc,unsigned int fourcc)884 static struct isc_format *find_format_by_fourcc(struct isc_device *isc,
885 						 unsigned int fourcc)
886 {
887 	unsigned int num_formats = isc->num_user_formats;
888 	struct isc_format *fmt;
889 	unsigned int i;
890 
891 	for (i = 0; i < num_formats; i++) {
892 		fmt = isc->user_formats[i];
893 		if (fmt->fourcc == fourcc)
894 			return fmt;
895 	}
896 
897 	return NULL;
898 }
899 
900 static const struct vb2_ops isc_vb2_ops = {
901 	.queue_setup		= isc_queue_setup,
902 	.wait_prepare		= vb2_ops_wait_prepare,
903 	.wait_finish		= vb2_ops_wait_finish,
904 	.buf_prepare		= isc_buffer_prepare,
905 	.start_streaming	= isc_start_streaming,
906 	.stop_streaming		= isc_stop_streaming,
907 	.buf_queue		= isc_buffer_queue,
908 };
909 
isc_querycap(struct file * file,void * priv,struct v4l2_capability * cap)910 static int isc_querycap(struct file *file, void *priv,
911 			 struct v4l2_capability *cap)
912 {
913 	struct isc_device *isc = video_drvdata(file);
914 
915 	strscpy(cap->driver, ATMEL_ISC_NAME, sizeof(cap->driver));
916 	strscpy(cap->card, "Atmel Image Sensor Controller", sizeof(cap->card));
917 	snprintf(cap->bus_info, sizeof(cap->bus_info),
918 		 "platform:%s", isc->v4l2_dev.name);
919 
920 	return 0;
921 }
922 
isc_enum_fmt_vid_cap(struct file * file,void * priv,struct v4l2_fmtdesc * f)923 static int isc_enum_fmt_vid_cap(struct file *file, void *priv,
924 				 struct v4l2_fmtdesc *f)
925 {
926 	u32 index = f->index;
927 	u32 i, supported_index;
928 
929 	if (index < ARRAY_SIZE(controller_formats)) {
930 		f->pixelformat = controller_formats[index].fourcc;
931 		return 0;
932 	}
933 
934 	index -= ARRAY_SIZE(controller_formats);
935 
936 	i = 0;
937 	supported_index = 0;
938 
939 	for (i = 0; i < ARRAY_SIZE(formats_list); i++) {
940 		if (!ISC_IS_FORMAT_RAW(formats_list[i].mbus_code) ||
941 		    !formats_list[i].sd_support)
942 			continue;
943 		if (supported_index == index) {
944 			f->pixelformat = formats_list[i].fourcc;
945 			return 0;
946 		}
947 		supported_index++;
948 	}
949 
950 	return -EINVAL;
951 }
952 
isc_g_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * fmt)953 static int isc_g_fmt_vid_cap(struct file *file, void *priv,
954 			      struct v4l2_format *fmt)
955 {
956 	struct isc_device *isc = video_drvdata(file);
957 
958 	*fmt = isc->fmt;
959 
960 	return 0;
961 }
962 
963 /*
964  * Checks the current configured format, if ISC can output it,
965  * considering which type of format the ISC receives from the sensor
966  */
isc_try_validate_formats(struct isc_device * isc)967 static int isc_try_validate_formats(struct isc_device *isc)
968 {
969 	int ret;
970 	bool bayer = false, yuv = false, rgb = false, grey = false;
971 
972 	/* all formats supported by the RLP module are OK */
973 	switch (isc->try_config.fourcc) {
974 	case V4L2_PIX_FMT_SBGGR8:
975 	case V4L2_PIX_FMT_SGBRG8:
976 	case V4L2_PIX_FMT_SGRBG8:
977 	case V4L2_PIX_FMT_SRGGB8:
978 	case V4L2_PIX_FMT_SBGGR10:
979 	case V4L2_PIX_FMT_SGBRG10:
980 	case V4L2_PIX_FMT_SGRBG10:
981 	case V4L2_PIX_FMT_SRGGB10:
982 	case V4L2_PIX_FMT_SBGGR12:
983 	case V4L2_PIX_FMT_SGBRG12:
984 	case V4L2_PIX_FMT_SGRBG12:
985 	case V4L2_PIX_FMT_SRGGB12:
986 		ret = 0;
987 		bayer = true;
988 		break;
989 
990 	case V4L2_PIX_FMT_YUV420:
991 	case V4L2_PIX_FMT_YUV422P:
992 	case V4L2_PIX_FMT_YUYV:
993 		ret = 0;
994 		yuv = true;
995 		break;
996 
997 	case V4L2_PIX_FMT_RGB565:
998 	case V4L2_PIX_FMT_ABGR32:
999 	case V4L2_PIX_FMT_XBGR32:
1000 	case V4L2_PIX_FMT_ARGB444:
1001 	case V4L2_PIX_FMT_ARGB555:
1002 		ret = 0;
1003 		rgb = true;
1004 		break;
1005 	case V4L2_PIX_FMT_GREY:
1006 		ret = 0;
1007 		grey = true;
1008 		break;
1009 	default:
1010 	/* any other different formats are not supported */
1011 		ret = -EINVAL;
1012 	}
1013 
1014 	/* we cannot output RAW/Grey if we do not receive RAW */
1015 	if ((bayer || grey) &&
1016 	    !ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code))
1017 		return -EINVAL;
1018 
1019 	v4l2_dbg(1, debug, &isc->v4l2_dev,
1020 		 "Format validation, requested rgb=%u, yuv=%u, grey=%u, bayer=%u\n",
1021 		 rgb, yuv, grey, bayer);
1022 
1023 	return ret;
1024 }
1025 
1026 /*
1027  * Configures the RLP and DMA modules, depending on the output format
1028  * configured for the ISC.
1029  * If direct_dump == true, just dump raw data 8 bits.
1030  */
isc_try_configure_rlp_dma(struct isc_device * isc,bool direct_dump)1031 static int isc_try_configure_rlp_dma(struct isc_device *isc, bool direct_dump)
1032 {
1033 	if (direct_dump) {
1034 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT8;
1035 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED8;
1036 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1037 		isc->try_config.bpp = 16;
1038 		return 0;
1039 	}
1040 
1041 	switch (isc->try_config.fourcc) {
1042 	case V4L2_PIX_FMT_SBGGR8:
1043 	case V4L2_PIX_FMT_SGBRG8:
1044 	case V4L2_PIX_FMT_SGRBG8:
1045 	case V4L2_PIX_FMT_SRGGB8:
1046 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT8;
1047 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED8;
1048 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1049 		isc->try_config.bpp = 8;
1050 		break;
1051 	case V4L2_PIX_FMT_SBGGR10:
1052 	case V4L2_PIX_FMT_SGBRG10:
1053 	case V4L2_PIX_FMT_SGRBG10:
1054 	case V4L2_PIX_FMT_SRGGB10:
1055 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT10;
1056 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1057 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1058 		isc->try_config.bpp = 16;
1059 		break;
1060 	case V4L2_PIX_FMT_SBGGR12:
1061 	case V4L2_PIX_FMT_SGBRG12:
1062 	case V4L2_PIX_FMT_SGRBG12:
1063 	case V4L2_PIX_FMT_SRGGB12:
1064 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT12;
1065 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1066 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1067 		isc->try_config.bpp = 16;
1068 		break;
1069 	case V4L2_PIX_FMT_RGB565:
1070 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_RGB565;
1071 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1072 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1073 		isc->try_config.bpp = 16;
1074 		break;
1075 	case V4L2_PIX_FMT_ARGB444:
1076 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_ARGB444;
1077 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1078 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1079 		isc->try_config.bpp = 16;
1080 		break;
1081 	case V4L2_PIX_FMT_ARGB555:
1082 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_ARGB555;
1083 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1084 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1085 		isc->try_config.bpp = 16;
1086 		break;
1087 	case V4L2_PIX_FMT_ABGR32:
1088 	case V4L2_PIX_FMT_XBGR32:
1089 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_ARGB32;
1090 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED32;
1091 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1092 		isc->try_config.bpp = 32;
1093 		break;
1094 	case V4L2_PIX_FMT_YUV420:
1095 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_YYCC;
1096 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_YC420P;
1097 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PLANAR;
1098 		isc->try_config.bpp = 12;
1099 		break;
1100 	case V4L2_PIX_FMT_YUV422P:
1101 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_YYCC;
1102 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_YC422P;
1103 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PLANAR;
1104 		isc->try_config.bpp = 16;
1105 		break;
1106 	case V4L2_PIX_FMT_YUYV:
1107 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_YYCC;
1108 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED32;
1109 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1110 		isc->try_config.bpp = 16;
1111 		break;
1112 	case V4L2_PIX_FMT_GREY:
1113 		isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DATY8;
1114 		isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED8;
1115 		isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1116 		isc->try_config.bpp = 8;
1117 		break;
1118 	default:
1119 		return -EINVAL;
1120 	}
1121 	return 0;
1122 }
1123 
1124 /*
1125  * Configuring pipeline modules, depending on which format the ISC outputs
1126  * and considering which format it has as input from the sensor.
1127  */
isc_try_configure_pipeline(struct isc_device * isc)1128 static int isc_try_configure_pipeline(struct isc_device *isc)
1129 {
1130 	switch (isc->try_config.fourcc) {
1131 	case V4L2_PIX_FMT_RGB565:
1132 	case V4L2_PIX_FMT_ARGB555:
1133 	case V4L2_PIX_FMT_ARGB444:
1134 	case V4L2_PIX_FMT_ABGR32:
1135 	case V4L2_PIX_FMT_XBGR32:
1136 		/* if sensor format is RAW, we convert inside ISC */
1137 		if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1138 			isc->try_config.bits_pipeline = CFA_ENABLE |
1139 				WB_ENABLE | GAM_ENABLES;
1140 		} else {
1141 			isc->try_config.bits_pipeline = 0x0;
1142 		}
1143 		break;
1144 	case V4L2_PIX_FMT_YUV420:
1145 		/* if sensor format is RAW, we convert inside ISC */
1146 		if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1147 			isc->try_config.bits_pipeline = CFA_ENABLE |
1148 				CSC_ENABLE | WB_ENABLE | GAM_ENABLES |
1149 				SUB420_ENABLE | SUB422_ENABLE | CBC_ENABLE;
1150 		} else {
1151 			isc->try_config.bits_pipeline = 0x0;
1152 		}
1153 		break;
1154 	case V4L2_PIX_FMT_YUV422P:
1155 		/* if sensor format is RAW, we convert inside ISC */
1156 		if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1157 			isc->try_config.bits_pipeline = CFA_ENABLE |
1158 				CSC_ENABLE | WB_ENABLE | GAM_ENABLES |
1159 				SUB422_ENABLE | CBC_ENABLE;
1160 		} else {
1161 			isc->try_config.bits_pipeline = 0x0;
1162 		}
1163 		break;
1164 	case V4L2_PIX_FMT_YUYV:
1165 		/* if sensor format is RAW, we convert inside ISC */
1166 		if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1167 			isc->try_config.bits_pipeline = CFA_ENABLE |
1168 				CSC_ENABLE | WB_ENABLE | GAM_ENABLES |
1169 				SUB422_ENABLE | CBC_ENABLE;
1170 		} else {
1171 			isc->try_config.bits_pipeline = 0x0;
1172 		}
1173 		break;
1174 	case V4L2_PIX_FMT_GREY:
1175 		if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1176 		/* if sensor format is RAW, we convert inside ISC */
1177 			isc->try_config.bits_pipeline = CFA_ENABLE |
1178 				CSC_ENABLE | WB_ENABLE | GAM_ENABLES |
1179 				CBC_ENABLE;
1180 		} else {
1181 			isc->try_config.bits_pipeline = 0x0;
1182 		}
1183 		break;
1184 	default:
1185 		isc->try_config.bits_pipeline = 0x0;
1186 	}
1187 	return 0;
1188 }
1189 
isc_try_fmt(struct isc_device * isc,struct v4l2_format * f,u32 * code)1190 static int isc_try_fmt(struct isc_device *isc, struct v4l2_format *f,
1191 			u32 *code)
1192 {
1193 	int i;
1194 	struct isc_format *sd_fmt = NULL, *direct_fmt = NULL;
1195 	struct v4l2_pix_format *pixfmt = &f->fmt.pix;
1196 	struct v4l2_subdev_pad_config pad_cfg;
1197 	struct v4l2_subdev_format format = {
1198 		.which = V4L2_SUBDEV_FORMAT_TRY,
1199 	};
1200 	u32 mbus_code;
1201 	int ret;
1202 	bool rlp_dma_direct_dump = false;
1203 
1204 	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1205 		return -EINVAL;
1206 
1207 	/* Step 1: find a RAW format that is supported */
1208 	for (i = 0; i < isc->num_user_formats; i++) {
1209 		if (ISC_IS_FORMAT_RAW(isc->user_formats[i]->mbus_code)) {
1210 			sd_fmt = isc->user_formats[i];
1211 			break;
1212 		}
1213 	}
1214 	/* Step 2: We can continue with this RAW format, or we can look
1215 	 * for better: maybe sensor supports directly what we need.
1216 	 */
1217 	direct_fmt = find_format_by_fourcc(isc, pixfmt->pixelformat);
1218 
1219 	/* Step 3: We have both. We decide given the module parameter which
1220 	 * one to use.
1221 	 */
1222 	if (direct_fmt && sd_fmt && sensor_preferred)
1223 		sd_fmt = direct_fmt;
1224 
1225 	/* Step 4: we do not have RAW but we have a direct format. Use it. */
1226 	if (direct_fmt && !sd_fmt)
1227 		sd_fmt = direct_fmt;
1228 
1229 	/* Step 5: if we are using a direct format, we need to package
1230 	 * everything as 8 bit data and just dump it
1231 	 */
1232 	if (sd_fmt == direct_fmt)
1233 		rlp_dma_direct_dump = true;
1234 
1235 	/* Step 6: We have no format. This can happen if the userspace
1236 	 * requests some weird/invalid format.
1237 	 * In this case, default to whatever we have
1238 	 */
1239 	if (!sd_fmt && !direct_fmt) {
1240 		sd_fmt = isc->user_formats[isc->num_user_formats - 1];
1241 		v4l2_dbg(1, debug, &isc->v4l2_dev,
1242 			 "Sensor not supporting %.4s, using %.4s\n",
1243 			 (char *)&pixfmt->pixelformat, (char *)&sd_fmt->fourcc);
1244 	}
1245 
1246 	if (!sd_fmt) {
1247 		ret = -EINVAL;
1248 		goto isc_try_fmt_err;
1249 	}
1250 
1251 	/* Step 7: Print out what we decided for debugging */
1252 	v4l2_dbg(1, debug, &isc->v4l2_dev,
1253 		 "Preferring to have sensor using format %.4s\n",
1254 		 (char *)&sd_fmt->fourcc);
1255 
1256 	/* Step 8: at this moment we decided which format the subdev will use */
1257 	isc->try_config.sd_format = sd_fmt;
1258 
1259 	/* Limit to Atmel ISC hardware capabilities */
1260 	if (pixfmt->width > ISC_MAX_SUPPORT_WIDTH)
1261 		pixfmt->width = ISC_MAX_SUPPORT_WIDTH;
1262 	if (pixfmt->height > ISC_MAX_SUPPORT_HEIGHT)
1263 		pixfmt->height = ISC_MAX_SUPPORT_HEIGHT;
1264 
1265 	/*
1266 	 * The mbus format is the one the subdev outputs.
1267 	 * The pixels will be transferred in this format Sensor -> ISC
1268 	 */
1269 	mbus_code = sd_fmt->mbus_code;
1270 
1271 	/*
1272 	 * Validate formats. If the required format is not OK, default to raw.
1273 	 */
1274 
1275 	isc->try_config.fourcc = pixfmt->pixelformat;
1276 
1277 	if (isc_try_validate_formats(isc)) {
1278 		pixfmt->pixelformat = isc->try_config.fourcc = sd_fmt->fourcc;
1279 		/* Re-try to validate the new format */
1280 		ret = isc_try_validate_formats(isc);
1281 		if (ret)
1282 			goto isc_try_fmt_err;
1283 	}
1284 
1285 	ret = isc_try_configure_rlp_dma(isc, rlp_dma_direct_dump);
1286 	if (ret)
1287 		goto isc_try_fmt_err;
1288 
1289 	ret = isc_try_configure_pipeline(isc);
1290 	if (ret)
1291 		goto isc_try_fmt_err;
1292 
1293 	v4l2_fill_mbus_format(&format.format, pixfmt, mbus_code);
1294 	ret = v4l2_subdev_call(isc->current_subdev->sd, pad, set_fmt,
1295 			       &pad_cfg, &format);
1296 	if (ret < 0)
1297 		goto isc_try_fmt_subdev_err;
1298 
1299 	v4l2_fill_pix_format(pixfmt, &format.format);
1300 
1301 	pixfmt->field = V4L2_FIELD_NONE;
1302 	pixfmt->bytesperline = (pixfmt->width * isc->try_config.bpp) >> 3;
1303 	pixfmt->sizeimage = pixfmt->bytesperline * pixfmt->height;
1304 
1305 	if (code)
1306 		*code = mbus_code;
1307 
1308 	return 0;
1309 
1310 isc_try_fmt_err:
1311 	v4l2_err(&isc->v4l2_dev, "Could not find any possible format for a working pipeline\n");
1312 isc_try_fmt_subdev_err:
1313 	memset(&isc->try_config, 0, sizeof(isc->try_config));
1314 
1315 	return ret;
1316 }
1317 
isc_set_fmt(struct isc_device * isc,struct v4l2_format * f)1318 static int isc_set_fmt(struct isc_device *isc, struct v4l2_format *f)
1319 {
1320 	struct v4l2_subdev_format format = {
1321 		.which = V4L2_SUBDEV_FORMAT_ACTIVE,
1322 	};
1323 	u32 mbus_code = 0;
1324 	int ret;
1325 
1326 	ret = isc_try_fmt(isc, f, &mbus_code);
1327 	if (ret)
1328 		return ret;
1329 
1330 	v4l2_fill_mbus_format(&format.format, &f->fmt.pix, mbus_code);
1331 	ret = v4l2_subdev_call(isc->current_subdev->sd, pad,
1332 			       set_fmt, NULL, &format);
1333 	if (ret < 0)
1334 		return ret;
1335 
1336 	isc->fmt = *f;
1337 
1338 	if (isc->try_config.sd_format && isc->config.sd_format &&
1339 	    isc->try_config.sd_format != isc->config.sd_format) {
1340 		isc->ctrls.hist_stat = HIST_INIT;
1341 		isc_reset_awb_ctrls(isc);
1342 	}
1343 	/* make the try configuration active */
1344 	isc->config = isc->try_config;
1345 
1346 	v4l2_dbg(1, debug, &isc->v4l2_dev, "New ISC configuration in place\n");
1347 
1348 	return 0;
1349 }
1350 
isc_s_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)1351 static int isc_s_fmt_vid_cap(struct file *file, void *priv,
1352 			      struct v4l2_format *f)
1353 {
1354 	struct isc_device *isc = video_drvdata(file);
1355 
1356 	if (vb2_is_streaming(&isc->vb2_vidq))
1357 		return -EBUSY;
1358 
1359 	return isc_set_fmt(isc, f);
1360 }
1361 
isc_try_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)1362 static int isc_try_fmt_vid_cap(struct file *file, void *priv,
1363 				struct v4l2_format *f)
1364 {
1365 	struct isc_device *isc = video_drvdata(file);
1366 
1367 	return isc_try_fmt(isc, f, NULL);
1368 }
1369 
isc_enum_input(struct file * file,void * priv,struct v4l2_input * inp)1370 static int isc_enum_input(struct file *file, void *priv,
1371 			   struct v4l2_input *inp)
1372 {
1373 	if (inp->index != 0)
1374 		return -EINVAL;
1375 
1376 	inp->type = V4L2_INPUT_TYPE_CAMERA;
1377 	inp->std = 0;
1378 	strscpy(inp->name, "Camera", sizeof(inp->name));
1379 
1380 	return 0;
1381 }
1382 
isc_g_input(struct file * file,void * priv,unsigned int * i)1383 static int isc_g_input(struct file *file, void *priv, unsigned int *i)
1384 {
1385 	*i = 0;
1386 
1387 	return 0;
1388 }
1389 
isc_s_input(struct file * file,void * priv,unsigned int i)1390 static int isc_s_input(struct file *file, void *priv, unsigned int i)
1391 {
1392 	if (i > 0)
1393 		return -EINVAL;
1394 
1395 	return 0;
1396 }
1397 
isc_g_parm(struct file * file,void * fh,struct v4l2_streamparm * a)1398 static int isc_g_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
1399 {
1400 	struct isc_device *isc = video_drvdata(file);
1401 
1402 	return v4l2_g_parm_cap(video_devdata(file), isc->current_subdev->sd, a);
1403 }
1404 
isc_s_parm(struct file * file,void * fh,struct v4l2_streamparm * a)1405 static int isc_s_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
1406 {
1407 	struct isc_device *isc = video_drvdata(file);
1408 
1409 	return v4l2_s_parm_cap(video_devdata(file), isc->current_subdev->sd, a);
1410 }
1411 
isc_enum_framesizes(struct file * file,void * fh,struct v4l2_frmsizeenum * fsize)1412 static int isc_enum_framesizes(struct file *file, void *fh,
1413 			       struct v4l2_frmsizeenum *fsize)
1414 {
1415 	struct isc_device *isc = video_drvdata(file);
1416 	struct v4l2_subdev_frame_size_enum fse = {
1417 		.index = fsize->index,
1418 		.which = V4L2_SUBDEV_FORMAT_ACTIVE,
1419 	};
1420 	int ret = -EINVAL;
1421 	int i;
1422 
1423 	for (i = 0; i < isc->num_user_formats; i++)
1424 		if (isc->user_formats[i]->fourcc == fsize->pixel_format)
1425 			ret = 0;
1426 
1427 	for (i = 0; i < ARRAY_SIZE(controller_formats); i++)
1428 		if (controller_formats[i].fourcc == fsize->pixel_format)
1429 			ret = 0;
1430 
1431 	if (ret)
1432 		return ret;
1433 
1434 	ret = v4l2_subdev_call(isc->current_subdev->sd, pad, enum_frame_size,
1435 			       NULL, &fse);
1436 	if (ret)
1437 		return ret;
1438 
1439 	fse.code = isc->config.sd_format->mbus_code;
1440 
1441 	fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1442 	fsize->discrete.width = fse.max_width;
1443 	fsize->discrete.height = fse.max_height;
1444 
1445 	return 0;
1446 }
1447 
isc_enum_frameintervals(struct file * file,void * fh,struct v4l2_frmivalenum * fival)1448 static int isc_enum_frameintervals(struct file *file, void *fh,
1449 				    struct v4l2_frmivalenum *fival)
1450 {
1451 	struct isc_device *isc = video_drvdata(file);
1452 	struct v4l2_subdev_frame_interval_enum fie = {
1453 		.index = fival->index,
1454 		.width = fival->width,
1455 		.height = fival->height,
1456 		.which = V4L2_SUBDEV_FORMAT_ACTIVE,
1457 	};
1458 	int ret = -EINVAL;
1459 	unsigned int i;
1460 
1461 	for (i = 0; i < isc->num_user_formats; i++)
1462 		if (isc->user_formats[i]->fourcc == fival->pixel_format)
1463 			ret = 0;
1464 
1465 	for (i = 0; i < ARRAY_SIZE(controller_formats); i++)
1466 		if (controller_formats[i].fourcc == fival->pixel_format)
1467 			ret = 0;
1468 
1469 	if (ret)
1470 		return ret;
1471 
1472 	ret = v4l2_subdev_call(isc->current_subdev->sd, pad,
1473 			       enum_frame_interval, NULL, &fie);
1474 	if (ret)
1475 		return ret;
1476 
1477 	fie.code = isc->config.sd_format->mbus_code;
1478 	fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1479 	fival->discrete = fie.interval;
1480 
1481 	return 0;
1482 }
1483 
1484 static const struct v4l2_ioctl_ops isc_ioctl_ops = {
1485 	.vidioc_querycap		= isc_querycap,
1486 	.vidioc_enum_fmt_vid_cap	= isc_enum_fmt_vid_cap,
1487 	.vidioc_g_fmt_vid_cap		= isc_g_fmt_vid_cap,
1488 	.vidioc_s_fmt_vid_cap		= isc_s_fmt_vid_cap,
1489 	.vidioc_try_fmt_vid_cap		= isc_try_fmt_vid_cap,
1490 
1491 	.vidioc_enum_input		= isc_enum_input,
1492 	.vidioc_g_input			= isc_g_input,
1493 	.vidioc_s_input			= isc_s_input,
1494 
1495 	.vidioc_reqbufs			= vb2_ioctl_reqbufs,
1496 	.vidioc_querybuf		= vb2_ioctl_querybuf,
1497 	.vidioc_qbuf			= vb2_ioctl_qbuf,
1498 	.vidioc_expbuf			= vb2_ioctl_expbuf,
1499 	.vidioc_dqbuf			= vb2_ioctl_dqbuf,
1500 	.vidioc_create_bufs		= vb2_ioctl_create_bufs,
1501 	.vidioc_prepare_buf		= vb2_ioctl_prepare_buf,
1502 	.vidioc_streamon		= vb2_ioctl_streamon,
1503 	.vidioc_streamoff		= vb2_ioctl_streamoff,
1504 
1505 	.vidioc_g_parm			= isc_g_parm,
1506 	.vidioc_s_parm			= isc_s_parm,
1507 	.vidioc_enum_framesizes		= isc_enum_framesizes,
1508 	.vidioc_enum_frameintervals	= isc_enum_frameintervals,
1509 
1510 	.vidioc_log_status		= v4l2_ctrl_log_status,
1511 	.vidioc_subscribe_event		= v4l2_ctrl_subscribe_event,
1512 	.vidioc_unsubscribe_event	= v4l2_event_unsubscribe,
1513 };
1514 
isc_open(struct file * file)1515 static int isc_open(struct file *file)
1516 {
1517 	struct isc_device *isc = video_drvdata(file);
1518 	struct v4l2_subdev *sd = isc->current_subdev->sd;
1519 	int ret;
1520 
1521 	if (mutex_lock_interruptible(&isc->lock))
1522 		return -ERESTARTSYS;
1523 
1524 	ret = v4l2_fh_open(file);
1525 	if (ret < 0)
1526 		goto unlock;
1527 
1528 	if (!v4l2_fh_is_singular_file(file))
1529 		goto unlock;
1530 
1531 	ret = v4l2_subdev_call(sd, core, s_power, 1);
1532 	if (ret < 0 && ret != -ENOIOCTLCMD) {
1533 		v4l2_fh_release(file);
1534 		goto unlock;
1535 	}
1536 
1537 	ret = isc_set_fmt(isc, &isc->fmt);
1538 	if (ret) {
1539 		v4l2_subdev_call(sd, core, s_power, 0);
1540 		v4l2_fh_release(file);
1541 	}
1542 
1543 unlock:
1544 	mutex_unlock(&isc->lock);
1545 	return ret;
1546 }
1547 
isc_release(struct file * file)1548 static int isc_release(struct file *file)
1549 {
1550 	struct isc_device *isc = video_drvdata(file);
1551 	struct v4l2_subdev *sd = isc->current_subdev->sd;
1552 	bool fh_singular;
1553 	int ret;
1554 
1555 	mutex_lock(&isc->lock);
1556 
1557 	fh_singular = v4l2_fh_is_singular_file(file);
1558 
1559 	ret = _vb2_fop_release(file, NULL);
1560 
1561 	if (fh_singular)
1562 		v4l2_subdev_call(sd, core, s_power, 0);
1563 
1564 	mutex_unlock(&isc->lock);
1565 
1566 	return ret;
1567 }
1568 
1569 static const struct v4l2_file_operations isc_fops = {
1570 	.owner		= THIS_MODULE,
1571 	.open		= isc_open,
1572 	.release	= isc_release,
1573 	.unlocked_ioctl	= video_ioctl2,
1574 	.read		= vb2_fop_read,
1575 	.mmap		= vb2_fop_mmap,
1576 	.poll		= vb2_fop_poll,
1577 };
1578 
isc_interrupt(int irq,void * dev_id)1579 irqreturn_t isc_interrupt(int irq, void *dev_id)
1580 {
1581 	struct isc_device *isc = (struct isc_device *)dev_id;
1582 	struct regmap *regmap = isc->regmap;
1583 	u32 isc_intsr, isc_intmask, pending;
1584 	irqreturn_t ret = IRQ_NONE;
1585 
1586 	regmap_read(regmap, ISC_INTSR, &isc_intsr);
1587 	regmap_read(regmap, ISC_INTMASK, &isc_intmask);
1588 
1589 	pending = isc_intsr & isc_intmask;
1590 
1591 	if (likely(pending & ISC_INT_DDONE)) {
1592 		spin_lock(&isc->dma_queue_lock);
1593 		if (isc->cur_frm) {
1594 			struct vb2_v4l2_buffer *vbuf = &isc->cur_frm->vb;
1595 			struct vb2_buffer *vb = &vbuf->vb2_buf;
1596 
1597 			vb->timestamp = ktime_get_ns();
1598 			vbuf->sequence = isc->sequence++;
1599 			vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
1600 			isc->cur_frm = NULL;
1601 		}
1602 
1603 		if (!list_empty(&isc->dma_queue) && !isc->stop) {
1604 			isc->cur_frm = list_first_entry(&isc->dma_queue,
1605 						     struct isc_buffer, list);
1606 			list_del(&isc->cur_frm->list);
1607 
1608 			isc_start_dma(isc);
1609 		}
1610 
1611 		if (isc->stop)
1612 			complete(&isc->comp);
1613 
1614 		ret = IRQ_HANDLED;
1615 		spin_unlock(&isc->dma_queue_lock);
1616 	}
1617 
1618 	if (pending & ISC_INT_HISDONE) {
1619 		schedule_work(&isc->awb_work);
1620 		ret = IRQ_HANDLED;
1621 	}
1622 
1623 	return ret;
1624 }
1625 
isc_hist_count(struct isc_device * isc,u32 * min,u32 * max)1626 static void isc_hist_count(struct isc_device *isc, u32 *min, u32 *max)
1627 {
1628 	struct regmap *regmap = isc->regmap;
1629 	struct isc_ctrls *ctrls = &isc->ctrls;
1630 	u32 *hist_count = &ctrls->hist_count[ctrls->hist_id];
1631 	u32 *hist_entry = &ctrls->hist_entry[0];
1632 	u32 i;
1633 
1634 	*min = 0;
1635 	*max = HIST_ENTRIES;
1636 
1637 	regmap_bulk_read(regmap, ISC_HIS_ENTRY, hist_entry, HIST_ENTRIES);
1638 
1639 	*hist_count = 0;
1640 	/*
1641 	 * we deliberately ignore the end of the histogram,
1642 	 * the most white pixels
1643 	 */
1644 	for (i = 1; i < HIST_ENTRIES; i++) {
1645 		if (*hist_entry && !*min)
1646 			*min = i;
1647 		if (*hist_entry)
1648 			*max = i;
1649 		*hist_count += i * (*hist_entry++);
1650 	}
1651 
1652 	if (!*min)
1653 		*min = 1;
1654 }
1655 
isc_wb_update(struct isc_ctrls * ctrls)1656 static void isc_wb_update(struct isc_ctrls *ctrls)
1657 {
1658 	u32 *hist_count = &ctrls->hist_count[0];
1659 	u32 c, offset[4];
1660 	u64 avg = 0;
1661 	/* We compute two gains, stretch gain and grey world gain */
1662 	u32 s_gain[4], gw_gain[4];
1663 
1664 	/*
1665 	 * According to Grey World, we need to set gains for R/B to normalize
1666 	 * them towards the green channel.
1667 	 * Thus we want to keep Green as fixed and adjust only Red/Blue
1668 	 * Compute the average of the both green channels first
1669 	 */
1670 	avg = (u64)hist_count[ISC_HIS_CFG_MODE_GR] +
1671 		(u64)hist_count[ISC_HIS_CFG_MODE_GB];
1672 	avg >>= 1;
1673 
1674 	/* Green histogram is null, nothing to do */
1675 	if (!avg)
1676 		return;
1677 
1678 	for (c = ISC_HIS_CFG_MODE_GR; c <= ISC_HIS_CFG_MODE_B; c++) {
1679 		/*
1680 		 * the color offset is the minimum value of the histogram.
1681 		 * we stretch this color to the full range by substracting
1682 		 * this value from the color component.
1683 		 */
1684 		offset[c] = ctrls->hist_minmax[c][HIST_MIN_INDEX];
1685 		/*
1686 		 * The offset is always at least 1. If the offset is 1, we do
1687 		 * not need to adjust it, so our result must be zero.
1688 		 * the offset is computed in a histogram on 9 bits (0..512)
1689 		 * but the offset in register is based on
1690 		 * 12 bits pipeline (0..4096).
1691 		 * we need to shift with the 3 bits that the histogram is
1692 		 * ignoring
1693 		 */
1694 		ctrls->offset[c] = (offset[c] - 1) << 3;
1695 
1696 		/* the offset is then taken and converted to 2's complements */
1697 		if (!ctrls->offset[c])
1698 			ctrls->offset[c] = ISC_WB_O_ZERO_VAL;
1699 
1700 		/*
1701 		 * the stretch gain is the total number of histogram bins
1702 		 * divided by the actual range of color component (Max - Min)
1703 		 * If we compute gain like this, the actual color component
1704 		 * will be stretched to the full histogram.
1705 		 * We need to shift 9 bits for precision, we have 9 bits for
1706 		 * decimals
1707 		 */
1708 		s_gain[c] = (HIST_ENTRIES << 9) /
1709 			(ctrls->hist_minmax[c][HIST_MAX_INDEX] -
1710 			ctrls->hist_minmax[c][HIST_MIN_INDEX] + 1);
1711 
1712 		/*
1713 		 * Now we have to compute the gain w.r.t. the average.
1714 		 * Add/lose gain to the component towards the average.
1715 		 * If it happens that the component is zero, use the
1716 		 * fixed point value : 1.0 gain.
1717 		 */
1718 		if (hist_count[c])
1719 			gw_gain[c] = div_u64(avg << 9, hist_count[c]);
1720 		else
1721 			gw_gain[c] = 1 << 9;
1722 
1723 		/* multiply both gains and adjust for decimals */
1724 		ctrls->gain[c] = s_gain[c] * gw_gain[c];
1725 		ctrls->gain[c] >>= 9;
1726 	}
1727 }
1728 
isc_awb_work(struct work_struct * w)1729 static void isc_awb_work(struct work_struct *w)
1730 {
1731 	struct isc_device *isc =
1732 		container_of(w, struct isc_device, awb_work);
1733 	struct regmap *regmap = isc->regmap;
1734 	struct isc_ctrls *ctrls = &isc->ctrls;
1735 	u32 hist_id = ctrls->hist_id;
1736 	u32 baysel;
1737 	unsigned long flags;
1738 	u32 min, max;
1739 
1740 	/* streaming is not active anymore */
1741 	if (isc->stop)
1742 		return;
1743 
1744 	if (ctrls->hist_stat != HIST_ENABLED)
1745 		return;
1746 
1747 	isc_hist_count(isc, &min, &max);
1748 	ctrls->hist_minmax[hist_id][HIST_MIN_INDEX] = min;
1749 	ctrls->hist_minmax[hist_id][HIST_MAX_INDEX] = max;
1750 
1751 	if (hist_id != ISC_HIS_CFG_MODE_B) {
1752 		hist_id++;
1753 	} else {
1754 		isc_wb_update(ctrls);
1755 		hist_id = ISC_HIS_CFG_MODE_GR;
1756 	}
1757 
1758 	ctrls->hist_id = hist_id;
1759 	baysel = isc->config.sd_format->cfa_baycfg << ISC_HIS_CFG_BAYSEL_SHIFT;
1760 
1761 	/* if no more auto white balance, reset controls. */
1762 	if (ctrls->awb == ISC_WB_NONE)
1763 		isc_reset_awb_ctrls(isc);
1764 
1765 	pm_runtime_get_sync(isc->dev);
1766 
1767 	/*
1768 	 * only update if we have all the required histograms and controls
1769 	 * if awb has been disabled, we need to reset registers as well.
1770 	 */
1771 	if (hist_id == ISC_HIS_CFG_MODE_GR || ctrls->awb == ISC_WB_NONE) {
1772 		/*
1773 		 * It may happen that DMA Done IRQ will trigger while we are
1774 		 * updating white balance registers here.
1775 		 * In that case, only parts of the controls have been updated.
1776 		 * We can avoid that by locking the section.
1777 		 */
1778 		spin_lock_irqsave(&isc->awb_lock, flags);
1779 		isc_update_awb_ctrls(isc);
1780 		spin_unlock_irqrestore(&isc->awb_lock, flags);
1781 
1782 		/*
1783 		 * if we are doing just the one time white balance adjustment,
1784 		 * we are basically done.
1785 		 */
1786 		if (ctrls->awb == ISC_WB_ONETIME) {
1787 			v4l2_info(&isc->v4l2_dev,
1788 				  "Completed one time white-balance adjustment.\n");
1789 			ctrls->awb = ISC_WB_NONE;
1790 		}
1791 	}
1792 	regmap_write(regmap, ISC_HIS_CFG, hist_id | baysel | ISC_HIS_CFG_RAR);
1793 	isc_update_profile(isc);
1794 	/* if awb has been disabled, we don't need to start another histogram */
1795 	if (ctrls->awb)
1796 		regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_HISREQ);
1797 
1798 	pm_runtime_put_sync(isc->dev);
1799 }
1800 
isc_s_ctrl(struct v4l2_ctrl * ctrl)1801 static int isc_s_ctrl(struct v4l2_ctrl *ctrl)
1802 {
1803 	struct isc_device *isc = container_of(ctrl->handler,
1804 					     struct isc_device, ctrls.handler);
1805 	struct isc_ctrls *ctrls = &isc->ctrls;
1806 
1807 	if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
1808 		return 0;
1809 
1810 	switch (ctrl->id) {
1811 	case V4L2_CID_BRIGHTNESS:
1812 		ctrls->brightness = ctrl->val & ISC_CBC_BRIGHT_MASK;
1813 		break;
1814 	case V4L2_CID_CONTRAST:
1815 		ctrls->contrast = ctrl->val & ISC_CBC_CONTRAST_MASK;
1816 		break;
1817 	case V4L2_CID_GAMMA:
1818 		ctrls->gamma_index = ctrl->val;
1819 		break;
1820 	case V4L2_CID_AUTO_WHITE_BALANCE:
1821 		if (ctrl->val == 1)
1822 			ctrls->awb = ISC_WB_AUTO;
1823 		else
1824 			ctrls->awb = ISC_WB_NONE;
1825 
1826 		/* we did not configure ISC yet */
1827 		if (!isc->config.sd_format)
1828 			break;
1829 
1830 		if (ctrls->hist_stat != HIST_ENABLED)
1831 			isc_reset_awb_ctrls(isc);
1832 
1833 		if (isc->ctrls.awb == ISC_WB_AUTO &&
1834 		    vb2_is_streaming(&isc->vb2_vidq) &&
1835 		    ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code))
1836 			isc_set_histogram(isc, true);
1837 
1838 		break;
1839 	case V4L2_CID_DO_WHITE_BALANCE:
1840 		/* if AWB is enabled, do nothing */
1841 		if (ctrls->awb == ISC_WB_AUTO)
1842 			return 0;
1843 
1844 		ctrls->awb = ISC_WB_ONETIME;
1845 		isc_set_histogram(isc, true);
1846 		v4l2_dbg(1, debug, &isc->v4l2_dev,
1847 			 "One time white-balance started.\n");
1848 		break;
1849 	default:
1850 		return -EINVAL;
1851 	}
1852 
1853 	return 0;
1854 }
1855 
1856 static const struct v4l2_ctrl_ops isc_ctrl_ops = {
1857 	.s_ctrl	= isc_s_ctrl,
1858 };
1859 
isc_ctrl_init(struct isc_device * isc)1860 static int isc_ctrl_init(struct isc_device *isc)
1861 {
1862 	const struct v4l2_ctrl_ops *ops = &isc_ctrl_ops;
1863 	struct isc_ctrls *ctrls = &isc->ctrls;
1864 	struct v4l2_ctrl_handler *hdl = &ctrls->handler;
1865 	int ret;
1866 
1867 	ctrls->hist_stat = HIST_INIT;
1868 	isc_reset_awb_ctrls(isc);
1869 
1870 	ret = v4l2_ctrl_handler_init(hdl, 5);
1871 	if (ret < 0)
1872 		return ret;
1873 
1874 	ctrls->brightness = 0;
1875 	ctrls->contrast = 256;
1876 
1877 	v4l2_ctrl_new_std(hdl, ops, V4L2_CID_BRIGHTNESS, -1024, 1023, 1, 0);
1878 	v4l2_ctrl_new_std(hdl, ops, V4L2_CID_CONTRAST, -2048, 2047, 1, 256);
1879 	v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAMMA, 0, GAMMA_MAX, 1, 2);
1880 	v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTO_WHITE_BALANCE, 0, 1, 1, 1);
1881 
1882 	/* do_white_balance is a button, so min,max,step,default are ignored */
1883 	isc->do_wb_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_DO_WHITE_BALANCE,
1884 					    0, 0, 0, 0);
1885 
1886 	if (!isc->do_wb_ctrl) {
1887 		ret = hdl->error;
1888 		v4l2_ctrl_handler_free(hdl);
1889 		return ret;
1890 	}
1891 
1892 	v4l2_ctrl_activate(isc->do_wb_ctrl, false);
1893 
1894 	v4l2_ctrl_handler_setup(hdl);
1895 
1896 	return 0;
1897 }
1898 
isc_async_bound(struct v4l2_async_notifier * notifier,struct v4l2_subdev * subdev,struct v4l2_async_subdev * asd)1899 static int isc_async_bound(struct v4l2_async_notifier *notifier,
1900 			    struct v4l2_subdev *subdev,
1901 			    struct v4l2_async_subdev *asd)
1902 {
1903 	struct isc_device *isc = container_of(notifier->v4l2_dev,
1904 					      struct isc_device, v4l2_dev);
1905 	struct isc_subdev_entity *subdev_entity =
1906 		container_of(notifier, struct isc_subdev_entity, notifier);
1907 
1908 	if (video_is_registered(&isc->video_dev)) {
1909 		v4l2_err(&isc->v4l2_dev, "only supports one sub-device.\n");
1910 		return -EBUSY;
1911 	}
1912 
1913 	subdev_entity->sd = subdev;
1914 
1915 	return 0;
1916 }
1917 
isc_async_unbind(struct v4l2_async_notifier * notifier,struct v4l2_subdev * subdev,struct v4l2_async_subdev * asd)1918 static void isc_async_unbind(struct v4l2_async_notifier *notifier,
1919 			      struct v4l2_subdev *subdev,
1920 			      struct v4l2_async_subdev *asd)
1921 {
1922 	struct isc_device *isc = container_of(notifier->v4l2_dev,
1923 					      struct isc_device, v4l2_dev);
1924 	cancel_work_sync(&isc->awb_work);
1925 	video_unregister_device(&isc->video_dev);
1926 	v4l2_ctrl_handler_free(&isc->ctrls.handler);
1927 }
1928 
find_format_by_code(unsigned int code,int * index)1929 static struct isc_format *find_format_by_code(unsigned int code, int *index)
1930 {
1931 	struct isc_format *fmt = &formats_list[0];
1932 	unsigned int i;
1933 
1934 	for (i = 0; i < ARRAY_SIZE(formats_list); i++) {
1935 		if (fmt->mbus_code == code) {
1936 			*index = i;
1937 			return fmt;
1938 		}
1939 
1940 		fmt++;
1941 	}
1942 
1943 	return NULL;
1944 }
1945 
isc_formats_init(struct isc_device * isc)1946 static int isc_formats_init(struct isc_device *isc)
1947 {
1948 	struct isc_format *fmt;
1949 	struct v4l2_subdev *subdev = isc->current_subdev->sd;
1950 	unsigned int num_fmts, i, j;
1951 	u32 list_size = ARRAY_SIZE(formats_list);
1952 	struct v4l2_subdev_mbus_code_enum mbus_code = {
1953 		.which = V4L2_SUBDEV_FORMAT_ACTIVE,
1954 	};
1955 
1956 	num_fmts = 0;
1957 	while (!v4l2_subdev_call(subdev, pad, enum_mbus_code,
1958 	       NULL, &mbus_code)) {
1959 		mbus_code.index++;
1960 
1961 		fmt = find_format_by_code(mbus_code.code, &i);
1962 		if (!fmt) {
1963 			v4l2_warn(&isc->v4l2_dev, "Mbus code %x not supported\n",
1964 				  mbus_code.code);
1965 			continue;
1966 		}
1967 
1968 		fmt->sd_support = true;
1969 		num_fmts++;
1970 	}
1971 
1972 	if (!num_fmts)
1973 		return -ENXIO;
1974 
1975 	isc->num_user_formats = num_fmts;
1976 	isc->user_formats = devm_kcalloc(isc->dev,
1977 					 num_fmts, sizeof(*isc->user_formats),
1978 					 GFP_KERNEL);
1979 	if (!isc->user_formats)
1980 		return -ENOMEM;
1981 
1982 	fmt = &formats_list[0];
1983 	for (i = 0, j = 0; i < list_size; i++) {
1984 		if (fmt->sd_support)
1985 			isc->user_formats[j++] = fmt;
1986 		fmt++;
1987 	}
1988 
1989 	return 0;
1990 }
1991 
isc_set_default_fmt(struct isc_device * isc)1992 static int isc_set_default_fmt(struct isc_device *isc)
1993 {
1994 	struct v4l2_format f = {
1995 		.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
1996 		.fmt.pix = {
1997 			.width		= VGA_WIDTH,
1998 			.height		= VGA_HEIGHT,
1999 			.field		= V4L2_FIELD_NONE,
2000 			.pixelformat	= isc->user_formats[0]->fourcc,
2001 		},
2002 	};
2003 	int ret;
2004 
2005 	ret = isc_try_fmt(isc, &f, NULL);
2006 	if (ret)
2007 		return ret;
2008 
2009 	isc->fmt = f;
2010 	return 0;
2011 }
2012 
isc_async_complete(struct v4l2_async_notifier * notifier)2013 static int isc_async_complete(struct v4l2_async_notifier *notifier)
2014 {
2015 	struct isc_device *isc = container_of(notifier->v4l2_dev,
2016 					      struct isc_device, v4l2_dev);
2017 	struct video_device *vdev = &isc->video_dev;
2018 	struct vb2_queue *q = &isc->vb2_vidq;
2019 	int ret = 0;
2020 
2021 	INIT_WORK(&isc->awb_work, isc_awb_work);
2022 
2023 	ret = v4l2_device_register_subdev_nodes(&isc->v4l2_dev);
2024 	if (ret < 0) {
2025 		v4l2_err(&isc->v4l2_dev, "Failed to register subdev nodes\n");
2026 		return ret;
2027 	}
2028 
2029 	isc->current_subdev = container_of(notifier,
2030 					   struct isc_subdev_entity, notifier);
2031 	mutex_init(&isc->lock);
2032 	init_completion(&isc->comp);
2033 
2034 	/* Initialize videobuf2 queue */
2035 	q->type			= V4L2_BUF_TYPE_VIDEO_CAPTURE;
2036 	q->io_modes		= VB2_MMAP | VB2_DMABUF | VB2_READ;
2037 	q->drv_priv		= isc;
2038 	q->buf_struct_size	= sizeof(struct isc_buffer);
2039 	q->ops			= &isc_vb2_ops;
2040 	q->mem_ops		= &vb2_dma_contig_memops;
2041 	q->timestamp_flags	= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
2042 	q->lock			= &isc->lock;
2043 	q->min_buffers_needed	= 1;
2044 	q->dev			= isc->dev;
2045 
2046 	ret = vb2_queue_init(q);
2047 	if (ret < 0) {
2048 		v4l2_err(&isc->v4l2_dev,
2049 			 "vb2_queue_init() failed: %d\n", ret);
2050 		goto isc_async_complete_err;
2051 	}
2052 
2053 	/* Init video dma queues */
2054 	INIT_LIST_HEAD(&isc->dma_queue);
2055 	spin_lock_init(&isc->dma_queue_lock);
2056 	spin_lock_init(&isc->awb_lock);
2057 
2058 	ret = isc_formats_init(isc);
2059 	if (ret < 0) {
2060 		v4l2_err(&isc->v4l2_dev,
2061 			 "Init format failed: %d\n", ret);
2062 		goto isc_async_complete_err;
2063 	}
2064 
2065 	ret = isc_set_default_fmt(isc);
2066 	if (ret) {
2067 		v4l2_err(&isc->v4l2_dev, "Could not set default format\n");
2068 		goto isc_async_complete_err;
2069 	}
2070 
2071 	ret = isc_ctrl_init(isc);
2072 	if (ret) {
2073 		v4l2_err(&isc->v4l2_dev, "Init isc ctrols failed: %d\n", ret);
2074 		goto isc_async_complete_err;
2075 	}
2076 
2077 	/* Register video device */
2078 	strscpy(vdev->name, ATMEL_ISC_NAME, sizeof(vdev->name));
2079 	vdev->release		= video_device_release_empty;
2080 	vdev->fops		= &isc_fops;
2081 	vdev->ioctl_ops		= &isc_ioctl_ops;
2082 	vdev->v4l2_dev		= &isc->v4l2_dev;
2083 	vdev->vfl_dir		= VFL_DIR_RX;
2084 	vdev->queue		= q;
2085 	vdev->lock		= &isc->lock;
2086 	vdev->ctrl_handler	= &isc->ctrls.handler;
2087 	vdev->device_caps	= V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_CAPTURE;
2088 	video_set_drvdata(vdev, isc);
2089 
2090 	ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
2091 	if (ret < 0) {
2092 		v4l2_err(&isc->v4l2_dev,
2093 			 "video_register_device failed: %d\n", ret);
2094 		goto isc_async_complete_err;
2095 	}
2096 
2097 	return 0;
2098 
2099 isc_async_complete_err:
2100 	mutex_destroy(&isc->lock);
2101 	return ret;
2102 }
2103 
2104 const struct v4l2_async_notifier_operations isc_async_ops = {
2105 	.bound = isc_async_bound,
2106 	.unbind = isc_async_unbind,
2107 	.complete = isc_async_complete,
2108 };
2109 
isc_subdev_cleanup(struct isc_device * isc)2110 void isc_subdev_cleanup(struct isc_device *isc)
2111 {
2112 	struct isc_subdev_entity *subdev_entity;
2113 
2114 	list_for_each_entry(subdev_entity, &isc->subdev_entities, list) {
2115 		v4l2_async_notifier_unregister(&subdev_entity->notifier);
2116 		v4l2_async_notifier_cleanup(&subdev_entity->notifier);
2117 	}
2118 
2119 	INIT_LIST_HEAD(&isc->subdev_entities);
2120 }
2121 
isc_pipeline_init(struct isc_device * isc)2122 int isc_pipeline_init(struct isc_device *isc)
2123 {
2124 	struct device *dev = isc->dev;
2125 	struct regmap *regmap = isc->regmap;
2126 	struct regmap_field *regs;
2127 	unsigned int i;
2128 
2129 	/* WB-->CFA-->CC-->GAM-->CSC-->CBC-->SUB422-->SUB420 */
2130 	const struct reg_field regfields[ISC_PIPE_LINE_NODE_NUM] = {
2131 		REG_FIELD(ISC_WB_CTRL, 0, 0),
2132 		REG_FIELD(ISC_CFA_CTRL, 0, 0),
2133 		REG_FIELD(ISC_CC_CTRL, 0, 0),
2134 		REG_FIELD(ISC_GAM_CTRL, 0, 0),
2135 		REG_FIELD(ISC_GAM_CTRL, 1, 1),
2136 		REG_FIELD(ISC_GAM_CTRL, 2, 2),
2137 		REG_FIELD(ISC_GAM_CTRL, 3, 3),
2138 		REG_FIELD(ISC_CSC_CTRL, 0, 0),
2139 		REG_FIELD(ISC_CBC_CTRL, 0, 0),
2140 		REG_FIELD(ISC_SUB422_CTRL, 0, 0),
2141 		REG_FIELD(ISC_SUB420_CTRL, 0, 0),
2142 	};
2143 
2144 	for (i = 0; i < ISC_PIPE_LINE_NODE_NUM; i++) {
2145 		regs = devm_regmap_field_alloc(dev, regmap, regfields[i]);
2146 		if (IS_ERR(regs))
2147 			return PTR_ERR(regs);
2148 
2149 		isc->pipeline[i] =  regs;
2150 	}
2151 
2152 	return 0;
2153 }
2154 
2155 /* regmap configuration */
2156 #define ATMEL_ISC_REG_MAX    0xbfc
2157 const struct regmap_config isc_regmap_config = {
2158 	.reg_bits       = 32,
2159 	.reg_stride     = 4,
2160 	.val_bits       = 32,
2161 	.max_register	= ATMEL_ISC_REG_MAX,
2162 };
2163 
2164