GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / media / platform / renesas / rcar_jpu.c
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/samsung/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 requirement (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 quantization 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
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
475 static u32 jpu_read(struct jpu *jpu, unsigned int reg)
476 {
477         return ioread32(jpu->regs + reg);
478 }
479
480 static void jpu_write(struct jpu *jpu, u32 val, unsigned int reg)
481 {
482         iowrite32(val, jpu->regs + reg);
483 }
484
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
490 static struct jpu_ctx *fh_to_ctx(struct v4l2_fh *fh)
491 {
492         return container_of(fh, struct jpu_ctx, fh);
493 }
494
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
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
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
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
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  */
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
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
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
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
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
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
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                         break;
652                 case 0:
653                         break;
654                 default:
655                         return 0;
656                 }
657         }
658
659         return 0;
660 }
661
662 static int jpu_querycap(struct file *file, void *priv,
663                         struct v4l2_capability *cap)
664 {
665         struct jpu_ctx *ctx = fh_to_ctx(priv);
666
667         if (ctx->encoder)
668                 strscpy(cap->card, DRV_NAME " encoder", sizeof(cap->card));
669         else
670                 strscpy(cap->card, DRV_NAME " decoder", sizeof(cap->card));
671
672         strscpy(cap->driver, DRV_NAME, sizeof(cap->driver));
673         memset(cap->reserved, 0, sizeof(cap->reserved));
674
675         return 0;
676 }
677
678 static struct jpu_fmt *jpu_find_format(bool encoder, u32 pixelformat,
679                                        unsigned int fmt_type)
680 {
681         unsigned int i, fmt_flag;
682
683         if (encoder)
684                 fmt_flag = fmt_type == JPU_FMT_TYPE_OUTPUT ? JPU_ENC_OUTPUT :
685                                                              JPU_ENC_CAPTURE;
686         else
687                 fmt_flag = fmt_type == JPU_FMT_TYPE_OUTPUT ? JPU_DEC_OUTPUT :
688                                                              JPU_DEC_CAPTURE;
689
690         for (i = 0; i < ARRAY_SIZE(jpu_formats); i++) {
691                 struct jpu_fmt *fmt = &jpu_formats[i];
692
693                 if (fmt->fourcc == pixelformat && fmt->types & fmt_flag)
694                         return fmt;
695         }
696
697         return NULL;
698 }
699
700 static int jpu_enum_fmt(struct v4l2_fmtdesc *f, u32 type)
701 {
702         unsigned int i, num = 0;
703
704         for (i = 0; i < ARRAY_SIZE(jpu_formats); ++i) {
705                 if (jpu_formats[i].types & type) {
706                         if (num == f->index)
707                                 break;
708                         ++num;
709                 }
710         }
711
712         if (i >= ARRAY_SIZE(jpu_formats))
713                 return -EINVAL;
714
715         f->pixelformat = jpu_formats[i].fourcc;
716
717         return 0;
718 }
719
720 static int jpu_enum_fmt_cap(struct file *file, void *priv,
721                             struct v4l2_fmtdesc *f)
722 {
723         struct jpu_ctx *ctx = fh_to_ctx(priv);
724
725         return jpu_enum_fmt(f, ctx->encoder ? JPU_ENC_CAPTURE :
726                             JPU_DEC_CAPTURE);
727 }
728
729 static int jpu_enum_fmt_out(struct file *file, void *priv,
730                             struct v4l2_fmtdesc *f)
731 {
732         struct jpu_ctx *ctx = fh_to_ctx(priv);
733
734         return jpu_enum_fmt(f, ctx->encoder ? JPU_ENC_OUTPUT : JPU_DEC_OUTPUT);
735 }
736
737 static struct jpu_q_data *jpu_get_q_data(struct jpu_ctx *ctx,
738                                          enum v4l2_buf_type type)
739 {
740         if (V4L2_TYPE_IS_OUTPUT(type))
741                 return &ctx->out_q;
742         else
743                 return &ctx->cap_q;
744 }
745
746 static void jpu_bound_align_image(u32 *w, unsigned int w_min,
747                                   unsigned int w_max, unsigned int w_align,
748                                   u32 *h, unsigned int h_min,
749                                   unsigned int h_max, unsigned int h_align)
750 {
751         unsigned int width, height, w_step, h_step;
752
753         width = *w;
754         height = *h;
755
756         w_step = 1U << w_align;
757         h_step = 1U << h_align;
758         v4l_bound_align_image(w, w_min, w_max, w_align, h, h_min, h_max,
759                               h_align, 3);
760
761         if (*w < width && *w + w_step < w_max)
762                 *w += w_step;
763         if (*h < height && *h + h_step < h_max)
764                 *h += h_step;
765 }
766
767 static int __jpu_try_fmt(struct jpu_ctx *ctx, struct jpu_fmt **fmtinfo,
768                          struct v4l2_pix_format_mplane *pix,
769                          enum v4l2_buf_type type)
770 {
771         struct jpu_fmt *fmt;
772         unsigned int f_type, w, h;
773
774         f_type = V4L2_TYPE_IS_OUTPUT(type) ? JPU_FMT_TYPE_OUTPUT :
775                                                 JPU_FMT_TYPE_CAPTURE;
776
777         fmt = jpu_find_format(ctx->encoder, pix->pixelformat, f_type);
778         if (!fmt) {
779                 unsigned int pixelformat;
780
781                 dev_dbg(ctx->jpu->dev, "unknown format; set default format\n");
782                 if (ctx->encoder)
783                         pixelformat = f_type == JPU_FMT_TYPE_OUTPUT ?
784                                 V4L2_PIX_FMT_NV16M : V4L2_PIX_FMT_JPEG;
785                 else
786                         pixelformat = f_type == JPU_FMT_TYPE_CAPTURE ?
787                                 V4L2_PIX_FMT_NV16M : V4L2_PIX_FMT_JPEG;
788                 fmt = jpu_find_format(ctx->encoder, pixelformat, f_type);
789         }
790
791         pix->pixelformat = fmt->fourcc;
792         pix->colorspace = fmt->colorspace;
793         pix->field = V4L2_FIELD_NONE;
794         pix->num_planes = fmt->num_planes;
795
796         jpu_bound_align_image(&pix->width, JPU_WIDTH_MIN, JPU_WIDTH_MAX,
797                               fmt->h_align, &pix->height, JPU_HEIGHT_MIN,
798                               JPU_HEIGHT_MAX, fmt->v_align);
799
800         w = pix->width;
801         h = pix->height;
802
803         if (fmt->fourcc == V4L2_PIX_FMT_JPEG) {
804                 /* ignore userspaces's sizeimage for encoding */
805                 if (pix->plane_fmt[0].sizeimage <= 0 || ctx->encoder)
806                         pix->plane_fmt[0].sizeimage = JPU_JPEG_HDR_SIZE +
807                                 (JPU_JPEG_MAX_BYTES_PER_PIXEL * w * h);
808                 pix->plane_fmt[0].bytesperline = 0;
809         } else {
810                 unsigned int i, bpl = 0;
811
812                 for (i = 0; i < pix->num_planes; ++i)
813                         bpl = max(bpl, pix->plane_fmt[i].bytesperline);
814
815                 bpl = clamp_t(unsigned int, bpl, w, JPU_WIDTH_MAX);
816                 bpl = round_up(bpl, JPU_MEMALIGN);
817
818                 for (i = 0; i < pix->num_planes; ++i) {
819                         pix->plane_fmt[i].bytesperline = bpl;
820                         pix->plane_fmt[i].sizeimage = bpl * h * fmt->bpp[i] / 8;
821                 }
822         }
823
824         if (fmtinfo)
825                 *fmtinfo = fmt;
826
827         return 0;
828 }
829
830 static int jpu_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
831 {
832         struct jpu_ctx *ctx = fh_to_ctx(priv);
833
834         if (!v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type))
835                 return -EINVAL;
836
837         return __jpu_try_fmt(ctx, NULL, &f->fmt.pix_mp, f->type);
838 }
839
840 static int jpu_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
841 {
842         struct vb2_queue *vq;
843         struct jpu_ctx *ctx = fh_to_ctx(priv);
844         struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx;
845         struct jpu_fmt *fmtinfo;
846         struct jpu_q_data *q_data;
847         int ret;
848
849         vq = v4l2_m2m_get_vq(m2m_ctx, f->type);
850         if (!vq)
851                 return -EINVAL;
852
853         if (vb2_is_busy(vq)) {
854                 v4l2_err(&ctx->jpu->v4l2_dev, "%s queue busy\n", __func__);
855                 return -EBUSY;
856         }
857
858         ret = __jpu_try_fmt(ctx, &fmtinfo, &f->fmt.pix_mp, f->type);
859         if (ret < 0)
860                 return ret;
861
862         q_data = jpu_get_q_data(ctx, f->type);
863
864         q_data->format = f->fmt.pix_mp;
865         q_data->fmtinfo = fmtinfo;
866
867         return 0;
868 }
869
870 static int jpu_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
871 {
872         struct jpu_q_data *q_data;
873         struct jpu_ctx *ctx = fh_to_ctx(priv);
874
875         if (!v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type))
876                 return -EINVAL;
877
878         q_data = jpu_get_q_data(ctx, f->type);
879         f->fmt.pix_mp = q_data->format;
880
881         return 0;
882 }
883
884 /*
885  * V4L2 controls
886  */
887 static int jpu_s_ctrl(struct v4l2_ctrl *ctrl)
888 {
889         struct jpu_ctx *ctx = ctrl_to_ctx(ctrl);
890         unsigned long flags;
891
892         spin_lock_irqsave(&ctx->jpu->lock, flags);
893         if (ctrl->id == V4L2_CID_JPEG_COMPRESSION_QUALITY)
894                 ctx->compr_quality = ctrl->val;
895         spin_unlock_irqrestore(&ctx->jpu->lock, flags);
896
897         return 0;
898 }
899
900 static const struct v4l2_ctrl_ops jpu_ctrl_ops = {
901         .s_ctrl         = jpu_s_ctrl,
902 };
903
904 static int jpu_streamon(struct file *file, void *priv, enum v4l2_buf_type type)
905 {
906         struct jpu_ctx *ctx = fh_to_ctx(priv);
907         struct jpu_q_data *src_q_data, *dst_q_data, *orig, adj, *ref;
908         enum v4l2_buf_type adj_type;
909
910         src_q_data = jpu_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
911         dst_q_data = jpu_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
912
913         if (ctx->encoder) {
914                 adj = *src_q_data;
915                 orig = src_q_data;
916                 ref = dst_q_data;
917                 adj_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
918         } else {
919                 adj = *dst_q_data;
920                 orig = dst_q_data;
921                 ref = src_q_data;
922                 adj_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
923         }
924
925         adj.format.width = ref->format.width;
926         adj.format.height = ref->format.height;
927
928         __jpu_try_fmt(ctx, NULL, &adj.format, adj_type);
929
930         if (adj.format.width != orig->format.width ||
931             adj.format.height != orig->format.height) {
932                 dev_err(ctx->jpu->dev, "src and dst formats do not match.\n");
933                 /* maybe we can return -EPIPE here? */
934                 return -EINVAL;
935         }
936
937         return v4l2_m2m_streamon(file, ctx->fh.m2m_ctx, type);
938 }
939
940 static const struct v4l2_ioctl_ops jpu_ioctl_ops = {
941         .vidioc_querycap                = jpu_querycap,
942
943         .vidioc_enum_fmt_vid_cap        = jpu_enum_fmt_cap,
944         .vidioc_enum_fmt_vid_out        = jpu_enum_fmt_out,
945         .vidioc_g_fmt_vid_cap_mplane    = jpu_g_fmt,
946         .vidioc_g_fmt_vid_out_mplane    = jpu_g_fmt,
947         .vidioc_try_fmt_vid_cap_mplane  = jpu_try_fmt,
948         .vidioc_try_fmt_vid_out_mplane  = jpu_try_fmt,
949         .vidioc_s_fmt_vid_cap_mplane    = jpu_s_fmt,
950         .vidioc_s_fmt_vid_out_mplane    = jpu_s_fmt,
951
952         .vidioc_reqbufs                 = v4l2_m2m_ioctl_reqbufs,
953         .vidioc_create_bufs             = v4l2_m2m_ioctl_create_bufs,
954         .vidioc_querybuf                = v4l2_m2m_ioctl_querybuf,
955         .vidioc_qbuf                    = v4l2_m2m_ioctl_qbuf,
956         .vidioc_dqbuf                   = v4l2_m2m_ioctl_dqbuf,
957         .vidioc_expbuf                  = v4l2_m2m_ioctl_expbuf,
958
959         .vidioc_streamon                = jpu_streamon,
960         .vidioc_streamoff               = v4l2_m2m_ioctl_streamoff,
961
962         .vidioc_subscribe_event         = v4l2_ctrl_subscribe_event,
963         .vidioc_unsubscribe_event       = v4l2_event_unsubscribe
964 };
965
966 static int jpu_controls_create(struct jpu_ctx *ctx)
967 {
968         struct v4l2_ctrl *ctrl;
969         int ret;
970
971         v4l2_ctrl_handler_init(&ctx->ctrl_handler, 1);
972
973         ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler, &jpu_ctrl_ops,
974                                  V4L2_CID_JPEG_COMPRESSION_QUALITY,
975                                  0, JPU_MAX_QUALITY - 1, 1, 0);
976
977         if (ctx->ctrl_handler.error) {
978                 ret = ctx->ctrl_handler.error;
979                 goto error_free;
980         }
981
982         if (!ctx->encoder)
983                 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE |
984                                 V4L2_CTRL_FLAG_READ_ONLY;
985
986         ret = v4l2_ctrl_handler_setup(&ctx->ctrl_handler);
987         if (ret < 0)
988                 goto error_free;
989
990         return 0;
991
992 error_free:
993         v4l2_ctrl_handler_free(&ctx->ctrl_handler);
994         return ret;
995 }
996
997 /*
998  * ============================================================================
999  * Queue operations
1000  * ============================================================================
1001  */
1002 static int jpu_queue_setup(struct vb2_queue *vq,
1003                            unsigned int *nbuffers, unsigned int *nplanes,
1004                            unsigned int sizes[], struct device *alloc_devs[])
1005 {
1006         struct jpu_ctx *ctx = vb2_get_drv_priv(vq);
1007         struct jpu_q_data *q_data;
1008         unsigned int i;
1009
1010         q_data = jpu_get_q_data(ctx, vq->type);
1011
1012         if (*nplanes) {
1013                 if (*nplanes != q_data->format.num_planes)
1014                         return -EINVAL;
1015
1016                 for (i = 0; i < *nplanes; i++) {
1017                         unsigned int q_size = q_data->format.plane_fmt[i].sizeimage;
1018
1019                         if (sizes[i] < q_size)
1020                                 return -EINVAL;
1021                 }
1022                 return 0;
1023         }
1024
1025         *nplanes = q_data->format.num_planes;
1026
1027         for (i = 0; i < *nplanes; i++)
1028                 sizes[i] = q_data->format.plane_fmt[i].sizeimage;
1029
1030         return 0;
1031 }
1032
1033 static int jpu_buf_prepare(struct vb2_buffer *vb)
1034 {
1035         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1036         struct jpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1037         struct jpu_q_data *q_data;
1038         unsigned int i;
1039
1040         q_data = jpu_get_q_data(ctx, vb->vb2_queue->type);
1041
1042         if (V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
1043                 if (vbuf->field == V4L2_FIELD_ANY)
1044                         vbuf->field = V4L2_FIELD_NONE;
1045                 if (vbuf->field != V4L2_FIELD_NONE) {
1046                         dev_err(ctx->jpu->dev, "%s field isn't supported\n",
1047                                         __func__);
1048                         return -EINVAL;
1049                 }
1050         }
1051
1052         for (i = 0; i < q_data->format.num_planes; i++) {
1053                 unsigned long size = q_data->format.plane_fmt[i].sizeimage;
1054
1055                 if (vb2_plane_size(vb, i) < size) {
1056                         dev_err(ctx->jpu->dev,
1057                                 "%s: data will not fit into plane (%lu < %lu)\n",
1058                                __func__, vb2_plane_size(vb, i), size);
1059                         return -EINVAL;
1060                 }
1061
1062                 /* decoder capture queue */
1063                 if (!ctx->encoder && V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type))
1064                         vb2_set_plane_payload(vb, i, size);
1065         }
1066
1067         return 0;
1068 }
1069
1070 static void jpu_buf_queue(struct vb2_buffer *vb)
1071 {
1072         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1073         struct jpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1074
1075         if (!ctx->encoder && V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
1076                 struct jpu_buffer *jpu_buf = vb2_to_jpu_buffer(vbuf);
1077                 struct jpu_q_data *q_data, adjust;
1078                 void *buffer = vb2_plane_vaddr(vb, 0);
1079                 unsigned long buf_size = vb2_get_plane_payload(vb, 0);
1080                 unsigned int width, height;
1081
1082                 u8 subsampling = jpu_parse_hdr(buffer, buf_size, &width,
1083                                                  &height);
1084
1085                 /* check if JPEG data basic parsing was successful */
1086                 if (subsampling != JPU_JPEG_422 && subsampling != JPU_JPEG_420)
1087                         goto format_error;
1088
1089                 q_data = &ctx->out_q;
1090
1091                 adjust = *q_data;
1092                 adjust.format.width = width;
1093                 adjust.format.height = height;
1094
1095                 __jpu_try_fmt(ctx, &adjust.fmtinfo, &adjust.format,
1096                               V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1097
1098                 if (adjust.format.width != q_data->format.width ||
1099                     adjust.format.height != q_data->format.height)
1100                         goto format_error;
1101
1102                 /*
1103                  * keep subsampling in buffer to check it
1104                  * for compatibility in device_run
1105                  */
1106                 jpu_buf->subsampling = subsampling;
1107         }
1108
1109         if (ctx->fh.m2m_ctx)
1110                 v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1111
1112         return;
1113
1114 format_error:
1115         dev_err(ctx->jpu->dev, "incompatible or corrupted JPEG data\n");
1116         vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
1117 }
1118
1119 static void jpu_buf_finish(struct vb2_buffer *vb)
1120 {
1121         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1122         struct jpu_buffer *jpu_buf = vb2_to_jpu_buffer(vbuf);
1123         struct jpu_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1124         struct jpu_q_data *q_data = &ctx->out_q;
1125         enum v4l2_buf_type type = vb->vb2_queue->type;
1126         u8 *buffer;
1127
1128         if (vb->state == VB2_BUF_STATE_DONE)
1129                 vbuf->sequence = jpu_get_q_data(ctx, type)->sequence++;
1130
1131         if (!ctx->encoder || vb->state != VB2_BUF_STATE_DONE ||
1132             V4L2_TYPE_IS_OUTPUT(type))
1133                 return;
1134
1135         buffer = vb2_plane_vaddr(vb, 0);
1136
1137         memcpy(buffer, jpeg_hdrs[jpu_buf->compr_quality], JPU_JPEG_HDR_SIZE);
1138         *(__be16 *)(buffer + JPU_JPEG_HEIGHT_OFFSET) =
1139                                         cpu_to_be16(q_data->format.height);
1140         *(__be16 *)(buffer + JPU_JPEG_WIDTH_OFFSET) =
1141                                         cpu_to_be16(q_data->format.width);
1142         *(buffer + JPU_JPEG_SUBS_OFFSET) = q_data->fmtinfo->subsampling;
1143 }
1144
1145 static int jpu_start_streaming(struct vb2_queue *vq, unsigned count)
1146 {
1147         struct jpu_ctx *ctx = vb2_get_drv_priv(vq);
1148         struct jpu_q_data *q_data = jpu_get_q_data(ctx, vq->type);
1149
1150         q_data->sequence = 0;
1151         return 0;
1152 }
1153
1154 static void jpu_stop_streaming(struct vb2_queue *vq)
1155 {
1156         struct jpu_ctx *ctx = vb2_get_drv_priv(vq);
1157         struct vb2_v4l2_buffer *vb;
1158         unsigned long flags;
1159
1160         for (;;) {
1161                 if (V4L2_TYPE_IS_OUTPUT(vq->type))
1162                         vb = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1163                 else
1164                         vb = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1165                 if (vb == NULL)
1166                         return;
1167                 spin_lock_irqsave(&ctx->jpu->lock, flags);
1168                 v4l2_m2m_buf_done(vb, VB2_BUF_STATE_ERROR);
1169                 spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1170         }
1171 }
1172
1173 static const struct vb2_ops jpu_qops = {
1174         .queue_setup            = jpu_queue_setup,
1175         .buf_prepare            = jpu_buf_prepare,
1176         .buf_queue              = jpu_buf_queue,
1177         .buf_finish             = jpu_buf_finish,
1178         .start_streaming        = jpu_start_streaming,
1179         .stop_streaming         = jpu_stop_streaming,
1180         .wait_prepare           = vb2_ops_wait_prepare,
1181         .wait_finish            = vb2_ops_wait_finish,
1182 };
1183
1184 static int jpu_queue_init(void *priv, struct vb2_queue *src_vq,
1185                           struct vb2_queue *dst_vq)
1186 {
1187         struct jpu_ctx *ctx = priv;
1188         int ret;
1189
1190         memset(src_vq, 0, sizeof(*src_vq));
1191         src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1192         src_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1193         src_vq->drv_priv = ctx;
1194         src_vq->buf_struct_size = sizeof(struct jpu_buffer);
1195         src_vq->ops = &jpu_qops;
1196         src_vq->mem_ops = &vb2_dma_contig_memops;
1197         src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
1198         src_vq->lock = &ctx->jpu->mutex;
1199         src_vq->dev = ctx->jpu->v4l2_dev.dev;
1200
1201         ret = vb2_queue_init(src_vq);
1202         if (ret)
1203                 return ret;
1204
1205         memset(dst_vq, 0, sizeof(*dst_vq));
1206         dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1207         dst_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1208         dst_vq->drv_priv = ctx;
1209         dst_vq->buf_struct_size = sizeof(struct jpu_buffer);
1210         dst_vq->ops = &jpu_qops;
1211         dst_vq->mem_ops = &vb2_dma_contig_memops;
1212         dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
1213         dst_vq->lock = &ctx->jpu->mutex;
1214         dst_vq->dev = ctx->jpu->v4l2_dev.dev;
1215
1216         return vb2_queue_init(dst_vq);
1217 }
1218
1219 /*
1220  * ============================================================================
1221  * Device file operations
1222  * ============================================================================
1223  */
1224 static int jpu_open(struct file *file)
1225 {
1226         struct jpu *jpu = video_drvdata(file);
1227         struct video_device *vfd = video_devdata(file);
1228         struct jpu_ctx *ctx;
1229         int ret;
1230
1231         ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
1232         if (!ctx)
1233                 return -ENOMEM;
1234
1235         v4l2_fh_init(&ctx->fh, vfd);
1236         ctx->fh.ctrl_handler = &ctx->ctrl_handler;
1237         file->private_data = &ctx->fh;
1238         v4l2_fh_add(&ctx->fh);
1239
1240         ctx->jpu = jpu;
1241         ctx->encoder = vfd == &jpu->vfd_encoder;
1242
1243         __jpu_try_fmt(ctx, &ctx->out_q.fmtinfo, &ctx->out_q.format,
1244                       V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1245         __jpu_try_fmt(ctx, &ctx->cap_q.fmtinfo, &ctx->cap_q.format,
1246                       V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
1247
1248         ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(jpu->m2m_dev, ctx, jpu_queue_init);
1249         if (IS_ERR(ctx->fh.m2m_ctx)) {
1250                 ret = PTR_ERR(ctx->fh.m2m_ctx);
1251                 goto v4l_prepare_rollback;
1252         }
1253
1254         ret = jpu_controls_create(ctx);
1255         if (ret < 0)
1256                 goto v4l_prepare_rollback;
1257
1258         if (mutex_lock_interruptible(&jpu->mutex)) {
1259                 ret = -ERESTARTSYS;
1260                 goto v4l_prepare_rollback;
1261         }
1262
1263         if (jpu->ref_count == 0) {
1264                 ret = clk_prepare_enable(jpu->clk);
1265                 if (ret < 0)
1266                         goto device_prepare_rollback;
1267                 /* ...issue software reset */
1268                 ret = jpu_reset(jpu);
1269                 if (ret)
1270                         goto jpu_reset_rollback;
1271         }
1272
1273         jpu->ref_count++;
1274
1275         mutex_unlock(&jpu->mutex);
1276         return 0;
1277
1278 jpu_reset_rollback:
1279         clk_disable_unprepare(jpu->clk);
1280 device_prepare_rollback:
1281         mutex_unlock(&jpu->mutex);
1282 v4l_prepare_rollback:
1283         v4l2_fh_del(&ctx->fh);
1284         v4l2_fh_exit(&ctx->fh);
1285         kfree(ctx);
1286         return ret;
1287 }
1288
1289 static int jpu_release(struct file *file)
1290 {
1291         struct jpu *jpu = video_drvdata(file);
1292         struct jpu_ctx *ctx = fh_to_ctx(file->private_data);
1293
1294         v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
1295         v4l2_ctrl_handler_free(&ctx->ctrl_handler);
1296         v4l2_fh_del(&ctx->fh);
1297         v4l2_fh_exit(&ctx->fh);
1298         kfree(ctx);
1299
1300         mutex_lock(&jpu->mutex);
1301         if (--jpu->ref_count == 0)
1302                 clk_disable_unprepare(jpu->clk);
1303         mutex_unlock(&jpu->mutex);
1304
1305         return 0;
1306 }
1307
1308 static const struct v4l2_file_operations jpu_fops = {
1309         .owner          = THIS_MODULE,
1310         .open           = jpu_open,
1311         .release        = jpu_release,
1312         .unlocked_ioctl = video_ioctl2,
1313         .poll           = v4l2_m2m_fop_poll,
1314         .mmap           = v4l2_m2m_fop_mmap,
1315 };
1316
1317 /*
1318  * ============================================================================
1319  * mem2mem callbacks
1320  * ============================================================================
1321  */
1322 static void jpu_cleanup(struct jpu_ctx *ctx, bool reset)
1323 {
1324         /* remove current buffers and finish job */
1325         struct vb2_v4l2_buffer *src_buf, *dst_buf;
1326         unsigned long flags;
1327
1328         spin_lock_irqsave(&ctx->jpu->lock, flags);
1329
1330         src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1331         dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1332
1333         v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
1334         v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
1335
1336         /* ...and give it a chance on next run */
1337         if (reset)
1338                 jpu_write(ctx->jpu, JCCMD_SRST, JCCMD);
1339
1340         spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1341
1342         v4l2_m2m_job_finish(ctx->jpu->m2m_dev, ctx->fh.m2m_ctx);
1343 }
1344
1345 static void jpu_device_run(void *priv)
1346 {
1347         struct jpu_ctx *ctx = priv;
1348         struct jpu *jpu = ctx->jpu;
1349         struct jpu_buffer *jpu_buf;
1350         struct jpu_q_data *q_data;
1351         struct vb2_v4l2_buffer *src_buf, *dst_buf;
1352         unsigned int w, h, bpl;
1353         unsigned char num_planes, subsampling;
1354         unsigned long flags;
1355
1356         /* ...wait until module reset completes; we have mutex locked here */
1357         if (jpu_wait_reset(jpu)) {
1358                 jpu_cleanup(ctx, true);
1359                 return;
1360         }
1361
1362         spin_lock_irqsave(&ctx->jpu->lock, flags);
1363
1364         jpu->curr = ctx;
1365
1366         src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
1367         dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1368
1369         if (ctx->encoder) {
1370                 jpu_buf = vb2_to_jpu_buffer(dst_buf);
1371                 q_data = &ctx->out_q;
1372         } else {
1373                 jpu_buf = vb2_to_jpu_buffer(src_buf);
1374                 q_data = &ctx->cap_q;
1375         }
1376
1377         w = q_data->format.width;
1378         h = q_data->format.height;
1379         bpl = q_data->format.plane_fmt[0].bytesperline;
1380         num_planes = q_data->fmtinfo->num_planes;
1381         subsampling = q_data->fmtinfo->subsampling;
1382
1383         if (ctx->encoder) {
1384                 unsigned long src_1_addr, src_2_addr, dst_addr;
1385                 unsigned int redu, inft;
1386
1387                 dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
1388                 src_1_addr =
1389                         vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
1390                 if (num_planes > 1)
1391                         src_2_addr = vb2_dma_contig_plane_dma_addr(
1392                                         &src_buf->vb2_buf, 1);
1393                 else
1394                         src_2_addr = src_1_addr + w * h;
1395
1396                 jpu_buf->compr_quality = ctx->compr_quality;
1397
1398                 if (subsampling == JPU_JPEG_420) {
1399                         redu = JCMOD_REDU_420;
1400                         inft = JIFECNT_INFT_420;
1401                 } else {
1402                         redu = JCMOD_REDU_422;
1403                         inft = JIFECNT_INFT_422;
1404                 }
1405
1406                 /* only no marker mode works for encoding */
1407                 jpu_write(jpu, JCMOD_DSP_ENC | JCMOD_PCTR | redu |
1408                           JCMOD_MSKIP_ENABLE, JCMOD);
1409
1410                 jpu_write(jpu, JIFECNT_SWAP_WB | inft, JIFECNT);
1411                 jpu_write(jpu, JIFDCNT_SWAP_WB, JIFDCNT);
1412                 jpu_write(jpu, JINTE_TRANSF_COMPL, JINTE);
1413
1414                 /* Y and C components source addresses */
1415                 jpu_write(jpu, src_1_addr, JIFESYA1);
1416                 jpu_write(jpu, src_2_addr, JIFESCA1);
1417
1418                 /* memory width */
1419                 jpu_write(jpu, bpl, JIFESMW);
1420
1421                 jpu_write(jpu, (w >> 8) & JCSZ_MASK, JCHSZU);
1422                 jpu_write(jpu, w & JCSZ_MASK, JCHSZD);
1423
1424                 jpu_write(jpu, (h >> 8) & JCSZ_MASK, JCVSZU);
1425                 jpu_write(jpu, h & JCSZ_MASK, JCVSZD);
1426
1427                 jpu_write(jpu, w, JIFESHSZ);
1428                 jpu_write(jpu, h, JIFESVSZ);
1429
1430                 jpu_write(jpu, dst_addr + JPU_JPEG_HDR_SIZE, JIFEDA1);
1431
1432                 jpu_write(jpu, 0 << JCQTN_SHIFT(1) | 1 << JCQTN_SHIFT(2) |
1433                           1 << JCQTN_SHIFT(3), JCQTN);
1434
1435                 jpu_write(jpu, 0 << JCHTN_AC_SHIFT(1) | 0 << JCHTN_DC_SHIFT(1) |
1436                           1 << JCHTN_AC_SHIFT(2) | 1 << JCHTN_DC_SHIFT(2) |
1437                           1 << JCHTN_AC_SHIFT(3) | 1 << JCHTN_DC_SHIFT(3),
1438                           JCHTN);
1439
1440                 jpu_set_qtbl(jpu, ctx->compr_quality);
1441                 jpu_set_htbl(jpu);
1442         } else {
1443                 unsigned long src_addr, dst_1_addr, dst_2_addr;
1444
1445                 if (jpu_buf->subsampling != subsampling) {
1446                         dev_err(ctx->jpu->dev,
1447                                 "src and dst formats do not match.\n");
1448                         spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1449                         jpu_cleanup(ctx, false);
1450                         return;
1451                 }
1452
1453                 src_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
1454                 dst_1_addr =
1455                         vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
1456                 if (q_data->fmtinfo->num_planes > 1)
1457                         dst_2_addr = vb2_dma_contig_plane_dma_addr(
1458                                         &dst_buf->vb2_buf, 1);
1459                 else
1460                         dst_2_addr = dst_1_addr + w * h;
1461
1462                 /* ...set up decoder operation */
1463                 jpu_write(jpu, JCMOD_DSP_DEC | JCMOD_PCTR, JCMOD);
1464                 jpu_write(jpu, JIFECNT_SWAP_WB, JIFECNT);
1465                 jpu_write(jpu, JIFDCNT_SWAP_WB, JIFDCNT);
1466
1467                 /* ...enable interrupts on transfer completion and d-g error */
1468                 jpu_write(jpu, JINTE_TRANSF_COMPL | JINTE_ERR, JINTE);
1469
1470                 /* ...set source/destination addresses of encoded data */
1471                 jpu_write(jpu, src_addr, JIFDSA1);
1472                 jpu_write(jpu, dst_1_addr, JIFDDYA1);
1473                 jpu_write(jpu, dst_2_addr, JIFDDCA1);
1474
1475                 jpu_write(jpu, bpl, JIFDDMW);
1476         }
1477
1478         /* ...start encoder/decoder operation */
1479         jpu_write(jpu, JCCMD_JSRT, JCCMD);
1480
1481         spin_unlock_irqrestore(&ctx->jpu->lock, flags);
1482 }
1483
1484 static const struct v4l2_m2m_ops jpu_m2m_ops = {
1485         .device_run     = jpu_device_run,
1486 };
1487
1488 /*
1489  * ============================================================================
1490  * IRQ handler
1491  * ============================================================================
1492  */
1493 static irqreturn_t jpu_irq_handler(int irq, void *dev_id)
1494 {
1495         struct jpu *jpu = dev_id;
1496         struct jpu_ctx *curr_ctx;
1497         struct vb2_v4l2_buffer *src_buf, *dst_buf;
1498         unsigned int int_status;
1499
1500         int_status = jpu_read(jpu, JINTS);
1501
1502         /* ...spurious interrupt */
1503         if (!((JINTS_TRANSF_COMPL | JINTS_PROCESS_COMPL | JINTS_ERR) &
1504             int_status))
1505                 return IRQ_NONE;
1506
1507         /* ...clear interrupts */
1508         jpu_write(jpu, ~(int_status & JINTS_MASK), JINTS);
1509         if (int_status & (JINTS_ERR | JINTS_PROCESS_COMPL))
1510                 jpu_write(jpu, JCCMD_JEND, JCCMD);
1511
1512         spin_lock(&jpu->lock);
1513
1514         if ((int_status & JINTS_PROCESS_COMPL) &&
1515            !(int_status & JINTS_TRANSF_COMPL))
1516                 goto handled;
1517
1518         curr_ctx = v4l2_m2m_get_curr_priv(jpu->m2m_dev);
1519         if (!curr_ctx) {
1520                 /* ...instance is not running */
1521                 dev_err(jpu->dev, "no active context for m2m\n");
1522                 goto handled;
1523         }
1524
1525         src_buf = v4l2_m2m_src_buf_remove(curr_ctx->fh.m2m_ctx);
1526         dst_buf = v4l2_m2m_dst_buf_remove(curr_ctx->fh.m2m_ctx);
1527
1528         if (int_status & JINTS_TRANSF_COMPL) {
1529                 if (curr_ctx->encoder) {
1530                         unsigned long payload_size = jpu_read(jpu, JCDTCU) << 16
1531                                                    | jpu_read(jpu, JCDTCM) << 8
1532                                                    | jpu_read(jpu, JCDTCD);
1533                         vb2_set_plane_payload(&dst_buf->vb2_buf, 0,
1534                                 payload_size + JPU_JPEG_HDR_SIZE);
1535                 }
1536
1537                 dst_buf->field = src_buf->field;
1538                 dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
1539                 if (src_buf->flags & V4L2_BUF_FLAG_TIMECODE)
1540                         dst_buf->timecode = src_buf->timecode;
1541                 dst_buf->flags = src_buf->flags &
1542                         (V4L2_BUF_FLAG_TIMECODE | V4L2_BUF_FLAG_KEYFRAME |
1543                          V4L2_BUF_FLAG_PFRAME | V4L2_BUF_FLAG_BFRAME |
1544                          V4L2_BUF_FLAG_TSTAMP_SRC_MASK);
1545
1546                 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
1547                 v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
1548         } else if (int_status & JINTS_ERR) {
1549                 unsigned char error = jpu_read(jpu, JCDERR) & JCDERR_MASK;
1550
1551                 dev_dbg(jpu->dev, "processing error: %#X: %s\n", error,
1552                         error_to_text[error]);
1553
1554                 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
1555                 v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
1556         }
1557
1558         jpu->curr = NULL;
1559
1560         /* ...reset JPU after completion */
1561         jpu_write(jpu, JCCMD_SRST, JCCMD);
1562         spin_unlock(&jpu->lock);
1563
1564         v4l2_m2m_job_finish(jpu->m2m_dev, curr_ctx->fh.m2m_ctx);
1565
1566         return IRQ_HANDLED;
1567
1568 handled:
1569         spin_unlock(&jpu->lock);
1570         return IRQ_HANDLED;
1571 }
1572
1573 /*
1574  * ============================================================================
1575  * Driver basic infrastructure
1576  * ============================================================================
1577  */
1578 static const struct of_device_id jpu_dt_ids[] = {
1579         { .compatible = "renesas,jpu-r8a7790" }, /* H2 */
1580         { .compatible = "renesas,jpu-r8a7791" }, /* M2-W */
1581         { .compatible = "renesas,jpu-r8a7792" }, /* V2H */
1582         { .compatible = "renesas,jpu-r8a7793" }, /* M2-N */
1583         { .compatible = "renesas,rcar-gen2-jpu" },
1584         { },
1585 };
1586 MODULE_DEVICE_TABLE(of, jpu_dt_ids);
1587
1588 static int jpu_probe(struct platform_device *pdev)
1589 {
1590         struct jpu *jpu;
1591         int ret;
1592         unsigned int i;
1593
1594         jpu = devm_kzalloc(&pdev->dev, sizeof(*jpu), GFP_KERNEL);
1595         if (!jpu)
1596                 return -ENOMEM;
1597
1598         mutex_init(&jpu->mutex);
1599         spin_lock_init(&jpu->lock);
1600         jpu->dev = &pdev->dev;
1601
1602         /* memory-mapped registers */
1603         jpu->regs = devm_platform_ioremap_resource(pdev, 0);
1604         if (IS_ERR(jpu->regs))
1605                 return PTR_ERR(jpu->regs);
1606
1607         /* interrupt service routine registration */
1608         jpu->irq = ret = platform_get_irq(pdev, 0);
1609         if (ret < 0) {
1610                 dev_err(&pdev->dev, "cannot find IRQ\n");
1611                 return ret;
1612         }
1613
1614         ret = devm_request_irq(&pdev->dev, jpu->irq, jpu_irq_handler, 0,
1615                                dev_name(&pdev->dev), jpu);
1616         if (ret) {
1617                 dev_err(&pdev->dev, "cannot claim IRQ %d\n", jpu->irq);
1618                 return ret;
1619         }
1620
1621         /* clocks */
1622         jpu->clk = devm_clk_get(&pdev->dev, NULL);
1623         if (IS_ERR(jpu->clk)) {
1624                 dev_err(&pdev->dev, "cannot get clock\n");
1625                 return PTR_ERR(jpu->clk);
1626         }
1627
1628         /* v4l2 device */
1629         ret = v4l2_device_register(&pdev->dev, &jpu->v4l2_dev);
1630         if (ret) {
1631                 dev_err(&pdev->dev, "Failed to register v4l2 device\n");
1632                 return ret;
1633         }
1634
1635         /* mem2mem device */
1636         jpu->m2m_dev = v4l2_m2m_init(&jpu_m2m_ops);
1637         if (IS_ERR(jpu->m2m_dev)) {
1638                 v4l2_err(&jpu->v4l2_dev, "Failed to init mem2mem device\n");
1639                 ret = PTR_ERR(jpu->m2m_dev);
1640                 goto device_register_rollback;
1641         }
1642
1643         /* fill in quantization and Huffman tables for encoder */
1644         for (i = 0; i < JPU_MAX_QUALITY; i++)
1645                 jpu_generate_hdr(i, (unsigned char *)jpeg_hdrs[i]);
1646
1647         strscpy(jpu->vfd_encoder.name, DRV_NAME, sizeof(jpu->vfd_encoder.name));
1648         jpu->vfd_encoder.fops           = &jpu_fops;
1649         jpu->vfd_encoder.ioctl_ops      = &jpu_ioctl_ops;
1650         jpu->vfd_encoder.minor          = -1;
1651         jpu->vfd_encoder.release        = video_device_release_empty;
1652         jpu->vfd_encoder.lock           = &jpu->mutex;
1653         jpu->vfd_encoder.v4l2_dev       = &jpu->v4l2_dev;
1654         jpu->vfd_encoder.vfl_dir        = VFL_DIR_M2M;
1655         jpu->vfd_encoder.device_caps    = V4L2_CAP_STREAMING |
1656                                           V4L2_CAP_VIDEO_M2M_MPLANE;
1657
1658         ret = video_register_device(&jpu->vfd_encoder, VFL_TYPE_VIDEO, -1);
1659         if (ret) {
1660                 v4l2_err(&jpu->v4l2_dev, "Failed to register video device\n");
1661                 goto m2m_init_rollback;
1662         }
1663
1664         video_set_drvdata(&jpu->vfd_encoder, jpu);
1665
1666         strscpy(jpu->vfd_decoder.name, DRV_NAME, sizeof(jpu->vfd_decoder.name));
1667         jpu->vfd_decoder.fops           = &jpu_fops;
1668         jpu->vfd_decoder.ioctl_ops      = &jpu_ioctl_ops;
1669         jpu->vfd_decoder.minor          = -1;
1670         jpu->vfd_decoder.release        = video_device_release_empty;
1671         jpu->vfd_decoder.lock           = &jpu->mutex;
1672         jpu->vfd_decoder.v4l2_dev       = &jpu->v4l2_dev;
1673         jpu->vfd_decoder.vfl_dir        = VFL_DIR_M2M;
1674         jpu->vfd_decoder.device_caps    = V4L2_CAP_STREAMING |
1675                                           V4L2_CAP_VIDEO_M2M_MPLANE;
1676
1677         ret = video_register_device(&jpu->vfd_decoder, VFL_TYPE_VIDEO, -1);
1678         if (ret) {
1679                 v4l2_err(&jpu->v4l2_dev, "Failed to register video device\n");
1680                 goto enc_vdev_register_rollback;
1681         }
1682
1683         video_set_drvdata(&jpu->vfd_decoder, jpu);
1684         platform_set_drvdata(pdev, jpu);
1685
1686         v4l2_info(&jpu->v4l2_dev, "encoder device registered as /dev/video%d\n",
1687                   jpu->vfd_encoder.num);
1688         v4l2_info(&jpu->v4l2_dev, "decoder device registered as /dev/video%d\n",
1689                   jpu->vfd_decoder.num);
1690
1691         return 0;
1692
1693 enc_vdev_register_rollback:
1694         video_unregister_device(&jpu->vfd_encoder);
1695
1696 m2m_init_rollback:
1697         v4l2_m2m_release(jpu->m2m_dev);
1698
1699 device_register_rollback:
1700         v4l2_device_unregister(&jpu->v4l2_dev);
1701
1702         return ret;
1703 }
1704
1705 static int jpu_remove(struct platform_device *pdev)
1706 {
1707         struct jpu *jpu = platform_get_drvdata(pdev);
1708
1709         video_unregister_device(&jpu->vfd_decoder);
1710         video_unregister_device(&jpu->vfd_encoder);
1711         v4l2_m2m_release(jpu->m2m_dev);
1712         v4l2_device_unregister(&jpu->v4l2_dev);
1713
1714         return 0;
1715 }
1716
1717 #ifdef CONFIG_PM_SLEEP
1718 static int jpu_suspend(struct device *dev)
1719 {
1720         struct jpu *jpu = dev_get_drvdata(dev);
1721
1722         if (jpu->ref_count == 0)
1723                 return 0;
1724
1725         clk_disable_unprepare(jpu->clk);
1726
1727         return 0;
1728 }
1729
1730 static int jpu_resume(struct device *dev)
1731 {
1732         struct jpu *jpu = dev_get_drvdata(dev);
1733
1734         if (jpu->ref_count == 0)
1735                 return 0;
1736
1737         clk_prepare_enable(jpu->clk);
1738
1739         return 0;
1740 }
1741 #endif
1742
1743 static const struct dev_pm_ops jpu_pm_ops = {
1744         SET_SYSTEM_SLEEP_PM_OPS(jpu_suspend, jpu_resume)
1745 };
1746
1747 static struct platform_driver jpu_driver = {
1748         .probe = jpu_probe,
1749         .remove = jpu_remove,
1750         .driver = {
1751                 .of_match_table = jpu_dt_ids,
1752                 .name = DRV_NAME,
1753                 .pm = &jpu_pm_ops,
1754         },
1755 };
1756
1757 module_platform_driver(jpu_driver);
1758
1759 MODULE_ALIAS("platform:" DRV_NAME);
1760 MODULE_AUTHOR("Mikhail Ulianov <mikhail.ulyanov@cogentembedded.com>");
1761 MODULE_DESCRIPTION("Renesas R-Car JPEG processing unit driver");
1762 MODULE_LICENSE("GPL v2");