1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Author: Mikhail Ulyanov
4  * Copyright (C) 2014-2015 Cogent Embedded, Inc.  <source@cogentembedded.com>
5  * Copyright (C) 2014-2015 Renesas Electronics Corporation
6  *
7  * This is based on the drivers/media/platform/s5p-jpeg driver by
8  * Andrzej Pietrasiewicz and Jacek Anaszewski.
9  * Some portions of code inspired by VSP1 driver by Laurent Pinchart.
10  *
11  * TODO in order of priority:
12  *      1) Rotation
13  *      2) Cropping
14  *      3) V4L2_CID_JPEG_ACTIVE_MARKER
15  */
16 
17 #include <asm/unaligned.h>
18 #include <linux/clk.h>
19 #include <linux/err.h>
20 #include <linux/interrupt.h>
21 #include <linux/io.h>
22 #include <linux/kernel.h>
23 #include <linux/module.h>
24 #include <linux/of.h>
25 #include <linux/of_device.h>
26 #include <linux/platform_device.h>
27 #include <linux/slab.h>
28 #include <linux/spinlock.h>
29 #include <linux/string.h>
30 #include <linux/videodev2.h>
31 #include <media/v4l2-ctrls.h>
32 #include <media/v4l2-device.h>
33 #include <media/v4l2-event.h>
34 #include <media/v4l2-fh.h>
35 #include <media/v4l2-mem2mem.h>
36 #include <media/v4l2-ioctl.h>
37 #include <media/videobuf2-v4l2.h>
38 #include <media/videobuf2-dma-contig.h>
39 
40 
41 #define DRV_NAME "rcar_jpu"
42 
43 /*
44  * Align JPEG header end to cache line to make sure we will not have any issues
45  * with cache; additionally to requerment (33.3.27 R01UH0501EJ0100 Rev.1.00)
46  */
47 #define JPU_JPEG_HDR_SIZE		(ALIGN(0x258, L1_CACHE_BYTES))
48 #define JPU_JPEG_MAX_BYTES_PER_PIXEL	2	/* 16 bit precision format */
49 #define JPU_JPEG_MIN_SIZE		25	/* SOI + SOF + EOI */
50 #define JPU_JPEG_QTBL_SIZE		0x40
51 #define JPU_JPEG_HDCTBL_SIZE		0x1c
52 #define JPU_JPEG_HACTBL_SIZE		0xb2
53 #define JPU_JPEG_HEIGHT_OFFSET		0x91
54 #define JPU_JPEG_WIDTH_OFFSET		0x93
55 #define JPU_JPEG_SUBS_OFFSET		0x97
56 #define JPU_JPEG_QTBL_LUM_OFFSET	0x07
57 #define JPU_JPEG_QTBL_CHR_OFFSET	0x4c
58 #define JPU_JPEG_HDCTBL_LUM_OFFSET	0xa4
59 #define JPU_JPEG_HACTBL_LUM_OFFSET	0xc5
60 #define JPU_JPEG_HDCTBL_CHR_OFFSET	0x17c
61 #define JPU_JPEG_HACTBL_CHR_OFFSET	0x19d
62 #define JPU_JPEG_PADDING_OFFSET		0x24f
63 #define JPU_JPEG_LUM 0x00
64 #define JPU_JPEG_CHR 0x01
65 #define JPU_JPEG_DC  0x00
66 #define JPU_JPEG_AC  0x10
67 
68 #define JPU_JPEG_422 0x21
69 #define JPU_JPEG_420 0x22
70 
71 #define JPU_JPEG_DEFAULT_422_PIX_FMT V4L2_PIX_FMT_NV16M
72 #define JPU_JPEG_DEFAULT_420_PIX_FMT V4L2_PIX_FMT_NV12M
73 
74 /* JPEG markers */
75 #define TEM	0x01
76 #define SOF0	0xc0
77 #define RST	0xd0
78 #define SOI	0xd8
79 #define EOI	0xd9
80 #define DHP	0xde
81 #define DHT	0xc4
82 #define COM	0xfe
83 #define DQT	0xdb
84 #define DRI	0xdd
85 #define APP0	0xe0
86 
87 #define JPU_RESET_TIMEOUT	100 /* ms */
88 #define JPU_JOB_TIMEOUT		300 /* ms */
89 #define JPU_MAX_QUALITY		4
90 #define JPU_WIDTH_MIN		16
91 #define JPU_HEIGHT_MIN		16
92 #define JPU_WIDTH_MAX		4096
93 #define JPU_HEIGHT_MAX		4096
94 #define JPU_MEMALIGN		8
95 
96 /* Flags that indicate a format can be used for capture/output */
97 #define JPU_FMT_TYPE_OUTPUT	0
98 #define JPU_FMT_TYPE_CAPTURE	1
99 #define JPU_ENC_CAPTURE		(1 << 0)
100 #define JPU_ENC_OUTPUT		(1 << 1)
101 #define JPU_DEC_CAPTURE		(1 << 2)
102 #define JPU_DEC_OUTPUT		(1 << 3)
103 
104 /*
105  * JPEG registers and bits
106  */
107 
108 /* JPEG code mode register */
109 #define JCMOD	0x00
110 #define JCMOD_PCTR		(1 << 7)
111 #define JCMOD_MSKIP_ENABLE	(1 << 5)
112 #define JCMOD_DSP_ENC		(0 << 3)
113 #define JCMOD_DSP_DEC		(1 << 3)
114 #define JCMOD_REDU		(7 << 0)
115 #define JCMOD_REDU_422		(1 << 0)
116 #define JCMOD_REDU_420		(2 << 0)
117 
118 /* JPEG code command register */
119 #define JCCMD	0x04
120 #define JCCMD_SRST	(1 << 12)
121 #define JCCMD_JEND	(1 << 2)
122 #define JCCMD_JSRT	(1 << 0)
123 
124 /* JPEG code quantanization table number register */
125 #define JCQTN	0x0c
126 #define JCQTN_SHIFT(t)		(((t) - 1) << 1)
127 
128 /* JPEG code Huffman table number register */
129 #define JCHTN	0x10
130 #define JCHTN_AC_SHIFT(t)	(((t) << 1) - 1)
131 #define JCHTN_DC_SHIFT(t)	(((t) - 1) << 1)
132 
133 #define JCVSZU	0x1c /* JPEG code vertical size upper register */
134 #define JCVSZD	0x20 /* JPEG code vertical size lower register */
135 #define JCHSZU	0x24 /* JPEG code horizontal size upper register */
136 #define JCHSZD	0x28 /* JPEG code horizontal size lower register */
137 #define JCSZ_MASK 0xff /* JPEG code h/v size register contains only 1 byte*/
138 
139 #define JCDTCU	0x2c /* JPEG code data count upper register */
140 #define JCDTCM	0x30 /* JPEG code data count middle register */
141 #define JCDTCD	0x34 /* JPEG code data count lower register */
142 
143 /* JPEG interrupt enable register */
144 #define JINTE	0x38
145 #define JINTE_ERR		(7 << 5) /* INT5 + INT6 + INT7 */
146 #define JINTE_TRANSF_COMPL	(1 << 10)
147 
148 /* JPEG interrupt status register */
149 #define JINTS	0x3c
150 #define JINTS_MASK	0x7c68
151 #define JINTS_ERR		(1 << 5)
152 #define JINTS_PROCESS_COMPL	(1 << 6)
153 #define JINTS_TRANSF_COMPL	(1 << 10)
154 
155 #define JCDERR	0x40 /* JPEG code decode error register */
156 #define JCDERR_MASK	0xf /* JPEG code decode error register mask*/
157 
158 /* JPEG interface encoding */
159 #define JIFECNT	0x70
160 #define JIFECNT_INFT_422	0
161 #define JIFECNT_INFT_420	1
162 #define JIFECNT_SWAP_WB		(3 << 4) /* to JPU */
163 
164 #define JIFESYA1	0x74	/* encode source Y address register 1 */
165 #define JIFESCA1	0x78	/* encode source C address register 1 */
166 #define JIFESYA2	0x7c	/* encode source Y address register 2 */
167 #define JIFESCA2	0x80	/* encode source C address register 2 */
168 #define JIFESMW		0x84	/* encode source memory width register */
169 #define JIFESVSZ	0x88	/* encode source vertical size register */
170 #define JIFESHSZ	0x8c	/* encode source horizontal size register */
171 #define JIFEDA1		0x90	/* encode destination address register 1 */
172 #define JIFEDA2		0x94	/* encode destination address register 2 */
173 
174 /* JPEG decoding control register */
175 #define JIFDCNT	0xa0
176 #define JIFDCNT_SWAP_WB		(3 << 1) /* from JPU */
177 
178 #define JIFDSA1		0xa4	/* decode source address register 1 */
179 #define JIFDDMW		0xb0	/* decode destination  memory width register */
180 #define JIFDDVSZ	0xb4	/* decode destination  vert. size register */
181 #define JIFDDHSZ	0xb8	/* decode destination  horiz. size register */
182 #define JIFDDYA1	0xbc	/* decode destination  Y address register 1 */
183 #define JIFDDCA1	0xc0	/* decode destination  C address register 1 */
184 
185 #define JCQTBL(n)	(0x10000 + (n) * 0x40)	/* quantization tables regs */
186 #define JCHTBD(n)	(0x10100 + (n) * 0x100)	/* Huffman table DC regs */
187 #define JCHTBA(n)	(0x10120 + (n) * 0x100)	/* Huffman table AC regs */
188 
189 /**
190  * struct jpu - JPEG IP abstraction
191  * @mutex: the mutex protecting this structure
192  * @lock: spinlock protecting the device contexts
193  * @v4l2_dev: v4l2 device for mem2mem mode
194  * @vfd_encoder: video device node for encoder mem2mem mode
195  * @vfd_decoder: video device node for decoder mem2mem mode
196  * @m2m_dev: v4l2 mem2mem device data
197  * @curr: pointer to current context
198  * @regs: JPEG IP registers mapping
199  * @irq: JPEG IP irq
200  * @clk: JPEG IP clock
201  * @dev: JPEG IP struct device
202  * @ref_count: reference counter
203  */
204 struct jpu {
205 	struct mutex	mutex;
206 	spinlock_t	lock;
207 	struct v4l2_device	v4l2_dev;
208 	struct video_device	vfd_encoder;
209 	struct video_device	vfd_decoder;
210 	struct v4l2_m2m_dev	*m2m_dev;
211 	struct jpu_ctx		*curr;
212 
213 	void __iomem		*regs;
214 	unsigned int		irq;
215 	struct clk		*clk;
216 	struct device		*dev;
217 	int			ref_count;
218 };
219 
220 /**
221  * struct jpu_buffer - driver's specific video buffer
222  * @buf: m2m buffer
223  * @compr_quality: destination image quality in compression mode
224  * @subsampling: source image subsampling in decompression mode
225  */
226 struct jpu_buffer {
227 	struct v4l2_m2m_buffer buf;
228 	unsigned short	compr_quality;
229 	unsigned char	subsampling;
230 };
231 
232 /**
233  * struct jpu_fmt - driver's internal format data
234  * @fourcc: the fourcc code, 0 if not applicable
235  * @colorspace: the colorspace specifier
236  * @bpp: number of bits per pixel per plane
237  * @h_align: horizontal alignment order (align to 2^h_align)
238  * @v_align: vertical alignment order (align to 2^v_align)
239  * @subsampling: (horizontal:4 | vertical:4) subsampling factor
240  * @num_planes: number of planes
241  * @types: types of queue this format is applicable to
242  */
243 struct jpu_fmt {
244 	u32 fourcc;
245 	u32 colorspace;
246 	u8 bpp[2];
247 	u8 h_align;
248 	u8 v_align;
249 	u8 subsampling;
250 	u8 num_planes;
251 	u16 types;
252 };
253 
254 /**
255  * struct jpu_q_data - parameters of one queue
256  * @fmtinfo: driver-specific format of this queue
257  * @format: multiplanar format of this queue
258  * @sequence: sequence number
259  */
260 struct jpu_q_data {
261 	struct jpu_fmt *fmtinfo;
262 	struct v4l2_pix_format_mplane format;
263 	unsigned int sequence;
264 };
265 
266 /**
267  * struct jpu_ctx - the device context data
268  * @jpu: JPEG IP device for this context
269  * @encoder: compression (encode) operation or decompression (decode)
270  * @compr_quality: destination image quality in compression (encode) mode
271  * @out_q: source (output) queue information
272  * @cap_q: destination (capture) queue information
273  * @fh: file handler
274  * @ctrl_handler: controls handler
275  */
276 struct jpu_ctx {
277 	struct jpu		*jpu;
278 	bool			encoder;
279 	unsigned short		compr_quality;
280 	struct jpu_q_data	out_q;
281 	struct jpu_q_data	cap_q;
282 	struct v4l2_fh		fh;
283 	struct v4l2_ctrl_handler ctrl_handler;
284 };
285 
286  /**
287  * jpeg_buffer - description of memory containing input JPEG data
288  * @end: end position in the buffer
289  * @curr: current position in the buffer
290  */
291 struct jpeg_buffer {
292 	void *end;
293 	void *curr;
294 };
295 
296 static struct jpu_fmt jpu_formats[] = {
297 	{ V4L2_PIX_FMT_JPEG, V4L2_COLORSPACE_JPEG,
298 	  {0, 0}, 0, 0, 0, 1, JPU_ENC_CAPTURE | JPU_DEC_OUTPUT },
299 	{ V4L2_PIX_FMT_NV16M, V4L2_COLORSPACE_SRGB,
300 	  {8, 8}, 2, 2, JPU_JPEG_422, 2, JPU_ENC_OUTPUT | JPU_DEC_CAPTURE },
301 	{ V4L2_PIX_FMT_NV12M, V4L2_COLORSPACE_SRGB,
302 	  {8, 4}, 2, 2, JPU_JPEG_420, 2, JPU_ENC_OUTPUT | JPU_DEC_CAPTURE },
303 	{ V4L2_PIX_FMT_NV16, V4L2_COLORSPACE_SRGB,
304 	  {16, 0}, 2, 2, JPU_JPEG_422, 1, JPU_ENC_OUTPUT | JPU_DEC_CAPTURE },
305 	{ V4L2_PIX_FMT_NV12, V4L2_COLORSPACE_SRGB,
306 	  {12, 0}, 2, 2, JPU_JPEG_420, 1, JPU_ENC_OUTPUT | JPU_DEC_CAPTURE },
307 };
308 
309 static const u8 zigzag[] = {
310 	0x03, 0x02, 0x0b, 0x13, 0x0a, 0x01, 0x00, 0x09,
311 	0x12, 0x1b, 0x23, 0x1a, 0x11, 0x08, 0x07, 0x06,
312 	0x0f, 0x10, 0x19, 0x22, 0x2b, 0x33, 0x2a, 0x21,
313 	0x18, 0x17, 0x0e, 0x05, 0x04, 0x0d, 0x16, 0x1f,
314 	0x20, 0x29, 0x32, 0x3b, 0x3a, 0x31, 0x28, 0x27,
315 	0x1e, 0x15, 0x0e, 0x14, 0x10, 0x26, 0x2f, 0x30,
316 	0x39, 0x38, 0x37, 0x2e, 0x25, 0x1c, 0x24, 0x2b,
317 	0x36, 0x3f, 0x3e, 0x35, 0x2c, 0x34, 0x3d, 0x3c
318 };
319 
320 #define QTBL_SIZE (ALIGN(JPU_JPEG_QTBL_SIZE, \
321 			  sizeof(unsigned int)) / sizeof(unsigned int))
322 #define HDCTBL_SIZE (ALIGN(JPU_JPEG_HDCTBL_SIZE, \
323 			  sizeof(unsigned int)) / sizeof(unsigned int))
324 #define HACTBL_SIZE (ALIGN(JPU_JPEG_HACTBL_SIZE, \
325 			  sizeof(unsigned int)) / sizeof(unsigned int))
326 /*
327  * Start of image; Quantization tables
328  * SOF0 (17 bytes payload) is Baseline DCT - Sample precision, height, width,
329  * Number of image components, (Ci:8 - Hi:4 - Vi:4 - Tq:8) * 3 - Y,Cb,Cr;
330  * Huffman tables; Padding with 0xff (33.3.27 R01UH0501EJ0100 Rev.1.00)
331  */
332 #define JPU_JPEG_HDR_BLOB {                                                    \
333 	0xff, SOI, 0xff, DQT, 0x00, JPU_JPEG_QTBL_SIZE + 0x3, JPU_JPEG_LUM,    \
334 	[JPU_JPEG_QTBL_LUM_OFFSET ...                                          \
335 		JPU_JPEG_QTBL_LUM_OFFSET + JPU_JPEG_QTBL_SIZE - 1] = 0x00,     \
336 	0xff, DQT, 0x00, JPU_JPEG_QTBL_SIZE + 0x3, JPU_JPEG_CHR,               \
337 	[JPU_JPEG_QTBL_CHR_OFFSET ... JPU_JPEG_QTBL_CHR_OFFSET +               \
338 		JPU_JPEG_QTBL_SIZE - 1] = 0x00, 0xff, SOF0, 0x00, 0x11, 0x08,  \
339 	[JPU_JPEG_HEIGHT_OFFSET ... JPU_JPEG_HEIGHT_OFFSET + 1] = 0x00,        \
340 	[JPU_JPEG_WIDTH_OFFSET ... JPU_JPEG_WIDTH_OFFSET + 1] = 0x00,          \
341 	0x03, 0x01, [JPU_JPEG_SUBS_OFFSET] = 0x00, JPU_JPEG_LUM,               \
342 	0x02, 0x11, JPU_JPEG_CHR, 0x03, 0x11, JPU_JPEG_CHR,                    \
343 	0xff, DHT, 0x00, JPU_JPEG_HDCTBL_SIZE + 0x3, JPU_JPEG_LUM|JPU_JPEG_DC, \
344 	[JPU_JPEG_HDCTBL_LUM_OFFSET ...                                        \
345 		JPU_JPEG_HDCTBL_LUM_OFFSET + JPU_JPEG_HDCTBL_SIZE - 1] = 0x00, \
346 	0xff, DHT, 0x00, JPU_JPEG_HACTBL_SIZE + 0x3, JPU_JPEG_LUM|JPU_JPEG_AC, \
347 	[JPU_JPEG_HACTBL_LUM_OFFSET ...                                        \
348 		JPU_JPEG_HACTBL_LUM_OFFSET + JPU_JPEG_HACTBL_SIZE - 1] = 0x00, \
349 	0xff, DHT, 0x00, JPU_JPEG_HDCTBL_SIZE + 0x3, JPU_JPEG_CHR|JPU_JPEG_DC, \
350 	[JPU_JPEG_HDCTBL_CHR_OFFSET ...                                        \
351 		JPU_JPEG_HDCTBL_CHR_OFFSET + JPU_JPEG_HDCTBL_SIZE - 1] = 0x00, \
352 	0xff, DHT, 0x00, JPU_JPEG_HACTBL_SIZE + 0x3, JPU_JPEG_CHR|JPU_JPEG_AC, \
353 	[JPU_JPEG_HACTBL_CHR_OFFSET ...                                        \
354 		JPU_JPEG_HACTBL_CHR_OFFSET + JPU_JPEG_HACTBL_SIZE - 1] = 0x00, \
355 	[JPU_JPEG_PADDING_OFFSET ... JPU_JPEG_HDR_SIZE - 1] = 0xff             \
356 }
357 
358 static unsigned char jpeg_hdrs[JPU_MAX_QUALITY][JPU_JPEG_HDR_SIZE] = {
359 	[0 ... JPU_MAX_QUALITY - 1] = JPU_JPEG_HDR_BLOB
360 };
361 
362 static const unsigned int qtbl_lum[JPU_MAX_QUALITY][QTBL_SIZE] = {
363 	{
364 		0x14101927, 0x322e3e44, 0x10121726, 0x26354144,
365 		0x19171f26, 0x35414444, 0x27262635, 0x41444444,
366 		0x32263541, 0x44444444, 0x2e354144, 0x44444444,
367 		0x3e414444, 0x44444444, 0x44444444, 0x44444444
368 	},
369 	{
370 		0x100b0b10, 0x171b1f1e, 0x0b0c0c0f, 0x1417171e,
371 		0x0b0c0d10, 0x171a232f, 0x100f1017, 0x1a252f40,
372 		0x1714171a, 0x27334040, 0x1b171a25, 0x33404040,
373 		0x1f17232f, 0x40404040, 0x1e1e2f40, 0x40404040
374 	},
375 	{
376 		0x0c08080c, 0x11151817, 0x0809090b, 0x0f131217,
377 		0x08090a0c, 0x13141b24, 0x0c0b0c15, 0x141c2435,
378 		0x110f1314, 0x1e27333b, 0x1513141c, 0x27333b3b,
379 		0x18121b24, 0x333b3b3b, 0x17172435, 0x3b3b3b3b
380 	},
381 	{
382 		0x08060608, 0x0c0e1011, 0x06060608, 0x0a0d0c0f,
383 		0x06060708, 0x0d0e1218, 0x0808080e, 0x0d131823,
384 		0x0c0a0d0d, 0x141a2227, 0x0e0d0e13, 0x1a222727,
385 		0x100c1318, 0x22272727, 0x110f1823, 0x27272727
386 	}
387 };
388 
389 static const unsigned int qtbl_chr[JPU_MAX_QUALITY][QTBL_SIZE] = {
390 	{
391 		0x15192026, 0x36444444, 0x191c1826, 0x36444444,
392 		0x2018202b, 0x42444444, 0x26262b35, 0x44444444,
393 		0x36424444, 0x44444444, 0x44444444, 0x44444444,
394 		0x44444444, 0x44444444, 0x44444444, 0x44444444
395 	},
396 	{
397 		0x110f1115, 0x141a2630, 0x0f131211, 0x141a232b,
398 		0x11121416, 0x1a1e2e35, 0x1511161c, 0x1e273540,
399 		0x14141a1e, 0x27304040, 0x1a1a1e27, 0x303f4040,
400 		0x26232e35, 0x40404040, 0x302b3540, 0x40404040
401 	},
402 	{
403 		0x0d0b0d10, 0x14141d25, 0x0b0e0e0e, 0x10141a20,
404 		0x0d0e0f11, 0x14172328, 0x100e1115, 0x171e2832,
405 		0x14101417, 0x1e25323b, 0x1414171e, 0x25303b3b,
406 		0x1d1a2328, 0x323b3b3b, 0x25202832, 0x3b3b3b3b
407 	},
408 	{
409 		0x0908090b, 0x0e111318, 0x080a090b, 0x0e0d1116,
410 		0x09090d0e, 0x0d0f171a, 0x0b0b0e0e, 0x0f141a21,
411 		0x0e0e0d0f, 0x14182127, 0x110d0f14, 0x18202727,
412 		0x1311171a, 0x21272727, 0x18161a21, 0x27272727
413 	}
414 };
415 
416 static const unsigned int hdctbl_lum[HDCTBL_SIZE] = {
417 	0x00010501, 0x01010101, 0x01000000, 0x00000000,
418 	0x00010203, 0x04050607, 0x08090a0b
419 };
420 
421 static const unsigned int hdctbl_chr[HDCTBL_SIZE] = {
422 	0x00010501, 0x01010101, 0x01000000, 0x00000000,
423 	0x00010203, 0x04050607, 0x08090a0b
424 };
425 
426 static const unsigned int hactbl_lum[HACTBL_SIZE] = {
427 	0x00020103, 0x03020403, 0x05050404, 0x0000017d, 0x01020300, 0x04110512,
428 	0x21314106, 0x13516107,	0x22711432, 0x8191a108, 0x2342b1c1, 0x1552d1f0,
429 	0x24336272, 0x82090a16, 0x1718191a, 0x25262728, 0x292a3435, 0x36373839,
430 	0x3a434445, 0x46474849, 0x4a535455, 0x56575859, 0x5a636465, 0x66676869,
431 	0x6a737475, 0x76777879, 0x7a838485, 0x86878889, 0x8a929394, 0x95969798,
432 	0x999aa2a3, 0xa4a5a6a7, 0xa8a9aab2, 0xb3b4b5b6, 0xb7b8b9ba, 0xc2c3c4c5,
433 	0xc6c7c8c9, 0xcad2d3d4, 0xd5d6d7d8, 0xd9dae1e2, 0xe3e4e5e6, 0xe7e8e9ea,
434 	0xf1f2f3f4, 0xf5f6f7f8, 0xf9fa0000
435 };
436 
437 static const unsigned int hactbl_chr[HACTBL_SIZE] = {
438 	0x00020103, 0x03020403, 0x05050404, 0x0000017d, 0x01020300, 0x04110512,
439 	0x21314106, 0x13516107,	0x22711432, 0x8191a108, 0x2342b1c1, 0x1552d1f0,
440 	0x24336272, 0x82090a16, 0x1718191a, 0x25262728, 0x292a3435, 0x36373839,
441 	0x3a434445, 0x46474849, 0x4a535455, 0x56575859, 0x5a636465, 0x66676869,
442 	0x6a737475, 0x76777879, 0x7a838485, 0x86878889, 0x8a929394, 0x95969798,
443 	0x999aa2a3, 0xa4a5a6a7, 0xa8a9aab2, 0xb3b4b5b6, 0xb7b8b9ba, 0xc2c3c4c5,
444 	0xc6c7c8c9, 0xcad2d3d4, 0xd5d6d7d8, 0xd9dae1e2, 0xe3e4e5e6, 0xe7e8e9ea,
445 	0xf1f2f3f4, 0xf5f6f7f8, 0xf9fa0000
446 };
447 
448 static const char *error_to_text[16] = {
449 	"Normal",
450 	"SOI not detected",
451 	"SOF1 to SOFF detected",
452 	"Subsampling not detected",
453 	"SOF accuracy error",
454 	"DQT accuracy error",
455 	"Component error 1",
456 	"Component error 2",
457 	"SOF0, DQT, and DHT not detected when SOS detected",
458 	"SOS not detected",
459 	"EOI not detected",
460 	"Restart interval data number error detected",
461 	"Image size error",
462 	"Last MCU data number error",
463 	"Block data number error",
464 	"Unknown"
465 };
466 
vb2_to_jpu_buffer(struct vb2_v4l2_buffer * vb)467 static struct jpu_buffer *vb2_to_jpu_buffer(struct vb2_v4l2_buffer *vb)
468 {
469 	struct v4l2_m2m_buffer *b =
470 		container_of(vb, struct v4l2_m2m_buffer, vb);
471 
472 	return container_of(b, struct jpu_buffer, buf);
473 }
474 
jpu_read(struct jpu * jpu,unsigned int reg)475 static u32 jpu_read(struct jpu *jpu, unsigned int reg)
476 {
477 	return ioread32(jpu->regs + reg);
478 }
479 
jpu_write(struct jpu * jpu,u32 val,unsigned int reg)480 static void jpu_write(struct jpu *jpu, u32 val, unsigned int reg)
481 {
482 	iowrite32(val, jpu->regs + reg);
483 }
484 
ctrl_to_ctx(struct v4l2_ctrl * c)485 static struct jpu_ctx *ctrl_to_ctx(struct v4l2_ctrl *c)
486 {
487 	return container_of(c->handler, struct jpu_ctx, ctrl_handler);
488 }
489 
fh_to_ctx(struct v4l2_fh * fh)490 static struct jpu_ctx *fh_to_ctx(struct v4l2_fh *fh)
491 {
492 	return container_of(fh, struct jpu_ctx, fh);
493 }
494 
jpu_set_tbl(struct jpu * jpu,u32 reg,const unsigned int * tbl,unsigned int len)495 static void jpu_set_tbl(struct jpu *jpu, u32 reg, const unsigned int *tbl,
496 			unsigned int len) {
497 	unsigned int i;
498 
499 	for (i = 0; i < len; i++)
500 		jpu_write(jpu, tbl[i], reg + (i << 2));
501 }
502 
jpu_set_qtbl(struct jpu * jpu,unsigned short quality)503 static void jpu_set_qtbl(struct jpu *jpu, unsigned short quality)
504 {
505 	jpu_set_tbl(jpu, JCQTBL(0), qtbl_lum[quality], QTBL_SIZE);
506 	jpu_set_tbl(jpu, JCQTBL(1), qtbl_chr[quality], QTBL_SIZE);
507 }
508 
jpu_set_htbl(struct jpu * jpu)509 static void jpu_set_htbl(struct jpu *jpu)
510 {
511 	jpu_set_tbl(jpu, JCHTBD(0), hdctbl_lum, HDCTBL_SIZE);
512 	jpu_set_tbl(jpu, JCHTBA(0), hactbl_lum, HACTBL_SIZE);
513 	jpu_set_tbl(jpu, JCHTBD(1), hdctbl_chr, HDCTBL_SIZE);
514 	jpu_set_tbl(jpu, JCHTBA(1), hactbl_chr, HACTBL_SIZE);
515 }
516 
jpu_wait_reset(struct jpu * jpu)517 static int jpu_wait_reset(struct jpu *jpu)
518 {
519 	unsigned long timeout;
520 
521 	timeout = jiffies + msecs_to_jiffies(JPU_RESET_TIMEOUT);
522 
523 	while (jpu_read(jpu, JCCMD) & JCCMD_SRST) {
524 		if (time_after(jiffies, timeout)) {
525 			dev_err(jpu->dev, "timed out in reset\n");
526 			return -ETIMEDOUT;
527 		}
528 		schedule();
529 	}
530 
531 	return 0;
532 }
533 
jpu_reset(struct jpu * jpu)534 static int jpu_reset(struct jpu *jpu)
535 {
536 	jpu_write(jpu, JCCMD_SRST, JCCMD);
537 	return jpu_wait_reset(jpu);
538 }
539 
540 /*
541  * ============================================================================
542  * video ioctl operations
543  * ============================================================================
544  */
put_qtbl(u8 * p,const u8 * qtbl)545 static void put_qtbl(u8 *p, const u8 *qtbl)
546 {
547 	unsigned int i;
548 
549 	for (i = 0; i < ARRAY_SIZE(zigzag); i++)
550 		p[i] = *(qtbl + zigzag[i]);
551 }
552 
put_htbl(u8 * p,const u8 * htbl,unsigned int len)553 static void put_htbl(u8 *p, const u8 *htbl, unsigned int len)
554 {
555 	unsigned int i, j;
556 
557 	for (i = 0; i < len; i += 4)
558 		for (j = 0; j < 4 && (i + j) < len; ++j)
559 			p[i + j] = htbl[i + 3 - j];
560 }
561 
jpu_generate_hdr(unsigned short quality,unsigned char * p)562 static void jpu_generate_hdr(unsigned short quality, unsigned char *p)
563 {
564 	put_qtbl(p + JPU_JPEG_QTBL_LUM_OFFSET, (const u8 *)qtbl_lum[quality]);
565 	put_qtbl(p + JPU_JPEG_QTBL_CHR_OFFSET, (const u8 *)qtbl_chr[quality]);
566 
567 	put_htbl(p + JPU_JPEG_HDCTBL_LUM_OFFSET, (const u8 *)hdctbl_lum,
568 		 JPU_JPEG_HDCTBL_SIZE);
569 	put_htbl(p + JPU_JPEG_HACTBL_LUM_OFFSET, (const u8 *)hactbl_lum,
570 		 JPU_JPEG_HACTBL_SIZE);
571 
572 	put_htbl(p + JPU_JPEG_HDCTBL_CHR_OFFSET, (const u8 *)hdctbl_chr,
573 		 JPU_JPEG_HDCTBL_SIZE);
574 	put_htbl(p + JPU_JPEG_HACTBL_CHR_OFFSET, (const u8 *)hactbl_chr,
575 		 JPU_JPEG_HACTBL_SIZE);
576 }
577 
get_byte(struct jpeg_buffer * buf)578 static int get_byte(struct jpeg_buffer *buf)
579 {
580 	if (buf->curr >= buf->end)
581 		return -1;
582 
583 	return *(u8 *)buf->curr++;
584 }
585 
get_word_be(struct jpeg_buffer * buf,unsigned int * word)586 static int get_word_be(struct jpeg_buffer *buf, unsigned int *word)
587 {
588 	if (buf->end - buf->curr < 2)
589 		return -1;
590 
591 	*word = get_unaligned_be16(buf->curr);
592 	buf->curr += 2;
593 
594 	return 0;
595 }
596 
skip(struct jpeg_buffer * buf,unsigned long len)597 static void skip(struct jpeg_buffer *buf, unsigned long len)
598 {
599 	buf->curr += min((unsigned long)(buf->end - buf->curr), len);
600 }
601 
jpu_parse_hdr(void * buffer,unsigned long size,unsigned int * width,unsigned int * height)602 static u8 jpu_parse_hdr(void *buffer, unsigned long size, unsigned int *width,
603 			  unsigned int *height)
604 {
605 	struct jpeg_buffer jpeg_buffer;
606 	unsigned int word;
607 	bool soi = false;
608 
609 	jpeg_buffer.end = buffer + size;
610 	jpeg_buffer.curr = buffer;
611 
612 	/*
613 	 * basic size check and EOI - we don't want to let JPU cross
614 	 * buffer bounds in any case. Hope it's stopping by EOI.
615 	 */
616 	if (size < JPU_JPEG_MIN_SIZE || *(u8 *)(buffer + size - 1) != EOI)
617 		return 0;
618 
619 	for (;;) {
620 		int c;
621 
622 		/* skip preceding filler bytes */
623 		do
624 			c = get_byte(&jpeg_buffer);
625 		while (c == 0xff || c == 0);
626 
627 		if (!soi && c == SOI) {
628 			soi = true;
629 			continue;
630 		} else if (soi != (c != SOI))
631 			return 0;
632 
633 		switch (c) {
634 		case SOF0: /* SOF0: baseline JPEG */
635 			skip(&jpeg_buffer, 3); /* segment length and bpp */
636 			if (get_word_be(&jpeg_buffer, height) ||
637 			    get_word_be(&jpeg_buffer, width) ||
638 			    get_byte(&jpeg_buffer) != 3) /* YCbCr only */
639 				return 0;
640 
641 			skip(&jpeg_buffer, 1);
642 			return get_byte(&jpeg_buffer);
643 		case DHT:
644 		case DQT:
645 		case COM:
646 		case DRI:
647 		case APP0 ... APP0 + 0x0f:
648 			if (get_word_be(&jpeg_buffer, &word))
649 				return 0;
650 			skip(&jpeg_buffer, (long)word - 2);
651 		case 0:
652 			break;
653 		default:
654 			return 0;
655 		}
656 	}
657 
658 	return 0;
659 }
660 
jpu_querycap(struct file * file,void * priv,struct v4l2_capability * cap)661 static int jpu_querycap(struct file *file, void *priv,
662 			struct v4l2_capability *cap)
663 {
664 	struct jpu_ctx *ctx = fh_to_ctx(priv);
665 
666 	if (ctx->encoder)
667 		strlcpy(cap->card, DRV_NAME " encoder", sizeof(cap->card));
668 	else
669 		strlcpy(cap->card, DRV_NAME " decoder", sizeof(cap->card));
670 
671 	strlcpy(cap->driver, DRV_NAME, sizeof(cap->driver));
672 	snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s",
673 		 dev_name(ctx->jpu->dev));
674 	cap->device_caps |= V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE;
675 	cap->capabilities = V4L2_CAP_DEVICE_CAPS | cap->device_caps;
676 	memset(cap->reserved, 0, sizeof(cap->reserved));
677 
678 	return 0;
679 }
680 
jpu_find_format(bool encoder,u32 pixelformat,unsigned int fmt_type)681 static struct jpu_fmt *jpu_find_format(bool encoder, u32 pixelformat,
682 				       unsigned int fmt_type)
683 {
684 	unsigned int i, fmt_flag;
685 
686 	if (encoder)
687 		fmt_flag = fmt_type == JPU_FMT_TYPE_OUTPUT ? JPU_ENC_OUTPUT :
688 							     JPU_ENC_CAPTURE;
689 	else
690 		fmt_flag = fmt_type == JPU_FMT_TYPE_OUTPUT ? JPU_DEC_OUTPUT :
691 							     JPU_DEC_CAPTURE;
692 
693 	for (i = 0; i < ARRAY_SIZE(jpu_formats); i++) {
694 		struct jpu_fmt *fmt = &jpu_formats[i];
695 
696 		if (fmt->fourcc == pixelformat && fmt->types & fmt_flag)
697 			return fmt;
698 	}
699 
700 	return NULL;
701 }
702 
jpu_enum_fmt(struct v4l2_fmtdesc * f,u32 type)703 static int jpu_enum_fmt(struct v4l2_fmtdesc *f, u32 type)
704 {
705 	unsigned int i, num = 0;
706 
707 	for (i = 0; i < ARRAY_SIZE(jpu_formats); ++i) {
708 		if (jpu_formats[i].types & type) {
709 			if (num == f->index)
710 				break;
711 			++num;
712 		}
713 	}
714 
715 	if (i >= ARRAY_SIZE(jpu_formats))
716 		return -EINVAL;
717 
718 	f->pixelformat = jpu_formats[i].fourcc;
719 
720 	return 0;
721 }
722 
jpu_enum_fmt_cap(struct file * file,void * priv,struct v4l2_fmtdesc * f)723 static int jpu_enum_fmt_cap(struct file *file, void *priv,
724 			    struct v4l2_fmtdesc *f)
725 {
726 	struct jpu_ctx *ctx = fh_to_ctx(priv);
727 
728 	return jpu_enum_fmt(f, ctx->encoder ? JPU_ENC_CAPTURE :
729 			    JPU_DEC_CAPTURE);
730 }
731 
jpu_enum_fmt_out(struct file * file,void * priv,struct v4l2_fmtdesc * f)732 static int jpu_enum_fmt_out(struct file *file, void *priv,
733 			    struct v4l2_fmtdesc *f)
734 {
735 	struct jpu_ctx *ctx = fh_to_ctx(priv);
736 
737 	return jpu_enum_fmt(f, ctx->encoder ? JPU_ENC_OUTPUT : JPU_DEC_OUTPUT);
738 }
739 
jpu_get_q_data(struct jpu_ctx * ctx,enum v4l2_buf_type type)740 static struct jpu_q_data *jpu_get_q_data(struct jpu_ctx *ctx,
741 					 enum v4l2_buf_type type)
742 {
743 	if (V4L2_TYPE_IS_OUTPUT(type))
744 		return &ctx->out_q;
745 	else
746 		return &ctx->cap_q;
747 }
748 
jpu_bound_align_image(u32 * w,unsigned int w_min,unsigned int w_max,unsigned int w_align,u32 * h,unsigned int h_min,unsigned int h_max,unsigned int h_align)749 static void jpu_bound_align_image(u32 *w, unsigned int w_min,
750 				  unsigned int w_max, unsigned int w_align,
751 				  u32 *h, unsigned int h_min,
752 				  unsigned int h_max, unsigned int h_align)
753 {
754 	unsigned int width, height, w_step, h_step;
755 
756 	width = *w;
757 	height = *h;
758 
759 	w_step = 1U << w_align;
760 	h_step = 1U << h_align;
761 	v4l_bound_align_image(w, w_min, w_max, w_align, h, h_min, h_max,
762 			      h_align, 3);
763 
764 	if (*w < width && *w + w_step < w_max)
765 		*w += w_step;
766 	if (*h < height && *h + h_step < h_max)
767 		*h += h_step;
768 }
769 
__jpu_try_fmt(struct jpu_ctx * ctx,struct jpu_fmt ** fmtinfo,struct v4l2_pix_format_mplane * pix,enum v4l2_buf_type type)770 static int __jpu_try_fmt(struct jpu_ctx *ctx, struct jpu_fmt **fmtinfo,
771 			 struct v4l2_pix_format_mplane *pix,
772 			 enum v4l2_buf_type type)
773 {
774 	struct jpu_fmt *fmt;
775 	unsigned int f_type, w, h;
776 
777 	f_type = V4L2_TYPE_IS_OUTPUT(type) ? JPU_FMT_TYPE_OUTPUT :
778 						JPU_FMT_TYPE_CAPTURE;
779 
780 	fmt = jpu_find_format(ctx->encoder, pix->pixelformat, f_type);
781 	if (!fmt) {
782 		unsigned int pixelformat;
783 
784 		dev_dbg(ctx->jpu->dev, "unknown format; set default format\n");
785 		if (ctx->encoder)
786 			pixelformat = f_type == JPU_FMT_TYPE_OUTPUT ?
787 				V4L2_PIX_FMT_NV16M : V4L2_PIX_FMT_JPEG;
788 		else
789 			pixelformat = f_type == JPU_FMT_TYPE_CAPTURE ?
790 				V4L2_PIX_FMT_NV16M : V4L2_PIX_FMT_JPEG;
791 		fmt = jpu_find_format(ctx->encoder, pixelformat, f_type);
792 	}
793 
794 	pix->pixelformat = fmt->fourcc;
795 	pix->colorspace = fmt->colorspace;
796 	pix->field = V4L2_FIELD_NONE;
797 	pix->num_planes = fmt->num_planes;
798 	memset(pix->reserved, 0, sizeof(pix->reserved));
799 
800 	jpu_bound_align_image(&pix->width, JPU_WIDTH_MIN, JPU_WIDTH_MAX,
801 			      fmt->h_align, &pix->height, JPU_HEIGHT_MIN,
802 			      JPU_HEIGHT_MAX, fmt->v_align);
803 
804 	w = pix->width;
805 	h = pix->height;
806 
807 	if (fmt->fourcc == V4L2_PIX_FMT_JPEG) {
808 		/* ignore userspaces's sizeimage for encoding */
809 		if (pix->plane_fmt[0].sizeimage <= 0 || ctx->encoder)
810 			pix->plane_fmt[0].sizeimage = JPU_JPEG_HDR_SIZE +
811 				(JPU_JPEG_MAX_BYTES_PER_PIXEL * w * h);
812 		pix->plane_fmt[0].bytesperline = 0;
813 		memset(pix->plane_fmt[0].reserved, 0,
814 		       sizeof(pix->plane_fmt[0].reserved));
815 	} else {
816 		unsigned int i, bpl = 0;
817 
818 		for (i = 0; i < pix->num_planes; ++i)
819 			bpl = max(bpl, pix->plane_fmt[i].bytesperline);
820 
821 		bpl = clamp_t(unsigned int, bpl, w, JPU_WIDTH_MAX);
822 		bpl = round_up(bpl, JPU_MEMALIGN);
823 
824 		for (i = 0; i < pix->num_planes; ++i) {
825 			pix->plane_fmt[i].bytesperline = bpl;
826 			pix->plane_fmt[i].sizeimage = bpl * h * fmt->bpp[i] / 8;
827 			memset(pix->plane_fmt[i].reserved, 0,
828 			       sizeof(pix->plane_fmt[i].reserved));
829 		}
830 	}
831 
832 	if (fmtinfo)
833 		*fmtinfo = fmt;
834 
835 	return 0;
836 }
837 
jpu_try_fmt(struct file * file,void * priv,struct v4l2_format * f)838 static int jpu_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
839 {
840 	struct jpu_ctx *ctx = fh_to_ctx(priv);
841 
842 	if (!v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type))
843 		return -EINVAL;
844 
845 	return __jpu_try_fmt(ctx, NULL, &f->fmt.pix_mp, f->type);
846 }
847 
jpu_s_fmt(struct file * file,void * priv,struct v4l2_format * f)848 static int jpu_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
849 {
850 	struct vb2_queue *vq;
851 	struct jpu_ctx *ctx = fh_to_ctx(priv);
852 	struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx;
853 	struct jpu_fmt *fmtinfo;
854 	struct jpu_q_data *q_data;
855 	int ret;
856 
857 	vq = v4l2_m2m_get_vq(m2m_ctx, f->type);
858 	if (!vq)
859 		return -EINVAL;
860 
861 	if (vb2_is_busy(vq)) {
862 		v4l2_err(&ctx->jpu->v4l2_dev, "%s queue busy\n", __func__);
863 		return -EBUSY;
864 	}
865 
866 	ret = __jpu_try_fmt(ctx, &fmtinfo, &f->fmt.pix_mp, f->type);
867 	if (ret < 0)
868 		return ret;
869 
870 	q_data = jpu_get_q_data(ctx, f->type);
871 
872 	q_data->format = f->fmt.pix_mp;
873 	q_data->fmtinfo = fmtinfo;
874 
875 	return 0;
876 }
877 
jpu_g_fmt(struct file * file,void * priv,struct v4l2_format * f)878 static int jpu_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
879 {
880 	struct jpu_q_data *q_data;
881 	struct jpu_ctx *ctx = fh_to_ctx(priv);
882 
883 	if (!v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type))
884 		return -EINVAL;
885 
886 	q_data = jpu_get_q_data(ctx, f->type);
887 	f->fmt.pix_mp = q_data->format;
888 
889 	return 0;
890 }
891 
892 /*
893  * V4L2 controls
894  */
jpu_s_ctrl(struct v4l2_ctrl * ctrl)895 static int jpu_s_ctrl(struct v4l2_ctrl *ctrl)
896 {
897 	struct jpu_ctx *ctx = ctrl_to_ctx(ctrl);
898 	unsigned long flags;
899 
900 	spin_lock_irqsave(&ctx->jpu->lock, flags);
901 	if (ctrl->id == V4L2_CID_JPEG_COMPRESSION_QUALITY)
902 		ctx->compr_quality = ctrl->val;
903 	spin_unlock_irqrestore(&ctx->jpu->lock, flags);
904 
905 	return 0;
906 }
907 
908 static const struct v4l2_ctrl_ops jpu_ctrl_ops = {
909 	.s_ctrl		= jpu_s_ctrl,
910 };
911 
jpu_streamon(struct file * file,void * priv,enum v4l2_buf_type type)912 static int jpu_streamon(struct file *file, void *priv, enum v4l2_buf_type type)
913 {
914 	struct jpu_ctx *ctx = fh_to_ctx(priv);
915 	struct jpu_q_data *src_q_data, *dst_q_data, *orig, adj, *ref;
916 	enum v4l2_buf_type adj_type;
917 
918 	src_q_data = jpu_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
919 	dst_q_data = jpu_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
920 
921 	if (ctx->encoder) {
922 		adj = *src_q_data;
923 		orig = src_q_data;
924 		ref = dst_q_data;
925 		adj_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
926 	} else {
927 		adj = *dst_q_data;
928 		orig = dst_q_data;
929 		ref = src_q_data;
930 		adj_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
931 	}
932 
933 	adj.format.width = ref->format.width;
934 	adj.format.height = ref->format.height;
935 
936 	__jpu_try_fmt(ctx, NULL, &adj.format, adj_type);
937 
938 	if (adj.format.width != orig->format.width ||
939 	    adj.format.height != orig->format.height) {
940 		dev_err(ctx->jpu->dev, "src and dst formats do not match.\n");
941 		/* maybe we can return -EPIPE here? */
942 		return -EINVAL;
943 	}
944 
945 	return v4l2_m2m_streamon(file, ctx->fh.m2m_ctx, type);
946 }
947 
948 static const struct v4l2_ioctl_ops jpu_ioctl_ops = {
949 	.vidioc_querycap		= jpu_querycap,
950 
951 	.vidioc_enum_fmt_vid_cap_mplane = jpu_enum_fmt_cap,
952 	.vidioc_enum_fmt_vid_out_mplane = jpu_enum_fmt_out,
953 	.vidioc_g_fmt_vid_cap_mplane	= jpu_g_fmt,
954 	.vidioc_g_fmt_vid_out_mplane	= jpu_g_fmt,
955 	.vidioc_try_fmt_vid_cap_mplane	= jpu_try_fmt,
956 	.vidioc_try_fmt_vid_out_mplane	= jpu_try_fmt,
957 	.vidioc_s_fmt_vid_cap_mplane	= jpu_s_fmt,
958 	.vidioc_s_fmt_vid_out_mplane	= jpu_s_fmt,
959 
960 	.vidioc_reqbufs			= v4l2_m2m_ioctl_reqbufs,
961 	.vidioc_create_bufs             = v4l2_m2m_ioctl_create_bufs,
962 	.vidioc_querybuf		= v4l2_m2m_ioctl_querybuf,
963 	.vidioc_qbuf			= v4l2_m2m_ioctl_qbuf,
964 	.vidioc_dqbuf			= v4l2_m2m_ioctl_dqbuf,
965 	.vidioc_expbuf			= v4l2_m2m_ioctl_expbuf,
966 
967 	.vidioc_streamon		= jpu_streamon,
968 	.vidioc_streamoff		= v4l2_m2m_ioctl_streamoff,
969 
970 	.vidioc_subscribe_event		= v4l2_ctrl_subscribe_event,
971 	.vidioc_unsubscribe_event	= v4l2_event_unsubscribe
972 };
973 
jpu_controls_create(struct jpu_ctx * ctx)974 static int jpu_controls_create(struct jpu_ctx *ctx)
975 {
976 	struct v4l2_ctrl *ctrl;
977 	int ret;
978 
979 	v4l2_ctrl_handler_init(&ctx->ctrl_handler, 1);
980 
981 	ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler, &jpu_ctrl_ops,
982 				 V4L2_CID_JPEG_COMPRESSION_QUALITY,
983 				 0, JPU_MAX_QUALITY - 1, 1, 0);
984 
985 	if (ctx->ctrl_handler.error) {
986 		ret = ctx->ctrl_handler.error;
987 		goto error_free;
988 	}
989 
990 	if (!ctx->encoder)
991 		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE |
992 				V4L2_CTRL_FLAG_READ_ONLY;
993 
994 	ret = v4l2_ctrl_handler_setup(&ctx->ctrl_handler);
995 	if (ret < 0)
996 		goto error_free;
997 
998 	return 0;
999 
1000 error_free:
1001 	v4l2_ctrl_handler_free(&ctx->ctrl_handler);
1002 	return ret;
1003 }
1004 
1005 /*
1006  * ============================================================================
1007  * Queue operations
1008  * ============================================================================
1009  */
jpu_queue_setup(struct vb2_queue * vq,unsigned int * nbuffers,unsigned int * nplanes,unsigned int sizes[],struct device * alloc_devs[])1010 static int jpu_queue_setup(struct vb2_queue *vq,
1011 			   unsigned int *nbuffers, unsigned int *nplanes,
1012 			   unsigned int sizes[], struct device *alloc_devs[])
1013 {
1014 	struct jpu_ctx *ctx = vb2_get_drv_priv(vq);
1015 	struct jpu_q_data *q_data;
1016 	unsigned int i;
1017 
1018 	q_data = jpu_get_q_data(ctx, vq->type);
1019 
1020 	if (*nplanes) {
1021 		if (*nplanes != q_data->format.num_planes)
1022 			return -EINVAL;
1023 
1024 		for (i = 0; i < *nplanes; i++) {
1025 			unsigned int q_size = q_data->format.plane_fmt[i].sizeimage;
1026 
1027 			if (sizes[i] < q_size)
1028 				return -EINVAL;
1029 		}
1030 		return 0;
1031 	}
1032 
1033 	*nplanes = q_data->format.num_planes;
1034 
1035 	for (i = 0; i < *nplanes; i++)
1036 		sizes[i] = q_data->format.plane_fmt[i].sizeimage;
1037 
1038 	return 0;
1039 }
1040 
jpu_buf_prepare(struct vb2_buffer * vb)1041 static int jpu_buf_prepare(struct vb2_buffer *vb)
1042 {
1043 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1044 	struct jpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1045 	struct jpu_q_data *q_data;
1046 	unsigned int i;
1047 
1048 	q_data = jpu_get_q_data(ctx, vb->vb2_queue->type);
1049 
1050 	if (V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
1051 		if (vbuf->field == V4L2_FIELD_ANY)
1052 			vbuf->field = V4L2_FIELD_NONE;
1053 		if (vbuf->field != V4L2_FIELD_NONE) {
1054 			dev_err(ctx->jpu->dev, "%s field isn't supported\n",
1055 					__func__);
1056 			return -EINVAL;
1057 		}
1058 	}
1059 
1060 	for (i = 0; i < q_data->format.num_planes; i++) {
1061 		unsigned long size = q_data->format.plane_fmt[i].sizeimage;
1062 
1063 		if (vb2_plane_size(vb, i) < size) {
1064 			dev_err(ctx->jpu->dev,
1065 				"%s: data will not fit into plane (%lu < %lu)\n",
1066 			       __func__, vb2_plane_size(vb, i), size);
1067 			return -EINVAL;
1068 		}
1069 
1070 		/* decoder capture queue */
1071 		if (!ctx->encoder && !V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type))
1072 			vb2_set_plane_payload(vb, i, size);
1073 	}
1074 
1075 	return 0;
1076 }
1077 
jpu_buf_queue(struct vb2_buffer * vb)1078 static void jpu_buf_queue(struct vb2_buffer *vb)
1079 {
1080 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1081 	struct jpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1082 
1083 	if (!ctx->encoder && V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
1084 		struct jpu_buffer *jpu_buf = vb2_to_jpu_buffer(vbuf);
1085 		struct jpu_q_data *q_data, adjust;
1086 		void *buffer = vb2_plane_vaddr(vb, 0);
1087 		unsigned long buf_size = vb2_get_plane_payload(vb, 0);
1088 		unsigned int width, height;
1089 
1090 		u8 subsampling = jpu_parse_hdr(buffer, buf_size, &width,
1091 						 &height);
1092 
1093 		/* check if JPEG data basic parsing was successful */
1094 		if (subsampling != JPU_JPEG_422 && subsampling != JPU_JPEG_420)
1095 			goto format_error;
1096 
1097 		q_data = &ctx->out_q;
1098 
1099 		adjust = *q_data;
1100 		adjust.format.width = width;
1101 		adjust.format.height = height;
1102 
1103 		__jpu_try_fmt(ctx, &adjust.fmtinfo, &adjust.format,
1104 			      V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1105 
1106 		if (adjust.format.width != q_data->format.width ||
1107 		    adjust.format.height != q_data->format.height)
1108 			goto format_error;
1109 
1110 		/*
1111 		 * keep subsampling in buffer to check it
1112 		 * for compatibility in device_run
1113 		 */
1114 		jpu_buf->subsampling = subsampling;
1115 	}
1116 
1117 	if (ctx->fh.m2m_ctx)
1118 		v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1119 
1120 	return;
1121 
1122 format_error:
1123 	dev_err(ctx->jpu->dev, "incompatible or corrupted JPEG data\n");
1124 	vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
1125 }
1126 
jpu_buf_finish(struct vb2_buffer * vb)1127 static void jpu_buf_finish(struct vb2_buffer *vb)
1128 {
1129 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1130 	struct jpu_buffer *jpu_buf = vb2_to_jpu_buffer(vbuf);
1131 	struct jpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1132 	struct jpu_q_data *q_data = &ctx->out_q;
1133 	enum v4l2_buf_type type = vb->vb2_queue->type;
1134 	u8 *buffer;
1135 
1136 	if (vb->state == VB2_BUF_STATE_DONE)
1137 		vbuf->sequence = jpu_get_q_data(ctx, type)->sequence++;
1138 
1139 	if (!ctx->encoder || vb->state != VB2_BUF_STATE_DONE ||
1140 	    V4L2_TYPE_IS_OUTPUT(type))
1141 		return;
1142 
1143 	buffer = vb2_plane_vaddr(vb, 0);
1144 
1145 	memcpy(buffer, jpeg_hdrs[jpu_buf->compr_quality], JPU_JPEG_HDR_SIZE);
1146 	*(__be16 *)(buffer + JPU_JPEG_HEIGHT_OFFSET) =
1147 					cpu_to_be16(q_data->format.height);
1148 	*(__be16 *)(buffer + JPU_JPEG_WIDTH_OFFSET) =
1149 					cpu_to_be16(q_data->format.width);
1150 	*(buffer + JPU_JPEG_SUBS_OFFSET) = q_data->fmtinfo->subsampling;
1151 }
1152 
jpu_start_streaming(struct vb2_queue * vq,unsigned count)1153 static int jpu_start_streaming(struct vb2_queue *vq, unsigned count)
1154 {
1155 	struct jpu_ctx *ctx = vb2_get_drv_priv(vq);
1156 	struct jpu_q_data *q_data = jpu_get_q_data(ctx, vq->type);
1157 
1158 	q_data->sequence = 0;
1159 	return 0;
1160 }
1161 
jpu_stop_streaming(struct vb2_queue * vq)1162 static void jpu_stop_streaming(struct vb2_queue *vq)
1163 {
1164 	struct jpu_ctx *ctx = vb2_get_drv_priv(vq);
1165 	struct vb2_v4l2_buffer *vb;
1166 	unsigned long flags;
1167 
1168 	for (;;) {
1169 		if (V4L2_TYPE_IS_OUTPUT(vq->type))
1170 			vb = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1171 		else
1172 			vb = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1173 		if (vb == NULL)
1174 			return;
1175 		spin_lock_irqsave(&ctx->jpu->lock, flags);
1176 		v4l2_m2m_buf_done(vb, VB2_BUF_STATE_ERROR);
1177 		spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1178 	}
1179 }
1180 
1181 static const struct vb2_ops jpu_qops = {
1182 	.queue_setup		= jpu_queue_setup,
1183 	.buf_prepare		= jpu_buf_prepare,
1184 	.buf_queue		= jpu_buf_queue,
1185 	.buf_finish		= jpu_buf_finish,
1186 	.start_streaming	= jpu_start_streaming,
1187 	.stop_streaming		= jpu_stop_streaming,
1188 	.wait_prepare		= vb2_ops_wait_prepare,
1189 	.wait_finish		= vb2_ops_wait_finish,
1190 };
1191 
jpu_queue_init(void * priv,struct vb2_queue * src_vq,struct vb2_queue * dst_vq)1192 static int jpu_queue_init(void *priv, struct vb2_queue *src_vq,
1193 			  struct vb2_queue *dst_vq)
1194 {
1195 	struct jpu_ctx *ctx = priv;
1196 	int ret;
1197 
1198 	memset(src_vq, 0, sizeof(*src_vq));
1199 	src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1200 	src_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1201 	src_vq->drv_priv = ctx;
1202 	src_vq->buf_struct_size = sizeof(struct jpu_buffer);
1203 	src_vq->ops = &jpu_qops;
1204 	src_vq->mem_ops = &vb2_dma_contig_memops;
1205 	src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
1206 	src_vq->lock = &ctx->jpu->mutex;
1207 	src_vq->dev = ctx->jpu->v4l2_dev.dev;
1208 
1209 	ret = vb2_queue_init(src_vq);
1210 	if (ret)
1211 		return ret;
1212 
1213 	memset(dst_vq, 0, sizeof(*dst_vq));
1214 	dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1215 	dst_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1216 	dst_vq->drv_priv = ctx;
1217 	dst_vq->buf_struct_size = sizeof(struct jpu_buffer);
1218 	dst_vq->ops = &jpu_qops;
1219 	dst_vq->mem_ops = &vb2_dma_contig_memops;
1220 	dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
1221 	dst_vq->lock = &ctx->jpu->mutex;
1222 	dst_vq->dev = ctx->jpu->v4l2_dev.dev;
1223 
1224 	return vb2_queue_init(dst_vq);
1225 }
1226 
1227 /*
1228  * ============================================================================
1229  * Device file operations
1230  * ============================================================================
1231  */
jpu_open(struct file * file)1232 static int jpu_open(struct file *file)
1233 {
1234 	struct jpu *jpu = video_drvdata(file);
1235 	struct video_device *vfd = video_devdata(file);
1236 	struct jpu_ctx *ctx;
1237 	int ret;
1238 
1239 	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
1240 	if (!ctx)
1241 		return -ENOMEM;
1242 
1243 	v4l2_fh_init(&ctx->fh, vfd);
1244 	ctx->fh.ctrl_handler = &ctx->ctrl_handler;
1245 	file->private_data = &ctx->fh;
1246 	v4l2_fh_add(&ctx->fh);
1247 
1248 	ctx->jpu = jpu;
1249 	ctx->encoder = vfd == &jpu->vfd_encoder;
1250 
1251 	__jpu_try_fmt(ctx, &ctx->out_q.fmtinfo, &ctx->out_q.format,
1252 		      V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1253 	__jpu_try_fmt(ctx, &ctx->cap_q.fmtinfo, &ctx->cap_q.format,
1254 		      V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
1255 
1256 	ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(jpu->m2m_dev, ctx, jpu_queue_init);
1257 	if (IS_ERR(ctx->fh.m2m_ctx)) {
1258 		ret = PTR_ERR(ctx->fh.m2m_ctx);
1259 		goto v4l_prepare_rollback;
1260 	}
1261 
1262 	ret = jpu_controls_create(ctx);
1263 	if (ret < 0)
1264 		goto v4l_prepare_rollback;
1265 
1266 	if (mutex_lock_interruptible(&jpu->mutex)) {
1267 		ret = -ERESTARTSYS;
1268 		goto v4l_prepare_rollback;
1269 	}
1270 
1271 	if (jpu->ref_count == 0) {
1272 		ret = clk_prepare_enable(jpu->clk);
1273 		if (ret < 0)
1274 			goto device_prepare_rollback;
1275 		/* ...issue software reset */
1276 		ret = jpu_reset(jpu);
1277 		if (ret)
1278 			goto jpu_reset_rollback;
1279 	}
1280 
1281 	jpu->ref_count++;
1282 
1283 	mutex_unlock(&jpu->mutex);
1284 	return 0;
1285 
1286 jpu_reset_rollback:
1287 	clk_disable_unprepare(jpu->clk);
1288 device_prepare_rollback:
1289 	mutex_unlock(&jpu->mutex);
1290 v4l_prepare_rollback:
1291 	v4l2_fh_del(&ctx->fh);
1292 	v4l2_fh_exit(&ctx->fh);
1293 	kfree(ctx);
1294 	return ret;
1295 }
1296 
jpu_release(struct file * file)1297 static int jpu_release(struct file *file)
1298 {
1299 	struct jpu *jpu = video_drvdata(file);
1300 	struct jpu_ctx *ctx = fh_to_ctx(file->private_data);
1301 
1302 	v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
1303 	v4l2_ctrl_handler_free(&ctx->ctrl_handler);
1304 	v4l2_fh_del(&ctx->fh);
1305 	v4l2_fh_exit(&ctx->fh);
1306 	kfree(ctx);
1307 
1308 	mutex_lock(&jpu->mutex);
1309 	if (--jpu->ref_count == 0)
1310 		clk_disable_unprepare(jpu->clk);
1311 	mutex_unlock(&jpu->mutex);
1312 
1313 	return 0;
1314 }
1315 
1316 static const struct v4l2_file_operations jpu_fops = {
1317 	.owner		= THIS_MODULE,
1318 	.open		= jpu_open,
1319 	.release	= jpu_release,
1320 	.unlocked_ioctl	= video_ioctl2,
1321 	.poll		= v4l2_m2m_fop_poll,
1322 	.mmap		= v4l2_m2m_fop_mmap,
1323 };
1324 
1325 /*
1326  * ============================================================================
1327  * mem2mem callbacks
1328  * ============================================================================
1329  */
jpu_cleanup(struct jpu_ctx * ctx,bool reset)1330 static void jpu_cleanup(struct jpu_ctx *ctx, bool reset)
1331 {
1332 	/* remove current buffers and finish job */
1333 	struct vb2_v4l2_buffer *src_buf, *dst_buf;
1334 	unsigned long flags;
1335 
1336 	spin_lock_irqsave(&ctx->jpu->lock, flags);
1337 
1338 	src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1339 	dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1340 
1341 	v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
1342 	v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
1343 
1344 	/* ...and give it a chance on next run */
1345 	if (reset)
1346 		jpu_write(ctx->jpu, JCCMD_SRST, JCCMD);
1347 
1348 	spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1349 
1350 	v4l2_m2m_job_finish(ctx->jpu->m2m_dev, ctx->fh.m2m_ctx);
1351 }
1352 
jpu_device_run(void * priv)1353 static void jpu_device_run(void *priv)
1354 {
1355 	struct jpu_ctx *ctx = priv;
1356 	struct jpu *jpu = ctx->jpu;
1357 	struct jpu_buffer *jpu_buf;
1358 	struct jpu_q_data *q_data;
1359 	struct vb2_v4l2_buffer *src_buf, *dst_buf;
1360 	unsigned int w, h, bpl;
1361 	unsigned char num_planes, subsampling;
1362 	unsigned long flags;
1363 
1364 	/* ...wait until module reset completes; we have mutex locked here */
1365 	if (jpu_wait_reset(jpu)) {
1366 		jpu_cleanup(ctx, true);
1367 		return;
1368 	}
1369 
1370 	spin_lock_irqsave(&ctx->jpu->lock, flags);
1371 
1372 	jpu->curr = ctx;
1373 
1374 	src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
1375 	dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1376 
1377 	if (ctx->encoder) {
1378 		jpu_buf = vb2_to_jpu_buffer(dst_buf);
1379 		q_data = &ctx->out_q;
1380 	} else {
1381 		jpu_buf = vb2_to_jpu_buffer(src_buf);
1382 		q_data = &ctx->cap_q;
1383 	}
1384 
1385 	w = q_data->format.width;
1386 	h = q_data->format.height;
1387 	bpl = q_data->format.plane_fmt[0].bytesperline;
1388 	num_planes = q_data->fmtinfo->num_planes;
1389 	subsampling = q_data->fmtinfo->subsampling;
1390 
1391 	if (ctx->encoder) {
1392 		unsigned long src_1_addr, src_2_addr, dst_addr;
1393 		unsigned int redu, inft;
1394 
1395 		dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
1396 		src_1_addr =
1397 			vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
1398 		if (num_planes > 1)
1399 			src_2_addr = vb2_dma_contig_plane_dma_addr(
1400 					&src_buf->vb2_buf, 1);
1401 		else
1402 			src_2_addr = src_1_addr + w * h;
1403 
1404 		jpu_buf->compr_quality = ctx->compr_quality;
1405 
1406 		if (subsampling == JPU_JPEG_420) {
1407 			redu = JCMOD_REDU_420;
1408 			inft = JIFECNT_INFT_420;
1409 		} else {
1410 			redu = JCMOD_REDU_422;
1411 			inft = JIFECNT_INFT_422;
1412 		}
1413 
1414 		/* only no marker mode works for encoding */
1415 		jpu_write(jpu, JCMOD_DSP_ENC | JCMOD_PCTR | redu |
1416 			  JCMOD_MSKIP_ENABLE, JCMOD);
1417 
1418 		jpu_write(jpu, JIFECNT_SWAP_WB | inft, JIFECNT);
1419 		jpu_write(jpu, JIFDCNT_SWAP_WB, JIFDCNT);
1420 		jpu_write(jpu, JINTE_TRANSF_COMPL, JINTE);
1421 
1422 		/* Y and C components source addresses */
1423 		jpu_write(jpu, src_1_addr, JIFESYA1);
1424 		jpu_write(jpu, src_2_addr, JIFESCA1);
1425 
1426 		/* memory width */
1427 		jpu_write(jpu, bpl, JIFESMW);
1428 
1429 		jpu_write(jpu, (w >> 8) & JCSZ_MASK, JCHSZU);
1430 		jpu_write(jpu, w & JCSZ_MASK, JCHSZD);
1431 
1432 		jpu_write(jpu, (h >> 8) & JCSZ_MASK, JCVSZU);
1433 		jpu_write(jpu, h & JCSZ_MASK, JCVSZD);
1434 
1435 		jpu_write(jpu, w, JIFESHSZ);
1436 		jpu_write(jpu, h, JIFESVSZ);
1437 
1438 		jpu_write(jpu, dst_addr + JPU_JPEG_HDR_SIZE, JIFEDA1);
1439 
1440 		jpu_write(jpu, 0 << JCQTN_SHIFT(1) | 1 << JCQTN_SHIFT(2) |
1441 			  1 << JCQTN_SHIFT(3), JCQTN);
1442 
1443 		jpu_write(jpu, 0 << JCHTN_AC_SHIFT(1) | 0 << JCHTN_DC_SHIFT(1) |
1444 			  1 << JCHTN_AC_SHIFT(2) | 1 << JCHTN_DC_SHIFT(2) |
1445 			  1 << JCHTN_AC_SHIFT(3) | 1 << JCHTN_DC_SHIFT(3),
1446 			  JCHTN);
1447 
1448 		jpu_set_qtbl(jpu, ctx->compr_quality);
1449 		jpu_set_htbl(jpu);
1450 	} else {
1451 		unsigned long src_addr, dst_1_addr, dst_2_addr;
1452 
1453 		if (jpu_buf->subsampling != subsampling) {
1454 			dev_err(ctx->jpu->dev,
1455 				"src and dst formats do not match.\n");
1456 			spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1457 			jpu_cleanup(ctx, false);
1458 			return;
1459 		}
1460 
1461 		src_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
1462 		dst_1_addr =
1463 			vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
1464 		if (q_data->fmtinfo->num_planes > 1)
1465 			dst_2_addr = vb2_dma_contig_plane_dma_addr(
1466 					&dst_buf->vb2_buf, 1);
1467 		else
1468 			dst_2_addr = dst_1_addr + w * h;
1469 
1470 		/* ...set up decoder operation */
1471 		jpu_write(jpu, JCMOD_DSP_DEC | JCMOD_PCTR, JCMOD);
1472 		jpu_write(jpu, JIFECNT_SWAP_WB, JIFECNT);
1473 		jpu_write(jpu, JIFDCNT_SWAP_WB, JIFDCNT);
1474 
1475 		/* ...enable interrupts on transfer completion and d-g error */
1476 		jpu_write(jpu, JINTE_TRANSF_COMPL | JINTE_ERR, JINTE);
1477 
1478 		/* ...set source/destination addresses of encoded data */
1479 		jpu_write(jpu, src_addr, JIFDSA1);
1480 		jpu_write(jpu, dst_1_addr, JIFDDYA1);
1481 		jpu_write(jpu, dst_2_addr, JIFDDCA1);
1482 
1483 		jpu_write(jpu, bpl, JIFDDMW);
1484 	}
1485 
1486 	/* ...start encoder/decoder operation */
1487 	jpu_write(jpu, JCCMD_JSRT, JCCMD);
1488 
1489 	spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1490 }
1491 
1492 static const struct v4l2_m2m_ops jpu_m2m_ops = {
1493 	.device_run	= jpu_device_run,
1494 };
1495 
1496 /*
1497  * ============================================================================
1498  * IRQ handler
1499  * ============================================================================
1500  */
jpu_irq_handler(int irq,void * dev_id)1501 static irqreturn_t jpu_irq_handler(int irq, void *dev_id)
1502 {
1503 	struct jpu *jpu = dev_id;
1504 	struct jpu_ctx *curr_ctx;
1505 	struct vb2_v4l2_buffer *src_buf, *dst_buf;
1506 	unsigned int int_status;
1507 
1508 	int_status = jpu_read(jpu, JINTS);
1509 
1510 	/* ...spurious interrupt */
1511 	if (!((JINTS_TRANSF_COMPL | JINTS_PROCESS_COMPL | JINTS_ERR) &
1512 	    int_status))
1513 		return IRQ_NONE;
1514 
1515 	/* ...clear interrupts */
1516 	jpu_write(jpu, ~(int_status & JINTS_MASK), JINTS);
1517 	if (int_status & (JINTS_ERR | JINTS_PROCESS_COMPL))
1518 		jpu_write(jpu, JCCMD_JEND, JCCMD);
1519 
1520 	spin_lock(&jpu->lock);
1521 
1522 	if ((int_status & JINTS_PROCESS_COMPL) &&
1523 	   !(int_status & JINTS_TRANSF_COMPL))
1524 		goto handled;
1525 
1526 	curr_ctx = v4l2_m2m_get_curr_priv(jpu->m2m_dev);
1527 	if (!curr_ctx) {
1528 		/* ...instance is not running */
1529 		dev_err(jpu->dev, "no active context for m2m\n");
1530 		goto handled;
1531 	}
1532 
1533 	src_buf = v4l2_m2m_src_buf_remove(curr_ctx->fh.m2m_ctx);
1534 	dst_buf = v4l2_m2m_dst_buf_remove(curr_ctx->fh.m2m_ctx);
1535 
1536 	if (int_status & JINTS_TRANSF_COMPL) {
1537 		if (curr_ctx->encoder) {
1538 			unsigned long payload_size = jpu_read(jpu, JCDTCU) << 16
1539 						   | jpu_read(jpu, JCDTCM) << 8
1540 						   | jpu_read(jpu, JCDTCD);
1541 			vb2_set_plane_payload(&dst_buf->vb2_buf, 0,
1542 				payload_size + JPU_JPEG_HDR_SIZE);
1543 		}
1544 
1545 		dst_buf->field = src_buf->field;
1546 		dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
1547 		if (src_buf->flags & V4L2_BUF_FLAG_TIMECODE)
1548 			dst_buf->timecode = src_buf->timecode;
1549 		dst_buf->flags = src_buf->flags &
1550 			(V4L2_BUF_FLAG_TIMECODE | V4L2_BUF_FLAG_KEYFRAME |
1551 			 V4L2_BUF_FLAG_PFRAME | V4L2_BUF_FLAG_BFRAME |
1552 			 V4L2_BUF_FLAG_TSTAMP_SRC_MASK);
1553 
1554 		v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
1555 		v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
1556 	} else if (int_status & JINTS_ERR) {
1557 		unsigned char error = jpu_read(jpu, JCDERR) & JCDERR_MASK;
1558 
1559 		dev_dbg(jpu->dev, "processing error: %#X: %s\n", error,
1560 			error_to_text[error]);
1561 
1562 		v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
1563 		v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
1564 	}
1565 
1566 	jpu->curr = NULL;
1567 
1568 	/* ...reset JPU after completion */
1569 	jpu_write(jpu, JCCMD_SRST, JCCMD);
1570 	spin_unlock(&jpu->lock);
1571 
1572 	v4l2_m2m_job_finish(jpu->m2m_dev, curr_ctx->fh.m2m_ctx);
1573 
1574 	return IRQ_HANDLED;
1575 
1576 handled:
1577 	spin_unlock(&jpu->lock);
1578 	return IRQ_HANDLED;
1579 }
1580 
1581 /*
1582  * ============================================================================
1583  * Driver basic infrastructure
1584  * ============================================================================
1585  */
1586 static const struct of_device_id jpu_dt_ids[] = {
1587 	{ .compatible = "renesas,jpu-r8a7790" }, /* H2 */
1588 	{ .compatible = "renesas,jpu-r8a7791" }, /* M2-W */
1589 	{ .compatible = "renesas,jpu-r8a7792" }, /* V2H */
1590 	{ .compatible = "renesas,jpu-r8a7793" }, /* M2-N */
1591 	{ .compatible = "renesas,rcar-gen2-jpu" },
1592 	{ },
1593 };
1594 MODULE_DEVICE_TABLE(of, jpu_dt_ids);
1595 
jpu_probe(struct platform_device * pdev)1596 static int jpu_probe(struct platform_device *pdev)
1597 {
1598 	struct jpu *jpu;
1599 	struct resource *res;
1600 	int ret;
1601 	unsigned int i;
1602 
1603 	jpu = devm_kzalloc(&pdev->dev, sizeof(*jpu), GFP_KERNEL);
1604 	if (!jpu)
1605 		return -ENOMEM;
1606 
1607 	mutex_init(&jpu->mutex);
1608 	spin_lock_init(&jpu->lock);
1609 	jpu->dev = &pdev->dev;
1610 
1611 	/* memory-mapped registers */
1612 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1613 	jpu->regs = devm_ioremap_resource(&pdev->dev, res);
1614 	if (IS_ERR(jpu->regs))
1615 		return PTR_ERR(jpu->regs);
1616 
1617 	/* interrupt service routine registration */
1618 	jpu->irq = ret = platform_get_irq(pdev, 0);
1619 	if (ret < 0) {
1620 		dev_err(&pdev->dev, "cannot find IRQ\n");
1621 		return ret;
1622 	}
1623 
1624 	ret = devm_request_irq(&pdev->dev, jpu->irq, jpu_irq_handler, 0,
1625 			       dev_name(&pdev->dev), jpu);
1626 	if (ret) {
1627 		dev_err(&pdev->dev, "cannot claim IRQ %d\n", jpu->irq);
1628 		return ret;
1629 	}
1630 
1631 	/* clocks */
1632 	jpu->clk = devm_clk_get(&pdev->dev, NULL);
1633 	if (IS_ERR(jpu->clk)) {
1634 		dev_err(&pdev->dev, "cannot get clock\n");
1635 		return PTR_ERR(jpu->clk);
1636 	}
1637 
1638 	/* v4l2 device */
1639 	ret = v4l2_device_register(&pdev->dev, &jpu->v4l2_dev);
1640 	if (ret) {
1641 		dev_err(&pdev->dev, "Failed to register v4l2 device\n");
1642 		return ret;
1643 	}
1644 
1645 	/* mem2mem device */
1646 	jpu->m2m_dev = v4l2_m2m_init(&jpu_m2m_ops);
1647 	if (IS_ERR(jpu->m2m_dev)) {
1648 		v4l2_err(&jpu->v4l2_dev, "Failed to init mem2mem device\n");
1649 		ret = PTR_ERR(jpu->m2m_dev);
1650 		goto device_register_rollback;
1651 	}
1652 
1653 	/* fill in qantization and Huffman tables for encoder */
1654 	for (i = 0; i < JPU_MAX_QUALITY; i++)
1655 		jpu_generate_hdr(i, (unsigned char *)jpeg_hdrs[i]);
1656 
1657 	strlcpy(jpu->vfd_encoder.name, DRV_NAME, sizeof(jpu->vfd_encoder.name));
1658 	jpu->vfd_encoder.fops		= &jpu_fops;
1659 	jpu->vfd_encoder.ioctl_ops	= &jpu_ioctl_ops;
1660 	jpu->vfd_encoder.minor		= -1;
1661 	jpu->vfd_encoder.release	= video_device_release_empty;
1662 	jpu->vfd_encoder.lock		= &jpu->mutex;
1663 	jpu->vfd_encoder.v4l2_dev	= &jpu->v4l2_dev;
1664 	jpu->vfd_encoder.vfl_dir	= VFL_DIR_M2M;
1665 
1666 	ret = video_register_device(&jpu->vfd_encoder, VFL_TYPE_GRABBER, -1);
1667 	if (ret) {
1668 		v4l2_err(&jpu->v4l2_dev, "Failed to register video device\n");
1669 		goto m2m_init_rollback;
1670 	}
1671 
1672 	video_set_drvdata(&jpu->vfd_encoder, jpu);
1673 
1674 	strlcpy(jpu->vfd_decoder.name, DRV_NAME, sizeof(jpu->vfd_decoder.name));
1675 	jpu->vfd_decoder.fops		= &jpu_fops;
1676 	jpu->vfd_decoder.ioctl_ops	= &jpu_ioctl_ops;
1677 	jpu->vfd_decoder.minor		= -1;
1678 	jpu->vfd_decoder.release	= video_device_release_empty;
1679 	jpu->vfd_decoder.lock		= &jpu->mutex;
1680 	jpu->vfd_decoder.v4l2_dev	= &jpu->v4l2_dev;
1681 	jpu->vfd_decoder.vfl_dir	= VFL_DIR_M2M;
1682 
1683 	ret = video_register_device(&jpu->vfd_decoder, VFL_TYPE_GRABBER, -1);
1684 	if (ret) {
1685 		v4l2_err(&jpu->v4l2_dev, "Failed to register video device\n");
1686 		goto enc_vdev_register_rollback;
1687 	}
1688 
1689 	video_set_drvdata(&jpu->vfd_decoder, jpu);
1690 	platform_set_drvdata(pdev, jpu);
1691 
1692 	v4l2_info(&jpu->v4l2_dev, "encoder device registered as /dev/video%d\n",
1693 		  jpu->vfd_encoder.num);
1694 	v4l2_info(&jpu->v4l2_dev, "decoder device registered as /dev/video%d\n",
1695 		  jpu->vfd_decoder.num);
1696 
1697 	return 0;
1698 
1699 enc_vdev_register_rollback:
1700 	video_unregister_device(&jpu->vfd_encoder);
1701 
1702 m2m_init_rollback:
1703 	v4l2_m2m_release(jpu->m2m_dev);
1704 
1705 device_register_rollback:
1706 	v4l2_device_unregister(&jpu->v4l2_dev);
1707 
1708 	return ret;
1709 }
1710 
jpu_remove(struct platform_device * pdev)1711 static int jpu_remove(struct platform_device *pdev)
1712 {
1713 	struct jpu *jpu = platform_get_drvdata(pdev);
1714 
1715 	video_unregister_device(&jpu->vfd_decoder);
1716 	video_unregister_device(&jpu->vfd_encoder);
1717 	v4l2_m2m_release(jpu->m2m_dev);
1718 	v4l2_device_unregister(&jpu->v4l2_dev);
1719 
1720 	return 0;
1721 }
1722 
1723 #ifdef CONFIG_PM_SLEEP
jpu_suspend(struct device * dev)1724 static int jpu_suspend(struct device *dev)
1725 {
1726 	struct jpu *jpu = dev_get_drvdata(dev);
1727 
1728 	if (jpu->ref_count == 0)
1729 		return 0;
1730 
1731 	clk_disable_unprepare(jpu->clk);
1732 
1733 	return 0;
1734 }
1735 
jpu_resume(struct device * dev)1736 static int jpu_resume(struct device *dev)
1737 {
1738 	struct jpu *jpu = dev_get_drvdata(dev);
1739 
1740 	if (jpu->ref_count == 0)
1741 		return 0;
1742 
1743 	clk_prepare_enable(jpu->clk);
1744 
1745 	return 0;
1746 }
1747 #endif
1748 
1749 static const struct dev_pm_ops jpu_pm_ops = {
1750 	SET_SYSTEM_SLEEP_PM_OPS(jpu_suspend, jpu_resume)
1751 };
1752 
1753 static struct platform_driver jpu_driver = {
1754 	.probe = jpu_probe,
1755 	.remove = jpu_remove,
1756 	.driver = {
1757 		.of_match_table = jpu_dt_ids,
1758 		.name = DRV_NAME,
1759 		.pm = &jpu_pm_ops,
1760 	},
1761 };
1762 
1763 module_platform_driver(jpu_driver);
1764 
1765 MODULE_ALIAS("platform:" DRV_NAME);
1766 MODULE_AUTHOR("Mikhail Ulianov <mikhail.ulyanov@cogentembedded.com>");
1767 MODULE_DESCRIPTION("Renesas R-Car JPEG processing unit driver");
1768 MODULE_LICENSE("GPL v2");
1769