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 q_data_cap->bytesperline[0] = 0;
1377 q_data_cap->bytesperline[1] = 0;
1378
1379 /*
1380 * align up the resolution for CAST IP,
1381 * but leave the buffer resolution unchanged
1382 */
1383 v4l_bound_align_image(&q_data_cap->w_adjusted,
1384 q_data_cap->w_adjusted, /* adjust up */
1385 MXC_JPEG_MAX_WIDTH,
1386 q_data_cap->fmt->h_align,
1387 &q_data_cap->h_adjusted,
1388 q_data_cap->h_adjusted, /* adjust up */
1389 MXC_JPEG_MAX_HEIGHT,
1390 q_data_cap->fmt->v_align,
1391 0);
1392
1393 /* setup bytesperline/sizeimage for capture queue */
1394 mxc_jpeg_bytesperline(q_data_cap, jpeg_src_buf->fmt->precision);
1395 mxc_jpeg_sizeimage(q_data_cap);
1396 notify_src_chg(ctx);
1397 ctx->source_change = 1;
1398 ctx->need_initial_source_change_evt = false;
1399 if (vb2_is_streaming(v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx)))
1400 mxc_jpeg_set_last_buffer(ctx);
1401 }
1402
1403 return ctx->source_change ? true : false;
1404 }
1405
mxc_jpeg_job_ready(void * priv)1406 static int mxc_jpeg_job_ready(void *priv)
1407 {
1408 struct mxc_jpeg_ctx *ctx = priv;
1409
1410 return ctx->source_change ? 0 : 1;
1411 }
1412
mxc_jpeg_device_run_timeout(struct work_struct * work)1413 static void mxc_jpeg_device_run_timeout(struct work_struct *work)
1414 {
1415 struct delayed_work *dwork = to_delayed_work(work);
1416 struct mxc_jpeg_ctx *ctx = container_of(dwork, struct mxc_jpeg_ctx, task_timer);
1417 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
1418 unsigned long flags;
1419
1420 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags);
1421 if (ctx->mxc_jpeg->slot_data.used) {
1422 dev_warn(jpeg->dev, "%s timeout, cancel it\n",
1423 ctx->mxc_jpeg->mode == MXC_JPEG_DECODE ? "decode" : "encode");
1424 mxc_jpeg_job_finish(ctx, VB2_BUF_STATE_ERROR, true);
1425 v4l2_m2m_job_finish(ctx->mxc_jpeg->m2m_dev, ctx->fh.m2m_ctx);
1426 }
1427 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1428 }
1429
mxc_jpeg_device_run(void * priv)1430 static void mxc_jpeg_device_run(void *priv)
1431 {
1432 struct mxc_jpeg_ctx *ctx = priv;
1433 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
1434 void __iomem *reg = jpeg->base_reg;
1435 struct device *dev = jpeg->dev;
1436 struct vb2_v4l2_buffer *src_buf, *dst_buf;
1437 unsigned long flags;
1438 struct mxc_jpeg_q_data *q_data_cap, *q_data_out;
1439 struct mxc_jpeg_src_buf *jpeg_src_buf;
1440
1441 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags);
1442 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
1443 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
1444 if (!src_buf || !dst_buf) {
1445 dev_err(dev, "Null src or dst buf\n");
1446 goto end;
1447 }
1448
1449 q_data_cap = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
1450 if (!q_data_cap)
1451 goto end;
1452 q_data_out = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
1453 if (!q_data_out)
1454 goto end;
1455 src_buf->sequence = q_data_out->sequence++;
1456 dst_buf->sequence = q_data_cap->sequence++;
1457
1458 v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, true);
1459
1460 jpeg_src_buf = vb2_to_mxc_buf(&src_buf->vb2_buf);
1461 if (q_data_cap->fmt->mem_planes != dst_buf->vb2_buf.num_planes) {
1462 dev_err(dev, "Capture format %s has %d planes, but capture buffer has %d planes\n",
1463 q_data_cap->fmt->name, q_data_cap->fmt->mem_planes,
1464 dst_buf->vb2_buf.num_planes);
1465 jpeg_src_buf->jpeg_parse_error = true;
1466 }
1467 if (jpeg_src_buf->jpeg_parse_error) {
1468 mxc_jpeg_check_and_set_last_buffer(ctx, src_buf, dst_buf);
1469 v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1470 v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1471 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
1472 v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
1473 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1474 v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
1475
1476 return;
1477 }
1478 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE) {
1479 if (ctx->source_change || mxc_jpeg_source_change(ctx, jpeg_src_buf)) {
1480 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1481 v4l2_m2m_job_finish(jpeg->m2m_dev, ctx->fh.m2m_ctx);
1482 return;
1483 }
1484 }
1485
1486 mxc_jpeg_enable(reg);
1487 mxc_jpeg_set_l_endian(reg, 1);
1488
1489 ctx->slot = mxc_get_free_slot(&jpeg->slot_data);
1490 if (ctx->slot < 0) {
1491 dev_err(dev, "No more free slots\n");
1492 goto end;
1493 }
1494 if (!mxc_jpeg_alloc_slot_data(jpeg)) {
1495 dev_err(dev, "Cannot allocate slot data\n");
1496 goto end;
1497 }
1498
1499 mxc_jpeg_enable_slot(reg, ctx->slot);
1500 mxc_jpeg_enable_irq(reg, ctx->slot);
1501
1502 if (jpeg->mode == MXC_JPEG_ENCODE) {
1503 dev_dbg(dev, "Encoding on slot %d\n", ctx->slot);
1504 ctx->enc_state = MXC_JPEG_ENC_CONF;
1505 mxc_jpeg_config_enc_desc(&dst_buf->vb2_buf, ctx,
1506 &src_buf->vb2_buf, &dst_buf->vb2_buf);
1507 /* start config phase */
1508 mxc_jpeg_enc_mode_conf(dev, reg,
1509 mxc_jpeg_is_extended_sequential(q_data_out->fmt));
1510 } else {
1511 dev_dbg(dev, "Decoding on slot %d\n", ctx->slot);
1512 print_mxc_buf(jpeg, &src_buf->vb2_buf, 0);
1513 mxc_jpeg_config_dec_desc(&dst_buf->vb2_buf, ctx,
1514 &src_buf->vb2_buf, &dst_buf->vb2_buf);
1515 mxc_jpeg_dec_mode_go(dev, reg);
1516 }
1517 schedule_delayed_work(&ctx->task_timer, msecs_to_jiffies(hw_timeout));
1518 end:
1519 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1520 }
1521
mxc_jpeg_decoder_cmd(struct file * file,void * priv,struct v4l2_decoder_cmd * cmd)1522 static int mxc_jpeg_decoder_cmd(struct file *file, void *priv,
1523 struct v4l2_decoder_cmd *cmd)
1524 {
1525 struct v4l2_fh *fh = file->private_data;
1526 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
1527 unsigned long flags;
1528 int ret;
1529
1530 ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, cmd);
1531 if (ret < 0)
1532 return ret;
1533
1534 if (!vb2_is_streaming(v4l2_m2m_get_src_vq(fh->m2m_ctx)))
1535 return 0;
1536
1537 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags);
1538 ret = v4l2_m2m_ioctl_decoder_cmd(file, priv, cmd);
1539 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1540 if (ret < 0)
1541 return ret;
1542
1543 if (cmd->cmd == V4L2_DEC_CMD_STOP &&
1544 v4l2_m2m_has_stopped(fh->m2m_ctx)) {
1545 notify_eos(ctx);
1546 ctx->header_parsed = false;
1547 }
1548
1549 if (cmd->cmd == V4L2_DEC_CMD_START &&
1550 v4l2_m2m_has_stopped(fh->m2m_ctx))
1551 vb2_clear_last_buffer_dequeued(&fh->m2m_ctx->cap_q_ctx.q);
1552 return 0;
1553 }
1554
mxc_jpeg_encoder_cmd(struct file * file,void * priv,struct v4l2_encoder_cmd * cmd)1555 static int mxc_jpeg_encoder_cmd(struct file *file, void *priv,
1556 struct v4l2_encoder_cmd *cmd)
1557 {
1558 struct v4l2_fh *fh = file->private_data;
1559 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
1560 unsigned long flags;
1561 int ret;
1562
1563 ret = v4l2_m2m_ioctl_try_encoder_cmd(file, fh, cmd);
1564 if (ret < 0)
1565 return ret;
1566
1567 if (!vb2_is_streaming(v4l2_m2m_get_src_vq(fh->m2m_ctx)) ||
1568 !vb2_is_streaming(v4l2_m2m_get_dst_vq(fh->m2m_ctx)))
1569 return 0;
1570
1571 spin_lock_irqsave(&ctx->mxc_jpeg->hw_lock, flags);
1572 ret = v4l2_m2m_ioctl_encoder_cmd(file, fh, cmd);
1573 spin_unlock_irqrestore(&ctx->mxc_jpeg->hw_lock, flags);
1574 if (ret < 0)
1575 return 0;
1576
1577 if (cmd->cmd == V4L2_ENC_CMD_STOP &&
1578 v4l2_m2m_has_stopped(fh->m2m_ctx))
1579 notify_eos(ctx);
1580
1581 if (cmd->cmd == V4L2_ENC_CMD_START &&
1582 v4l2_m2m_has_stopped(fh->m2m_ctx))
1583 vb2_clear_last_buffer_dequeued(&fh->m2m_ctx->cap_q_ctx.q);
1584
1585 return 0;
1586 }
1587
mxc_jpeg_queue_setup(struct vb2_queue * q,unsigned int * nbuffers,unsigned int * nplanes,unsigned int sizes[],struct device * alloc_ctxs[])1588 static int mxc_jpeg_queue_setup(struct vb2_queue *q,
1589 unsigned int *nbuffers,
1590 unsigned int *nplanes,
1591 unsigned int sizes[],
1592 struct device *alloc_ctxs[])
1593 {
1594 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(q);
1595 struct mxc_jpeg_q_data *q_data = NULL;
1596 int i;
1597
1598 q_data = mxc_jpeg_get_q_data(ctx, q->type);
1599 if (!q_data)
1600 return -EINVAL;
1601
1602 /* Handle CREATE_BUFS situation - *nplanes != 0 */
1603 if (*nplanes) {
1604 if (*nplanes != q_data->fmt->mem_planes)
1605 return -EINVAL;
1606 for (i = 0; i < *nplanes; i++) {
1607 if (sizes[i] < mxc_jpeg_get_plane_size(q_data, i))
1608 return -EINVAL;
1609 }
1610 return 0;
1611 }
1612
1613 /* Handle REQBUFS situation */
1614 *nplanes = q_data->fmt->mem_planes;
1615 for (i = 0; i < *nplanes; i++)
1616 sizes[i] = mxc_jpeg_get_plane_size(q_data, i);
1617
1618 if (V4L2_TYPE_IS_OUTPUT(q->type))
1619 ctx->need_initial_source_change_evt = true;
1620
1621 return 0;
1622 }
1623
mxc_jpeg_start_streaming(struct vb2_queue * q,unsigned int count)1624 static int mxc_jpeg_start_streaming(struct vb2_queue *q, unsigned int count)
1625 {
1626 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(q);
1627 struct mxc_jpeg_q_data *q_data = mxc_jpeg_get_q_data(ctx, q->type);
1628 int ret;
1629
1630 v4l2_m2m_update_start_streaming_state(ctx->fh.m2m_ctx, q);
1631
1632 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE && V4L2_TYPE_IS_CAPTURE(q->type))
1633 ctx->source_change = 0;
1634 dev_dbg(ctx->mxc_jpeg->dev, "Start streaming ctx=%p", ctx);
1635 q_data->sequence = 0;
1636
1637 if (V4L2_TYPE_IS_CAPTURE(q->type))
1638 ctx->need_initial_source_change_evt = false;
1639
1640 ret = pm_runtime_resume_and_get(ctx->mxc_jpeg->dev);
1641 if (ret < 0) {
1642 dev_err(ctx->mxc_jpeg->dev, "Failed to power up jpeg\n");
1643 return ret;
1644 }
1645
1646 return 0;
1647 }
1648
mxc_jpeg_stop_streaming(struct vb2_queue * q)1649 static void mxc_jpeg_stop_streaming(struct vb2_queue *q)
1650 {
1651 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(q);
1652 struct vb2_v4l2_buffer *vbuf;
1653
1654 dev_dbg(ctx->mxc_jpeg->dev, "Stop streaming ctx=%p", ctx);
1655
1656 /* Release all active buffers */
1657 for (;;) {
1658 if (V4L2_TYPE_IS_OUTPUT(q->type))
1659 vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
1660 else
1661 vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
1662 if (!vbuf)
1663 break;
1664 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
1665 }
1666
1667 v4l2_m2m_update_stop_streaming_state(ctx->fh.m2m_ctx, q);
1668 /* if V4L2_DEC_CMD_STOP is sent before the source change triggered,
1669 * restore the is_draining flag
1670 */
1671 if (V4L2_TYPE_IS_CAPTURE(q->type) && ctx->source_change && ctx->fh.m2m_ctx->last_src_buf)
1672 ctx->fh.m2m_ctx->is_draining = true;
1673
1674 if (V4L2_TYPE_IS_OUTPUT(q->type) &&
1675 v4l2_m2m_has_stopped(ctx->fh.m2m_ctx)) {
1676 notify_eos(ctx);
1677 ctx->header_parsed = false;
1678 }
1679
1680 pm_runtime_put_sync(&ctx->mxc_jpeg->pdev->dev);
1681 }
1682
mxc_jpeg_valid_comp_id(struct device * dev,struct mxc_jpeg_sof * sof,struct mxc_jpeg_sos * sos)1683 static int mxc_jpeg_valid_comp_id(struct device *dev,
1684 struct mxc_jpeg_sof *sof,
1685 struct mxc_jpeg_sos *sos)
1686 {
1687 int valid = 1;
1688 int i;
1689
1690 /*
1691 * there's a limitation in the IP that the component IDs must be
1692 * between 0..4, if they are not, let's patch them
1693 */
1694 for (i = 0; i < sof->components_no; i++)
1695 if (sof->comp[i].id > MXC_JPEG_MAX_COMPONENTS) {
1696 valid = 0;
1697 dev_err(dev, "Component %d has invalid ID: %d",
1698 i, sof->comp[i].id);
1699 }
1700 if (!valid)
1701 /* patch all comp IDs if at least one is invalid */
1702 for (i = 0; i < sof->components_no; i++) {
1703 dev_warn(dev, "Component %d ID patched to: %d",
1704 i, i + 1);
1705 sof->comp[i].id = i + 1;
1706 sos->comp[i].id = i + 1;
1707 }
1708
1709 return valid;
1710 }
1711
mxc_jpeg_match_image_format(const struct mxc_jpeg_fmt * fmt,const struct v4l2_jpeg_header * header)1712 static bool mxc_jpeg_match_image_format(const struct mxc_jpeg_fmt *fmt,
1713 const struct v4l2_jpeg_header *header)
1714 {
1715 if (fmt->subsampling != header->frame.subsampling ||
1716 fmt->nc != header->frame.num_components ||
1717 fmt->precision != header->frame.precision)
1718 return false;
1719
1720 /*
1721 * If the transform flag from APP14 marker is 0, images that are
1722 * encoded with 3 components have RGB colorspace, see Recommendation
1723 * ITU-T T.872 chapter 6.5.3 APP14 marker segment for colour encoding
1724 */
1725 if (header->frame.subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_444) {
1726 u8 is_rgb = header->app14_tf == V4L2_JPEG_APP14_TF_CMYK_RGB ? 1 : 0;
1727
1728 if (is_rgb != fmt->is_rgb)
1729 return false;
1730 }
1731 return true;
1732 }
1733
mxc_jpeg_get_image_format(struct device * dev,const struct v4l2_jpeg_header * header)1734 static u32 mxc_jpeg_get_image_format(struct device *dev,
1735 const struct v4l2_jpeg_header *header)
1736 {
1737 int i;
1738 u32 fourcc = 0;
1739
1740 for (i = 0; i < MXC_JPEG_NUM_FORMATS; i++) {
1741 if (mxc_jpeg_match_image_format(&mxc_formats[i], header)) {
1742 fourcc = mxc_formats[i].fourcc;
1743 break;
1744 }
1745 }
1746 if (fourcc == 0) {
1747 dev_err(dev,
1748 "Could not identify image format nc=%d, subsampling=%d, precision=%d\n",
1749 header->frame.num_components,
1750 header->frame.subsampling,
1751 header->frame.precision);
1752 return fourcc;
1753 }
1754
1755 return fourcc;
1756 }
1757
mxc_jpeg_bytesperline(struct mxc_jpeg_q_data * q,u32 precision)1758 static void mxc_jpeg_bytesperline(struct mxc_jpeg_q_data *q, u32 precision)
1759 {
1760 u32 bytesperline[2];
1761
1762 bytesperline[0] = q->bytesperline[0];
1763 bytesperline[1] = q->bytesperline[0]; /*imx-jpeg only support the same line pitch*/
1764 v4l_bound_align_image(&bytesperline[0], 0, MXC_JPEG_MAX_LINE, 2,
1765 &bytesperline[1], 0, MXC_JPEG_MAX_LINE, 2,
1766 0);
1767
1768 /* Bytes distance between the leftmost pixels in two adjacent lines */
1769 if (q->fmt->fourcc == V4L2_PIX_FMT_JPEG) {
1770 /* bytesperline unused for compressed formats */
1771 q->bytesperline[0] = 0;
1772 q->bytesperline[1] = 0;
1773 } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_420) {
1774 /* When the image format is planar the bytesperline value
1775 * applies to the first plane and is divided by the same factor
1776 * as the width field for the other planes
1777 */
1778 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8);
1779 q->bytesperline[1] = q->bytesperline[0];
1780 } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_422) {
1781 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8) * 2;
1782 q->bytesperline[1] = 0;
1783 } else if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_444) {
1784 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8) * q->fmt->nc;
1785 q->bytesperline[1] = 0;
1786 } else {
1787 /* grayscale */
1788 q->bytesperline[0] = q->w_adjusted * DIV_ROUND_UP(precision, 8);
1789 q->bytesperline[1] = 0;
1790 }
1791
1792 if (q->fmt->fourcc != V4L2_PIX_FMT_JPEG) {
1793 q->bytesperline[0] = max(q->bytesperline[0], bytesperline[0]);
1794 if (q->fmt->mem_planes > 1)
1795 q->bytesperline[1] = max(q->bytesperline[1], bytesperline[1]);
1796 }
1797 }
1798
mxc_jpeg_sizeimage(struct mxc_jpeg_q_data * q)1799 static void mxc_jpeg_sizeimage(struct mxc_jpeg_q_data *q)
1800 {
1801 if (q->fmt->fourcc == V4L2_PIX_FMT_JPEG) {
1802 /* if no sizeimage from user, assume worst jpeg compression */
1803 if (!q->sizeimage[0])
1804 q->sizeimage[0] = 6 * q->w * q->h;
1805 q->sizeimage[1] = 0;
1806
1807 if (q->sizeimage[0] > MXC_JPEG_MAX_SIZEIMAGE)
1808 q->sizeimage[0] = MXC_JPEG_MAX_SIZEIMAGE;
1809
1810 /* jpeg stream size must be multiple of 1K */
1811 q->sizeimage[0] = ALIGN(q->sizeimage[0], 1024);
1812 } else {
1813 q->sizeimage[0] = q->bytesperline[0] * q->h_adjusted;
1814 q->sizeimage[1] = 0;
1815 if (q->fmt->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_420)
1816 q->sizeimage[1] = q->sizeimage[0] / 2;
1817 }
1818 }
1819
mxc_jpeg_parse(struct mxc_jpeg_ctx * ctx,struct vb2_buffer * vb)1820 static int mxc_jpeg_parse(struct mxc_jpeg_ctx *ctx, struct vb2_buffer *vb)
1821 {
1822 struct device *dev = ctx->mxc_jpeg->dev;
1823 struct mxc_jpeg_q_data *q_data_out;
1824 struct mxc_jpeg_q_data *q_data_cap;
1825 u32 fourcc;
1826 struct v4l2_jpeg_header header;
1827 struct mxc_jpeg_sof *psof = NULL;
1828 struct mxc_jpeg_sos *psos = NULL;
1829 struct mxc_jpeg_src_buf *jpeg_src_buf = vb2_to_mxc_buf(vb);
1830 u8 *src_addr = (u8 *)vb2_plane_vaddr(vb, 0);
1831 u32 size = vb2_get_plane_payload(vb, 0);
1832 int ret;
1833
1834 memset(&header, 0, sizeof(header));
1835 ret = v4l2_jpeg_parse_header((void *)src_addr, size, &header);
1836 if (ret < 0) {
1837 dev_err(dev, "Error parsing JPEG stream markers\n");
1838 return ret;
1839 }
1840
1841 /* if DHT marker present, no need to inject default one */
1842 jpeg_src_buf->dht_needed = (header.num_dht == 0);
1843
1844 q_data_out = mxc_jpeg_get_q_data(ctx,
1845 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
1846 q_data_out->w = header.frame.width;
1847 q_data_out->h = header.frame.height;
1848 if (header.frame.width > MXC_JPEG_MAX_WIDTH ||
1849 header.frame.height > MXC_JPEG_MAX_HEIGHT) {
1850 dev_err(dev, "JPEG width or height should be <= 8192: %dx%d\n",
1851 header.frame.width, header.frame.height);
1852 return -EINVAL;
1853 }
1854 if (header.frame.width < MXC_JPEG_MIN_WIDTH ||
1855 header.frame.height < MXC_JPEG_MIN_HEIGHT) {
1856 dev_err(dev, "JPEG width or height should be > 64: %dx%d\n",
1857 header.frame.width, header.frame.height);
1858 return -EINVAL;
1859 }
1860 if (header.frame.num_components > V4L2_JPEG_MAX_COMPONENTS) {
1861 dev_err(dev, "JPEG number of components should be <=%d",
1862 V4L2_JPEG_MAX_COMPONENTS);
1863 return -EINVAL;
1864 }
1865 /* check and, if necessary, patch component IDs*/
1866 psof = (struct mxc_jpeg_sof *)header.sof.start;
1867 psos = (struct mxc_jpeg_sos *)header.sos.start;
1868 if (!mxc_jpeg_valid_comp_id(dev, psof, psos))
1869 dev_warn(dev, "JPEG component ids should be 0-3 or 1-4");
1870
1871 q_data_cap = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
1872 if (q_data_cap->fmt && mxc_jpeg_match_image_format(q_data_cap->fmt, &header))
1873 fourcc = q_data_cap->fmt->fourcc;
1874 else
1875 fourcc = mxc_jpeg_get_image_format(dev, &header);
1876 if (fourcc == 0)
1877 return -EINVAL;
1878
1879 jpeg_src_buf->fmt = mxc_jpeg_find_format(fourcc);
1880 jpeg_src_buf->w = header.frame.width;
1881 jpeg_src_buf->h = header.frame.height;
1882 ctx->header_parsed = true;
1883
1884 if (!v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx))
1885 mxc_jpeg_source_change(ctx, jpeg_src_buf);
1886
1887 return 0;
1888 }
1889
mxc_jpeg_buf_queue(struct vb2_buffer * vb)1890 static void mxc_jpeg_buf_queue(struct vb2_buffer *vb)
1891 {
1892 int ret;
1893 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1894 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1895 struct mxc_jpeg_src_buf *jpeg_src_buf;
1896
1897 if (V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type) &&
1898 vb2_is_streaming(vb->vb2_queue) &&
1899 v4l2_m2m_dst_buf_is_last(ctx->fh.m2m_ctx)) {
1900 struct mxc_jpeg_q_data *q_data;
1901
1902 q_data = mxc_jpeg_get_q_data(ctx, vb->vb2_queue->type);
1903 vbuf->field = V4L2_FIELD_NONE;
1904 vbuf->sequence = q_data->sequence++;
1905 v4l2_m2m_last_buffer_done(ctx->fh.m2m_ctx, vbuf);
1906 notify_eos(ctx);
1907 ctx->header_parsed = false;
1908 return;
1909 }
1910
1911 if (vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
1912 goto end;
1913
1914 /* for V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE */
1915 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE)
1916 goto end;
1917
1918 jpeg_src_buf = vb2_to_mxc_buf(vb);
1919 jpeg_src_buf->jpeg_parse_error = false;
1920 ret = mxc_jpeg_parse(ctx, vb);
1921 if (ret)
1922 jpeg_src_buf->jpeg_parse_error = true;
1923
1924 end:
1925 v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1926 }
1927
mxc_jpeg_buf_out_validate(struct vb2_buffer * vb)1928 static int mxc_jpeg_buf_out_validate(struct vb2_buffer *vb)
1929 {
1930 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1931
1932 vbuf->field = V4L2_FIELD_NONE;
1933
1934 return 0;
1935 }
1936
mxc_jpeg_buf_prepare(struct vb2_buffer * vb)1937 static int mxc_jpeg_buf_prepare(struct vb2_buffer *vb)
1938 {
1939 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1940 struct mxc_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1941 struct mxc_jpeg_q_data *q_data = NULL;
1942 struct device *dev = ctx->mxc_jpeg->dev;
1943 unsigned long sizeimage;
1944 int i;
1945
1946 vbuf->field = V4L2_FIELD_NONE;
1947
1948 q_data = mxc_jpeg_get_q_data(ctx, vb->vb2_queue->type);
1949 if (!q_data)
1950 return -EINVAL;
1951 for (i = 0; i < q_data->fmt->mem_planes; i++) {
1952 sizeimage = mxc_jpeg_get_plane_size(q_data, i);
1953 if (!ctx->source_change && vb2_plane_size(vb, i) < sizeimage) {
1954 dev_err(dev, "plane %d too small (%lu < %lu)",
1955 i, vb2_plane_size(vb, i), sizeimage);
1956 return -EINVAL;
1957 }
1958 }
1959 if (V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type)) {
1960 vb2_set_plane_payload(vb, 0, 0);
1961 vb2_set_plane_payload(vb, 1, 0);
1962 }
1963 return 0;
1964 }
1965
1966 static const struct vb2_ops mxc_jpeg_qops = {
1967 .queue_setup = mxc_jpeg_queue_setup,
1968 .wait_prepare = vb2_ops_wait_prepare,
1969 .wait_finish = vb2_ops_wait_finish,
1970 .buf_out_validate = mxc_jpeg_buf_out_validate,
1971 .buf_prepare = mxc_jpeg_buf_prepare,
1972 .start_streaming = mxc_jpeg_start_streaming,
1973 .stop_streaming = mxc_jpeg_stop_streaming,
1974 .buf_queue = mxc_jpeg_buf_queue,
1975 };
1976
mxc_jpeg_queue_init(void * priv,struct vb2_queue * src_vq,struct vb2_queue * dst_vq)1977 static int mxc_jpeg_queue_init(void *priv, struct vb2_queue *src_vq,
1978 struct vb2_queue *dst_vq)
1979 {
1980 struct mxc_jpeg_ctx *ctx = priv;
1981 int ret;
1982
1983 src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1984 src_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1985 src_vq->drv_priv = ctx;
1986 src_vq->buf_struct_size = sizeof(struct mxc_jpeg_src_buf);
1987 src_vq->ops = &mxc_jpeg_qops;
1988 src_vq->mem_ops = &vb2_dma_contig_memops;
1989 src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
1990 src_vq->lock = &ctx->mxc_jpeg->lock;
1991 src_vq->dev = ctx->mxc_jpeg->dev;
1992
1993 ret = vb2_queue_init(src_vq);
1994 if (ret)
1995 return ret;
1996
1997 dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1998 dst_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1999 dst_vq->drv_priv = ctx;
2000 dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
2001 dst_vq->ops = &mxc_jpeg_qops;
2002 dst_vq->mem_ops = &vb2_dma_contig_memops;
2003 dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2004 dst_vq->lock = &ctx->mxc_jpeg->lock;
2005 dst_vq->dev = ctx->mxc_jpeg->dev;
2006
2007 ret = vb2_queue_init(dst_vq);
2008 return ret;
2009 }
2010
mxc_jpeg_set_default_params(struct mxc_jpeg_ctx * ctx)2011 static void mxc_jpeg_set_default_params(struct mxc_jpeg_ctx *ctx)
2012 {
2013 struct mxc_jpeg_q_data *out_q = &ctx->out_q;
2014 struct mxc_jpeg_q_data *cap_q = &ctx->cap_q;
2015 struct mxc_jpeg_q_data *q[2] = {out_q, cap_q};
2016 int i;
2017
2018 if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE) {
2019 out_q->fmt = mxc_jpeg_find_format(MXC_JPEG_DEFAULT_PFMT);
2020 cap_q->fmt = mxc_jpeg_find_format(V4L2_PIX_FMT_JPEG);
2021 } else {
2022 out_q->fmt = mxc_jpeg_find_format(V4L2_PIX_FMT_JPEG);
2023 cap_q->fmt = mxc_jpeg_find_format(MXC_JPEG_DEFAULT_PFMT);
2024 }
2025
2026 for (i = 0; i < 2; i++) {
2027 q[i]->w = MXC_JPEG_DEFAULT_WIDTH;
2028 q[i]->h = MXC_JPEG_DEFAULT_HEIGHT;
2029 q[i]->w_adjusted = MXC_JPEG_DEFAULT_WIDTH;
2030 q[i]->h_adjusted = MXC_JPEG_DEFAULT_HEIGHT;
2031 q[i]->crop.left = 0;
2032 q[i]->crop.top = 0;
2033 q[i]->crop.width = MXC_JPEG_DEFAULT_WIDTH;
2034 q[i]->crop.height = MXC_JPEG_DEFAULT_HEIGHT;
2035 mxc_jpeg_bytesperline(q[i], q[i]->fmt->precision);
2036 mxc_jpeg_sizeimage(q[i]);
2037 }
2038 }
2039
mxc_jpeg_s_ctrl(struct v4l2_ctrl * ctrl)2040 static int mxc_jpeg_s_ctrl(struct v4l2_ctrl *ctrl)
2041 {
2042 struct mxc_jpeg_ctx *ctx =
2043 container_of(ctrl->handler, struct mxc_jpeg_ctx, ctrl_handler);
2044
2045 switch (ctrl->id) {
2046 case V4L2_CID_JPEG_COMPRESSION_QUALITY:
2047 ctx->jpeg_quality = ctrl->val;
2048 break;
2049 default:
2050 dev_err(ctx->mxc_jpeg->dev, "Invalid control, id = %d, val = %d\n",
2051 ctrl->id, ctrl->val);
2052 return -EINVAL;
2053 }
2054
2055 return 0;
2056 }
2057
2058 static const struct v4l2_ctrl_ops mxc_jpeg_ctrl_ops = {
2059 .s_ctrl = mxc_jpeg_s_ctrl,
2060 };
2061
mxc_jpeg_encode_ctrls(struct mxc_jpeg_ctx * ctx)2062 static void mxc_jpeg_encode_ctrls(struct mxc_jpeg_ctx *ctx)
2063 {
2064 v4l2_ctrl_new_std(&ctx->ctrl_handler, &mxc_jpeg_ctrl_ops,
2065 V4L2_CID_JPEG_COMPRESSION_QUALITY, 1, 100, 1, 75);
2066 }
2067
mxc_jpeg_ctrls_setup(struct mxc_jpeg_ctx * ctx)2068 static int mxc_jpeg_ctrls_setup(struct mxc_jpeg_ctx *ctx)
2069 {
2070 int err;
2071
2072 v4l2_ctrl_handler_init(&ctx->ctrl_handler, 2);
2073
2074 if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE)
2075 mxc_jpeg_encode_ctrls(ctx);
2076
2077 if (ctx->ctrl_handler.error) {
2078 err = ctx->ctrl_handler.error;
2079
2080 v4l2_ctrl_handler_free(&ctx->ctrl_handler);
2081 return err;
2082 }
2083
2084 err = v4l2_ctrl_handler_setup(&ctx->ctrl_handler);
2085 if (err)
2086 v4l2_ctrl_handler_free(&ctx->ctrl_handler);
2087 return err;
2088 }
2089
mxc_jpeg_open(struct file * file)2090 static int mxc_jpeg_open(struct file *file)
2091 {
2092 struct mxc_jpeg_dev *mxc_jpeg = video_drvdata(file);
2093 struct video_device *mxc_vfd = video_devdata(file);
2094 struct device *dev = mxc_jpeg->dev;
2095 struct mxc_jpeg_ctx *ctx;
2096 int ret = 0;
2097
2098 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2099 if (!ctx)
2100 return -ENOMEM;
2101
2102 if (mutex_lock_interruptible(&mxc_jpeg->lock)) {
2103 ret = -ERESTARTSYS;
2104 goto free;
2105 }
2106
2107 v4l2_fh_init(&ctx->fh, mxc_vfd);
2108 file->private_data = &ctx->fh;
2109 v4l2_fh_add(&ctx->fh);
2110
2111 ctx->mxc_jpeg = mxc_jpeg;
2112
2113 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(mxc_jpeg->m2m_dev, ctx,
2114 mxc_jpeg_queue_init);
2115
2116 if (IS_ERR(ctx->fh.m2m_ctx)) {
2117 ret = PTR_ERR(ctx->fh.m2m_ctx);
2118 goto error;
2119 }
2120
2121 ret = mxc_jpeg_ctrls_setup(ctx);
2122 if (ret) {
2123 dev_err(ctx->mxc_jpeg->dev, "failed to setup mxc jpeg controls\n");
2124 goto err_ctrls_setup;
2125 }
2126 ctx->fh.ctrl_handler = &ctx->ctrl_handler;
2127 mxc_jpeg_set_default_params(ctx);
2128 ctx->slot = -1; /* slot not allocated yet */
2129 INIT_DELAYED_WORK(&ctx->task_timer, mxc_jpeg_device_run_timeout);
2130
2131 if (mxc_jpeg->mode == MXC_JPEG_DECODE)
2132 dev_dbg(dev, "Opened JPEG decoder instance %p\n", ctx);
2133 else
2134 dev_dbg(dev, "Opened JPEG encoder instance %p\n", ctx);
2135 mutex_unlock(&mxc_jpeg->lock);
2136
2137 return 0;
2138
2139 err_ctrls_setup:
2140 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2141 error:
2142 v4l2_fh_del(&ctx->fh);
2143 v4l2_fh_exit(&ctx->fh);
2144 mutex_unlock(&mxc_jpeg->lock);
2145 free:
2146 kfree(ctx);
2147 return ret;
2148 }
2149
mxc_jpeg_querycap(struct file * file,void * priv,struct v4l2_capability * cap)2150 static int mxc_jpeg_querycap(struct file *file, void *priv,
2151 struct v4l2_capability *cap)
2152 {
2153 strscpy(cap->driver, MXC_JPEG_NAME " codec", sizeof(cap->driver));
2154 strscpy(cap->card, MXC_JPEG_NAME " codec", sizeof(cap->card));
2155 cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE;
2156 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
2157
2158 return 0;
2159 }
2160
mxc_jpeg_enum_fmt_vid_cap(struct file * file,void * priv,struct v4l2_fmtdesc * f)2161 static int mxc_jpeg_enum_fmt_vid_cap(struct file *file, void *priv,
2162 struct v4l2_fmtdesc *f)
2163 {
2164 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2165 struct mxc_jpeg_q_data *q_data = mxc_jpeg_get_q_data(ctx, f->type);
2166
2167 if (ctx->mxc_jpeg->mode == MXC_JPEG_ENCODE) {
2168 return enum_fmt(mxc_formats, MXC_JPEG_NUM_FORMATS, f,
2169 MXC_JPEG_FMT_TYPE_ENC);
2170 } else if (!ctx->header_parsed) {
2171 return enum_fmt(mxc_formats, MXC_JPEG_NUM_FORMATS, f,
2172 MXC_JPEG_FMT_TYPE_RAW);
2173 } else {
2174 /* For the decoder CAPTURE queue, only enumerate the raw formats
2175 * supported for the format currently active on OUTPUT
2176 * (more precisely what was propagated on capture queue
2177 * after jpeg parse on the output buffer)
2178 */
2179 int ret = -EINVAL;
2180 const struct mxc_jpeg_fmt *sibling;
2181
2182 switch (f->index) {
2183 case 0:
2184 f->pixelformat = q_data->fmt->fourcc;
2185 ret = 0;
2186 break;
2187 case 1:
2188 sibling = mxc_jpeg_get_sibling_format(q_data->fmt);
2189 if (sibling) {
2190 f->pixelformat = sibling->fourcc;
2191 ret = 0;
2192 }
2193 break;
2194 default:
2195 break;
2196 }
2197 return ret;
2198 }
2199 }
2200
mxc_jpeg_enum_fmt_vid_out(struct file * file,void * priv,struct v4l2_fmtdesc * f)2201 static int mxc_jpeg_enum_fmt_vid_out(struct file *file, void *priv,
2202 struct v4l2_fmtdesc *f)
2203 {
2204 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2205 u32 type = ctx->mxc_jpeg->mode == MXC_JPEG_DECODE ? MXC_JPEG_FMT_TYPE_ENC :
2206 MXC_JPEG_FMT_TYPE_RAW;
2207 int ret;
2208
2209 ret = enum_fmt(mxc_formats, MXC_JPEG_NUM_FORMATS, f, type);
2210 if (ret)
2211 return ret;
2212 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE)
2213 f->flags = V4L2_FMT_FLAG_DYN_RESOLUTION;
2214 return 0;
2215 }
2216
mxc_jpeg_get_fmt_type(struct mxc_jpeg_ctx * ctx,u32 type)2217 static u32 mxc_jpeg_get_fmt_type(struct mxc_jpeg_ctx *ctx, u32 type)
2218 {
2219 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE)
2220 return V4L2_TYPE_IS_OUTPUT(type) ? MXC_JPEG_FMT_TYPE_ENC : MXC_JPEG_FMT_TYPE_RAW;
2221 else
2222 return V4L2_TYPE_IS_CAPTURE(type) ? MXC_JPEG_FMT_TYPE_ENC : MXC_JPEG_FMT_TYPE_RAW;
2223 }
2224
mxc_jpeg_get_default_fourcc(struct mxc_jpeg_ctx * ctx,u32 type)2225 static u32 mxc_jpeg_get_default_fourcc(struct mxc_jpeg_ctx *ctx, u32 type)
2226 {
2227 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE)
2228 return V4L2_TYPE_IS_OUTPUT(type) ? V4L2_PIX_FMT_JPEG : MXC_JPEG_DEFAULT_PFMT;
2229 else
2230 return V4L2_TYPE_IS_CAPTURE(type) ? V4L2_PIX_FMT_JPEG : MXC_JPEG_DEFAULT_PFMT;
2231 }
2232
mxc_jpeg_try_fourcc(struct mxc_jpeg_ctx * ctx,u32 fourcc)2233 static u32 mxc_jpeg_try_fourcc(struct mxc_jpeg_ctx *ctx, u32 fourcc)
2234 {
2235 const struct mxc_jpeg_fmt *sibling;
2236 struct mxc_jpeg_q_data *q_data_cap;
2237
2238 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE)
2239 return fourcc;
2240 if (!ctx->header_parsed)
2241 return fourcc;
2242
2243 q_data_cap = &ctx->cap_q;
2244 if (q_data_cap->fmt->fourcc == fourcc)
2245 return fourcc;
2246
2247 sibling = mxc_jpeg_get_sibling_format(q_data_cap->fmt);
2248 if (sibling && sibling->fourcc == fourcc)
2249 return sibling->fourcc;
2250
2251 return q_data_cap->fmt->fourcc;
2252 }
2253
mxc_jpeg_try_fmt(struct v4l2_format * f,struct mxc_jpeg_ctx * ctx,struct mxc_jpeg_q_data * q_data)2254 static int mxc_jpeg_try_fmt(struct v4l2_format *f,
2255 struct mxc_jpeg_ctx *ctx, struct mxc_jpeg_q_data *q_data)
2256 {
2257 const struct mxc_jpeg_fmt *fmt;
2258 struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
2259 struct v4l2_plane_pix_format *pfmt;
2260 u32 fourcc = f->fmt.pix_mp.pixelformat;
2261 u32 w = (pix_mp->width < MXC_JPEG_MAX_WIDTH) ?
2262 pix_mp->width : MXC_JPEG_MAX_WIDTH;
2263 u32 h = (pix_mp->height < MXC_JPEG_MAX_HEIGHT) ?
2264 pix_mp->height : MXC_JPEG_MAX_HEIGHT;
2265 int i;
2266
2267 fmt = mxc_jpeg_find_format(fourcc);
2268 if (!fmt || fmt->flags != mxc_jpeg_get_fmt_type(ctx, f->type)) {
2269 dev_warn(ctx->mxc_jpeg->dev, "Format not supported: %c%c%c%c, use the default.\n",
2270 (fourcc & 0xff),
2271 (fourcc >> 8) & 0xff,
2272 (fourcc >> 16) & 0xff,
2273 (fourcc >> 24) & 0xff);
2274 fourcc = mxc_jpeg_get_default_fourcc(ctx, f->type);
2275 fmt = mxc_jpeg_find_format(fourcc);
2276 if (!fmt)
2277 return -EINVAL;
2278 f->fmt.pix_mp.pixelformat = fourcc;
2279 }
2280 q_data->fmt = fmt;
2281
2282 memset(pix_mp->reserved, 0, sizeof(pix_mp->reserved));
2283 pix_mp->field = V4L2_FIELD_NONE;
2284 pix_mp->num_planes = fmt->mem_planes;
2285 pix_mp->pixelformat = fmt->fourcc;
2286
2287 q_data->w = w;
2288 q_data->h = h;
2289 q_data->w_adjusted = w;
2290 q_data->h_adjusted = h;
2291 v4l_bound_align_image(&q_data->w_adjusted,
2292 w, /* adjust upwards*/
2293 MXC_JPEG_MAX_WIDTH,
2294 fmt->h_align,
2295 &q_data->h_adjusted,
2296 h, /* adjust upwards*/
2297 MXC_JPEG_MAX_HEIGHT,
2298 fmt->v_align,
2299 0);
2300 for (i = 0; i < pix_mp->num_planes; i++) {
2301 pfmt = &pix_mp->plane_fmt[i];
2302 q_data->bytesperline[i] = pfmt->bytesperline;
2303 q_data->sizeimage[i] = pfmt->sizeimage;
2304 }
2305
2306 /* calculate bytesperline & sizeimage */
2307 mxc_jpeg_bytesperline(q_data, fmt->precision);
2308 mxc_jpeg_sizeimage(q_data);
2309
2310 /* adjust user format according to our calculations */
2311 for (i = 0; i < pix_mp->num_planes; i++) {
2312 pfmt = &pix_mp->plane_fmt[i];
2313 memset(pfmt->reserved, 0, sizeof(pfmt->reserved));
2314 pfmt->bytesperline = q_data->bytesperline[i];
2315 pfmt->sizeimage = mxc_jpeg_get_plane_size(q_data, i);
2316 }
2317
2318 /* fix colorspace information to sRGB for both output & capture */
2319 pix_mp->colorspace = V4L2_COLORSPACE_SRGB;
2320 pix_mp->ycbcr_enc = V4L2_YCBCR_ENC_601;
2321 pix_mp->xfer_func = V4L2_XFER_FUNC_SRGB;
2322 /*
2323 * this hardware does not change the range of the samples
2324 * but since inside JPEG the YUV quantization is full-range,
2325 * this driver will always use full-range for the raw frames, too
2326 */
2327 pix_mp->quantization = V4L2_QUANTIZATION_FULL_RANGE;
2328
2329 if (fmt->flags == MXC_JPEG_FMT_TYPE_RAW) {
2330 q_data->crop.left = 0;
2331 q_data->crop.top = 0;
2332 q_data->crop.width = q_data->w;
2333 q_data->crop.height = q_data->h;
2334 }
2335
2336 pix_mp->width = q_data->w_adjusted;
2337 pix_mp->height = q_data->h_adjusted;
2338
2339 return 0;
2340 }
2341
mxc_jpeg_try_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)2342 static int mxc_jpeg_try_fmt_vid_cap(struct file *file, void *priv,
2343 struct v4l2_format *f)
2344 {
2345 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2346 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
2347 struct device *dev = jpeg->dev;
2348 struct mxc_jpeg_q_data tmp_q;
2349
2350 if (!V4L2_TYPE_IS_MULTIPLANAR(f->type)) {
2351 dev_err(dev, "TRY_FMT with Invalid type: %d\n", f->type);
2352 return -EINVAL;
2353 }
2354
2355 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE && V4L2_TYPE_IS_CAPTURE(f->type))
2356 f->fmt.pix_mp.pixelformat = mxc_jpeg_try_fourcc(ctx, f->fmt.pix_mp.pixelformat);
2357
2358 return mxc_jpeg_try_fmt(f, ctx, &tmp_q);
2359 }
2360
mxc_jpeg_try_fmt_vid_out(struct file * file,void * priv,struct v4l2_format * f)2361 static int mxc_jpeg_try_fmt_vid_out(struct file *file, void *priv,
2362 struct v4l2_format *f)
2363 {
2364 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2365 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
2366 struct device *dev = jpeg->dev;
2367 struct mxc_jpeg_q_data tmp_q;
2368
2369 if (!V4L2_TYPE_IS_MULTIPLANAR(f->type)) {
2370 dev_err(dev, "TRY_FMT with Invalid type: %d\n", f->type);
2371 return -EINVAL;
2372 }
2373
2374 return mxc_jpeg_try_fmt(f, ctx, &tmp_q);
2375 }
2376
mxc_jpeg_s_parsed_fmt(struct mxc_jpeg_ctx * ctx,struct v4l2_format * f)2377 static void mxc_jpeg_s_parsed_fmt(struct mxc_jpeg_ctx *ctx, struct v4l2_format *f)
2378 {
2379 struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
2380 struct mxc_jpeg_q_data *q_data_cap;
2381
2382 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE || !V4L2_TYPE_IS_CAPTURE(f->type))
2383 return;
2384 if (!ctx->header_parsed)
2385 return;
2386
2387 q_data_cap = mxc_jpeg_get_q_data(ctx, f->type);
2388 pix_mp->pixelformat = mxc_jpeg_try_fourcc(ctx, pix_mp->pixelformat);
2389 pix_mp->width = q_data_cap->w;
2390 pix_mp->height = q_data_cap->h;
2391 }
2392
mxc_jpeg_s_fmt(struct mxc_jpeg_ctx * ctx,struct v4l2_format * f)2393 static int mxc_jpeg_s_fmt(struct mxc_jpeg_ctx *ctx,
2394 struct v4l2_format *f)
2395 {
2396 struct vb2_queue *vq;
2397 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
2398
2399 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
2400 if (!vq)
2401 return -EINVAL;
2402
2403 if (vb2_is_busy(vq)) {
2404 v4l2_err(&jpeg->v4l2_dev, "queue busy\n");
2405 return -EBUSY;
2406 }
2407
2408 mxc_jpeg_s_parsed_fmt(ctx, f);
2409
2410 return mxc_jpeg_try_fmt(f, ctx, mxc_jpeg_get_q_data(ctx, f->type));
2411 }
2412
mxc_jpeg_s_fmt_vid_cap(struct file * file,void * priv,struct v4l2_format * f)2413 static int mxc_jpeg_s_fmt_vid_cap(struct file *file, void *priv,
2414 struct v4l2_format *f)
2415 {
2416 return mxc_jpeg_s_fmt(mxc_jpeg_fh_to_ctx(priv), f);
2417 }
2418
mxc_jpeg_s_fmt_vid_out(struct file * file,void * priv,struct v4l2_format * f)2419 static int mxc_jpeg_s_fmt_vid_out(struct file *file, void *priv,
2420 struct v4l2_format *f)
2421 {
2422 int ret;
2423 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2424 struct vb2_queue *dst_vq;
2425 struct mxc_jpeg_q_data *q_data_cap;
2426 enum v4l2_buf_type cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
2427 struct v4l2_format fc;
2428
2429 ret = mxc_jpeg_s_fmt(mxc_jpeg_fh_to_ctx(priv), f);
2430 if (ret)
2431 return ret;
2432
2433 if (ctx->mxc_jpeg->mode != MXC_JPEG_DECODE)
2434 return 0;
2435
2436 dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, cap_type);
2437 if (!dst_vq)
2438 return -EINVAL;
2439
2440 if (vb2_is_busy(dst_vq))
2441 return 0;
2442
2443 q_data_cap = mxc_jpeg_get_q_data(ctx, cap_type);
2444 if (q_data_cap->w == f->fmt.pix_mp.width && q_data_cap->h == f->fmt.pix_mp.height)
2445 return 0;
2446 memset(&fc, 0, sizeof(fc));
2447 fc.type = cap_type;
2448 fc.fmt.pix_mp.pixelformat = q_data_cap->fmt->fourcc;
2449 fc.fmt.pix_mp.width = f->fmt.pix_mp.width;
2450 fc.fmt.pix_mp.height = f->fmt.pix_mp.height;
2451
2452 return mxc_jpeg_s_fmt_vid_cap(file, priv, &fc);
2453 }
2454
mxc_jpeg_g_fmt_vid(struct file * file,void * priv,struct v4l2_format * f)2455 static int mxc_jpeg_g_fmt_vid(struct file *file, void *priv,
2456 struct v4l2_format *f)
2457 {
2458 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(priv);
2459 struct mxc_jpeg_dev *jpeg = ctx->mxc_jpeg;
2460 struct device *dev = jpeg->dev;
2461 struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
2462 struct mxc_jpeg_q_data *q_data = mxc_jpeg_get_q_data(ctx, f->type);
2463 int i;
2464
2465 if (!V4L2_TYPE_IS_MULTIPLANAR(f->type)) {
2466 dev_err(dev, "G_FMT with Invalid type: %d\n", f->type);
2467 return -EINVAL;
2468 }
2469
2470 pix_mp->pixelformat = q_data->fmt->fourcc;
2471 pix_mp->width = q_data->w;
2472 pix_mp->height = q_data->h;
2473 pix_mp->field = V4L2_FIELD_NONE;
2474 if (q_data->fmt->flags == MXC_JPEG_FMT_TYPE_RAW) {
2475 pix_mp->width = q_data->w_adjusted;
2476 pix_mp->height = q_data->h_adjusted;
2477 }
2478
2479 /* fix colorspace information to sRGB for both output & capture */
2480 pix_mp->colorspace = V4L2_COLORSPACE_SRGB;
2481 pix_mp->ycbcr_enc = V4L2_YCBCR_ENC_601;
2482 pix_mp->xfer_func = V4L2_XFER_FUNC_SRGB;
2483 pix_mp->quantization = V4L2_QUANTIZATION_FULL_RANGE;
2484
2485 pix_mp->num_planes = q_data->fmt->mem_planes;
2486 for (i = 0; i < pix_mp->num_planes; i++) {
2487 pix_mp->plane_fmt[i].bytesperline = q_data->bytesperline[i];
2488 pix_mp->plane_fmt[i].sizeimage = mxc_jpeg_get_plane_size(q_data, i);
2489 }
2490
2491 return 0;
2492 }
2493
mxc_jpeg_dec_g_selection(struct file * file,void * fh,struct v4l2_selection * s)2494 static int mxc_jpeg_dec_g_selection(struct file *file, void *fh, struct v4l2_selection *s)
2495 {
2496 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
2497 struct mxc_jpeg_q_data *q_data_cap;
2498
2499 if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE && s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
2500 return -EINVAL;
2501
2502 q_data_cap = mxc_jpeg_get_q_data(ctx, s->type);
2503
2504 switch (s->target) {
2505 case V4L2_SEL_TGT_COMPOSE:
2506 case V4L2_SEL_TGT_COMPOSE_DEFAULT:
2507 s->r = q_data_cap->crop;
2508 break;
2509 case V4L2_SEL_TGT_COMPOSE_PADDED:
2510 case V4L2_SEL_TGT_COMPOSE_BOUNDS:
2511 s->r.left = 0;
2512 s->r.top = 0;
2513 s->r.width = q_data_cap->w_adjusted;
2514 s->r.height = q_data_cap->h_adjusted;
2515 break;
2516 default:
2517 return -EINVAL;
2518 }
2519
2520 return 0;
2521 }
2522
mxc_jpeg_enc_g_selection(struct file * file,void * fh,struct v4l2_selection * s)2523 static int mxc_jpeg_enc_g_selection(struct file *file, void *fh, struct v4l2_selection *s)
2524 {
2525 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
2526 struct mxc_jpeg_q_data *q_data_out;
2527
2528 if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
2529 return -EINVAL;
2530
2531 q_data_out = mxc_jpeg_get_q_data(ctx, s->type);
2532
2533 switch (s->target) {
2534 case V4L2_SEL_TGT_CROP_DEFAULT:
2535 case V4L2_SEL_TGT_CROP_BOUNDS:
2536 s->r.left = 0;
2537 s->r.top = 0;
2538 s->r.width = q_data_out->w;
2539 s->r.height = q_data_out->h;
2540 break;
2541 case V4L2_SEL_TGT_CROP:
2542 s->r = q_data_out->crop;
2543 break;
2544 default:
2545 return -EINVAL;
2546 }
2547
2548 return 0;
2549 }
2550
mxc_jpeg_g_selection(struct file * file,void * fh,struct v4l2_selection * s)2551 static int mxc_jpeg_g_selection(struct file *file, void *fh, struct v4l2_selection *s)
2552 {
2553 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
2554
2555 if (ctx->mxc_jpeg->mode == MXC_JPEG_DECODE)
2556 return mxc_jpeg_dec_g_selection(file, fh, s);
2557 else
2558 return mxc_jpeg_enc_g_selection(file, fh, s);
2559 }
2560
mxc_jpeg_s_selection(struct file * file,void * fh,struct v4l2_selection * s)2561 static int mxc_jpeg_s_selection(struct file *file, void *fh, struct v4l2_selection *s)
2562 {
2563 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(fh);
2564 struct mxc_jpeg_q_data *q_data_out;
2565
2566 if (ctx->mxc_jpeg->mode != MXC_JPEG_ENCODE)
2567 return -ENOTTY;
2568
2569 if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
2570 return -EINVAL;
2571 if (s->target != V4L2_SEL_TGT_CROP)
2572 return -EINVAL;
2573
2574 q_data_out = mxc_jpeg_get_q_data(ctx, s->type);
2575 if (s->r.left || s->r.top)
2576 return -EINVAL;
2577 if (s->r.width > q_data_out->w || s->r.height > q_data_out->h)
2578 return -EINVAL;
2579
2580 q_data_out->crop.left = 0;
2581 q_data_out->crop.top = 0;
2582 q_data_out->crop.width = s->r.width;
2583 q_data_out->crop.height = s->r.height;
2584
2585 return 0;
2586 }
2587
mxc_jpeg_subscribe_event(struct v4l2_fh * fh,const struct v4l2_event_subscription * sub)2588 static int mxc_jpeg_subscribe_event(struct v4l2_fh *fh,
2589 const struct v4l2_event_subscription *sub)
2590 {
2591 switch (sub->type) {
2592 case V4L2_EVENT_EOS:
2593 return v4l2_event_subscribe(fh, sub, 0, NULL);
2594 case V4L2_EVENT_SOURCE_CHANGE:
2595 return v4l2_src_change_event_subscribe(fh, sub);
2596 case V4L2_EVENT_CTRL:
2597 return v4l2_ctrl_subscribe_event(fh, sub);
2598 default:
2599 return -EINVAL;
2600 }
2601 }
2602
2603 static const struct v4l2_ioctl_ops mxc_jpeg_ioctl_ops = {
2604 .vidioc_querycap = mxc_jpeg_querycap,
2605 .vidioc_enum_fmt_vid_cap = mxc_jpeg_enum_fmt_vid_cap,
2606 .vidioc_enum_fmt_vid_out = mxc_jpeg_enum_fmt_vid_out,
2607
2608 .vidioc_try_fmt_vid_cap_mplane = mxc_jpeg_try_fmt_vid_cap,
2609 .vidioc_try_fmt_vid_out_mplane = mxc_jpeg_try_fmt_vid_out,
2610
2611 .vidioc_s_fmt_vid_cap_mplane = mxc_jpeg_s_fmt_vid_cap,
2612 .vidioc_s_fmt_vid_out_mplane = mxc_jpeg_s_fmt_vid_out,
2613
2614 .vidioc_g_fmt_vid_cap_mplane = mxc_jpeg_g_fmt_vid,
2615 .vidioc_g_fmt_vid_out_mplane = mxc_jpeg_g_fmt_vid,
2616
2617 .vidioc_g_selection = mxc_jpeg_g_selection,
2618 .vidioc_s_selection = mxc_jpeg_s_selection,
2619
2620 .vidioc_subscribe_event = mxc_jpeg_subscribe_event,
2621 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
2622
2623 .vidioc_try_decoder_cmd = v4l2_m2m_ioctl_try_decoder_cmd,
2624 .vidioc_decoder_cmd = mxc_jpeg_decoder_cmd,
2625 .vidioc_try_encoder_cmd = v4l2_m2m_ioctl_try_encoder_cmd,
2626 .vidioc_encoder_cmd = mxc_jpeg_encoder_cmd,
2627
2628 .vidioc_qbuf = v4l2_m2m_ioctl_qbuf,
2629 .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf,
2630
2631 .vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs,
2632 .vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf,
2633 .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs,
2634 .vidioc_querybuf = v4l2_m2m_ioctl_querybuf,
2635 .vidioc_expbuf = v4l2_m2m_ioctl_expbuf,
2636 .vidioc_streamon = v4l2_m2m_ioctl_streamon,
2637 .vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
2638 };
2639
mxc_jpeg_release(struct file * file)2640 static int mxc_jpeg_release(struct file *file)
2641 {
2642 struct mxc_jpeg_dev *mxc_jpeg = video_drvdata(file);
2643 struct mxc_jpeg_ctx *ctx = mxc_jpeg_fh_to_ctx(file->private_data);
2644 struct device *dev = mxc_jpeg->dev;
2645
2646 mutex_lock(&mxc_jpeg->lock);
2647 if (mxc_jpeg->mode == MXC_JPEG_DECODE)
2648 dev_dbg(dev, "Release JPEG decoder instance on slot %d.",
2649 ctx->slot);
2650 else
2651 dev_dbg(dev, "Release JPEG encoder instance on slot %d.",
2652 ctx->slot);
2653 v4l2_ctrl_handler_free(&ctx->ctrl_handler);
2654 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
2655 v4l2_fh_del(&ctx->fh);
2656 v4l2_fh_exit(&ctx->fh);
2657 kfree(ctx);
2658 mutex_unlock(&mxc_jpeg->lock);
2659
2660 return 0;
2661 }
2662
2663 static const struct v4l2_file_operations mxc_jpeg_fops = {
2664 .owner = THIS_MODULE,
2665 .open = mxc_jpeg_open,
2666 .release = mxc_jpeg_release,
2667 .poll = v4l2_m2m_fop_poll,
2668 .unlocked_ioctl = video_ioctl2,
2669 .mmap = v4l2_m2m_fop_mmap,
2670 };
2671
2672 static const struct v4l2_m2m_ops mxc_jpeg_m2m_ops = {
2673 .job_ready = mxc_jpeg_job_ready,
2674 .device_run = mxc_jpeg_device_run,
2675 };
2676
mxc_jpeg_detach_pm_domains(struct mxc_jpeg_dev * jpeg)2677 static void mxc_jpeg_detach_pm_domains(struct mxc_jpeg_dev *jpeg)
2678 {
2679 int i;
2680
2681 for (i = 0; i < jpeg->num_domains; i++) {
2682 if (jpeg->pd_link[i] && !IS_ERR(jpeg->pd_link[i]))
2683 device_link_del(jpeg->pd_link[i]);
2684 if (jpeg->pd_dev[i] && !IS_ERR(jpeg->pd_dev[i]))
2685 dev_pm_domain_detach(jpeg->pd_dev[i], true);
2686 jpeg->pd_dev[i] = NULL;
2687 jpeg->pd_link[i] = NULL;
2688 }
2689 }
2690
mxc_jpeg_attach_pm_domains(struct mxc_jpeg_dev * jpeg)2691 static int mxc_jpeg_attach_pm_domains(struct mxc_jpeg_dev *jpeg)
2692 {
2693 struct device *dev = jpeg->dev;
2694 struct device_node *np = jpeg->pdev->dev.of_node;
2695 int i;
2696 int ret;
2697
2698 jpeg->num_domains = of_count_phandle_with_args(np, "power-domains",
2699 "#power-domain-cells");
2700 if (jpeg->num_domains < 0) {
2701 dev_err(dev, "No power domains defined for jpeg node\n");
2702 return jpeg->num_domains;
2703 }
2704 if (jpeg->num_domains == 1) {
2705 /* genpd_dev_pm_attach() attach automatically if power domains count is 1 */
2706 jpeg->num_domains = 0;
2707 return 0;
2708 }
2709
2710 jpeg->pd_dev = devm_kmalloc_array(dev, jpeg->num_domains,
2711 sizeof(*jpeg->pd_dev), GFP_KERNEL);
2712 if (!jpeg->pd_dev)
2713 return -ENOMEM;
2714
2715 jpeg->pd_link = devm_kmalloc_array(dev, jpeg->num_domains,
2716 sizeof(*jpeg->pd_link), GFP_KERNEL);
2717 if (!jpeg->pd_link)
2718 return -ENOMEM;
2719
2720 for (i = 0; i < jpeg->num_domains; i++) {
2721 jpeg->pd_dev[i] = dev_pm_domain_attach_by_id(dev, i);
2722 if (IS_ERR(jpeg->pd_dev[i])) {
2723 ret = PTR_ERR(jpeg->pd_dev[i]);
2724 goto fail;
2725 }
2726
2727 jpeg->pd_link[i] = device_link_add(dev, jpeg->pd_dev[i],
2728 DL_FLAG_STATELESS |
2729 DL_FLAG_PM_RUNTIME);
2730 if (!jpeg->pd_link[i]) {
2731 ret = -EINVAL;
2732 goto fail;
2733 }
2734 }
2735
2736 return 0;
2737 fail:
2738 mxc_jpeg_detach_pm_domains(jpeg);
2739 return ret;
2740 }
2741
mxc_jpeg_probe(struct platform_device * pdev)2742 static int mxc_jpeg_probe(struct platform_device *pdev)
2743 {
2744 struct mxc_jpeg_dev *jpeg;
2745 struct device *dev = &pdev->dev;
2746 int dec_irq;
2747 int ret;
2748 int mode;
2749 const struct of_device_id *of_id;
2750
2751 of_id = of_match_node(mxc_jpeg_match, dev->of_node);
2752 if (!of_id)
2753 return -ENODEV;
2754 mode = *(const int *)of_id->data;
2755
2756 jpeg = devm_kzalloc(dev, sizeof(struct mxc_jpeg_dev), GFP_KERNEL);
2757 if (!jpeg)
2758 return -ENOMEM;
2759
2760 mutex_init(&jpeg->lock);
2761 spin_lock_init(&jpeg->hw_lock);
2762
2763 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
2764 if (ret) {
2765 dev_err(&pdev->dev, "No suitable DMA available.\n");
2766 goto err_irq;
2767 }
2768
2769 jpeg->base_reg = devm_platform_ioremap_resource(pdev, 0);
2770 if (IS_ERR(jpeg->base_reg))
2771 return PTR_ERR(jpeg->base_reg);
2772
2773 ret = of_property_read_u32_index(pdev->dev.of_node, "slot", 0, &jpeg->slot_data.slot);
2774 if (ret)
2775 jpeg->slot_data.slot = 0;
2776 dev_info(&pdev->dev, "choose slot %d\n", jpeg->slot_data.slot);
2777 dec_irq = platform_get_irq(pdev, 0);
2778 if (dec_irq < 0) {
2779 ret = dec_irq;
2780 goto err_irq;
2781 }
2782 ret = devm_request_irq(&pdev->dev, dec_irq, mxc_jpeg_dec_irq,
2783 0, pdev->name, jpeg);
2784 if (ret) {
2785 dev_err(&pdev->dev, "Failed to request irq %d (%d)\n",
2786 dec_irq, ret);
2787 goto err_irq;
2788 }
2789
2790 jpeg->pdev = pdev;
2791 jpeg->dev = dev;
2792 jpeg->mode = mode;
2793
2794 /* Get clocks */
2795 ret = devm_clk_bulk_get_all(&pdev->dev, &jpeg->clks);
2796 if (ret < 0) {
2797 dev_err(dev, "failed to get clock\n");
2798 goto err_clk;
2799 }
2800 jpeg->num_clks = ret;
2801
2802 ret = mxc_jpeg_attach_pm_domains(jpeg);
2803 if (ret < 0) {
2804 dev_err(dev, "failed to attach power domains %d\n", ret);
2805 goto err_clk;
2806 }
2807
2808 /* v4l2 */
2809 ret = v4l2_device_register(dev, &jpeg->v4l2_dev);
2810 if (ret) {
2811 dev_err(dev, "failed to register v4l2 device\n");
2812 goto err_register;
2813 }
2814 jpeg->m2m_dev = v4l2_m2m_init(&mxc_jpeg_m2m_ops);
2815 if (IS_ERR(jpeg->m2m_dev)) {
2816 dev_err(dev, "failed to register v4l2 device\n");
2817 ret = PTR_ERR(jpeg->m2m_dev);
2818 goto err_m2m;
2819 }
2820
2821 jpeg->dec_vdev = video_device_alloc();
2822 if (!jpeg->dec_vdev) {
2823 dev_err(dev, "failed to register v4l2 device\n");
2824 ret = -ENOMEM;
2825 goto err_vdev_alloc;
2826 }
2827 if (mode == MXC_JPEG_ENCODE)
2828 snprintf(jpeg->dec_vdev->name,
2829 sizeof(jpeg->dec_vdev->name),
2830 "%s-enc", MXC_JPEG_NAME);
2831 else
2832 snprintf(jpeg->dec_vdev->name,
2833 sizeof(jpeg->dec_vdev->name),
2834 "%s-dec", MXC_JPEG_NAME);
2835
2836 jpeg->dec_vdev->fops = &mxc_jpeg_fops;
2837 jpeg->dec_vdev->ioctl_ops = &mxc_jpeg_ioctl_ops;
2838 jpeg->dec_vdev->minor = -1;
2839 jpeg->dec_vdev->release = video_device_release;
2840 jpeg->dec_vdev->lock = &jpeg->lock; /* lock for ioctl serialization */
2841 jpeg->dec_vdev->v4l2_dev = &jpeg->v4l2_dev;
2842 jpeg->dec_vdev->vfl_dir = VFL_DIR_M2M;
2843 jpeg->dec_vdev->device_caps = V4L2_CAP_STREAMING |
2844 V4L2_CAP_VIDEO_M2M_MPLANE;
2845 if (mode == MXC_JPEG_ENCODE) {
2846 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_DECODER_CMD);
2847 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_TRY_DECODER_CMD);
2848 } else {
2849 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_ENCODER_CMD);
2850 v4l2_disable_ioctl(jpeg->dec_vdev, VIDIOC_TRY_ENCODER_CMD);
2851 }
2852 ret = video_register_device(jpeg->dec_vdev, VFL_TYPE_VIDEO, -1);
2853 if (ret) {
2854 dev_err(dev, "failed to register video device\n");
2855 goto err_vdev_register;
2856 }
2857 video_set_drvdata(jpeg->dec_vdev, jpeg);
2858 if (mode == MXC_JPEG_ENCODE)
2859 v4l2_info(&jpeg->v4l2_dev,
2860 "encoder device registered as /dev/video%d (%d,%d)\n",
2861 jpeg->dec_vdev->num, VIDEO_MAJOR,
2862 jpeg->dec_vdev->minor);
2863 else
2864 v4l2_info(&jpeg->v4l2_dev,
2865 "decoder device registered as /dev/video%d (%d,%d)\n",
2866 jpeg->dec_vdev->num, VIDEO_MAJOR,
2867 jpeg->dec_vdev->minor);
2868
2869 platform_set_drvdata(pdev, jpeg);
2870 pm_runtime_enable(dev);
2871
2872 return 0;
2873
2874 err_vdev_register:
2875 video_device_release(jpeg->dec_vdev);
2876
2877 err_vdev_alloc:
2878 v4l2_m2m_release(jpeg->m2m_dev);
2879
2880 err_m2m:
2881 v4l2_device_unregister(&jpeg->v4l2_dev);
2882
2883 err_register:
2884 mxc_jpeg_detach_pm_domains(jpeg);
2885
2886 err_irq:
2887 err_clk:
2888 return ret;
2889 }
2890
2891 #ifdef CONFIG_PM
mxc_jpeg_runtime_resume(struct device * dev)2892 static int mxc_jpeg_runtime_resume(struct device *dev)
2893 {
2894 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev);
2895 int ret;
2896
2897 ret = clk_bulk_prepare_enable(jpeg->num_clks, jpeg->clks);
2898 if (ret < 0) {
2899 dev_err(dev, "failed to enable clock\n");
2900 return ret;
2901 }
2902
2903 return 0;
2904 }
2905
mxc_jpeg_runtime_suspend(struct device * dev)2906 static int mxc_jpeg_runtime_suspend(struct device *dev)
2907 {
2908 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev);
2909
2910 clk_bulk_disable_unprepare(jpeg->num_clks, jpeg->clks);
2911
2912 return 0;
2913 }
2914 #endif
2915
2916 #ifdef CONFIG_PM_SLEEP
mxc_jpeg_suspend(struct device * dev)2917 static int mxc_jpeg_suspend(struct device *dev)
2918 {
2919 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev);
2920
2921 v4l2_m2m_suspend(jpeg->m2m_dev);
2922 return pm_runtime_force_suspend(dev);
2923 }
2924
mxc_jpeg_resume(struct device * dev)2925 static int mxc_jpeg_resume(struct device *dev)
2926 {
2927 struct mxc_jpeg_dev *jpeg = dev_get_drvdata(dev);
2928 int ret;
2929
2930 ret = pm_runtime_force_resume(dev);
2931 if (ret < 0)
2932 return ret;
2933
2934 v4l2_m2m_resume(jpeg->m2m_dev);
2935 return ret;
2936 }
2937 #endif
2938
2939 static const struct dev_pm_ops mxc_jpeg_pm_ops = {
2940 SET_RUNTIME_PM_OPS(mxc_jpeg_runtime_suspend,
2941 mxc_jpeg_runtime_resume, NULL)
2942 SET_SYSTEM_SLEEP_PM_OPS(mxc_jpeg_suspend, mxc_jpeg_resume)
2943 };
2944
mxc_jpeg_remove(struct platform_device * pdev)2945 static void mxc_jpeg_remove(struct platform_device *pdev)
2946 {
2947 struct mxc_jpeg_dev *jpeg = platform_get_drvdata(pdev);
2948
2949 mxc_jpeg_free_slot_data(jpeg);
2950
2951 pm_runtime_disable(&pdev->dev);
2952 video_unregister_device(jpeg->dec_vdev);
2953 v4l2_m2m_release(jpeg->m2m_dev);
2954 v4l2_device_unregister(&jpeg->v4l2_dev);
2955 mxc_jpeg_detach_pm_domains(jpeg);
2956 }
2957
2958 MODULE_DEVICE_TABLE(of, mxc_jpeg_match);
2959
2960 static struct platform_driver mxc_jpeg_driver = {
2961 .probe = mxc_jpeg_probe,
2962 .remove_new = mxc_jpeg_remove,
2963 .driver = {
2964 .name = "mxc-jpeg",
2965 .of_match_table = mxc_jpeg_match,
2966 .pm = &mxc_jpeg_pm_ops,
2967 },
2968 };
2969 module_platform_driver(mxc_jpeg_driver);
2970
2971 MODULE_AUTHOR("Zhengyu Shen <zhengyu.shen_1@nxp.com>");
2972 MODULE_AUTHOR("Mirela Rabulea <mirela.rabulea@nxp.com>");
2973 MODULE_DESCRIPTION("V4L2 driver for i.MX8 QXP/QM JPEG encoder/decoder");
2974 MODULE_LICENSE("GPL v2");
2975