1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * V4L2 driver for the JPEG encoder/decoder from i.MX8QXP/i.MX8QM application
4 * processors.
5 *
6 * The multi-planar buffers API is used.
7 *
8 * Baseline and extended sequential jpeg decoding is supported.
9 * Progressive jpeg decoding is not supported by the IP.
10 * Supports encode and decode of various formats:
11 * YUV444, YUV422, YUV420, BGR, ABGR, Gray
12 * YUV420 is the only multi-planar format supported.
13 * Minimum resolution is 64 x 64, maximum 8192 x 8192.
14 * To achieve 8192 x 8192, modify in defconfig: CONFIG_CMA_SIZE_MBYTES=320
15 * The alignment requirements for the resolution depend on the format,
16 * multiple of 16 resolutions should work for all formats.
17 * Special workarounds are made in the driver to support NV12 1080p.
18 * When decoding, the driver detects image resolution and pixel format
19 * from the jpeg stream, by parsing the jpeg markers.
20 *
21 * The IP has 4 slots available for context switching, but only slot 0
22 * was fully tested to work. Context switching is not used by the driver.
23 * Each driver instance (context) allocates a slot for itself, but this
24 * is postponed until device_run, to allow unlimited opens.
25 *
26 * The driver submits jobs to the IP by setting up a descriptor for the
27 * used slot, and then validating it. The encoder has an additional descriptor
28 * for the configuration phase. The driver expects FRM_DONE interrupt from
29 * IP to mark the job as finished.
30 *
31 * The decoder IP has some limitations regarding the component ID's,
32 * but the driver works around this by replacing them in the jpeg stream.
33 *
34 * A module parameter is available for debug purpose (jpeg_tracing), to enable
35 * it, enable dynamic debug for this module and:
36 * echo 1 > /sys/module/mxc_jpeg_encdec/parameters/jpeg_tracing
37 *
38 * This is inspired by the drivers/media/platform/samsung/s5p-jpeg driver
39 *
40 * Copyright 2018-2019 NXP
41 */
42
43 #include <linux/kernel.h>
44 #include <linux/module.h>
45 #include <linux/io.h>
46 #include <linux/clk.h>
47 #include <linux/of_platform.h>
48 #include <linux/platform_device.h>
49 #include <linux/slab.h>
50 #include <linux/irqreturn.h>
51 #include <linux/interrupt.h>
52 #include <linux/pm_runtime.h>
53 #include <linux/pm_domain.h>
54 #include <linux/string.h>
55
56 #include <media/v4l2-jpeg.h>
57 #include <media/v4l2-mem2mem.h>
58 #include <media/v4l2-ioctl.h>
59 #include <media/v4l2-common.h>
60 #include <media/v4l2-event.h>
61 #include <media/videobuf2-dma-contig.h>
62
63 #include "mxc-jpeg-hw.h"
64 #include "mxc-jpeg.h"
65
66 static const struct mxc_jpeg_fmt mxc_formats[] = {
67 {
68 .name = "JPEG",
69 .fourcc = V4L2_PIX_FMT_JPEG,
70 .subsampling = -1,
71 .nc = -1,
72 .mem_planes = 1,
73 .comp_planes = 1,
74 .flags = MXC_JPEG_FMT_TYPE_ENC,
75 },
76 {
77 .name = "BGR", /*BGR packed format*/
78 .fourcc = V4L2_PIX_FMT_BGR24,
79 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
80 .nc = 3,
81 .depth = 24,
82 .mem_planes = 1,
83 .comp_planes = 1,
84 .h_align = 3,
85 .v_align = 3,
86 .flags = MXC_JPEG_FMT_TYPE_RAW,
87 .precision = 8,
88 .is_rgb = 1,
89 },
90 {
91 .name = "BGR 12bit", /*12-bit BGR packed format*/
92 .fourcc = V4L2_PIX_FMT_BGR48_12,
93 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
94 .nc = 3,
95 .depth = 36,
96 .mem_planes = 1,
97 .comp_planes = 1,
98 .h_align = 3,
99 .v_align = 3,
100 .flags = MXC_JPEG_FMT_TYPE_RAW,
101 .precision = 12,
102 .is_rgb = 1,
103 },
104 {
105 .name = "ABGR", /* ABGR packed format */
106 .fourcc = V4L2_PIX_FMT_ABGR32,
107 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
108 .nc = 4,
109 .depth = 32,
110 .mem_planes = 1,
111 .comp_planes = 1,
112 .h_align = 3,
113 .v_align = 3,
114 .flags = MXC_JPEG_FMT_TYPE_RAW,
115 .precision = 8,
116 .is_rgb = 1,
117 },
118 {
119 .name = "ABGR 12bit", /* 12-bit ABGR packed format */
120 .fourcc = V4L2_PIX_FMT_ABGR64_12,
121 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
122 .nc = 4,
123 .depth = 48,
124 .mem_planes = 1,
125 .comp_planes = 1,
126 .h_align = 3,
127 .v_align = 3,
128 .flags = MXC_JPEG_FMT_TYPE_RAW,
129 .precision = 12,
130 .is_rgb = 1,
131 },
132 {
133 .name = "YUV420", /* 1st plane = Y, 2nd plane = UV */
134 .fourcc = V4L2_PIX_FMT_NV12M,
135 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
136 .nc = 3,
137 .depth = 12, /* 6 bytes (4Y + UV) for 4 pixels */
138 .mem_planes = 2,
139 .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */
140 .h_align = 4,
141 .v_align = 4,
142 .flags = MXC_JPEG_FMT_TYPE_RAW,
143 .precision = 8,
144 },
145 {
146 .name = "YUV420", /* 1st plane = Y, 2nd plane = UV */
147 .fourcc = V4L2_PIX_FMT_NV12,
148 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
149 .nc = 3,
150 .depth = 12, /* 6 bytes (4Y + UV) for 4 pixels */
151 .mem_planes = 1,
152 .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */
153 .h_align = 4,
154 .v_align = 4,
155 .flags = MXC_JPEG_FMT_TYPE_RAW,
156 .precision = 8,
157 },
158 {
159 .name = "YUV420 12bit", /* 1st plane = Y, 2nd plane = UV */
160 .fourcc = V4L2_PIX_FMT_P012M,
161 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
162 .nc = 3,
163 .depth = 18, /* 6 x 12 bits (4Y + UV) for 4 pixels */
164 .mem_planes = 2,
165 .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */
166 .h_align = 4,
167 .v_align = 4,
168 .flags = MXC_JPEG_FMT_TYPE_RAW,
169 .precision = 12,
170 },
171 {
172 .name = "YUV420 12bit", /* 1st plane = Y, 2nd plane = UV */
173 .fourcc = V4L2_PIX_FMT_P012,
174 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
175 .nc = 3,
176 .depth = 18, /* 6 x 12 bits (4Y + UV) for 4 pixels */
177 .mem_planes = 1,
178 .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */
179 .h_align = 4,
180 .v_align = 4,
181 .flags = MXC_JPEG_FMT_TYPE_RAW,
182 .precision = 12,
183 },
184 {
185 .name = "YUV422", /* YUYV */
186 .fourcc = V4L2_PIX_FMT_YUYV,
187 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
188 .nc = 3,
189 .depth = 16,
190 .mem_planes = 1,
191 .comp_planes = 1,
192 .h_align = 4,
193 .v_align = 3,
194 .flags = MXC_JPEG_FMT_TYPE_RAW,
195 .precision = 8,
196 },
197 {
198 .name = "YUV422 12bit", /* YUYV */
199 .fourcc = V4L2_PIX_FMT_Y212,
200 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
201 .nc = 3,
202 .depth = 24,
203 .mem_planes = 1,
204 .comp_planes = 1,
205 .h_align = 4,
206 .v_align = 3,
207 .flags = MXC_JPEG_FMT_TYPE_RAW,
208 .precision = 12,
209 },
210 {
211 .name = "YUV444", /* YUVYUV */
212 .fourcc = V4L2_PIX_FMT_YUV24,
213 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
214 .nc = 3,
215 .depth = 24,
216 .mem_planes = 1,
217 .comp_planes = 1,
218 .h_align = 3,
219 .v_align = 3,
220 .flags = MXC_JPEG_FMT_TYPE_RAW,
221 .precision = 8,
222 },
223 {
224 .name = "YUV444 12bit", /* YUVYUV */
225 .fourcc = V4L2_PIX_FMT_YUV48_12,
226 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
227 .nc = 3,
228 .depth = 36,
229 .mem_planes = 1,
230 .comp_planes = 1,
231 .h_align = 3,
232 .v_align = 3,
233 .flags = MXC_JPEG_FMT_TYPE_RAW,
234 .precision = 12,
235 },
236 {
237 .name = "Gray", /* Gray (Y8/Y12) or Single Comp */
238 .fourcc = V4L2_PIX_FMT_GREY,
239 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY,
240 .nc = 1,
241 .depth = 8,
242 .mem_planes = 1,
243 .comp_planes = 1,
244 .h_align = 3,
245 .v_align = 3,
246 .flags = MXC_JPEG_FMT_TYPE_RAW,
247 .precision = 8,
248 },
249 {
250 .name = "Gray 12bit", /* Gray (Y8/Y12) or Single Comp */
251 .fourcc = V4L2_PIX_FMT_Y012,
252 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY,
253 .nc = 1,
254 .depth = 12,
255 .mem_planes = 1,
256 .comp_planes = 1,
257 .h_align = 3,
258 .v_align = 3,
259 .flags = MXC_JPEG_FMT_TYPE_RAW,
260 .precision = 12,
261 },
262 };
263
264 #define MXC_JPEG_NUM_FORMATS ARRAY_SIZE(mxc_formats)
265
266 static const int mxc_decode_mode = MXC_JPEG_DECODE;
267 static const int mxc_encode_mode = MXC_JPEG_ENCODE;
268
269 static const struct of_device_id mxc_jpeg_match[] = {
270 {
271 .compatible = "nxp,imx8qxp-jpgdec",
272 .data = &mxc_decode_mode,
273 },
274 {
275 .compatible = "nxp,imx8qxp-jpgenc",
276 .data = &mxc_encode_mode,
277 },
278 { },
279 };
280
281 /*
282 * default configuration stream, 64x64 yuv422
283 * split by JPEG marker, so it's easier to modify & use
284 */
285 static const unsigned char jpeg_soi[] = {
286 0xFF, 0xD8
287 };
288
289 static const unsigned char jpeg_app0[] = {
290 0xFF, 0xE0,
291 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00,
292 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01,
293 0x00, 0x00
294 };
295
296 static const unsigned char jpeg_app14[] = {
297 0xFF, 0xEE,
298 0x00, 0x0E, 0x41, 0x64, 0x6F, 0x62, 0x65,
299 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00
300 };
301
302 static const unsigned char jpeg_dqt[] = {
303 0xFF, 0xDB,
304 0x00, 0x84, 0x00, 0x10, 0x0B, 0x0C, 0x0E,
305 0x0C, 0x0A, 0x10, 0x0E, 0x0D, 0x0E, 0x12,
306 0x11, 0x10, 0x13, 0x18, 0x28, 0x1A, 0x18,
307 0x16, 0x16, 0x18, 0x31, 0x23, 0x25, 0x1D,
308 0x28, 0x3A, 0x33, 0x3D, 0x3C, 0x39, 0x33,
309 0x38, 0x37, 0x40, 0x48, 0x5C, 0x4E, 0x40,
310 0x44, 0x57, 0x45, 0x37, 0x38, 0x50, 0x6D,
311 0x51, 0x57, 0x5F, 0x62, 0x67, 0x68, 0x67,
312 0x3E, 0x4D, 0x71, 0x79, 0x70, 0x64, 0x78,
313 0x5C, 0x65, 0x67, 0x63, 0x01, 0x11, 0x12,
314 0x12, 0x18, 0x15, 0x18, 0x2F, 0x1A, 0x1A,
315 0x2F, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
316 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
317 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
318 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
319 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
320 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
321 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
322 0x63, 0x63, 0x63, 0x63, 0x63, 0x63
323 };
324
325 static const unsigned char jpeg_dqt_extseq[] = {
326 0xFF, 0xDB,
327 0x01, 0x04,
328 0x10,
329 0x00, 0x80, 0x00, 0x58, 0x00, 0x60, 0x00, 0x70,
330 0x00, 0x60, 0x00, 0x50, 0x00, 0x80, 0x00, 0x70,
331 0x00, 0x68, 0x00, 0x70, 0x00, 0x90, 0x00, 0x88,
332 0x00, 0x80, 0x00, 0x98, 0x00, 0xC0, 0x01, 0x40,
333 0x00, 0xD0, 0x00, 0xC0, 0x00, 0xB0, 0x00, 0xB0,
334 0x00, 0xC0, 0x01, 0x88, 0x01, 0x18, 0x01, 0x28,
335 0x00, 0xE8, 0x01, 0x40, 0x01, 0xD0, 0x01, 0x98,
336 0x01, 0xE8, 0x01, 0xE0, 0x01, 0xC8, 0x01, 0x98,
337 0x01, 0xC0, 0x01, 0xB8, 0x02, 0x00, 0x02, 0x40,
338 0x02, 0xE0, 0x02, 0x70, 0x02, 0x00, 0x02, 0x20,
339 0x02, 0xB8, 0x02, 0x28, 0x01, 0xB8, 0x01, 0xC0,
340 0x02, 0x80, 0x03, 0x68, 0x02, 0x88, 0x02, 0xB8,
341 0x02, 0xF8, 0x03, 0x10, 0x03, 0x38, 0x03, 0x40,
342 0x03, 0x38, 0x01, 0xF0, 0x02, 0x68, 0x03, 0x88,
343 0x03, 0xC8, 0x03, 0x80, 0x03, 0x20, 0x03, 0xC0,
344 0x02, 0xE0, 0x03, 0x28, 0x03, 0x38, 0x03, 0x18,
345 0x11,
346 0x00, 0x88, 0x00, 0x90, 0x00, 0x90, 0x00, 0xC0,
347 0x00, 0xA8, 0x00, 0xC0, 0x01, 0x78, 0x00, 0xD0,
348 0x00, 0xD0, 0x01, 0x78, 0x03, 0x18, 0x02, 0x10,
349 0x01, 0xC0, 0x02, 0x10, 0x03, 0x18, 0x03, 0x18,
350 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
351 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
352 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
353 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
354 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
355 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
356 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
357 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
358 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
359 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
360 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
361 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18,
362 };
363
364 static const unsigned char jpeg_sof_maximal[] = {
365 0xFF, 0xC0,
366 0x00, 0x14, 0x08, 0x00, 0x40, 0x00, 0x40,
367 0x04, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01,
368 0x03, 0x11, 0x01, 0x04, 0x11, 0x01
369 };
370
371 static const unsigned char jpeg_sof_extseq[] = {
372 0xFF, 0xC1,
373 0x00, 0x14, 0x08, 0x00, 0x40, 0x00, 0x40,
374 0x04, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01,
375 0x03, 0x11, 0x01, 0x04, 0x11, 0x01
376 };
377
378 static const unsigned char jpeg_dht[] = {
379 0xFF, 0xC4,
380 0x01, 0xA2, 0x00, 0x00, 0x01, 0x05, 0x01,
381 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
383 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
384 0x09, 0x0A, 0x0B, 0x10, 0x00, 0x02, 0x01,
385 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05,
386 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01,
387 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
388 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
389 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91,
390 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15,
391 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72,
392 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19,
393 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A,
394 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A,
395 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
396 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
397 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67,
398 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76,
399 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85,
400 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93,
401 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A,
402 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
403 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
404 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4,
405 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2,
406 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
407 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
408 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3,
409 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
410 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01,
411 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
413 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
414 0x0B, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04,
415 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04,
416 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02,
417 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06,
418 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13,
419 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
420 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52,
421 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16,
422 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18,
423 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A,
424 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43,
425 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A,
426 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
427 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
428 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77,
429 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85,
430 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93,
431 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A,
432 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
433 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
434 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4,
435 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2,
436 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
437 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
438 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5,
439 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
440 };
441
442 static const unsigned char jpeg_dht_extseq[] = {
443 0xFF, 0xC4,
444 0x02, 0x2a, 0x00, 0x00, 0x01, 0x05, 0x01,
445 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
446 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
447 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
448 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
449 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02,
450 0x04, 0x03, 0x05, 0x05, 0x02, 0x03, 0x02,
451 0x00, 0x00, 0xbf, 0x01, 0x02, 0x03, 0x00,
452 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41,
453 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71,
454 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23,
455 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
456 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a,
457 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26,
458 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36,
459 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45,
460 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54,
461 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63,
462 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
463 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
464 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
465 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
466 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4,
467 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2,
468 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
469 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
470 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5,
471 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
472 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
473 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,
474 0xf7, 0xf8, 0xf9, 0xfa, 0x0b, 0x0c, 0x0d,
475 0x0e, 0x1b, 0x1c, 0x1d, 0x1e, 0x2b, 0x2c,
476 0x2d, 0x2e, 0x3b, 0x3c, 0x3d, 0x3e, 0x4b,
477 0x4c, 0x4d, 0x4e, 0x5b, 0x5c, 0x5d, 0x5e,
478 0x6b, 0x6c, 0x6d, 0x6e, 0x7b, 0x7c, 0x7d,
479 0x7e, 0x8b, 0x8c, 0x8d, 0x8e, 0x9b, 0x9c,
480 0x9d, 0x9e, 0xab, 0xac, 0xad, 0xae, 0xbb,
481 0xbc, 0xbd, 0xbe, 0xcb, 0xcc, 0xcd, 0xce,
482 0xdb, 0xdc, 0xdd, 0xde, 0xeb, 0xec, 0xed,
483 0xee, 0xfb, 0xfc, 0xfd, 0xfe, 0x01, 0x00,
484 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
485 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
486 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
487 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
488 0x0d, 0x0e, 0x0f, 0x11, 0x00, 0x02, 0x01,
489 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05,
490 0x02, 0x03, 0x02, 0x00, 0x00, 0xbf, 0x01,
491 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
492 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
493 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91,
494 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15,
495 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72,
496 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19,
497 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
498 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a,
499 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
500 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
501 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67,
502 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
503 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85,
504 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93,
505 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a,
506 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
507 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
508 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4,
509 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
510 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
511 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,
512 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3,
513 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa,
514 0x0b, 0x0c, 0x0d, 0x0e, 0x1b, 0x1c, 0x1d,
515 0x1e, 0x2b, 0x2c, 0x2d, 0x2e, 0x3b, 0x3c,
516 0x3d, 0x3e, 0x4b, 0x4c, 0x4d, 0x4e, 0x5b,
517 0x5c, 0x5d, 0x5e, 0x6b, 0x6c, 0x6d, 0x6e,
518 0x7b, 0x7c, 0x7d, 0x7e, 0x8b, 0x8c, 0x8d,
519 0x8e, 0x9b, 0x9c, 0x9d, 0x9e, 0xab, 0xac,
520 0xad, 0xae, 0xbb, 0xbc, 0xbd, 0xbe, 0xcb,
521 0xcc, 0xcd, 0xce, 0xdb, 0xdc, 0xdd, 0xde,
522 0xeb, 0xec, 0xed, 0xee, 0xfb, 0xfc, 0xfd,
523 0xfe,
524 };
525
526 static const unsigned char jpeg_dri[] = {
527 0xFF, 0xDD,
528 0x00, 0x04, 0x00, 0x20
529 };
530
531 static const unsigned char jpeg_sos_maximal[] = {
532 0xFF, 0xDA,
533 0x00, 0x0C, 0x04, 0x01, 0x00, 0x02, 0x11, 0x03,
534 0x11, 0x04, 0x11, 0x00, 0x3F, 0x00
535 };
536
537 static const unsigned char jpeg_image_red[] = {
538 0xFC, 0x5F, 0xA2, 0xBF, 0xCA, 0x73, 0xFE, 0xFE,
539 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00,
540 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02,
541 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28,
542 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A,
543 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0,
544 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00,
545 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02,
546 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00, 0x28,
547 0xA0, 0x02, 0x8A, 0x00, 0x28, 0xA0, 0x02, 0x8A,
548 0x00, 0x28, 0xA0, 0x02, 0x8A, 0x00
549 };
550
551 static const unsigned char jpeg_eoi[] = {
552 0xFF, 0xD9
553 };
554
555 struct mxc_jpeg_src_buf {
556 /* common v4l buffer stuff -- must be first */
557 struct vb2_v4l2_buffer b;
558 struct list_head list;
559
560 /* mxc-jpeg specific */
561 bool dht_needed;
562 bool jpeg_parse_error;
563 const struct mxc_jpeg_fmt *fmt;
564 int w;
565 int h;
566 };
567
vb2_to_mxc_buf(struct vb2_buffer * vb)568 static inline struct mxc_jpeg_src_buf *vb2_to_mxc_buf(struct vb2_buffer *vb)
569 {
570 return container_of(to_vb2_v4l2_buffer(vb),
571 struct mxc_jpeg_src_buf, b);
572 }
573
574 static unsigned int debug;
575 module_param(debug, int, 0644);
576 MODULE_PARM_DESC(debug, "Debug level (0-3)");
577
578 static unsigned int hw_timeout = 2000;
579 module_param(hw_timeout, int, 0644);
580 MODULE_PARM_DESC(hw_timeout, "MXC JPEG hw timeout, the number of milliseconds");
581
582 static void mxc_jpeg_bytesperline(struct mxc_jpeg_q_data *q, u32 precision);
583 static void mxc_jpeg_sizeimage(struct mxc_jpeg_q_data *q);
584
_bswap16(u16 * a)585 static void _bswap16(u16 *a)
586 {
587 *a = ((*a & 0x00FF) << 8) | ((*a & 0xFF00) >> 8);
588 }
589
print_mxc_buf(struct mxc_jpeg_dev * jpeg,struct vb2_buffer * buf,unsigned long len)590 static void print_mxc_buf(struct mxc_jpeg_dev *jpeg, struct vb2_buffer *buf,
591 unsigned long len)
592 {
593 unsigned int plane_no;
594 u32 dma_addr;
595 void *vaddr;
596 unsigned long payload;
597
598 if (debug < 3)
599 return;
600
601 for (plane_no = 0; plane_no < buf->num_planes; plane_no++) {
602 payload = vb2_get_plane_payload(buf, plane_no);
603 if (len == 0)
604 len = payload;
605 dma_addr = vb2_dma_contig_plane_dma_addr(buf, plane_no);
606 vaddr = vb2_plane_vaddr(buf, plane_no);
607 v4l2_dbg(3, debug, &jpeg->v4l2_dev,
608 "plane %d (vaddr=%p dma_addr=%x payload=%ld):",
609 plane_no, vaddr, dma_addr, payload);
610 print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1,
611 vaddr, len, false);
612 }
613 }
614
mxc_jpeg_fh_to_ctx(struct v4l2_fh * fh)615 static inline struct mxc_jpeg_ctx *mxc_jpeg_fh_to_ctx(struct v4l2_fh *fh)
616 {
617 return container_of(fh, struct mxc_jpeg_ctx, fh);
618 }
619
enum_fmt(const struct mxc_jpeg_fmt * mxc_formats,int n,struct v4l2_fmtdesc * f,u32 type)620 static int enum_fmt(const struct mxc_jpeg_fmt *mxc_formats, int n,
621 struct v4l2_fmtdesc *f, u32 type)
622 {
623 int i, num = 0;
624
625 for (i = 0; i < n; ++i) {
626 if (mxc_formats[i].flags == type) {
627 /* index-th format of searched type found ? */
628 if (num == f->index)
629 break;
630 /* Correct type but haven't reached our index yet,
631 * just increment per-type index
632 */
633 ++num;
634 }
635 }
636
637 /* Format not found */
638 if (i >= n)
639 return -EINVAL;
640
641 f->pixelformat = mxc_formats[i].fourcc;
642
643 return 0;
644 }
645
mxc_jpeg_find_format(u32 pixelformat)646 static const struct mxc_jpeg_fmt *mxc_jpeg_find_format(u32 pixelformat)
647 {
648 unsigned int k;
649
650 for (k = 0; k < MXC_JPEG_NUM_FORMATS; k++) {
651 const struct mxc_jpeg_fmt *fmt = &mxc_formats[k];
652
653 if (fmt->fourcc == pixelformat)
654 return fmt;
655 }
656 return NULL;
657 }
658
mxc_jpeg_fourcc_to_imgfmt(u32 fourcc)659 static enum mxc_jpeg_image_format mxc_jpeg_fourcc_to_imgfmt(u32 fourcc)
660 {
661 switch (fourcc) {
662 case V4L2_PIX_FMT_GREY:
663 case V4L2_PIX_FMT_Y012:
664 return MXC_JPEG_GRAY;
665 case V4L2_PIX_FMT_YUYV:
666 case V4L2_PIX_FMT_Y212:
667 return MXC_JPEG_YUV422;
668 case V4L2_PIX_FMT_NV12:
669 case V4L2_PIX_FMT_NV12M:
670 case V4L2_PIX_FMT_P012:
671 case V4L2_PIX_FMT_P012M:
672 return MXC_JPEG_YUV420;
673 case V4L2_PIX_FMT_YUV24:
674 case V4L2_PIX_FMT_YUV48_12:
675 return MXC_JPEG_YUV444;
676 case V4L2_PIX_FMT_BGR24:
677 case V4L2_PIX_FMT_BGR48_12:
678 return MXC_JPEG_BGR;
679 case V4L2_PIX_FMT_ABGR32:
680 case V4L2_PIX_FMT_ABGR64_12:
681 return MXC_JPEG_ABGR;
682 default:
683 return MXC_JPEG_INVALID;
684 }
685 }
686
mxc_jpeg_get_q_data(struct mxc_jpeg_ctx * ctx,enum v4l2_buf_type type)687 static struct mxc_jpeg_q_data *mxc_jpeg_get_q_data(struct mxc_jpeg_ctx *ctx,
688 enum v4l2_buf_type type)
689 {
690 if (V4L2_TYPE_IS_OUTPUT(type))
691 return &ctx->out_q;
692 return &ctx->cap_q;
693 }
694
mxc_jpeg_addrs(struct mxc_jpeg_desc * desc,struct vb2_buffer * raw_buf,struct vb2_buffer * jpeg_buf,int offset)695 static void mxc_jpeg_addrs(struct mxc_jpeg_desc *desc,
696 struct vb2_buffer *raw_buf,
697 struct vb2_buffer *jpeg_buf, int offset)
698 {
699 int img_fmt = desc->stm_ctrl & STM_CTRL_IMAGE_FORMAT_MASK;
700 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(raw_buf->vb2_queue);
701 struct mxc_jpeg_q_data *q_data;
702
703 q_data = mxc_jpeg_get_q_data(ctx, raw_buf->type);
704 desc->buf_base0 = vb2_dma_contig_plane_dma_addr(raw_buf, 0);
705 desc->buf_base1 = 0;
706 if (img_fmt == STM_CTRL_IMAGE_FORMAT(MXC_JPEG_YUV420)) {
707 if (raw_buf->num_planes == 2)
708 desc->buf_base1 = vb2_dma_contig_plane_dma_addr(raw_buf, 1);
709 else
710 desc->buf_base1 = desc->buf_base0 + q_data->sizeimage[0];
711 }
712 desc->stm_bufbase = vb2_dma_contig_plane_dma_addr(jpeg_buf, 0) +
713 offset;
714 }
715
mxc_jpeg_is_extended_sequential(const struct mxc_jpeg_fmt * fmt)716 static bool mxc_jpeg_is_extended_sequential(const struct mxc_jpeg_fmt *fmt)
717 {
718 if (!fmt || !(fmt->flags & MXC_JPEG_FMT_TYPE_RAW))
719 return false;
720
721 if (fmt->precision > 8)
722 return true;
723
724 return false;
725 }
726
notify_eos(struct mxc_jpeg_ctx * ctx)727 static void notify_eos(struct mxc_jpeg_ctx *ctx)
728 {
729 const struct v4l2_event ev = {
730 .type = V4L2_EVENT_EOS
731 };
732
733 dev_dbg(ctx->mxc_jpeg->dev, "Notify app event EOS reached");
734 v4l2_event_queue_fh(&ctx->fh, &ev);
735 }
736
notify_src_chg(struct mxc_jpeg_ctx * ctx)737 static void notify_src_chg(struct mxc_jpeg_ctx *ctx)
738 {
739 const struct v4l2_event ev = {
740 .type = V4L2_EVENT_SOURCE_CHANGE,
741 .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
742 };
743
744 dev_dbg(ctx->mxc_jpeg->dev, "Notify app event SRC_CH_RESOLUTION");
745 v4l2_event_queue_fh(&ctx->fh, &ev);
746 }
747
mxc_get_free_slot(struct mxc_jpeg_slot_data * slot_data)748 static int mxc_get_free_slot(struct mxc_jpeg_slot_data *slot_data)
749 {
750 if (!slot_data->used)
751 return slot_data->slot;
752 return -1;
753 }
754
mxc_jpeg_alloc_slot_data(struct mxc_jpeg_dev * jpeg)755 static bool mxc_jpeg_alloc_slot_data(struct mxc_jpeg_dev *jpeg)
756 {
757 struct mxc_jpeg_desc *desc;
758 struct mxc_jpeg_desc *cfg_desc;
759 void *cfg_stm;
760
761 if (jpeg->slot_data.desc)
762 goto skip_alloc; /* already allocated, reuse it */
763
764 /* allocate descriptor for decoding/encoding phase */
765 desc = dma_alloc_coherent(jpeg->dev,
766 sizeof(struct mxc_jpeg_desc),
767 &jpeg->slot_data.desc_handle,
768 GFP_ATOMIC);
769 if (!desc)
770 goto err;
771 jpeg->slot_data.desc = desc;
772
773 /* allocate descriptor for configuration phase (encoder only) */
774 cfg_desc = dma_alloc_coherent(jpeg->dev,
775 sizeof(struct mxc_jpeg_desc),
776 &jpeg->slot_data.cfg_desc_handle,
777 GFP_ATOMIC);
778 if (!cfg_desc)
779 goto err;
780 jpeg->slot_data.cfg_desc = cfg_desc;
781
782 /* allocate configuration stream */
783 cfg_stm = dma_alloc_coherent(jpeg->dev,
784 MXC_JPEG_MAX_CFG_STREAM,
785 &jpeg->slot_data.cfg_stream_handle,
786 GFP_ATOMIC);
787 if (!cfg_stm)
788 goto err;
789 jpeg->slot_data.cfg_stream_vaddr = cfg_stm;
790
791 skip_alloc:
792 jpeg->slot_data.used = true;
793
794 return true;
795 err:
796 dev_err(jpeg->dev, "Could not allocate descriptors for slot %d", jpeg->slot_data.slot);
797
798 return false;
799 }
800
mxc_jpeg_free_slot_data(struct mxc_jpeg_dev * jpeg)801 static void mxc_jpeg_free_slot_data(struct mxc_jpeg_dev *jpeg)
802 {
803 /* free descriptor for decoding/encoding phase */
804 dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc),
805 jpeg->slot_data.desc,
806 jpeg->slot_data.desc_handle);
807
808 /* free descriptor for encoder configuration phase / decoder DHT */
809 dma_free_coherent(jpeg->dev, sizeof(struct mxc_jpeg_desc),
810 jpeg->slot_data.cfg_desc,
811 jpeg->slot_data.cfg_desc_handle);
812
813 /* free configuration stream */
814 dma_free_coherent(jpeg->dev, MXC_JPEG_MAX_CFG_STREAM,
815 jpeg->slot_data.cfg_stream_vaddr,
816 jpeg->slot_data.cfg_stream_handle);
817
818 jpeg->slot_data.used = false;
819 }
820
mxc_jpeg_check_and_set_last_buffer(struct mxc_jpeg_ctx * ctx,struct vb2_v4l2_buffer * src_buf,struct vb2_v4l2_buffer * dst_buf)821 static void mxc_jpeg_check_and_set_last_buffer(struct mxc_jpeg_ctx *ctx,
822 struct vb2_v4l2_buffer *src_buf,
823 struct vb2_v4l2_buffer *dst_buf)
824 {
825 if (v4l2_m2m_is_last_draining_src_buf(ctx->fh.m2m_ctx, src_buf)) {
826 dst_buf->flags |= V4L2_BUF_FLAG_LAST;
827 v4l2_m2m_mark_stopped(ctx->fh.m2m_ctx);
828 notify_eos(ctx);
829 ctx->header_parsed = false;
830 }
831 }
832
mxc_jpeg_job_finish(struct mxc_jpeg_ctx * ctx,enum vb2_buffer_state state,bool reset)833 static void mxc_jpeg_job_finish(struct mxc_jpeg_ctx *ctx, enum vb2_buffer_state state, bool reset)
834 {
835 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
836 void __iomem *reg = jpeg->base_reg;
837 struct vb2_v4l2_buffer *src_buf, *dst_buf;
838
839 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
840 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
841 mxc_jpeg_check_and_set_last_buffer(ctx, src_buf, dst_buf);
842 v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
843 v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
844 v4l2_m2m_buf_done(src_buf, state);
845 v4l2_m2m_buf_done(dst_buf, state);
846
847 mxc_jpeg_disable_irq(reg, ctx->slot);
848 jpeg->slot_data.used = false;
849 if (reset)
850 mxc_jpeg_sw_reset(reg);
851 }
852
mxc_jpeg_get_plane_size(struct mxc_jpeg_q_data * q_data,u32 plane_no)853 static u32 mxc_jpeg_get_plane_size(struct mxc_jpeg_q_data *q_data, u32 plane_no)
854 {
855 const struct mxc_jpeg_fmt *fmt = q_data->fmt;
856 u32 size;
857 int i;
858
859 if (plane_no >= fmt->mem_planes)
860 return 0;
861
862 if (fmt->mem_planes == fmt->comp_planes)
863 return q_data->sizeimage[plane_no];
864
865 if (plane_no < fmt->mem_planes - 1)
866 return q_data->sizeimage[plane_no];
867
868 size = q_data->sizeimage[fmt->mem_planes - 1];
869
870 /* Should be impossible given mxc_formats. */
871 if (WARN_ON_ONCE(fmt->comp_planes > ARRAY_SIZE(q_data->sizeimage)))
872 return size;
873
874 for (i = fmt->mem_planes; i < fmt->comp_planes; i++)
875 size += q_data->sizeimage[i];
876
877 return size;
878 }
879
mxc_jpeg_dec_irq(int irq,void * priv)880 static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv)
881 {
882 struct mxc_jpeg_dev *jpeg = priv;
883 struct mxc_jpeg_ctx *ctx;
884 void __iomem *reg = jpeg->base_reg;
885 struct device *dev = jpeg->dev;
886 struct vb2_v4l2_buffer *src_buf, *dst_buf;
887 struct mxc_jpeg_src_buf *jpeg_src_buf;
888 enum vb2_buffer_state buf_state;
889 u32 dec_ret, com_status;
890 unsigned long payload;
891 struct mxc_jpeg_q_data *q_data;
892 enum v4l2_buf_type cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
893 unsigned int slot;
894
895 spin_lock(&jpeg->hw_lock);
896
897 com_status = readl(reg + COM_STATUS);
898 slot = COM_STATUS_CUR_SLOT(com_status);
899 dev_dbg(dev, "Irq %d on slot %d.\n", irq, slot);
900
901 ctx = v4l2_m2m_get_curr_priv(jpeg->m2m_dev);
902 if (WARN_ON(!ctx))
903 goto job_unlock;
904
905 if (slot != ctx->slot) {
906 /* TODO investigate when adding multi-instance support */
907 dev_warn(dev, "IRQ slot %d != context slot %d.\n",
908 slot, ctx->slot);
909 goto job_unlock;
910 }
911
912 if (!jpeg->slot_data.used)
913 goto job_unlock;
914
915 dec_ret = readl(reg + MXC_SLOT_OFFSET(slot, SLOT_STATUS));
916 writel(dec_ret, reg + MXC_SLOT_OFFSET(slot, SLOT_STATUS)); /* w1c */
917
918 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
919 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
920 if (!dst_buf || !src_buf) {
921 dev_err(dev, "No source or destination buffer.\n");
922 goto job_unlock;
923 }
924 jpeg_src_buf = vb2_to_mxc_buf(&src_buf->vb2_buf);
925
926 if (dec_ret & SLOT_STATUS_ENC_CONFIG_ERR) {
927 u32 ret = readl(reg + CAST_STATUS12);
928
929 dev_err(dev, "Encoder/decoder error, dec_ret = 0x%08x, status=0x%08x",
930 dec_ret, ret);
931 mxc_jpeg_clr_desc(reg, slot);
932 mxc_jpeg_sw_reset(reg);
933 buf_state = VB2_BUF_STATE_ERROR;
934 goto buffers_done;
935 }
936
937 if (!(dec_ret & SLOT_STATUS_FRMDONE))
938 goto job_unlock;
939
940 if (jpeg->mode == MXC_JPEG_ENCODE &&
941 ctx->enc_state == MXC_JPEG_ENC_CONF) {
942 q_data = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
943 ctx->enc_state = MXC_JPEG_ENCODING;
944 dev_dbg(dev, "Encoder config finished. Start encoding...\n");
945 mxc_jpeg_enc_set_quality(dev, reg, ctx->jpeg_quality);
946 mxc_jpeg_enc_mode_go(dev, reg, mxc_jpeg_is_extended_sequential(q_data->fmt));
947 goto job_unlock;
948 }
949 if (jpeg->mode == MXC_JPEG_DECODE && jpeg_src_buf->dht_needed) {
950 jpeg_src_buf->dht_needed = false;
951 dev_dbg(dev, "Decoder DHT cfg finished. Start decoding...\n");
952 goto job_unlock;
953 }
954
955 if (jpeg->mode == MXC_JPEG_ENCODE) {
956 payload = readl(reg + MXC_SLOT_OFFSET(slot, SLOT_BUF_PTR));
957 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, payload);
958 dev_dbg(dev, "Encoding finished, payload size: %ld\n",
959 payload);
960 } else {
961 q_data = mxc_jpeg_get_q_data(ctx, cap_type);
962 payload = mxc_jpeg_get_plane_size(q_data, 0);
963 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, payload);
964 vb2_set_plane_payload(&dst_buf->vb2_buf, 1, 0);
965 if (q_data->fmt->mem_planes == 2) {
966 payload = mxc_jpeg_get_plane_size(q_data, 1);
967 vb2_set_plane_payload(&dst_buf->vb2_buf, 1, payload);
968 }
969 dev_dbg(dev, "Decoding finished, payload size: %ld + %ld\n",
970 vb2_get_plane_payload(&dst_buf->vb2_buf, 0),
971 vb2_get_plane_payload(&dst_buf->vb2_buf, 1));
972 }
973
974 /* short preview of the results */
975 dev_dbg(dev, "src_buf preview: ");
976 print_mxc_buf(jpeg, &src_buf->vb2_buf, 32);
977 dev_dbg(dev, "dst_buf preview: ");
978 print_mxc_buf(jpeg, &dst_buf->vb2_buf, 32);
979 buf_state = VB2_BUF_STATE_DONE;
980
981 buffers_done:
982 mxc_jpeg_job_finish(ctx, buf_state, false);
983 spin_unlock(&jpeg->hw_lock);
984 cancel_delayed_work(&ctx->task_timer);
985 v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
986 return IRQ_HANDLED;
987 job_unlock:
988 spin_unlock(&jpeg->hw_lock);
989 return IRQ_HANDLED;
990 }
991
mxc_jpeg_fixup_sof(struct mxc_jpeg_sof * sof,u32 fourcc,u16 w,u16 h)992 static int mxc_jpeg_fixup_sof(struct mxc_jpeg_sof *sof,
993 u32 fourcc,
994 u16 w, u16 h)
995 {
996 int sof_length;
997 const struct mxc_jpeg_fmt *fmt = mxc_jpeg_find_format(fourcc);
998
999 if (fmt)
1000 sof->precision = fmt->precision;
1001 else
1002 sof->precision = 8; /* TODO allow 8/12 bit precision*/
1003 sof->height = h;
1004 _bswap16(&sof->height);
1005 sof->width = w;
1006 _bswap16(&sof->width);
1007
1008 switch (fourcc) {
1009 case V4L2_PIX_FMT_NV12:
1010 case V4L2_PIX_FMT_NV12M:
1011 case V4L2_PIX_FMT_P012:
1012 case V4L2_PIX_FMT_P012M:
1013 sof->components_no = 3;
1014 sof->comp[0].v = 0x2;
1015 sof->comp[0].h = 0x2;
1016 break;
1017 case V4L2_PIX_FMT_YUYV:
1018 case V4L2_PIX_FMT_Y212:
1019 sof->components_no = 3;
1020 sof->comp[0].v = 0x1;
1021 sof->comp[0].h = 0x2;
1022 break;
1023 case V4L2_PIX_FMT_YUV24:
1024 case V4L2_PIX_FMT_YUV48_12:
1025 case V4L2_PIX_FMT_BGR24:
1026 case V4L2_PIX_FMT_BGR48_12:
1027 default:
1028 sof->components_no = 3;
1029 break;
1030 case V4L2_PIX_FMT_ABGR32:
1031 case V4L2_PIX_FMT_ABGR64_12:
1032 sof->components_no = 4;
1033 break;
1034 case V4L2_PIX_FMT_GREY:
1035 case V4L2_PIX_FMT_Y012:
1036 sof->components_no = 1;
1037 break;
1038 }
1039 sof_length = 8 + 3 * sof->components_no;
1040 sof->length = sof_length;
1041 _bswap16(&sof->length);
1042
1043 return sof_length; /* not swaped */
1044 }
1045
mxc_jpeg_fixup_sos(struct mxc_jpeg_sos * sos,u32 fourcc)1046 static int mxc_jpeg_fixup_sos(struct mxc_jpeg_sos *sos,
1047 u32 fourcc)
1048 {
1049 int sos_length;
1050 u8 *sof_u8 = (u8 *)sos;
1051
1052 switch (fourcc) {
1053 case V4L2_PIX_FMT_NV12:
1054 case V4L2_PIX_FMT_NV12M:
1055 case V4L2_PIX_FMT_P012:
1056 case V4L2_PIX_FMT_P012M:
1057 sos->components_no = 3;
1058 break;
1059 case V4L2_PIX_FMT_YUYV:
1060 case V4L2_PIX_FMT_Y212:
1061 sos->components_no = 3;
1062 break;
1063 case V4L2_PIX_FMT_YUV24:
1064 case V4L2_PIX_FMT_YUV48_12:
1065 case V4L2_PIX_FMT_BGR24:
1066 case V4L2_PIX_FMT_BGR48_12:
1067 default:
1068 sos->components_no = 3;
1069 break;
1070 case V4L2_PIX_FMT_ABGR32:
1071 case V4L2_PIX_FMT_ABGR64_12:
1072 sos->components_no = 4;
1073 break;
1074 case V4L2_PIX_FMT_GREY:
1075 case V4L2_PIX_FMT_Y012:
1076 sos->components_no = 1;
1077 break;
1078 }
1079 sos_length = 6 + 2 * sos->components_no;
1080 sos->length = sos_length;
1081 _bswap16(&sos->length);
1082
1083 /* SOS ignorable bytes, not so ignorable after all */
1084 sof_u8[sos_length - 1] = 0x0;
1085 sof_u8[sos_length - 2] = 0x3f;
1086 sof_u8[sos_length - 3] = 0x0;
1087
1088 return sos_length; /* not swaped */
1089 }
1090
mxc_jpeg_setup_cfg_stream(void * cfg_stream_vaddr,u32 fourcc,u16 w,u16 h)1091 static unsigned int mxc_jpeg_setup_cfg_stream(void *cfg_stream_vaddr,
1092 u32 fourcc,
1093 u16 w, u16 h)
1094 {
1095 /*
1096 * There is a hardware issue that first 128 bytes of configuration data
1097 * can't be loaded correctly.
1098 * To avoid this issue, we need to write the configuration from
1099 * an offset which should be no less than 0x80 (128 bytes).
1100 */
1101 unsigned int offset = 0x80;
1102 u8 *cfg = (u8 *)cfg_stream_vaddr;
1103 struct mxc_jpeg_sof *sof;
1104 struct mxc_jpeg_sos *sos;
1105 const struct mxc_jpeg_fmt *fmt = mxc_jpeg_find_format(fourcc);
1106
1107 if (!fmt)
1108 return 0;
1109
1110 memcpy(cfg + offset, jpeg_soi, ARRAY_SIZE(jpeg_soi));
1111 offset += ARRAY_SIZE(jpeg_soi);
1112
1113 if (fmt->is_rgb) {
1114 memcpy(cfg + offset, jpeg_app14, sizeof(jpeg_app14));
1115 offset += sizeof(jpeg_app14);
1116 } else {
1117 memcpy(cfg + offset, jpeg_app0, sizeof(jpeg_app0));
1118 offset += sizeof(jpeg_app0);
1119 }
1120
1121 if (mxc_jpeg_is_extended_sequential(fmt)) {
1122 memcpy(cfg + offset, jpeg_dqt_extseq, sizeof(jpeg_dqt_extseq));
1123 offset += sizeof(jpeg_dqt_extseq);
1124
1125 memcpy(cfg + offset, jpeg_sof_extseq, sizeof(jpeg_sof_extseq));
1126 } else {
1127 memcpy(cfg + offset, jpeg_dqt, sizeof(jpeg_dqt));
1128 offset += sizeof(jpeg_dqt);
1129
1130 memcpy(cfg + offset, jpeg_sof_maximal, sizeof(jpeg_sof_maximal));
1131 }
1132 offset += 2; /* skip marker ID */
1133 sof = (struct mxc_jpeg_sof *)(cfg + offset);
1134 offset += mxc_jpeg_fixup_sof(sof, fourcc, w, h);
1135
1136 if (mxc_jpeg_is_extended_sequential(fmt)) {
1137 memcpy(cfg + offset, jpeg_dht_extseq, sizeof(jpeg_dht_extseq));
1138 offset += sizeof(jpeg_dht_extseq);
1139 } else {
1140 memcpy(cfg + offset, jpeg_dht, sizeof(jpeg_dht));
1141 offset += sizeof(jpeg_dht);
1142 }
1143
1144 memcpy(cfg + offset, jpeg_dri, sizeof(jpeg_dri));
1145 offset += sizeof(jpeg_dri);
1146
1147 memcpy(cfg + offset, jpeg_sos_maximal, sizeof(jpeg_sos_maximal));
1148 offset += 2; /* skip marker ID */
1149 sos = (struct mxc_jpeg_sos *)(cfg + offset);
1150 offset += mxc_jpeg_fixup_sos(sos, fourcc);
1151
1152 memcpy(cfg + offset, jpeg_image_red, sizeof(jpeg_image_red));
1153 offset += sizeof(jpeg_image_red);
1154
1155 memcpy(cfg + offset, jpeg_eoi, sizeof(jpeg_eoi));
1156 offset += sizeof(jpeg_eoi);
1157
1158 return offset;
1159 }
1160
mxc_jpeg_config_dec_desc(struct vb2_buffer * out_buf,struct mxc_jpeg_ctx * ctx,struct vb2_buffer * src_buf,struct vb2_buffer * dst_buf)1161 static void mxc_jpeg_config_dec_desc(struct vb2_buffer *out_buf,
1162 struct mxc_jpeg_ctx *ctx,
1163 struct vb2_buffer *src_buf,
1164 struct vb2_buffer *dst_buf)
1165 {
1166 enum v4l2_buf_type cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1167 struct mxc_jpeg_q_data *q_data_cap;
1168 enum mxc_jpeg_image_format img_fmt;
1169 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
1170 void __iomem *reg = jpeg->base_reg;
1171 unsigned int slot = ctx->slot;
1172 struct mxc_jpeg_desc *desc = jpeg->slot_data.desc;
1173 struct mxc_jpeg_desc *cfg_desc = jpeg->slot_data.cfg_desc;
1174 dma_addr_t desc_handle = jpeg->slot_data.desc_handle;
1175 dma_addr_t cfg_desc_handle = jpeg->slot_data.cfg_desc_handle;
1176 dma_addr_t cfg_stream_handle = jpeg->slot_data.cfg_stream_handle;
1177 unsigned int *cfg_size = &jpeg->slot_data.cfg_stream_size;
1178 void *cfg_stream_vaddr = jpeg->slot_data.cfg_stream_vaddr;
1179 struct mxc_jpeg_src_buf *jpeg_src_buf;
1180
1181 jpeg_src_buf = vb2_to_mxc_buf(src_buf);
1182
1183 /* setup the decoding descriptor */
1184 desc->next_descpt_ptr = 0; /* end of chain */
1185 q_data_cap = mxc_jpeg_get_q_data(ctx, cap_type);
1186 desc->imgsize = q_data_cap->w_adjusted << 16 | q_data_cap->h_adjusted;
1187 img_fmt = mxc_jpeg_fourcc_to_imgfmt(q_data_cap->fmt->fourcc);
1188 desc->stm_ctrl &= ~STM_CTRL_IMAGE_FORMAT(0xF); /* clear image format */
1189 desc->stm_ctrl |= STM_CTRL_IMAGE_FORMAT(img_fmt);
1190 desc->stm_ctrl |= STM_CTRL_BITBUF_PTR_CLR(1);
1191 if (mxc_jpeg_is_extended_sequential(jpeg_src_buf->fmt))
1192 desc->stm_ctrl |= STM_CTRL_PIXEL_PRECISION;
1193 else
1194 desc->stm_ctrl &= ~STM_CTRL_PIXEL_PRECISION;
1195 desc->line_pitch = q_data_cap->bytesperline[0];
1196 mxc_jpeg_addrs(desc, dst_buf, src_buf, 0);
1197 mxc_jpeg_set_bufsize(desc, ALIGN(vb2_plane_size(src_buf, 0), 1024));
1198 print_descriptor_info(jpeg->dev, desc);
1199
1200 if (!jpeg_src_buf->dht_needed) {
1201 /* validate the decoding descriptor */
1202 mxc_jpeg_set_desc(desc_handle, reg, slot);
1203 return;
1204 }
1205
1206 /*
1207 * if a default huffman table is needed, use the config descriptor to
1208 * inject a DHT, by chaining it before the decoding descriptor
1209 */
1210 *cfg_size = mxc_jpeg_setup_cfg_stream(cfg_stream_vaddr,
1211 V4L2_PIX_FMT_YUYV,
1212 MXC_JPEG_MIN_WIDTH,
1213 MXC_JPEG_MIN_HEIGHT);
1214 cfg_desc->next_descpt_ptr = desc_handle | MXC_NXT_DESCPT_EN;
1215 cfg_desc->buf_base0 = vb2_dma_contig_plane_dma_addr(dst_buf, 0);
1216 cfg_desc->buf_base1 = 0;
1217 cfg_desc->imgsize = MXC_JPEG_MIN_WIDTH << 16;
1218 cfg_desc->imgsize |= MXC_JPEG_MIN_HEIGHT;
1219 cfg_desc->line_pitch = MXC_JPEG_MIN_WIDTH * 2;
1220 cfg_desc->stm_ctrl = STM_CTRL_IMAGE_FORMAT(MXC_JPEG_YUV422);
1221 cfg_desc->stm_ctrl |= STM_CTRL_BITBUF_PTR_CLR(1);
1222 cfg_desc->stm_bufbase = cfg_stream_handle;
1223 cfg_desc->stm_bufsize = ALIGN(*cfg_size, 1024);
1224 print_descriptor_info(jpeg->dev, cfg_desc);
1225
1226 /* validate the configuration descriptor */
1227 mxc_jpeg_set_desc(cfg_desc_handle, reg, slot);
1228 }
1229
mxc_jpeg_config_enc_desc(struct vb2_buffer * out_buf,struct mxc_jpeg_ctx * ctx,struct vb2_buffer * src_buf,struct vb2_buffer * dst_buf)1230 static void mxc_jpeg_config_enc_desc(struct vb2_buffer *out_buf,
1231 struct mxc_jpeg_ctx *ctx,
1232 struct vb2_buffer *src_buf,
1233 struct vb2_buffer *dst_buf)
1234 {
1235 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
1236 void __iomem *reg = jpeg->base_reg;
1237 unsigned int slot = ctx->slot;
1238 struct mxc_jpeg_desc *desc = jpeg->slot_data.desc;
1239 struct mxc_jpeg_desc *cfg_desc = jpeg->slot_data.cfg_desc;
1240 dma_addr_t desc_handle = jpeg->slot_data.desc_handle;
1241 dma_addr_t cfg_desc_handle = jpeg->slot_data.cfg_desc_handle;
1242 void *cfg_stream_vaddr = jpeg->slot_data.cfg_stream_vaddr;
1243 struct mxc_jpeg_q_data *q_data;
1244 enum mxc_jpeg_image_format img_fmt;
1245 int w, h;
1246
1247 q_data = mxc_jpeg_get_q_data(ctx, src_buf->vb2_queue->type);
1248
1249 jpeg->slot_data.cfg_stream_size =
1250 mxc_jpeg_setup_cfg_stream(cfg_stream_vaddr,
1251 q_data->fmt->fourcc,
1252 q_data->crop.width,
1253 q_data->crop.height);
1254
1255 /* chain the config descriptor with the encoding descriptor */
1256 cfg_desc->next_descpt_ptr = desc_handle | MXC_NXT_DESCPT_EN;
1257
1258 cfg_desc->buf_base0 = jpeg->slot_data.cfg_stream_handle;
1259 cfg_desc->buf_base1 = 0;
1260 cfg_desc->line_pitch = 0;
1261 cfg_desc->stm_bufbase = 0; /* no output expected */
1262 cfg_desc->stm_bufsize = 0x0;
1263 cfg_desc->imgsize = 0;
1264 cfg_desc->stm_ctrl = STM_CTRL_CONFIG_MOD(1);
1265 cfg_desc->stm_ctrl |= STM_CTRL_BITBUF_PTR_CLR(1);
1266
1267 desc->next_descpt_ptr = 0; /* end of chain */
1268
1269 /* use adjusted resolution for CAST IP job */
1270 w = q_data->crop.width;
1271 h = q_data->crop.height;
1272 v4l_bound_align_image(&w, w, MXC_JPEG_MAX_WIDTH, q_data->fmt->h_align,
1273 &h, h, MXC_JPEG_MAX_HEIGHT, q_data->fmt->v_align, 0);
1274 mxc_jpeg_set_res(desc, w, h);
1275 mxc_jpeg_set_line_pitch(desc, q_data->bytesperline[0]);
1276 mxc_jpeg_set_bufsize(desc, ALIGN(vb2_plane_size(dst_buf, 0), 1024));
1277 img_fmt = mxc_jpeg_fourcc_to_imgfmt(q_data->fmt->fourcc);
1278 if (img_fmt == MXC_JPEG_INVALID)
1279 dev_err(jpeg->dev, "No valid image format detected\n");
1280 desc->stm_ctrl = STM_CTRL_CONFIG_MOD(0) |
1281 STM_CTRL_IMAGE_FORMAT(img_fmt);
1282 desc->stm_ctrl |= STM_CTRL_BITBUF_PTR_CLR(1);
1283 if (mxc_jpeg_is_extended_sequential(q_data->fmt))
1284 desc->stm_ctrl |= STM_CTRL_PIXEL_PRECISION;
1285 else
1286 desc->stm_ctrl &= ~STM_CTRL_PIXEL_PRECISION;
1287 mxc_jpeg_addrs(desc, src_buf, dst_buf, 0);
1288 dev_dbg(jpeg->dev, "cfg_desc:\n");
1289 print_descriptor_info(jpeg->dev, cfg_desc);
1290 dev_dbg(jpeg->dev, "enc desc:\n");
1291 print_descriptor_info(jpeg->dev, desc);
1292 print_wrapper_info(jpeg->dev, reg);
1293 print_cast_status(jpeg->dev, reg, MXC_JPEG_ENCODE);
1294
1295 /* validate the configuration descriptor */
1296 mxc_jpeg_set_desc(cfg_desc_handle, reg, slot);
1297 }
1298
mxc_jpeg_get_sibling_format(const struct mxc_jpeg_fmt * fmt)1299 static const struct mxc_jpeg_fmt *mxc_jpeg_get_sibling_format(const struct mxc_jpeg_fmt *fmt)
1300 {
1301 int i;
1302
1303 for (i = 0; i < MXC_JPEG_NUM_FORMATS; i++) {
1304 if (mxc_formats[i].subsampling == fmt->subsampling &&
1305 mxc_formats[i].nc == fmt->nc &&
1306 mxc_formats[i].precision == fmt->precision &&
1307 mxc_formats[i].is_rgb == fmt->is_rgb &&
1308 mxc_formats[i].fourcc != fmt->fourcc)
1309 return &mxc_formats[i];
1310 }
1311
1312 return NULL;
1313 }
1314
mxc_jpeg_compare_format(const struct mxc_jpeg_fmt * fmt1,const struct mxc_jpeg_fmt * fmt2)1315 static bool mxc_jpeg_compare_format(const struct mxc_jpeg_fmt *fmt1,
1316 const struct mxc_jpeg_fmt *fmt2)
1317 {
1318 if (fmt1 == fmt2)
1319 return true;
1320 if (mxc_jpeg_get_sibling_format(fmt1) == fmt2)
1321 return true;
1322 return false;
1323 }
1324
mxc_jpeg_set_last_buffer(struct mxc_jpeg_ctx * ctx)1325 static void mxc_jpeg_set_last_buffer(struct mxc_jpeg_ctx *ctx)
1326 {
1327 struct vb2_v4l2_buffer *next_dst_buf;
1328
1329 next_dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1330 if (!next_dst_buf) {
1331 ctx->fh.m2m_ctx->is_draining = true;
1332 ctx->fh.m2m_ctx->next_buf_last = true;
1333 return;
1334 }
1335
1336 v4l2_m2m_last_buffer_done(ctx->fh.m2m_ctx, next_dst_buf);
1337 }
1338
mxc_jpeg_source_change(struct mxc_jpeg_ctx * ctx,struct mxc_jpeg_src_buf * jpeg_src_buf)1339 static bool mxc_jpeg_source_change(struct mxc_jpeg_ctx *ctx,
1340 struct mxc_jpeg_src_buf *jpeg_src_buf)
1341 {
1342 struct device *dev = ctx->mxc_jpeg->dev;
1343 struct mxc_jpeg_q_data *q_data_cap;
1344
1345 if (!jpeg_src_buf->fmt)
1346 return false;
1347
1348 q_data_cap = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1349 if (mxc_jpeg_compare_format(q_data_cap->fmt, jpeg_src_buf->fmt))
1350 jpeg_src_buf->fmt = q_data_cap->fmt;
1351 if (ctx->need_initial_source_change_evt ||
1352 q_data_cap->fmt != jpeg_src_buf->fmt ||
1353 q_data_cap->w != jpeg_src_buf->w ||
1354 q_data_cap->h != jpeg_src_buf->h) {
1355 dev_dbg(dev, "Detected jpeg res=(%dx%d)->(%dx%d), pixfmt=%c%c%c%c\n",
1356 q_data_cap->w, q_data_cap->h,
1357 jpeg_src_buf->w, jpeg_src_buf->h,
1358 (jpeg_src_buf->fmt->fourcc & 0xff),
1359 (jpeg_src_buf->fmt->fourcc >> 8) & 0xff,
1360 (jpeg_src_buf->fmt->fourcc >> 16) & 0xff,
1361 (jpeg_src_buf->fmt->fourcc >> 24) & 0xff);
1362
1363 /*
1364 * set-up the capture queue with the pixelformat and resolution
1365 * detected from the jpeg output stream
1366 */
1367 q_data_cap->w = jpeg_src_buf->w;
1368 q_data_cap->h = jpeg_src_buf->h;
1369 q_data_cap->fmt = jpeg_src_buf->fmt;
1370 q_data_cap->w_adjusted = q_data_cap->w;
1371 q_data_cap->h_adjusted = q_data_cap->h;
1372 q_data_cap->crop.left = 0;
1373 q_data_cap->crop.top = 0;
1374 q_data_cap->crop.width = jpeg_src_buf->w;
1375 q_data_cap->crop.height = jpeg_src_buf->h;
1376
1377 /*
1378 * align up the resolution for CAST IP,
1379 * but leave the buffer resolution unchanged
1380 */
1381 v4l_bound_align_image(&q_data_cap->w_adjusted,
1382 q_data_cap->w_adjusted, /* adjust up */
1383 MXC_JPEG_MAX_WIDTH,
1384 q_data_cap->fmt->h_align,
1385 &q_data_cap->h_adjusted,
1386 q_data_cap->h_adjusted, /* adjust up */
1387 MXC_JPEG_MAX_HEIGHT,
1388 q_data_cap->fmt->v_align,
1389 0);
1390
1391 /* setup bytesperline/sizeimage for capture queue */
1392 mxc_jpeg_bytesperline(q_data_cap, jpeg_src_buf->fmt->precision);
1393 mxc_jpeg_sizeimage(q_data_cap);
1394 notify_src_chg(ctx);
1395 ctx->source_change = 1;
1396 ctx->need_initial_source_change_evt = false;
1397 if (vb2_is_streaming(v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx)))
1398 mxc_jpeg_set_last_buffer(ctx);
1399 }
1400
1401 return ctx->source_change ? true : false;
1402 }
1403
mxc_jpeg_job_ready(void * priv)1404 static int mxc_jpeg_job_ready(void *priv)
1405 {
1406 struct mxc_jpeg_ctx *ctx = priv;
1407
1408 return ctx->source_change ? 0 : 1;
1409 }
1410
mxc_jpeg_device_run_timeout(struct work_struct * work)1411 static void mxc_jpeg_device_run_timeout(struct work_struct *work)
1412 {
1413 struct delayed_work *dwork = to_delayed_work(work);
1414 struct mxc_jpeg_ctx *ctx = container_of(dwork, struct mxc_jpeg_ctx, task_timer);
1415 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
1416 unsigned long flags;
1417
1418 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags);
1419 if (ctx->mxc_jpeg->slot_data.used) {
1420 dev_warn(jpeg->dev, "%s timeout, cancel it\n",
1421 ctx->mxc_jpeg->mode == MXC_JPEG_DECODE ? "decode" : "encode");
1422 mxc_jpeg_job_finish(ctx, VB2_BUF_STATE_ERROR, true);
1423 v4l2_m2m_job_finish(ctx->mxc_jpeg->m2m_dev, ctx->fh.m2m_ctx);
1424 }
1425 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1426 }
1427
mxc_jpeg_device_run(void * priv)1428 static void mxc_jpeg_device_run(void *priv)
1429 {
1430 struct mxc_jpeg_ctx *ctx = priv;
1431 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
1432 void __iomem *reg = jpeg->base_reg;
1433 struct device *dev = jpeg->dev;
1434 struct vb2_v4l2_buffer *src_buf, *dst_buf;
1435 unsigned long flags;
1436 struct mxc_jpeg_q_data *q_data_cap, *q_data_out;
1437 struct mxc_jpeg_src_buf *jpeg_src_buf;
1438
1439 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags);
1440 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
1441 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1442 if (!src_buf || !dst_buf) {
1443 dev_err(dev, "Null src or dst buf\n");
1444 goto end;
1445 }
1446
1447 q_data_cap = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1448 if (!q_data_cap)
1449 goto end;
1450 q_data_out = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
1451 if (!q_data_out)
1452 goto end;
1453 src_buf->sequence = q_data_out->sequence++;
1454 dst_buf->sequence = q_data_cap->sequence++;
1455
1456 v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true);
1457
1458 jpeg_src_buf = vb2_to_mxc_buf(&src_buf->vb2_buf);
1459 if (q_data_cap->fmt->mem_planes != dst_buf->vb2_buf.num_planes) {
1460 dev_err(dev, "Capture format %s has %d planes, but capture buffer has %d planes\n",
1461 q_data_cap->fmt->name, q_data_cap->fmt->mem_planes,
1462 dst_buf->vb2_buf.num_planes);
1463 jpeg_src_buf->jpeg_parse_error = true;
1464 }
1465 if (jpeg_src_buf->jpeg_parse_error) {
1466 mxc_jpeg_check_and_set_last_buffer(ctx, src_buf, dst_buf);
1467 v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1468 v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1469 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
1470 v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
1471 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1472 v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
1473
1474 return;
1475 }
1476 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE) {
1477 if (ctx->source_change || mxc_jpeg_source_change(ctx, jpeg_src_buf)) {
1478 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1479 v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
1480 return;
1481 }
1482 }
1483
1484 mxc_jpeg_enable(reg);
1485 mxc_jpeg_set_l_endian(reg, 1);
1486
1487 ctx->slot = mxc_get_free_slot(&jpeg->slot_data);
1488 if (ctx->slot < 0) {
1489 dev_err(dev, "No more free slots\n");
1490 goto end;
1491 }
1492 if (!mxc_jpeg_alloc_slot_data(jpeg)) {
1493 dev_err(dev, "Cannot allocate slot data\n");
1494 goto end;
1495 }
1496
1497 mxc_jpeg_enable_slot(reg, ctx->slot);
1498 mxc_jpeg_enable_irq(reg, ctx->slot);
1499
1500 if (jpeg->mode == MXC_JPEG_ENCODE) {
1501 dev_dbg(dev, "Encoding on slot %d\n", ctx->slot);
1502 ctx->enc_state = MXC_JPEG_ENC_CONF;
1503 mxc_jpeg_config_enc_desc(&dst_buf->vb2_buf, ctx,
1504 &src_buf->vb2_buf, &dst_buf->vb2_buf);
1505 /* start config phase */
1506 mxc_jpeg_enc_mode_conf(dev, reg,
1507 mxc_jpeg_is_extended_sequential(q_data_out->fmt));
1508 } else {
1509 dev_dbg(dev, "Decoding on slot %d\n", ctx->slot);
1510 print_mxc_buf(jpeg, &src_buf->vb2_buf, 0);
1511 mxc_jpeg_config_dec_desc(&dst_buf->vb2_buf, ctx,
1512 &src_buf->vb2_buf, &dst_buf->vb2_buf);
1513 mxc_jpeg_dec_mode_go(dev, reg);
1514 }
1515 schedule_delayed_work(&ctx->task_timer, msecs_to_jiffies(hw_timeout));
1516 end:
1517 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1518 }
1519
mxc_jpeg_decoder_cmd(struct file * file,void * priv,struct v4l2_decoder_cmd * cmd)1520 static int mxc_jpeg_decoder_cmd(struct file *file, void *priv,
1521 struct v4l2_decoder_cmd *cmd)
1522 {
1523 struct v4l2_fh *fh = file->private_data;
1524 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
1525 unsigned long flags;
1526 int ret;
1527
1528 ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, cmd);
1529 if (ret < 0)
1530 return ret;
1531
1532 if (!vb2_is_streaming(v4l2_m2m_get_src_vq(fh->m2m_ctx)))
1533 return 0;
1534
1535 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags);
1536 ret = v4l2_m2m_ioctl_decoder_cmd(file, priv, cmd);
1537 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1538 if (ret < 0)
1539 return ret;
1540
1541 if (cmd->cmd == V4L2_DEC_CMD_STOP &&
1542 v4l2_m2m_has_stopped(fh->m2m_ctx)) {
1543 notify_eos(ctx);
1544 ctx->header_parsed = false;
1545 }
1546
1547 if (cmd->cmd == V4L2_DEC_CMD_START &&
1548 v4l2_m2m_has_stopped(fh->m2m_ctx))
1549 vb2_clear_last_buffer_dequeued(&fh->m2m_ctx->cap_q_ctx.q);
1550 return 0;
1551 }
1552
mxc_jpeg_encoder_cmd(struct file * file,void * priv,struct v4l2_encoder_cmd * cmd)1553 static int mxc_jpeg_encoder_cmd(struct file *file, void *priv,
1554 struct v4l2_encoder_cmd *cmd)
1555 {
1556 struct v4l2_fh *fh = file->private_data;
1557 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
1558 unsigned long flags;
1559 int ret;
1560
1561 ret = v4l2_m2m_ioctl_try_encoder_cmd(file, fh, cmd);
1562 if (ret < 0)
1563 return ret;
1564
1565 if (!vb2_is_streaming(v4l2_m2m_get_src_vq(fh->m2m_ctx)) ||
1566 !vb2_is_streaming(v4l2_m2m_get_dst_vq(fh->m2m_ctx)))
1567 return 0;
1568
1569 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags);
1570 ret = v4l2_m2m_ioctl_encoder_cmd(file, fh, cmd);
1571 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1572 if (ret < 0)
1573 return 0;
1574
1575 if (cmd->cmd == V4L2_ENC_CMD_STOP &&
1576 v4l2_m2m_has_stopped(fh->m2m_ctx))
1577 notify_eos(ctx);
1578
1579 if (cmd->cmd == V4L2_ENC_CMD_START &&
1580 v4l2_m2m_has_stopped(fh->m2m_ctx))
1581 vb2_clear_last_buffer_dequeued(&fh->m2m_ctx->cap_q_ctx.q);
1582
1583 return 0;
1584 }
1585
mxc_jpeg_queue_setup(struct vb2_queue * q,unsigned int * nbuffers,unsigned int * nplanes,unsigned int sizes[],struct device * alloc_ctxs[])1586 static int mxc_jpeg_queue_setup(struct vb2_queue *q,
1587 unsigned int *nbuffers,
1588 unsigned int *nplanes,
1589 unsigned int sizes[],
1590 struct device *alloc_ctxs[])
1591 {
1592 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(q);
1593 struct mxc_jpeg_q_data *q_data = NULL;
1594 int i;
1595
1596 q_data = mxc_jpeg_get_q_data(ctx, q->type);
1597 if (!q_data)
1598 return -EINVAL;
1599
1600 /* Handle CREATE_BUFS situation - *nplanes != 0 */
1601 if (*nplanes) {
1602 if (*nplanes != q_data->fmt->mem_planes)
1603 return -EINVAL;
1604 for (i = 0; i < *nplanes; i++) {
1605 if (sizes[i] < mxc_jpeg_get_plane_size(q_data, i))
1606 return -EINVAL;
1607 }
1608 return 0;
1609 }
1610
1611 /* Handle REQBUFS situation */
1612 *nplanes = q_data->fmt->mem_planes;
1613 for (i = 0; i < *nplanes; i++)
1614 sizes[i] = mxc_jpeg_get_plane_size(q_data, i);
1615
1616 if (V4L2_TYPE_IS_OUTPUT(q->type))
1617 ctx->need_initial_source_change_evt = true;
1618
1619 return 0;
1620 }
1621
mxc_jpeg_start_streaming(struct vb2_queue * q,unsigned int count)1622 static int mxc_jpeg_start_streaming(struct vb2_queue *q, unsigned int count)
1623 {
1624 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(q);
1625 struct mxc_jpeg_q_data *q_data = mxc_jpeg_get_q_data(ctx, q->type);
1626 int ret;
1627
1628 v4l2_m2m_update_start_streaming_state(ctx->fh.m2m_ctx, q);
1629
1630 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE && V4L2_TYPE_IS_CAPTURE(q->type))
1631 ctx->source_change = 0;
1632 dev_dbg(ctx->mxc_jpeg->dev, "Start streaming ctx=%p", ctx);
1633 q_data->sequence = 0;
1634
1635 if (V4L2_TYPE_IS_CAPTURE(q->type))
1636 ctx->need_initial_source_change_evt = false;
1637
1638 ret = pm_runtime_resume_and_get(ctx->mxc_jpeg->dev);
1639 if (ret < 0) {
1640 dev_err(ctx->mxc_jpeg->dev, "Failed to power up jpeg\n");
1641 return ret;
1642 }
1643
1644 return 0;
1645 }
1646
mxc_jpeg_stop_streaming(struct vb2_queue * q)1647 static void mxc_jpeg_stop_streaming(struct vb2_queue *q)
1648 {
1649 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(q);
1650 struct vb2_v4l2_buffer *vbuf;
1651
1652 dev_dbg(ctx->mxc_jpeg->dev, "Stop streaming ctx=%p", ctx);
1653
1654 /* Release all active buffers */
1655 for (;;) {
1656 if (V4L2_TYPE_IS_OUTPUT(q->type))
1657 vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1658 else
1659 vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1660 if (!vbuf)
1661 break;
1662 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
1663 }
1664
1665 v4l2_m2m_update_stop_streaming_state(ctx->fh.m2m_ctx, q);
1666 /* if V4L2_DEC_CMD_STOP is sent before the source change triggered,
1667 * restore the is_draining flag
1668 */
1669 if (V4L2_TYPE_IS_CAPTURE(q->type) && ctx->source_change && ctx->fh.m2m_ctx->last_src_buf)
1670 ctx->fh.m2m_ctx->is_draining = true;
1671
1672 if (V4L2_TYPE_IS_OUTPUT(q->type) &&
1673 v4l2_m2m_has_stopped(ctx->fh.m2m_ctx)) {
1674 notify_eos(ctx);
1675 ctx->header_parsed = false;
1676 }
1677
1678 pm_runtime_put_sync(&ctx->mxc_jpeg->pdev->dev);
1679 }
1680
mxc_jpeg_valid_comp_id(struct device * dev,struct mxc_jpeg_sof * sof,struct mxc_jpeg_sos * sos)1681 static int mxc_jpeg_valid_comp_id(struct device *dev,
1682 struct mxc_jpeg_sof *sof,
1683 struct mxc_jpeg_sos *sos)
1684 {
1685 int valid = 1;
1686 int i;
1687
1688 /*
1689 * there's a limitation in the IP that the component IDs must be
1690 * between 0..4, if they are not, let's patch them
1691 */
1692 for (i = 0; i < sof->components_no; i++)
1693 if (sof->comp[i].id > MXC_JPEG_MAX_COMPONENTS) {
1694 valid = 0;
1695 dev_err(dev, "Component %d has invalid ID: %d",
1696 i, sof->comp[i].id);
1697 }
1698 if (!valid)
1699 /* patch all comp IDs if at least one is invalid */
1700 for (i = 0; i < sof->components_no; i++) {
1701 dev_warn(dev, "Component %d ID patched to: %d",
1702 i, i + 1);
1703 sof->comp[i].id = i + 1;
1704 sos->comp[i].id = i + 1;
1705 }
1706
1707 return valid;
1708 }
1709
mxc_jpeg_match_image_format(const struct mxc_jpeg_fmt * fmt,const struct v4l2_jpeg_header * header)1710 static bool mxc_jpeg_match_image_format(const struct mxc_jpeg_fmt *fmt,
1711 const struct v4l2_jpeg_header *header)
1712 {
1713 if (fmt->subsampling != header->frame.subsampling ||
1714 fmt->nc != header->frame.num_components ||
1715 fmt->precision != header->frame.precision)
1716 return false;
1717
1718 /*
1719 * If the transform flag from APP14 marker is 0, images that are
1720 * encoded with 3 components have RGB colorspace, see Recommendation
1721 * ITU-T T.872 chapter 6.5.3 APP14 marker segment for colour encoding
1722 */
1723 if (header->frame.subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_444) {
1724 u8 is_rgb = header->app14_tf == V4L2_JPEG_APP14_TF_CMYK_RGB ? 1 : 0;
1725
1726 if (is_rgb != fmt->is_rgb)
1727 return false;
1728 }
1729 return true;
1730 }
1731
mxc_jpeg_get_image_format(struct device * dev,const struct v4l2_jpeg_header * header)1732 static u32 mxc_jpeg_get_image_format(struct device *dev,
1733 const struct v4l2_jpeg_header *header)
1734 {
1735 int i;
1736 u32 fourcc = 0;
1737
1738 for (i = 0; i < MXC_JPEG_NUM_FORMATS; i++) {
1739 if (mxc_jpeg_match_image_format(&mxc_formats[i], header)) {
1740 fourcc = mxc_formats[i].fourcc;
1741 break;
1742 }
1743 }
1744 if (fourcc == 0) {
1745 dev_err(dev,
1746 "Could not identify image format nc=%d, subsampling=%d, precision=%d\n",
1747 header->frame.num_components,
1748 header->frame.subsampling,
1749 header->frame.precision);
1750 return fourcc;
1751 }
1752
1753 return fourcc;
1754 }
1755
mxc_jpeg_bytesperline(struct mxc_jpeg_q_data * q,u32 precision)1756 static void mxc_jpeg_bytesperline(struct mxc_jpeg_q_data *q, u32 precision)
1757 {
1758 /* Bytes distance between the leftmost pixels in two adjacent lines */
1759 if (q->fmt->fourcc == V4L2_PIX_FMT_JPEG) {
1760 /* bytesperline unused for compressed formats */
1761 q->bytesperline[0] = 0;
1762 q->bytesperline[1] = 0;
1763 } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_420) {
1764 /* When the image format is planar the bytesperline value
1765 * applies to the first plane and is divided by the same factor
1766 * as the width field for the other planes
1767 */
1768 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8);
1769 q->bytesperline[1] = q->bytesperline[0];
1770 } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_422) {
1771 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8) * 2;
1772 q->bytesperline[1] = 0;
1773 } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_444) {
1774 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8) * q->fmt->nc;
1775 q->bytesperline[1] = 0;
1776 } else {
1777 /* grayscale */
1778 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8);
1779 q->bytesperline[1] = 0;
1780 }
1781 }
1782
mxc_jpeg_sizeimage(struct mxc_jpeg_q_data * q)1783 static void mxc_jpeg_sizeimage(struct mxc_jpeg_q_data *q)
1784 {
1785 if (q->fmt->fourcc == V4L2_PIX_FMT_JPEG) {
1786 /* if no sizeimage from user, assume worst jpeg compression */
1787 if (!q->sizeimage[0])
1788 q->sizeimage[0] = 6 * q->w * q->h;
1789 q->sizeimage[1] = 0;
1790
1791 if (q->sizeimage[0] > MXC_JPEG_MAX_SIZEIMAGE)
1792 q->sizeimage[0] = MXC_JPEG_MAX_SIZEIMAGE;
1793
1794 /* jpeg stream size must be multiple of 1K */
1795 q->sizeimage[0] = ALIGN(q->sizeimage[0], 1024);
1796 } else {
1797 q->sizeimage[0] = q->bytesperline[0] * q->h_adjusted;
1798 q->sizeimage[1] = 0;
1799 if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_420)
1800 q->sizeimage[1] = q->sizeimage[0] / 2;
1801 }
1802 }
1803
mxc_jpeg_parse(struct mxc_jpeg_ctx * ctx,struct vb2_buffer * vb)1804 static int mxc_jpeg_parse(struct mxc_jpeg_ctx *ctx, struct vb2_buffer *vb)
1805 {
1806 struct device *dev = ctx->mxc_jpeg->dev;
1807 struct mxc_jpeg_q_data *q_data_out;
1808 struct mxc_jpeg_q_data *q_data_cap;
1809 u32 fourcc;
1810 struct v4l2_jpeg_header header;
1811 struct mxc_jpeg_sof *psof = NULL;
1812 struct mxc_jpeg_sos *psos = NULL;
1813 struct mxc_jpeg_src_buf *jpeg_src_buf = vb2_to_mxc_buf(vb);
1814 u8 *src_addr = (u8 *)vb2_plane_vaddr(vb, 0);
1815 u32 size = vb2_get_plane_payload(vb, 0);
1816 int ret;
1817
1818 memset(&header, 0, sizeof(header));
1819 ret = v4l2_jpeg_parse_header((void *)src_addr, size, &header);
1820 if (ret < 0) {
1821 dev_err(dev, "Error parsing JPEG stream markers\n");
1822 return ret;
1823 }
1824
1825 /* if DHT marker present, no need to inject default one */
1826 jpeg_src_buf->dht_needed = (header.num_dht == 0);
1827
1828 q_data_out = mxc_jpeg_get_q_data(ctx,
1829 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1830 if (q_data_out->w == 0 && q_data_out->h == 0) {
1831 dev_warn(dev, "Invalid user resolution 0x0");
1832 dev_warn(dev, "Keeping resolution from JPEG: %dx%d",
1833 header.frame.width, header.frame.height);
1834 } else if (header.frame.width != q_data_out->w ||
1835 header.frame.height != q_data_out->h) {
1836 dev_err(dev,
1837 "Resolution mismatch: %dx%d (JPEG) versus %dx%d(user)",
1838 header.frame.width, header.frame.height,
1839 q_data_out->w, q_data_out->h);
1840 }
1841 q_data_out->w = header.frame.width;
1842 q_data_out->h = header.frame.height;
1843 if (header.frame.width > MXC_JPEG_MAX_WIDTH ||
1844 header.frame.height > MXC_JPEG_MAX_HEIGHT) {
1845 dev_err(dev, "JPEG width or height should be <= 8192: %dx%d\n",
1846 header.frame.width, header.frame.height);
1847 return -EINVAL;
1848 }
1849 if (header.frame.width < MXC_JPEG_MIN_WIDTH ||
1850 header.frame.height < MXC_JPEG_MIN_HEIGHT) {
1851 dev_err(dev, "JPEG width or height should be > 64: %dx%d\n",
1852 header.frame.width, header.frame.height);
1853 return -EINVAL;
1854 }
1855 if (header.frame.num_components > V4L2_JPEG_MAX_COMPONENTS) {
1856 dev_err(dev, "JPEG number of components should be <=%d",
1857 V4L2_JPEG_MAX_COMPONENTS);
1858 return -EINVAL;
1859 }
1860 /* check and, if necessary, patch component IDs*/
1861 psof = (struct mxc_jpeg_sof *)header.sof.start;
1862 psos = (struct mxc_jpeg_sos *)header.sos.start;
1863 if (!mxc_jpeg_valid_comp_id(dev, psof, psos))
1864 dev_warn(dev, "JPEG component ids should be 0-3 or 1-4");
1865
1866 q_data_cap = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
1867 if (q_data_cap->fmt && mxc_jpeg_match_image_format(q_data_cap->fmt, &header))
1868 fourcc = q_data_cap->fmt->fourcc;
1869 else
1870 fourcc = mxc_jpeg_get_image_format(dev, &header);
1871 if (fourcc == 0)
1872 return -EINVAL;
1873
1874 jpeg_src_buf->fmt = mxc_jpeg_find_format(fourcc);
1875 jpeg_src_buf->w = header.frame.width;
1876 jpeg_src_buf->h = header.frame.height;
1877 ctx->header_parsed = true;
1878
1879 if (!v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx))
1880 mxc_jpeg_source_change(ctx, jpeg_src_buf);
1881
1882 return 0;
1883 }
1884
mxc_jpeg_buf_queue(struct vb2_buffer * vb)1885 static void mxc_jpeg_buf_queue(struct vb2_buffer *vb)
1886 {
1887 int ret;
1888 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1889 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1890 struct mxc_jpeg_src_buf *jpeg_src_buf;
1891
1892 if (V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type) &&
1893 vb2_is_streaming(vb->vb2_queue) &&
1894 v4l2_m2m_dst_buf_is_last(ctx->fh.m2m_ctx)) {
1895 struct mxc_jpeg_q_data *q_data;
1896
1897 q_data = mxc_jpeg_get_q_data(ctx, vb->vb2_queue->type);
1898 vbuf->field = V4L2_FIELD_NONE;
1899 vbuf->sequence = q_data->sequence++;
1900 v4l2_m2m_last_buffer_done(ctx->fh.m2m_ctx, vbuf);
1901 notify_eos(ctx);
1902 ctx->header_parsed = false;
1903 return;
1904 }
1905
1906 if (vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
1907 goto end;
1908
1909 /* for V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE */
1910 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE)
1911 goto end;
1912
1913 jpeg_src_buf = vb2_to_mxc_buf(vb);
1914 jpeg_src_buf->jpeg_parse_error = false;
1915 ret = mxc_jpeg_parse(ctx, vb);
1916 if (ret)
1917 jpeg_src_buf->jpeg_parse_error = true;
1918
1919 end:
1920 v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1921 }
1922
mxc_jpeg_buf_out_validate(struct vb2_buffer * vb)1923 static int mxc_jpeg_buf_out_validate(struct vb2_buffer *vb)
1924 {
1925 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1926
1927 vbuf->field = V4L2_FIELD_NONE;
1928
1929 return 0;
1930 }
1931
mxc_jpeg_buf_prepare(struct vb2_buffer * vb)1932 static int mxc_jpeg_buf_prepare(struct vb2_buffer *vb)
1933 {
1934 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1935 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1936 struct mxc_jpeg_q_data *q_data = NULL;
1937 struct device *dev = ctx->mxc_jpeg->dev;
1938 unsigned long sizeimage;
1939 int i;
1940
1941 vbuf->field = V4L2_FIELD_NONE;
1942
1943 q_data = mxc_jpeg_get_q_data(ctx, vb->vb2_queue->type);
1944 if (!q_data)
1945 return -EINVAL;
1946 for (i = 0; i < q_data->fmt->mem_planes; i++) {
1947 sizeimage = mxc_jpeg_get_plane_size(q_data, i);
1948 if (!ctx->source_change && vb2_plane_size(vb, i) < sizeimage) {
1949 dev_err(dev, "plane %d too small (%lu < %lu)",
1950 i, vb2_plane_size(vb, i), sizeimage);
1951 return -EINVAL;
1952 }
1953 }
1954 if (V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type)) {
1955 vb2_set_plane_payload(vb, 0, 0);
1956 vb2_set_plane_payload(vb, 1, 0);
1957 }
1958 return 0;
1959 }
1960
1961 static const struct vb2_ops mxc_jpeg_qops = {
1962 .queue_setup = mxc_jpeg_queue_setup,
1963 .wait_prepare = vb2_ops_wait_prepare,
1964 .wait_finish = vb2_ops_wait_finish,
1965 .buf_out_validate = mxc_jpeg_buf_out_validate,
1966 .buf_prepare = mxc_jpeg_buf_prepare,
1967 .start_streaming = mxc_jpeg_start_streaming,
1968 .stop_streaming = mxc_jpeg_stop_streaming,
1969 .buf_queue = mxc_jpeg_buf_queue,
1970 };
1971
mxc_jpeg_queue_init(void * priv,struct vb2_queue * src_vq,struct vb2_queue * dst_vq)1972 static int mxc_jpeg_queue_init(void *priv, struct vb2_queue *src_vq,
1973 struct vb2_queue *dst_vq)
1974 {
1975 struct mxc_jpeg_ctx *ctx = priv;
1976 int ret;
1977
1978 src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1979 src_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1980 src_vq->drv_priv = ctx;
1981 src_vq->buf_struct_size = sizeof(struct mxc_jpeg_src_buf);
1982 src_vq->ops = &mxc_jpeg_qops;
1983 src_vq->mem_ops = &vb2_dma_contig_memops;
1984 src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
1985 src_vq->lock = &ctx->mxc_jpeg->lock;
1986 src_vq->dev = ctx->mxc_jpeg->dev;
1987
1988 ret = vb2_queue_init(src_vq);
1989 if (ret)
1990 return ret;
1991
1992 dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1993 dst_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1994 dst_vq->drv_priv = ctx;
1995 dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
1996 dst_vq->ops = &mxc_jpeg_qops;
1997 dst_vq->mem_ops = &vb2_dma_contig_memops;
1998 dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
1999 dst_vq->lock = &ctx->mxc_jpeg->lock;
2000 dst_vq->dev = ctx->mxc_jpeg->dev;
2001
2002 ret = vb2_queue_init(dst_vq);
2003 return ret;
2004 }
2005
mxc_jpeg_set_default_params(struct mxc_jpeg_ctx * ctx)2006 static void mxc_jpeg_set_default_params(struct mxc_jpeg_ctx *ctx)
2007 {
2008 struct mxc_jpeg_q_data *out_q = &ctx->out_q;
2009 struct mxc_jpeg_q_data *cap_q = &ctx->cap_q;
2010 struct mxc_jpeg_q_data *q[2] = {out_q, cap_q};
2011 int i;
2012
2013 if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE) {
2014 out_q->fmt = mxc_jpeg_find_format(MXC_JPEG_DEFAULT_PFMT);
2015 cap_q->fmt = mxc_jpeg_find_format(V4L2_PIX_FMT_JPEG);
2016 } else {
2017 out_q->fmt = mxc_jpeg_find_format(V4L2_PIX_FMT_JPEG);
2018 cap_q->fmt = mxc_jpeg_find_format(MXC_JPEG_DEFAULT_PFMT);
2019 }
2020
2021 for (i = 0; i < 2; i++) {
2022 q[i]->w = MXC_JPEG_DEFAULT_WIDTH;
2023 q[i]->h = MXC_JPEG_DEFAULT_HEIGHT;
2024 q[i]->w_adjusted = MXC_JPEG_DEFAULT_WIDTH;
2025 q[i]->h_adjusted = MXC_JPEG_DEFAULT_HEIGHT;
2026 q[i]->crop.left = 0;
2027 q[i]->crop.top = 0;
2028 q[i]->crop.width = MXC_JPEG_DEFAULT_WIDTH;
2029 q[i]->crop.height = MXC_JPEG_DEFAULT_HEIGHT;
2030 mxc_jpeg_bytesperline(q[i], q[i]->fmt->precision);
2031 mxc_jpeg_sizeimage(q[i]);
2032 }
2033 }
2034
mxc_jpeg_s_ctrl(struct v4l2_ctrl * ctrl)2035 static int mxc_jpeg_s_ctrl(struct v4l2_ctrl *ctrl)
2036 {
2037 struct mxc_jpeg_ctx *ctx =
2038 container_of(ctrl->handler, struct mxc_jpeg_ctx, ctrl_handler);
2039
2040 switch (ctrl->id) {
2041 case V4L2_CID_JPEG_COMPRESSION_QUALITY:
2042 ctx->jpeg_quality = ctrl->val;
2043 break;
2044 default:
2045 dev_err(ctx->mxc_jpeg->dev, "Invalid control, id = %d, val = %d\n",
2046 ctrl->id, ctrl->val);
2047 return -EINVAL;
2048 }
2049
2050 return 0;
2051 }
2052
2053 static const struct v4l2_ctrl_ops mxc_jpeg_ctrl_ops = {
2054 .s_ctrl = mxc_jpeg_s_ctrl,
2055 };
2056
mxc_jpeg_encode_ctrls(struct mxc_jpeg_ctx * ctx)2057 static void mxc_jpeg_encode_ctrls(struct mxc_jpeg_ctx *ctx)
2058 {
2059 v4l2_ctrl_new_std(&ctx->ctrl_handler, &mxc_jpeg_ctrl_ops,
2060 V4L2_CID_JPEG_COMPRESSION_QUALITY, 1, 100, 1, 75);
2061 }
2062
mxc_jpeg_ctrls_setup(struct mxc_jpeg_ctx * ctx)2063 static int mxc_jpeg_ctrls_setup(struct mxc_jpeg_ctx *ctx)
2064 {
2065 int err;
2066
2067 v4l2_ctrl_handler_init(&ctx->ctrl_handler, 2);
2068
2069 if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE)
2070 mxc_jpeg_encode_ctrls(ctx);
2071
2072 if (ctx->ctrl_handler.error) {
2073 err = ctx->ctrl_handler.error;
2074
2075 v4l2_ctrl_handler_free(&ctx->ctrl_handler);
2076 return err;
2077 }
2078
2079 err = v4l2_ctrl_handler_setup(&ctx->ctrl_handler);
2080 if (err)
2081 v4l2_ctrl_handler_free(&ctx->ctrl_handler);
2082 return err;
2083 }
2084
mxc_jpeg_open(struct file * file)2085 static int mxc_jpeg_open(struct file *file)
2086 {
2087 struct mxc_jpeg_dev *mxc_jpeg = video_drvdata(file);
2088 struct video_device *mxc_vfd = video_devdata(file);
2089 struct device *dev = mxc_jpeg->dev;
2090 struct mxc_jpeg_ctx *ctx;
2091 int ret = 0;
2092
2093 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2094 if (!ctx)
2095 return -ENOMEM;
2096
2097 if (mutex_lock_interruptible(&mxc_jpeg->lock)) {
2098 ret = -ERESTARTSYS;
2099 goto free;
2100 }
2101
2102 v4l2_fh_init(&ctx->fh, mxc_vfd);
2103 file->private_data = &ctx->fh;
2104 v4l2_fh_add(&ctx->fh);
2105
2106 ctx->mxc_jpeg = mxc_jpeg;
2107
2108 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(mxc_jpeg->m2m_dev, ctx,
2109 mxc_jpeg_queue_init);
2110
2111 if (IS_ERR(ctx->fh.m2m_ctx)) {
2112 ret = PTR_ERR(ctx->fh.m2m_ctx);
2113 goto error;
2114 }
2115
2116 ret = mxc_jpeg_ctrls_setup(ctx);
2117 if (ret) {
2118 dev_err(ctx->mxc_jpeg->dev, "failed to setup mxc jpeg controls\n");
2119 goto err_ctrls_setup;
2120 }
2121 ctx->fh.ctrl_handler = &ctx->ctrl_handler;
2122 mxc_jpeg_set_default_params(ctx);
2123 ctx->slot = -1; /* slot not allocated yet */
2124 INIT_DELAYED_WORK(&ctx->task_timer, mxc_jpeg_device_run_timeout);
2125
2126 if (mxc_jpeg->mode == MXC_JPEG_DECODE)
2127 dev_dbg(dev, "Opened JPEG decoder instance %p\n", ctx);
2128 else
2129 dev_dbg(dev, "Opened JPEG encoder instance %p\n", ctx);
2130 mutex_unlock(&mxc_jpeg->lock);
2131
2132 return 0;
2133
2134 err_ctrls_setup:
2135 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2136 error:
2137 v4l2_fh_del(&ctx->fh);
2138 v4l2_fh_exit(&ctx->fh);
2139 mutex_unlock(&mxc_jpeg->lock);
2140 free:
2141 kfree(ctx);
2142 return ret;
2143 }
2144
mxc_jpeg_querycap(struct file * file,void * priv,struct v4l2_capability * cap)2145 static int mxc_jpeg_querycap(struct file *file, void *priv,
2146 struct v4l2_capability *cap)
2147 {
2148 strscpy(cap->driver, MXC_JPEG_NAME " codec", sizeof(cap->driver));
2149 strscpy(cap->card, MXC_JPEG_NAME " codec", sizeof(cap->card));
2150 cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE;
2151 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
2152
2153 return 0;
2154 }
2155
mxc_jpeg_enum_fmt_vid_cap(struct file * file,void * priv,struct v4l2_fmtdesc * f)2156 static int mxc_jpeg_enum_fmt_vid_cap(struct file *file, void *priv,
2157 struct v4l2_fmtdesc *f)
2158 {
2159 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2160 struct mxc_jpeg_q_data *q_data = mxc_jpeg_get_q_data(ctx, f->type);
2161
2162 if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE) {
2163 return enum_fmt(mxc_formats, MXC_JPEG_NUM_FORMATS, f,
2164 MXC_JPEG_FMT_TYPE_ENC);
2165 } else if (!ctx->header_parsed) {
2166 return enum_fmt(mxc_formats, MXC_JPEG_NUM_FORMATS, f,
2167 MXC_JPEG_FMT_TYPE_RAW);
2168 } else {
2169 /* For the decoder CAPTURE queue, only enumerate the raw formats
2170 * supported for the format currently active on OUTPUT
2171 * (more precisely what was propagated on capture queue
2172 * after jpeg parse on the output buffer)
2173 */
2174 int ret = -EINVAL;
2175 const struct mxc_jpeg_fmt *sibling;
2176
2177 switch (f->index) {
2178 case 0:
2179 f->pixelformat = q_data->fmt->fourcc;
2180 ret = 0;
2181 break;
2182 case 1:
2183 sibling = mxc_jpeg_get_sibling_format(q_data->fmt);
2184 if (sibling) {
2185 f->pixelformat = sibling->fourcc;
2186 ret = 0;
2187 }
2188 break;
2189 default:
2190 break;
2191 }
2192 return ret;
2193 }
2194 }
2195
mxc_jpeg_enum_fmt_vid_out(struct file * file,void * priv,struct v4l2_fmtdesc * f)2196 static int mxc_jpeg_enum_fmt_vid_out(struct file *file, void *priv,
2197 struct v4l2_fmtdesc *f)
2198 {
2199 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2200 u32 type = ctx->mxc_jpeg->mode == MXC_JPEG_DECODE ? MXC_JPEG_FMT_TYPE_ENC :
2201 MXC_JPEG_FMT_TYPE_RAW;
2202 int ret;
2203
2204 ret = enum_fmt(mxc_formats, MXC_JPEG_NUM_FORMATS, f, type);
2205 if (ret)
2206 return ret;
2207 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE)
2208 f->flags = V4L2_FMT_FLAG_DYN_RESOLUTION;
2209 return 0;
2210 }
2211
mxc_jpeg_get_fmt_type(struct mxc_jpeg_ctx * ctx,u32 type)2212 static u32 mxc_jpeg_get_fmt_type(struct mxc_jpeg_ctx *ctx, u32 type)
2213 {
2214 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE)
2215 return V4L2_TYPE_IS_OUTPUT(type) ? MXC_JPEG_FMT_TYPE_ENC : MXC_JPEG_FMT_TYPE_RAW;
2216 else
2217 return V4L2_TYPE_IS_CAPTURE(type) ? MXC_JPEG_FMT_TYPE_ENC : MXC_JPEG_FMT_TYPE_RAW;
2218 }
2219
mxc_jpeg_get_default_fourcc(struct mxc_jpeg_ctx * ctx,u32 type)2220 static u32 mxc_jpeg_get_default_fourcc(struct mxc_jpeg_ctx *ctx, u32 type)
2221 {
2222 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE)
2223 return V4L2_TYPE_IS_OUTPUT(type) ? V4L2_PIX_FMT_JPEG : MXC_JPEG_DEFAULT_PFMT;
2224 else
2225 return V4L2_TYPE_IS_CAPTURE(type) ? V4L2_PIX_FMT_JPEG : MXC_JPEG_DEFAULT_PFMT;
2226 }
2227
mxc_jpeg_try_fourcc(struct mxc_jpeg_ctx * ctx,u32 fourcc)2228 static u32 mxc_jpeg_try_fourcc(struct mxc_jpeg_ctx *ctx, u32 fourcc)
2229 {
2230 const struct mxc_jpeg_fmt *sibling;
2231 struct mxc_jpeg_q_data *q_data_cap;
2232
2233 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE)
2234 return fourcc;
2235 if (!ctx->header_parsed)
2236 return fourcc;
2237
2238 q_data_cap = &ctx->cap_q;
2239 if (q_data_cap->fmt->fourcc == fourcc)
2240 return fourcc;
2241
2242 sibling = mxc_jpeg_get_sibling_format(q_data_cap->fmt);
2243 if (sibling && sibling->fourcc == fourcc)
2244 return sibling->fourcc;
2245
2246 return q_data_cap->fmt->fourcc;
2247 }
2248
mxc_jpeg_try_fmt(struct v4l2_format * f,struct mxc_jpeg_ctx * ctx,struct mxc_jpeg_q_data * q_data)2249 static int mxc_jpeg_try_fmt(struct v4l2_format *f,
2250 struct mxc_jpeg_ctx *ctx, struct mxc_jpeg_q_data *q_data)
2251 {
2252 const struct mxc_jpeg_fmt *fmt;
2253 struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
2254 struct v4l2_plane_pix_format *pfmt;
2255 u32 fourcc = f->fmt.pix_mp.pixelformat;
2256 u32 w = (pix_mp->width < MXC_JPEG_MAX_WIDTH) ?
2257 pix_mp->width : MXC_JPEG_MAX_WIDTH;
2258 u32 h = (pix_mp->height < MXC_JPEG_MAX_HEIGHT) ?
2259 pix_mp->height : MXC_JPEG_MAX_HEIGHT;
2260 int i;
2261
2262 fmt = mxc_jpeg_find_format(fourcc);
2263 if (!fmt || fmt->flags != mxc_jpeg_get_fmt_type(ctx, f->type)) {
2264 dev_warn(ctx->mxc_jpeg->dev, "Format not supported: %c%c%c%c, use the default.\n",
2265 (fourcc & 0xff),
2266 (fourcc >> 8) & 0xff,
2267 (fourcc >> 16) & 0xff,
2268 (fourcc >> 24) & 0xff);
2269 fourcc = mxc_jpeg_get_default_fourcc(ctx, f->type);
2270 fmt = mxc_jpeg_find_format(fourcc);
2271 if (!fmt)
2272 return -EINVAL;
2273 f->fmt.pix_mp.pixelformat = fourcc;
2274 }
2275 q_data->fmt = fmt;
2276
2277 memset(pix_mp->reserved, 0, sizeof(pix_mp->reserved));
2278 pix_mp->field = V4L2_FIELD_NONE;
2279 pix_mp->num_planes = fmt->mem_planes;
2280 pix_mp->pixelformat = fmt->fourcc;
2281
2282 q_data->w = w;
2283 q_data->h = h;
2284 q_data->w_adjusted = w;
2285 q_data->h_adjusted = h;
2286 v4l_bound_align_image(&q_data->w_adjusted,
2287 w, /* adjust upwards*/
2288 MXC_JPEG_MAX_WIDTH,
2289 fmt->h_align,
2290 &q_data->h_adjusted,
2291 h, /* adjust upwards*/
2292 MXC_JPEG_MAX_HEIGHT,
2293 fmt->v_align,
2294 0);
2295 for (i = 0; i < pix_mp->num_planes; i++) {
2296 pfmt = &pix_mp->plane_fmt[i];
2297 q_data->bytesperline[i] = pfmt->bytesperline;
2298 q_data->sizeimage[i] = pfmt->sizeimage;
2299 }
2300
2301 /* calculate bytesperline & sizeimage */
2302 mxc_jpeg_bytesperline(q_data, fmt->precision);
2303 mxc_jpeg_sizeimage(q_data);
2304
2305 /* adjust user format according to our calculations */
2306 for (i = 0; i < pix_mp->num_planes; i++) {
2307 pfmt = &pix_mp->plane_fmt[i];
2308 memset(pfmt->reserved, 0, sizeof(pfmt->reserved));
2309 pfmt->bytesperline = q_data->bytesperline[i];
2310 pfmt->sizeimage = mxc_jpeg_get_plane_size(q_data, i);
2311 }
2312
2313 /* fix colorspace information to sRGB for both output & capture */
2314 pix_mp->colorspace = V4L2_COLORSPACE_SRGB;
2315 pix_mp->ycbcr_enc = V4L2_YCBCR_ENC_601;
2316 pix_mp->xfer_func = V4L2_XFER_FUNC_SRGB;
2317 /*
2318 * this hardware does not change the range of the samples
2319 * but since inside JPEG the YUV quantization is full-range,
2320 * this driver will always use full-range for the raw frames, too
2321 */
2322 pix_mp->quantization = V4L2_QUANTIZATION_FULL_RANGE;
2323
2324 if (fmt->flags == MXC_JPEG_FMT_TYPE_RAW) {
2325 q_data->crop.left = 0;
2326 q_data->crop.top = 0;
2327 q_data->crop.width = q_data->w;
2328 q_data->crop.height = q_data->h;
2329 }
2330
2331 pix_mp->width = q_data->w_adjusted;
2332 pix_mp->height = q_data->h_adjusted;
2333
2334 return 0;
2335 }
2336
mxc_jpeg_try_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)2337 static int mxc_jpeg_try_fmt_vid_cap(struct file *file, void *priv,
2338 struct v4l2_format *f)
2339 {
2340 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2341 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
2342 struct device *dev = jpeg->dev;
2343 struct mxc_jpeg_q_data tmp_q;
2344
2345 if (!V4L2_TYPE_IS_MULTIPLANAR(f->type)) {
2346 dev_err(dev, "TRY_FMT with Invalid type: %d\n", f->type);
2347 return -EINVAL;
2348 }
2349
2350 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE && V4L2_TYPE_IS_CAPTURE(f->type))
2351 f->fmt.pix_mp.pixelformat = mxc_jpeg_try_fourcc(ctx, f->fmt.pix_mp.pixelformat);
2352
2353 return mxc_jpeg_try_fmt(f, ctx, &tmp_q);
2354 }
2355
mxc_jpeg_try_fmt_vid_out(struct file * file,void * priv,struct v4l2_format * f)2356 static int mxc_jpeg_try_fmt_vid_out(struct file *file, void *priv,
2357 struct v4l2_format *f)
2358 {
2359 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2360 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
2361 struct device *dev = jpeg->dev;
2362 struct mxc_jpeg_q_data tmp_q;
2363
2364 if (!V4L2_TYPE_IS_MULTIPLANAR(f->type)) {
2365 dev_err(dev, "TRY_FMT with Invalid type: %d\n", f->type);
2366 return -EINVAL;
2367 }
2368
2369 return mxc_jpeg_try_fmt(f, ctx, &tmp_q);
2370 }
2371
mxc_jpeg_s_parsed_fmt(struct mxc_jpeg_ctx * ctx,struct v4l2_format * f)2372 static void mxc_jpeg_s_parsed_fmt(struct mxc_jpeg_ctx *ctx, struct v4l2_format *f)
2373 {
2374 struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
2375 struct mxc_jpeg_q_data *q_data_cap;
2376
2377 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE || !V4L2_TYPE_IS_CAPTURE(f->type))
2378 return;
2379 if (!ctx->header_parsed)
2380 return;
2381
2382 q_data_cap = mxc_jpeg_get_q_data(ctx, f->type);
2383 pix_mp->pixelformat = mxc_jpeg_try_fourcc(ctx, pix_mp->pixelformat);
2384 pix_mp->width = q_data_cap->w;
2385 pix_mp->height = q_data_cap->h;
2386 }
2387
mxc_jpeg_s_fmt(struct mxc_jpeg_ctx * ctx,struct v4l2_format * f)2388 static int mxc_jpeg_s_fmt(struct mxc_jpeg_ctx *ctx,
2389 struct v4l2_format *f)
2390 {
2391 struct vb2_queue *vq;
2392 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
2393
2394 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
2395 if (!vq)
2396 return -EINVAL;
2397
2398 if (vb2_is_busy(vq)) {
2399 v4l2_err(&jpeg->v4l2_dev, "queue busy\n");
2400 return -EBUSY;
2401 }
2402
2403 mxc_jpeg_s_parsed_fmt(ctx, f);
2404
2405 return mxc_jpeg_try_fmt(f, ctx, mxc_jpeg_get_q_data(ctx, f->type));
2406 }
2407
mxc_jpeg_s_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)2408 static int mxc_jpeg_s_fmt_vid_cap(struct file *file, void *priv,
2409 struct v4l2_format *f)
2410 {
2411 return mxc_jpeg_s_fmt(mxc_jpeg_fh_to_ctx(priv), f);
2412 }
2413
mxc_jpeg_s_fmt_vid_out(struct file * file,void * priv,struct v4l2_format * f)2414 static int mxc_jpeg_s_fmt_vid_out(struct file *file, void *priv,
2415 struct v4l2_format *f)
2416 {
2417 int ret;
2418 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2419 struct vb2_queue *dst_vq;
2420 struct mxc_jpeg_q_data *q_data_cap;
2421 enum v4l2_buf_type cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
2422 struct v4l2_format fc;
2423
2424 ret = mxc_jpeg_s_fmt(mxc_jpeg_fh_to_ctx(priv), f);
2425 if (ret)
2426 return ret;
2427
2428 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE)
2429 return 0;
2430
2431 dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, cap_type);
2432 if (!dst_vq)
2433 return -EINVAL;
2434
2435 if (vb2_is_busy(dst_vq))
2436 return 0;
2437
2438 q_data_cap = mxc_jpeg_get_q_data(ctx, cap_type);
2439 if (q_data_cap->w == f->fmt.pix_mp.width && q_data_cap->h == f->fmt.pix_mp.height)
2440 return 0;
2441 memset(&fc, 0, sizeof(fc));
2442 fc.type = cap_type;
2443 fc.fmt.pix_mp.pixelformat = q_data_cap->fmt->fourcc;
2444 fc.fmt.pix_mp.width = f->fmt.pix_mp.width;
2445 fc.fmt.pix_mp.height = f->fmt.pix_mp.height;
2446
2447 return mxc_jpeg_s_fmt_vid_cap(file, priv, &fc);
2448 }
2449
mxc_jpeg_g_fmt_vid(struct file * file,void * priv,struct v4l2_format * f)2450 static int mxc_jpeg_g_fmt_vid(struct file *file, void *priv,
2451 struct v4l2_format *f)
2452 {
2453 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2454 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
2455 struct device *dev = jpeg->dev;
2456 struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
2457 struct mxc_jpeg_q_data *q_data = mxc_jpeg_get_q_data(ctx, f->type);
2458 int i;
2459
2460 if (!V4L2_TYPE_IS_MULTIPLANAR(f->type)) {
2461 dev_err(dev, "G_FMT with Invalid type: %d\n", f->type);
2462 return -EINVAL;
2463 }
2464
2465 pix_mp->pixelformat = q_data->fmt->fourcc;
2466 pix_mp->width = q_data->w;
2467 pix_mp->height = q_data->h;
2468 pix_mp->field = V4L2_FIELD_NONE;
2469 if (q_data->fmt->flags == MXC_JPEG_FMT_TYPE_RAW) {
2470 pix_mp->width = q_data->w_adjusted;
2471 pix_mp->height = q_data->h_adjusted;
2472 }
2473
2474 /* fix colorspace information to sRGB for both output & capture */
2475 pix_mp->colorspace = V4L2_COLORSPACE_SRGB;
2476 pix_mp->ycbcr_enc = V4L2_YCBCR_ENC_601;
2477 pix_mp->xfer_func = V4L2_XFER_FUNC_SRGB;
2478 pix_mp->quantization = V4L2_QUANTIZATION_FULL_RANGE;
2479
2480 pix_mp->num_planes = q_data->fmt->mem_planes;
2481 for (i = 0; i < pix_mp->num_planes; i++) {
2482 pix_mp->plane_fmt[i].bytesperline = q_data->bytesperline[i];
2483 pix_mp->plane_fmt[i].sizeimage = mxc_jpeg_get_plane_size(q_data, i);
2484 }
2485
2486 return 0;
2487 }
2488
mxc_jpeg_dec_g_selection(struct file * file,void * fh,struct v4l2_selection * s)2489 static int mxc_jpeg_dec_g_selection(struct file *file, void *fh, struct v4l2_selection *s)
2490 {
2491 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
2492 struct mxc_jpeg_q_data *q_data_cap;
2493
2494 if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE && s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
2495 return -EINVAL;
2496
2497 q_data_cap = mxc_jpeg_get_q_data(ctx, s->type);
2498
2499 switch (s->target) {
2500 case V4L2_SEL_TGT_COMPOSE:
2501 case V4L2_SEL_TGT_COMPOSE_DEFAULT:
2502 s->r = q_data_cap->crop;
2503 break;
2504 case V4L2_SEL_TGT_COMPOSE_PADDED:
2505 case V4L2_SEL_TGT_COMPOSE_BOUNDS:
2506 s->r.left = 0;
2507 s->r.top = 0;
2508 s->r.width = q_data_cap->w_adjusted;
2509 s->r.height = q_data_cap->h_adjusted;
2510 break;
2511 default:
2512 return -EINVAL;
2513 }
2514
2515 return 0;
2516 }
2517
mxc_jpeg_enc_g_selection(struct file * file,void * fh,struct v4l2_selection * s)2518 static int mxc_jpeg_enc_g_selection(struct file *file, void *fh, struct v4l2_selection *s)
2519 {
2520 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
2521 struct mxc_jpeg_q_data *q_data_out;
2522
2523 if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
2524 return -EINVAL;
2525
2526 q_data_out = mxc_jpeg_get_q_data(ctx, s->type);
2527
2528 switch (s->target) {
2529 case V4L2_SEL_TGT_CROP_DEFAULT:
2530 case V4L2_SEL_TGT_CROP_BOUNDS:
2531 s->r.left = 0;
2532 s->r.top = 0;
2533 s->r.width = q_data_out->w;
2534 s->r.height = q_data_out->h;
2535 break;
2536 case V4L2_SEL_TGT_CROP:
2537 s->r = q_data_out->crop;
2538 break;
2539 default:
2540 return -EINVAL;
2541 }
2542
2543 return 0;
2544 }
2545
mxc_jpeg_g_selection(struct file * file,void * fh,struct v4l2_selection * s)2546 static int mxc_jpeg_g_selection(struct file *file, void *fh, struct v4l2_selection *s)
2547 {
2548 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
2549
2550 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE)
2551 return mxc_jpeg_dec_g_selection(file, fh, s);
2552 else
2553 return mxc_jpeg_enc_g_selection(file, fh, s);
2554 }
2555
mxc_jpeg_s_selection(struct file * file,void * fh,struct v4l2_selection * s)2556 static int mxc_jpeg_s_selection(struct file *file, void *fh, struct v4l2_selection *s)
2557 {
2558 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
2559 struct mxc_jpeg_q_data *q_data_out;
2560
2561 if (ctx->mxc_jpeg->mode != MXC_JPEG_ENCODE)
2562 return -ENOTTY;
2563
2564 if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
2565 return -EINVAL;
2566 if (s->target != V4L2_SEL_TGT_CROP)
2567 return -EINVAL;
2568
2569 q_data_out = mxc_jpeg_get_q_data(ctx, s->type);
2570 if (s->r.left || s->r.top)
2571 return -EINVAL;
2572 if (s->r.width > q_data_out->w || s->r.height > q_data_out->h)
2573 return -EINVAL;
2574
2575 q_data_out->crop.left = 0;
2576 q_data_out->crop.top = 0;
2577 q_data_out->crop.width = s->r.width;
2578 q_data_out->crop.height = s->r.height;
2579
2580 return 0;
2581 }
2582
mxc_jpeg_subscribe_event(struct v4l2_fh * fh,const struct v4l2_event_subscription * sub)2583 static int mxc_jpeg_subscribe_event(struct v4l2_fh *fh,
2584 const struct v4l2_event_subscription *sub)
2585 {
2586 switch (sub->type) {
2587 case V4L2_EVENT_EOS:
2588 return v4l2_event_subscribe(fh, sub, 0, NULL);
2589 case V4L2_EVENT_SOURCE_CHANGE:
2590 return v4l2_src_change_event_subscribe(fh, sub);
2591 case V4L2_EVENT_CTRL:
2592 return v4l2_ctrl_subscribe_event(fh, sub);
2593 default:
2594 return -EINVAL;
2595 }
2596 }
2597
2598 static const struct v4l2_ioctl_ops mxc_jpeg_ioctl_ops = {
2599 .vidioc_querycap = mxc_jpeg_querycap,
2600 .vidioc_enum_fmt_vid_cap = mxc_jpeg_enum_fmt_vid_cap,
2601 .vidioc_enum_fmt_vid_out = mxc_jpeg_enum_fmt_vid_out,
2602
2603 .vidioc_try_fmt_vid_cap_mplane = mxc_jpeg_try_fmt_vid_cap,
2604 .vidioc_try_fmt_vid_out_mplane = mxc_jpeg_try_fmt_vid_out,
2605
2606 .vidioc_s_fmt_vid_cap_mplane = mxc_jpeg_s_fmt_vid_cap,
2607 .vidioc_s_fmt_vid_out_mplane = mxc_jpeg_s_fmt_vid_out,
2608
2609 .vidioc_g_fmt_vid_cap_mplane = mxc_jpeg_g_fmt_vid,
2610 .vidioc_g_fmt_vid_out_mplane = mxc_jpeg_g_fmt_vid,
2611
2612 .vidioc_g_selection = mxc_jpeg_g_selection,
2613 .vidioc_s_selection = mxc_jpeg_s_selection,
2614
2615 .vidioc_subscribe_event = mxc_jpeg_subscribe_event,
2616 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
2617
2618 .vidioc_try_decoder_cmd = v4l2_m2m_ioctl_try_decoder_cmd,
2619 .vidioc_decoder_cmd = mxc_jpeg_decoder_cmd,
2620 .vidioc_try_encoder_cmd = v4l2_m2m_ioctl_try_encoder_cmd,
2621 .vidioc_encoder_cmd = mxc_jpeg_encoder_cmd,
2622
2623 .vidioc_qbuf = v4l2_m2m_ioctl_qbuf,
2624 .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf,
2625
2626 .vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs,
2627 .vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf,
2628 .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs,
2629 .vidioc_querybuf = v4l2_m2m_ioctl_querybuf,
2630 .vidioc_expbuf = v4l2_m2m_ioctl_expbuf,
2631 .vidioc_streamon = v4l2_m2m_ioctl_streamon,
2632 .vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
2633 };
2634
mxc_jpeg_release(struct file * file)2635 static int mxc_jpeg_release(struct file *file)
2636 {
2637 struct mxc_jpeg_dev *mxc_jpeg = video_drvdata(file);
2638 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(file->private_data);
2639 struct device *dev = mxc_jpeg->dev;
2640
2641 mutex_lock(&mxc_jpeg->lock);
2642 if (mxc_jpeg->mode == MXC_JPEG_DECODE)
2643 dev_dbg(dev, "Release JPEG decoder instance on slot %d.",
2644 ctx->slot);
2645 else
2646 dev_dbg(dev, "Release JPEG encoder instance on slot %d.",
2647 ctx->slot);
2648 v4l2_ctrl_handler_free(&ctx->ctrl_handler);
2649 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2650 v4l2_fh_del(&ctx->fh);
2651 v4l2_fh_exit(&ctx->fh);
2652 kfree(ctx);
2653 mutex_unlock(&mxc_jpeg->lock);
2654
2655 return 0;
2656 }
2657
2658 static const struct v4l2_file_operations mxc_jpeg_fops = {
2659 .owner = THIS_MODULE,
2660 .open = mxc_jpeg_open,
2661 .release = mxc_jpeg_release,
2662 .poll = v4l2_m2m_fop_poll,
2663 .unlocked_ioctl = video_ioctl2,
2664 .mmap = v4l2_m2m_fop_mmap,
2665 };
2666
2667 static const struct v4l2_m2m_ops mxc_jpeg_m2m_ops = {
2668 .job_ready = mxc_jpeg_job_ready,
2669 .device_run = mxc_jpeg_device_run,
2670 };
2671
mxc_jpeg_detach_pm_domains(struct mxc_jpeg_dev * jpeg)2672 static void mxc_jpeg_detach_pm_domains(struct mxc_jpeg_dev *jpeg)
2673 {
2674 int i;
2675
2676 for (i = 0; i < jpeg->num_domains; i++) {
2677 if (jpeg->pd_link[i] && !IS_ERR(jpeg->pd_link[i]))
2678 device_link_del(jpeg->pd_link[i]);
2679 if (jpeg->pd_dev[i] && !IS_ERR(jpeg->pd_dev[i]))
2680 dev_pm_domain_detach(jpeg->pd_dev[i], true);
2681 jpeg->pd_dev[i] = NULL;
2682 jpeg->pd_link[i] = NULL;
2683 }
2684 }
2685
mxc_jpeg_attach_pm_domains(struct mxc_jpeg_dev * jpeg)2686 static int mxc_jpeg_attach_pm_domains(struct mxc_jpeg_dev *jpeg)
2687 {
2688 struct device *dev = jpeg->dev;
2689 struct device_node *np = jpeg->pdev->dev.of_node;
2690 int i;
2691 int ret;
2692
2693 jpeg->num_domains = of_count_phandle_with_args(np, "power-domains",
2694 "#power-domain-cells");
2695 if (jpeg->num_domains < 0) {
2696 dev_err(dev, "No power domains defined for jpeg node\n");
2697 return jpeg->num_domains;
2698 }
2699 if (jpeg->num_domains == 1) {
2700 /* genpd_dev_pm_attach() attach automatically if power domains count is 1 */
2701 jpeg->num_domains = 0;
2702 return 0;
2703 }
2704
2705 jpeg->pd_dev = devm_kmalloc_array(dev, jpeg->num_domains,
2706 sizeof(*jpeg->pd_dev), GFP_KERNEL);
2707 if (!jpeg->pd_dev)
2708 return -ENOMEM;
2709
2710 jpeg->pd_link = devm_kmalloc_array(dev, jpeg->num_domains,
2711 sizeof(*jpeg->pd_link), GFP_KERNEL);
2712 if (!jpeg->pd_link)
2713 return -ENOMEM;
2714
2715 for (i = 0; i < jpeg->num_domains; i++) {
2716 jpeg->pd_dev[i] = dev_pm_domain_attach_by_id(dev, i);
2717 if (IS_ERR(jpeg->pd_dev[i])) {
2718 ret = PTR_ERR(jpeg->pd_dev[i]);
2719 goto fail;
2720 }
2721
2722 jpeg->pd_link[i] = device_link_add(dev, jpeg->pd_dev[i],
2723 DL_FLAG_STATELESS |
2724 DL_FLAG_PM_RUNTIME);
2725 if (!jpeg->pd_link[i]) {
2726 ret = -EINVAL;
2727 goto fail;
2728 }
2729 }
2730
2731 return 0;
2732 fail:
2733 mxc_jpeg_detach_pm_domains(jpeg);
2734 return ret;
2735 }
2736
mxc_jpeg_probe(struct platform_device * pdev)2737 static int mxc_jpeg_probe(struct platform_device *pdev)
2738 {
2739 struct mxc_jpeg_dev *jpeg;
2740 struct device *dev = &pdev->dev;
2741 int dec_irq;
2742 int ret;
2743 int mode;
2744 const struct of_device_id *of_id;
2745
2746 of_id = of_match_node(mxc_jpeg_match, dev->of_node);
2747 if (!of_id)
2748 return -ENODEV;
2749 mode = *(const int *)of_id->data;
2750
2751 jpeg = devm_kzalloc(dev, sizeof(struct mxc_jpeg_dev), GFP_KERNEL);
2752 if (!jpeg)
2753 return -ENOMEM;
2754
2755 mutex_init(&jpeg->lock);
2756 spin_lock_init(&jpeg->hw_lock);
2757
2758 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
2759 if (ret) {
2760 dev_err(&pdev->dev, "No suitable DMA available.\n");
2761 goto err_irq;
2762 }
2763
2764 jpeg->base_reg = devm_platform_ioremap_resource(pdev, 0);
2765 if (IS_ERR(jpeg->base_reg))
2766 return PTR_ERR(jpeg->base_reg);
2767
2768 ret = of_property_read_u32_index(pdev->dev.of_node, "slot", 0, &jpeg->slot_data.slot);
2769 if (ret)
2770 jpeg->slot_data.slot = 0;
2771 dev_info(&pdev->dev, "choose slot %d\n", jpeg->slot_data.slot);
2772 dec_irq = platform_get_irq(pdev, 0);
2773 if (dec_irq < 0) {
2774 ret = dec_irq;
2775 goto err_irq;
2776 }
2777 ret = devm_request_irq(&pdev->dev, dec_irq, mxc_jpeg_dec_irq,
2778 0, pdev->name, jpeg);
2779 if (ret) {
2780 dev_err(&pdev->dev, "Failed to request irq %d (%d)\n",
2781 dec_irq, ret);
2782 goto err_irq;
2783 }
2784
2785 jpeg->pdev = pdev;
2786 jpeg->dev = dev;
2787 jpeg->mode = mode;
2788
2789 /* Get clocks */
2790 ret = devm_clk_bulk_get_all(&pdev->dev, &jpeg->clks);
2791 if (ret < 0) {
2792 dev_err(dev, "failed to get clock\n");
2793 goto err_clk;
2794 }
2795 jpeg->num_clks = ret;
2796
2797 ret = mxc_jpeg_attach_pm_domains(jpeg);
2798 if (ret < 0) {
2799 dev_err(dev, "failed to attach power domains %d\n", ret);
2800 return ret;
2801 }
2802
2803 /* v4l2 */
2804 ret = v4l2_device_register(dev, &jpeg->v4l2_dev);
2805 if (ret) {
2806 dev_err(dev, "failed to register v4l2 device\n");
2807 goto err_register;
2808 }
2809 jpeg->m2m_dev = v4l2_m2m_init(&mxc_jpeg_m2m_ops);
2810 if (IS_ERR(jpeg->m2m_dev)) {
2811 dev_err(dev, "failed to register v4l2 device\n");
2812 ret = PTR_ERR(jpeg->m2m_dev);
2813 goto err_m2m;
2814 }
2815
2816 jpeg->dec_vdev = video_device_alloc();
2817 if (!jpeg->dec_vdev) {
2818 dev_err(dev, "failed to register v4l2 device\n");
2819 ret = -ENOMEM;
2820 goto err_vdev_alloc;
2821 }
2822 if (mode == MXC_JPEG_ENCODE)
2823 snprintf(jpeg->dec_vdev->name,
2824 sizeof(jpeg->dec_vdev->name),
2825 "%s-enc", MXC_JPEG_NAME);
2826 else
2827 snprintf(jpeg->dec_vdev->name,
2828 sizeof(jpeg->dec_vdev->name),
2829 "%s-dec", MXC_JPEG_NAME);
2830
2831 jpeg->dec_vdev->fops = &mxc_jpeg_fops;
2832 jpeg->dec_vdev->ioctl_ops = &mxc_jpeg_ioctl_ops;
2833 jpeg->dec_vdev->minor = -1;
2834 jpeg->dec_vdev->release = video_device_release;
2835 jpeg->dec_vdev->lock = &jpeg->lock; /* lock for ioctl serialization */
2836 jpeg->dec_vdev->v4l2_dev = &jpeg->v4l2_dev;
2837 jpeg->dec_vdev->vfl_dir = VFL_DIR_M2M;
2838 jpeg->dec_vdev->device_caps = V4L2_CAP_STREAMING |
2839 V4L2_CAP_VIDEO_M2M_MPLANE;
2840 if (mode == MXC_JPEG_ENCODE) {
2841 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_DECODER_CMD);
2842 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_TRY_DECODER_CMD);
2843 } else {
2844 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_ENCODER_CMD);
2845 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_TRY_ENCODER_CMD);
2846 }
2847 ret = video_register_device(jpeg->dec_vdev, VFL_TYPE_VIDEO, -1);
2848 if (ret) {
2849 dev_err(dev, "failed to register video device\n");
2850 goto err_vdev_register;
2851 }
2852 video_set_drvdata(jpeg->dec_vdev, jpeg);
2853 if (mode == MXC_JPEG_ENCODE)
2854 v4l2_info(&jpeg->v4l2_dev,
2855 "encoder device registered as /dev/video%d (%d,%d)\n",
2856 jpeg->dec_vdev->num, VIDEO_MAJOR,
2857 jpeg->dec_vdev->minor);
2858 else
2859 v4l2_info(&jpeg->v4l2_dev,
2860 "decoder device registered as /dev/video%d (%d,%d)\n",
2861 jpeg->dec_vdev->num, VIDEO_MAJOR,
2862 jpeg->dec_vdev->minor);
2863
2864 platform_set_drvdata(pdev, jpeg);
2865 pm_runtime_enable(dev);
2866
2867 return 0;
2868
2869 err_vdev_register:
2870 video_device_release(jpeg->dec_vdev);
2871
2872 err_vdev_alloc:
2873 v4l2_m2m_release(jpeg->m2m_dev);
2874
2875 err_m2m:
2876 v4l2_device_unregister(&jpeg->v4l2_dev);
2877
2878 err_register:
2879 mxc_jpeg_detach_pm_domains(jpeg);
2880
2881 err_irq:
2882 err_clk:
2883 return ret;
2884 }
2885
2886 #ifdef CONFIG_PM
mxc_jpeg_runtime_resume(struct device * dev)2887 static int mxc_jpeg_runtime_resume(struct device *dev)
2888 {
2889 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev);
2890 int ret;
2891
2892 ret = clk_bulk_prepare_enable(jpeg->num_clks, jpeg->clks);
2893 if (ret < 0) {
2894 dev_err(dev, "failed to enable clock\n");
2895 return ret;
2896 }
2897
2898 return 0;
2899 }
2900
mxc_jpeg_runtime_suspend(struct device * dev)2901 static int mxc_jpeg_runtime_suspend(struct device *dev)
2902 {
2903 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev);
2904
2905 clk_bulk_disable_unprepare(jpeg->num_clks, jpeg->clks);
2906
2907 return 0;
2908 }
2909 #endif
2910
2911 #ifdef CONFIG_PM_SLEEP
mxc_jpeg_suspend(struct device * dev)2912 static int mxc_jpeg_suspend(struct device *dev)
2913 {
2914 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev);
2915
2916 v4l2_m2m_suspend(jpeg->m2m_dev);
2917 return pm_runtime_force_suspend(dev);
2918 }
2919
mxc_jpeg_resume(struct device * dev)2920 static int mxc_jpeg_resume(struct device *dev)
2921 {
2922 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev);
2923 int ret;
2924
2925 ret = pm_runtime_force_resume(dev);
2926 if (ret < 0)
2927 return ret;
2928
2929 v4l2_m2m_resume(jpeg->m2m_dev);
2930 return ret;
2931 }
2932 #endif
2933
2934 static const struct dev_pm_ops mxc_jpeg_pm_ops = {
2935 SET_RUNTIME_PM_OPS(mxc_jpeg_runtime_suspend,
2936 mxc_jpeg_runtime_resume, NULL)
2937 SET_SYSTEM_SLEEP_PM_OPS(mxc_jpeg_suspend, mxc_jpeg_resume)
2938 };
2939
mxc_jpeg_remove(struct platform_device * pdev)2940 static void mxc_jpeg_remove(struct platform_device *pdev)
2941 {
2942 struct mxc_jpeg_dev *jpeg = platform_get_drvdata(pdev);
2943
2944 mxc_jpeg_free_slot_data(jpeg);
2945
2946 pm_runtime_disable(&pdev->dev);
2947 video_unregister_device(jpeg->dec_vdev);
2948 v4l2_m2m_release(jpeg->m2m_dev);
2949 v4l2_device_unregister(&jpeg->v4l2_dev);
2950 mxc_jpeg_detach_pm_domains(jpeg);
2951 }
2952
2953 MODULE_DEVICE_TABLE(of, mxc_jpeg_match);
2954
2955 static struct platform_driver mxc_jpeg_driver = {
2956 .probe = mxc_jpeg_probe,
2957 .remove_new = mxc_jpeg_remove,
2958 .driver = {
2959 .name = "mxc-jpeg",
2960 .of_match_table = mxc_jpeg_match,
2961 .pm = &mxc_jpeg_pm_ops,
2962 },
2963 };
2964 module_platform_driver(mxc_jpeg_driver);
2965
2966 MODULE_AUTHOR("Zhengyu Shen <zhengyu.shen_1@nxp.com>");
2967 MODULE_AUTHOR("Mirela Rabulea <mirela.rabulea@nxp.com>");
2968 MODULE_DESCRIPTION("V4L2 driver for i.MX8 QXP/QM JPEG encoder/decoder");
2969 MODULE_LICENSE("GPL v2");
2970