1 /* linux/drivers/media/platform/s5p-jpeg/jpeg-core.c
3 * Copyright (c) 2011-2014 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
6 * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
7 * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
14 #include <linux/clk.h>
15 #include <linux/err.h>
16 #include <linux/gfp.h>
17 #include <linux/interrupt.h>
19 #include <linux/kernel.h>
20 #include <linux/module.h>
22 #include <linux/platform_device.h>
23 #include <linux/pm_runtime.h>
24 #include <linux/slab.h>
25 #include <linux/spinlock.h>
26 #include <linux/string.h>
27 #include <media/v4l2-mem2mem.h>
28 #include <media/v4l2-ioctl.h>
29 #include <media/videobuf2-v4l2.h>
30 #include <media/videobuf2-dma-contig.h>
32 #include "jpeg-core.h"
33 #include "jpeg-hw-s5p.h"
34 #include "jpeg-hw-exynos4.h"
35 #include "jpeg-hw-exynos3250.h"
36 #include "jpeg-regs.h"
38 static struct s5p_jpeg_fmt sjpeg_formats[] = {
41 .fourcc = V4L2_PIX_FMT_JPEG,
42 .flags = SJPEG_FMT_FLAG_ENC_CAPTURE |
43 SJPEG_FMT_FLAG_DEC_OUTPUT |
45 SJPEG_FMT_FLAG_EXYNOS3250 |
46 SJPEG_FMT_FLAG_EXYNOS4,
49 .name = "YUV 4:2:2 packed, YCbYCr",
50 .fourcc = V4L2_PIX_FMT_YUYV,
55 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
56 SJPEG_FMT_FLAG_DEC_CAPTURE |
59 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
62 .name = "YUV 4:2:2 packed, YCbYCr",
63 .fourcc = V4L2_PIX_FMT_YUYV,
68 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
69 SJPEG_FMT_FLAG_DEC_CAPTURE |
70 SJPEG_FMT_FLAG_EXYNOS4 |
72 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
75 .name = "YUV 4:2:2 packed, YCbYCr",
76 .fourcc = V4L2_PIX_FMT_YUYV,
81 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
82 SJPEG_FMT_FLAG_DEC_CAPTURE |
83 SJPEG_FMT_FLAG_EXYNOS3250 |
85 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
88 .name = "YUV 4:2:2 packed, YCrYCb",
89 .fourcc = V4L2_PIX_FMT_YVYU,
94 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
95 SJPEG_FMT_FLAG_DEC_CAPTURE |
96 SJPEG_FMT_FLAG_EXYNOS4 |
98 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
101 .name = "YUV 4:2:2 packed, YCrYCb",
102 .fourcc = V4L2_PIX_FMT_YVYU,
107 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
108 SJPEG_FMT_FLAG_DEC_CAPTURE |
109 SJPEG_FMT_FLAG_EXYNOS3250 |
111 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
114 .name = "YUV 4:2:2 packed, YCrYCb",
115 .fourcc = V4L2_PIX_FMT_UYVY,
120 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
121 SJPEG_FMT_FLAG_DEC_CAPTURE |
122 SJPEG_FMT_FLAG_EXYNOS3250 |
124 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
127 .name = "YUV 4:2:2 packed, YCrYCb",
128 .fourcc = V4L2_PIX_FMT_VYUY,
133 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
134 SJPEG_FMT_FLAG_DEC_CAPTURE |
135 SJPEG_FMT_FLAG_EXYNOS3250 |
137 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
141 .fourcc = V4L2_PIX_FMT_RGB565,
146 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
147 SJPEG_FMT_FLAG_DEC_CAPTURE |
148 SJPEG_FMT_FLAG_EXYNOS4 |
150 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
154 .fourcc = V4L2_PIX_FMT_RGB565,
159 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
160 SJPEG_FMT_FLAG_DEC_CAPTURE |
161 SJPEG_FMT_FLAG_EXYNOS3250 |
163 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
167 .fourcc = V4L2_PIX_FMT_RGB565X,
172 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
173 SJPEG_FMT_FLAG_DEC_CAPTURE |
174 SJPEG_FMT_FLAG_EXYNOS3250 |
176 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
180 .fourcc = V4L2_PIX_FMT_RGB565,
185 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
188 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
191 .name = "ARGB8888, 32 bpp",
192 .fourcc = V4L2_PIX_FMT_RGB32,
197 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
198 SJPEG_FMT_FLAG_DEC_CAPTURE |
199 SJPEG_FMT_FLAG_EXYNOS4 |
201 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
204 .name = "ARGB8888, 32 bpp",
205 .fourcc = V4L2_PIX_FMT_RGB32,
210 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
211 SJPEG_FMT_FLAG_DEC_CAPTURE |
212 SJPEG_FMT_FLAG_EXYNOS3250 |
214 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
217 .name = "YUV 4:4:4 planar, Y/CbCr",
218 .fourcc = V4L2_PIX_FMT_NV24,
223 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
224 SJPEG_FMT_FLAG_DEC_CAPTURE |
225 SJPEG_FMT_FLAG_EXYNOS4 |
227 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
230 .name = "YUV 4:4:4 planar, Y/CrCb",
231 .fourcc = V4L2_PIX_FMT_NV42,
236 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
237 SJPEG_FMT_FLAG_DEC_CAPTURE |
238 SJPEG_FMT_FLAG_EXYNOS4 |
240 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444,
243 .name = "YUV 4:2:2 planar, Y/CrCb",
244 .fourcc = V4L2_PIX_FMT_NV61,
249 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
250 SJPEG_FMT_FLAG_DEC_CAPTURE |
251 SJPEG_FMT_FLAG_EXYNOS4 |
253 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
256 .name = "YUV 4:2:2 planar, Y/CbCr",
257 .fourcc = V4L2_PIX_FMT_NV16,
262 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
263 SJPEG_FMT_FLAG_DEC_CAPTURE |
264 SJPEG_FMT_FLAG_EXYNOS4 |
266 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422,
269 .name = "YUV 4:2:0 planar, Y/CbCr",
270 .fourcc = V4L2_PIX_FMT_NV12,
275 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
276 SJPEG_FMT_FLAG_DEC_CAPTURE |
277 SJPEG_FMT_FLAG_EXYNOS4 |
279 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
282 .name = "YUV 4:2:0 planar, Y/CbCr",
283 .fourcc = V4L2_PIX_FMT_NV12,
288 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
289 SJPEG_FMT_FLAG_DEC_CAPTURE |
290 SJPEG_FMT_FLAG_EXYNOS3250 |
292 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
295 .name = "YUV 4:2:0 planar, Y/CbCr",
296 .fourcc = V4L2_PIX_FMT_NV12,
301 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
302 SJPEG_FMT_FLAG_DEC_CAPTURE |
305 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
308 .name = "YUV 4:2:0 planar, Y/CrCb",
309 .fourcc = V4L2_PIX_FMT_NV21,
314 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
315 SJPEG_FMT_FLAG_DEC_CAPTURE |
316 SJPEG_FMT_FLAG_EXYNOS3250 |
318 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
321 .name = "YUV 4:2:0 planar, Y/CrCb",
322 .fourcc = V4L2_PIX_FMT_NV21,
327 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
328 SJPEG_FMT_FLAG_DEC_CAPTURE |
329 SJPEG_FMT_FLAG_EXYNOS3250 |
330 SJPEG_FMT_FLAG_EXYNOS4 |
332 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
335 .name = "YUV 4:2:0 contiguous 3-planar, Y/Cb/Cr",
336 .fourcc = V4L2_PIX_FMT_YUV420,
341 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
342 SJPEG_FMT_FLAG_DEC_CAPTURE |
343 SJPEG_FMT_FLAG_EXYNOS4 |
345 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
348 .name = "YUV 4:2:0 contiguous 3-planar, Y/Cb/Cr",
349 .fourcc = V4L2_PIX_FMT_YUV420,
354 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
355 SJPEG_FMT_FLAG_DEC_CAPTURE |
356 SJPEG_FMT_FLAG_EXYNOS3250 |
358 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420,
362 .fourcc = V4L2_PIX_FMT_GREY,
365 .flags = SJPEG_FMT_FLAG_ENC_OUTPUT |
366 SJPEG_FMT_FLAG_DEC_CAPTURE |
367 SJPEG_FMT_FLAG_EXYNOS4 |
369 .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY,
372 #define SJPEG_NUM_FORMATS ARRAY_SIZE(sjpeg_formats)
374 static const unsigned char qtbl_luminance[4][64] = {
375 {/*level 0 - high compression quality */
376 20, 16, 25, 39, 50, 46, 62, 68,
377 16, 18, 23, 38, 38, 53, 65, 68,
378 25, 23, 31, 38, 53, 65, 68, 68,
379 39, 38, 38, 53, 65, 68, 68, 68,
380 50, 38, 53, 65, 68, 68, 68, 68,
381 46, 53, 65, 68, 68, 68, 68, 68,
382 62, 65, 68, 68, 68, 68, 68, 68,
383 68, 68, 68, 68, 68, 68, 68, 68
386 16, 11, 11, 16, 23, 27, 31, 30,
387 11, 12, 12, 15, 20, 23, 23, 30,
388 11, 12, 13, 16, 23, 26, 35, 47,
389 16, 15, 16, 23, 26, 37, 47, 64,
390 23, 20, 23, 26, 39, 51, 64, 64,
391 27, 23, 26, 37, 51, 64, 64, 64,
392 31, 23, 35, 47, 64, 64, 64, 64,
393 30, 30, 47, 64, 64, 64, 64, 64
396 12, 8, 8, 12, 17, 21, 24, 23,
397 8, 9, 9, 11, 15, 19, 18, 23,
398 8, 9, 10, 12, 19, 20, 27, 36,
399 12, 11, 12, 21, 20, 28, 36, 53,
400 17, 15, 19, 20, 30, 39, 51, 59,
401 21, 19, 20, 28, 39, 51, 59, 59,
402 24, 18, 27, 36, 51, 59, 59, 59,
403 23, 23, 36, 53, 59, 59, 59, 59
405 {/* level 3 - low compression quality */
406 8, 6, 6, 8, 12, 14, 16, 17,
407 6, 6, 6, 8, 10, 13, 12, 15,
408 6, 6, 7, 8, 13, 14, 18, 24,
409 8, 8, 8, 14, 13, 19, 24, 35,
410 12, 10, 13, 13, 20, 26, 34, 39,
411 14, 13, 14, 19, 26, 34, 39, 39,
412 16, 12, 18, 24, 34, 39, 39, 39,
413 17, 15, 24, 35, 39, 39, 39, 39
417 static const unsigned char qtbl_chrominance[4][64] = {
418 {/*level 0 - high compression quality */
419 21, 25, 32, 38, 54, 68, 68, 68,
420 25, 28, 24, 38, 54, 68, 68, 68,
421 32, 24, 32, 43, 66, 68, 68, 68,
422 38, 38, 43, 53, 68, 68, 68, 68,
423 54, 54, 66, 68, 68, 68, 68, 68,
424 68, 68, 68, 68, 68, 68, 68, 68,
425 68, 68, 68, 68, 68, 68, 68, 68,
426 68, 68, 68, 68, 68, 68, 68, 68
429 17, 15, 17, 21, 20, 26, 38, 48,
430 15, 19, 18, 17, 20, 26, 35, 43,
431 17, 18, 20, 22, 26, 30, 46, 53,
432 21, 17, 22, 28, 30, 39, 53, 64,
433 20, 20, 26, 30, 39, 48, 64, 64,
434 26, 26, 30, 39, 48, 63, 64, 64,
435 38, 35, 46, 53, 64, 64, 64, 64,
436 48, 43, 53, 64, 64, 64, 64, 64
439 13, 11, 13, 16, 20, 20, 29, 37,
440 11, 14, 14, 14, 16, 20, 26, 32,
441 13, 14, 15, 17, 20, 23, 35, 40,
442 16, 14, 17, 21, 23, 30, 40, 50,
443 20, 16, 20, 23, 30, 37, 50, 59,
444 20, 20, 23, 30, 37, 48, 59, 59,
445 29, 26, 35, 40, 50, 59, 59, 59,
446 37, 32, 40, 50, 59, 59, 59, 59
448 {/* level 3 - low compression quality */
449 9, 8, 9, 11, 14, 17, 19, 24,
450 8, 10, 9, 11, 14, 13, 17, 22,
451 9, 9, 13, 14, 13, 15, 23, 26,
452 11, 11, 14, 14, 15, 20, 26, 33,
453 14, 14, 13, 15, 20, 24, 33, 39,
454 17, 13, 15, 20, 24, 32, 39, 39,
455 19, 17, 23, 26, 33, 39, 39, 39,
456 24, 22, 26, 33, 39, 39, 39, 39
460 static const unsigned char hdctbl0[16] = {
461 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
464 static const unsigned char hdctblg0[12] = {
465 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb
467 static const unsigned char hactbl0[16] = {
468 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
470 static const unsigned char hactblg0[162] = {
471 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
472 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
473 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
474 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
475 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
476 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
477 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
478 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
479 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
480 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
481 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
482 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
483 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
484 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
485 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
486 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
487 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
488 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
489 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
490 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
495 * Fourcc downgrade schema lookup tables for 422 and 420
496 * chroma subsampling - fourcc on each position maps on the
497 * fourcc from the table fourcc_to_dwngrd_schema_id which allows
498 * to get the most suitable fourcc counterpart for the given
499 * downgraded subsampling property.
501 static const u32 subs422_fourcc_dwngrd_schema[] = {
506 static const u32 subs420_fourcc_dwngrd_schema[] = {
520 * Lookup table for translation of a fourcc to the position
521 * of its downgraded counterpart in the *fourcc_dwngrd_schema
524 static const u32 fourcc_to_dwngrd_schema_id[] = {
537 static int s5p_jpeg_get_dwngrd_sch_id_by_fourcc(u32 fourcc)
541 for (i = 0; i < ARRAY_SIZE(fourcc_to_dwngrd_schema_id); ++i) {
542 if (fourcc_to_dwngrd_schema_id[i] == fourcc)
549 static int s5p_jpeg_adjust_fourcc_to_subsampling(
550 enum v4l2_jpeg_chroma_subsampling subs,
553 struct s5p_jpeg_ctx *ctx)
557 if (ctx->subsampling != V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY) {
559 s5p_jpeg_get_dwngrd_sch_id_by_fourcc(in_fourcc);
560 if (dwngrd_sch_id < 0)
564 switch (ctx->subsampling) {
565 case V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY:
566 *out_fourcc = V4L2_PIX_FMT_GREY;
568 case V4L2_JPEG_CHROMA_SUBSAMPLING_420:
570 ARRAY_SIZE(subs420_fourcc_dwngrd_schema) - 1)
572 *out_fourcc = subs420_fourcc_dwngrd_schema[dwngrd_sch_id];
574 case V4L2_JPEG_CHROMA_SUBSAMPLING_422:
576 ARRAY_SIZE(subs422_fourcc_dwngrd_schema) - 1)
578 *out_fourcc = subs422_fourcc_dwngrd_schema[dwngrd_sch_id];
581 *out_fourcc = V4L2_PIX_FMT_GREY;
588 static int exynos4x12_decoded_subsampling[] = {
589 V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY,
590 V4L2_JPEG_CHROMA_SUBSAMPLING_444,
591 V4L2_JPEG_CHROMA_SUBSAMPLING_422,
592 V4L2_JPEG_CHROMA_SUBSAMPLING_420,
595 static int exynos3250_decoded_subsampling[] = {
596 V4L2_JPEG_CHROMA_SUBSAMPLING_444,
597 V4L2_JPEG_CHROMA_SUBSAMPLING_422,
598 V4L2_JPEG_CHROMA_SUBSAMPLING_420,
599 V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY,
602 V4L2_JPEG_CHROMA_SUBSAMPLING_411,
605 static inline struct s5p_jpeg_ctx *ctrl_to_ctx(struct v4l2_ctrl *c)
607 return container_of(c->handler, struct s5p_jpeg_ctx, ctrl_handler);
610 static inline struct s5p_jpeg_ctx *fh_to_ctx(struct v4l2_fh *fh)
612 return container_of(fh, struct s5p_jpeg_ctx, fh);
615 static int s5p_jpeg_to_user_subsampling(struct s5p_jpeg_ctx *ctx)
617 WARN_ON(ctx->subsampling > 3);
619 switch (ctx->jpeg->variant->version) {
621 if (ctx->subsampling > 2)
622 return V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY;
623 return ctx->subsampling;
624 case SJPEG_EXYNOS3250:
625 case SJPEG_EXYNOS5420:
626 if (ctx->subsampling > 3)
627 return V4L2_JPEG_CHROMA_SUBSAMPLING_411;
628 return exynos3250_decoded_subsampling[ctx->subsampling];
630 case SJPEG_EXYNOS5433:
631 if (ctx->subsampling > 2)
632 return V4L2_JPEG_CHROMA_SUBSAMPLING_420;
633 return exynos4x12_decoded_subsampling[ctx->subsampling];
635 return V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY;
639 static inline void s5p_jpeg_set_qtbl(void __iomem *regs,
640 const unsigned char *qtbl,
641 unsigned long tab, int len)
645 for (i = 0; i < len; i++)
646 writel((unsigned int)qtbl[i], regs + tab + (i * 0x04));
649 static inline void s5p_jpeg_set_qtbl_lum(void __iomem *regs, int quality)
651 /* this driver fills quantisation table 0 with data for luma */
652 s5p_jpeg_set_qtbl(regs, qtbl_luminance[quality],
653 S5P_JPG_QTBL_CONTENT(0),
654 ARRAY_SIZE(qtbl_luminance[quality]));
657 static inline void s5p_jpeg_set_qtbl_chr(void __iomem *regs, int quality)
659 /* this driver fills quantisation table 1 with data for chroma */
660 s5p_jpeg_set_qtbl(regs, qtbl_chrominance[quality],
661 S5P_JPG_QTBL_CONTENT(1),
662 ARRAY_SIZE(qtbl_chrominance[quality]));
665 static inline void s5p_jpeg_set_htbl(void __iomem *regs,
666 const unsigned char *htbl,
667 unsigned long tab, int len)
671 for (i = 0; i < len; i++)
672 writel((unsigned int)htbl[i], regs + tab + (i * 0x04));
675 static inline void s5p_jpeg_set_hdctbl(void __iomem *regs)
677 /* this driver fills table 0 for this component */
678 s5p_jpeg_set_htbl(regs, hdctbl0, S5P_JPG_HDCTBL(0),
679 ARRAY_SIZE(hdctbl0));
682 static inline void s5p_jpeg_set_hdctblg(void __iomem *regs)
684 /* this driver fills table 0 for this component */
685 s5p_jpeg_set_htbl(regs, hdctblg0, S5P_JPG_HDCTBLG(0),
686 ARRAY_SIZE(hdctblg0));
689 static inline void s5p_jpeg_set_hactbl(void __iomem *regs)
691 /* this driver fills table 0 for this component */
692 s5p_jpeg_set_htbl(regs, hactbl0, S5P_JPG_HACTBL(0),
693 ARRAY_SIZE(hactbl0));
696 static inline void s5p_jpeg_set_hactblg(void __iomem *regs)
698 /* this driver fills table 0 for this component */
699 s5p_jpeg_set_htbl(regs, hactblg0, S5P_JPG_HACTBLG(0),
700 ARRAY_SIZE(hactblg0));
703 static inline void exynos4_jpeg_set_tbl(void __iomem *regs,
704 const unsigned char *tbl,
705 unsigned long tab, int len)
710 for (i = 0; i < len; i += 4) {
715 writel(dword, regs + tab + i);
719 static inline void exynos4_jpeg_set_qtbl_lum(void __iomem *regs, int quality)
721 /* this driver fills quantisation table 0 with data for luma */
722 exynos4_jpeg_set_tbl(regs, qtbl_luminance[quality],
723 EXYNOS4_QTBL_CONTENT(0),
724 ARRAY_SIZE(qtbl_luminance[quality]));
727 static inline void exynos4_jpeg_set_qtbl_chr(void __iomem *regs, int quality)
729 /* this driver fills quantisation table 1 with data for chroma */
730 exynos4_jpeg_set_tbl(regs, qtbl_chrominance[quality],
731 EXYNOS4_QTBL_CONTENT(1),
732 ARRAY_SIZE(qtbl_chrominance[quality]));
735 static void exynos4_jpeg_set_huff_tbl(void __iomem *base)
737 exynos4_jpeg_set_tbl(base, hdctbl0, EXYNOS4_HUFF_TBL_HDCLL,
738 ARRAY_SIZE(hdctbl0));
739 exynos4_jpeg_set_tbl(base, hdctbl0, EXYNOS4_HUFF_TBL_HDCCL,
740 ARRAY_SIZE(hdctbl0));
741 exynos4_jpeg_set_tbl(base, hdctblg0, EXYNOS4_HUFF_TBL_HDCLV,
742 ARRAY_SIZE(hdctblg0));
743 exynos4_jpeg_set_tbl(base, hdctblg0, EXYNOS4_HUFF_TBL_HDCCV,
744 ARRAY_SIZE(hdctblg0));
745 exynos4_jpeg_set_tbl(base, hactbl0, EXYNOS4_HUFF_TBL_HACLL,
746 ARRAY_SIZE(hactbl0));
747 exynos4_jpeg_set_tbl(base, hactbl0, EXYNOS4_HUFF_TBL_HACCL,
748 ARRAY_SIZE(hactbl0));
749 exynos4_jpeg_set_tbl(base, hactblg0, EXYNOS4_HUFF_TBL_HACLV,
750 ARRAY_SIZE(hactblg0));
751 exynos4_jpeg_set_tbl(base, hactblg0, EXYNOS4_HUFF_TBL_HACCV,
752 ARRAY_SIZE(hactblg0));
755 static inline int __exynos4_huff_tbl(int class, int id, bool lenval)
758 * class: 0 - DC, 1 - AC
759 * id: 0 - Y, 1 - Cb/Cr
763 return lenval ? EXYNOS4_HUFF_TBL_HACCL :
764 EXYNOS4_HUFF_TBL_HACCV;
765 return lenval ? EXYNOS4_HUFF_TBL_HACLL : EXYNOS4_HUFF_TBL_HACLV;
770 return lenval ? EXYNOS4_HUFF_TBL_HDCCL : EXYNOS4_HUFF_TBL_HDCCV;
772 return lenval ? EXYNOS4_HUFF_TBL_HDCLL : EXYNOS4_HUFF_TBL_HDCLV;
775 static inline int exynos4_huff_tbl_len(int class, int id)
777 return __exynos4_huff_tbl(class, id, true);
780 static inline int exynos4_huff_tbl_val(int class, int id)
782 return __exynos4_huff_tbl(class, id, false);
785 static int get_byte(struct s5p_jpeg_buffer *buf);
786 static int get_word_be(struct s5p_jpeg_buffer *buf, unsigned int *word);
787 static void skip(struct s5p_jpeg_buffer *buf, long len);
789 static void exynos4_jpeg_parse_decode_h_tbl(struct s5p_jpeg_ctx *ctx)
791 struct s5p_jpeg *jpeg = ctx->jpeg;
792 struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
793 struct s5p_jpeg_buffer jpeg_buffer;
795 int c, x, components;
797 jpeg_buffer.size = 2; /* Ls */
799 (unsigned long)vb2_plane_vaddr(vb, 0) + ctx->out_q.sos + 2;
800 jpeg_buffer.curr = 0;
804 if (get_word_be(&jpeg_buffer, &word))
806 jpeg_buffer.size = (long)word - 2;
807 jpeg_buffer.data += 2;
808 jpeg_buffer.curr = 0;
810 components = get_byte(&jpeg_buffer);
811 if (components == -1)
813 while (components--) {
814 c = get_byte(&jpeg_buffer);
817 x = get_byte(&jpeg_buffer);
820 exynos4_jpeg_select_dec_h_tbl(jpeg->regs, c,
821 (((x >> 4) & 0x1) << 1) | (x & 0x1));
826 static void exynos4_jpeg_parse_huff_tbl(struct s5p_jpeg_ctx *ctx)
828 struct s5p_jpeg *jpeg = ctx->jpeg;
829 struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
830 struct s5p_jpeg_buffer jpeg_buffer;
834 for (j = 0; j < ctx->out_q.dht.n; ++j) {
835 jpeg_buffer.size = ctx->out_q.dht.len[j];
836 jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(vb, 0) +
837 ctx->out_q.dht.marker[j];
838 jpeg_buffer.curr = 0;
841 while (jpeg_buffer.curr < jpeg_buffer.size) {
844 c = get_byte(&jpeg_buffer);
848 class = (c >> 4) & 0xf;
850 for (i = 0; i < 16; ++i) {
851 c = get_byte(&jpeg_buffer);
854 word |= c << ((i % 4) * 8);
855 if ((i + 1) % 4 == 0) {
856 writel(word, jpeg->regs +
857 exynos4_huff_tbl_len(class, id) +
864 for (i = 0; i < n; ++i) {
865 c = get_byte(&jpeg_buffer);
868 word |= c << ((i % 4) * 8);
869 if ((i + 1) % 4 == 0) {
870 writel(word, jpeg->regs +
871 exynos4_huff_tbl_val(class, id) +
877 writel(word, jpeg->regs +
878 exynos4_huff_tbl_val(class, id) + (i / 4) * 4);
885 static void exynos4_jpeg_parse_decode_q_tbl(struct s5p_jpeg_ctx *ctx)
887 struct s5p_jpeg *jpeg = ctx->jpeg;
888 struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
889 struct s5p_jpeg_buffer jpeg_buffer;
890 int c, x, components;
892 jpeg_buffer.size = ctx->out_q.sof_len;
894 (unsigned long)vb2_plane_vaddr(vb, 0) + ctx->out_q.sof;
895 jpeg_buffer.curr = 0;
897 skip(&jpeg_buffer, 5); /* P, Y, X */
898 components = get_byte(&jpeg_buffer);
899 if (components == -1)
902 exynos4_jpeg_set_dec_components(jpeg->regs, components);
904 while (components--) {
905 c = get_byte(&jpeg_buffer);
908 skip(&jpeg_buffer, 1);
909 x = get_byte(&jpeg_buffer);
912 exynos4_jpeg_select_dec_q_tbl(jpeg->regs, c, x);
916 static void exynos4_jpeg_parse_q_tbl(struct s5p_jpeg_ctx *ctx)
918 struct s5p_jpeg *jpeg = ctx->jpeg;
919 struct vb2_buffer *vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
920 struct s5p_jpeg_buffer jpeg_buffer;
924 for (j = 0; j < ctx->out_q.dqt.n; ++j) {
925 jpeg_buffer.size = ctx->out_q.dqt.len[j];
926 jpeg_buffer.data = (unsigned long)vb2_plane_vaddr(vb, 0) +
927 ctx->out_q.dqt.marker[j];
928 jpeg_buffer.curr = 0;
931 while (jpeg_buffer.size - jpeg_buffer.curr >= 65) {
934 c = get_byte(&jpeg_buffer);
938 /* nonzero means extended mode - not supported */
941 for (i = 0; i < 64; ++i) {
942 c = get_byte(&jpeg_buffer);
945 word |= c << ((i % 4) * 8);
946 if ((i + 1) % 4 == 0) {
947 writel(word, jpeg->regs +
948 EXYNOS4_QTBL_CONTENT(id) + (i / 4) * 4);
958 * ============================================================================
959 * Device file operations
960 * ============================================================================
963 static int queue_init(void *priv, struct vb2_queue *src_vq,
964 struct vb2_queue *dst_vq);
965 static struct s5p_jpeg_fmt *s5p_jpeg_find_format(struct s5p_jpeg_ctx *ctx,
966 __u32 pixelformat, unsigned int fmt_type);
967 static int s5p_jpeg_controls_create(struct s5p_jpeg_ctx *ctx);
969 static int s5p_jpeg_open(struct file *file)
971 struct s5p_jpeg *jpeg = video_drvdata(file);
972 struct video_device *vfd = video_devdata(file);
973 struct s5p_jpeg_ctx *ctx;
974 struct s5p_jpeg_fmt *out_fmt, *cap_fmt;
977 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
981 if (mutex_lock_interruptible(&jpeg->lock)) {
986 v4l2_fh_init(&ctx->fh, vfd);
987 /* Use separate control handler per file handle */
988 ctx->fh.ctrl_handler = &ctx->ctrl_handler;
989 file->private_data = &ctx->fh;
990 v4l2_fh_add(&ctx->fh);
993 if (vfd == jpeg->vfd_encoder) {
994 ctx->mode = S5P_JPEG_ENCODE;
995 out_fmt = s5p_jpeg_find_format(ctx, V4L2_PIX_FMT_RGB565,
997 cap_fmt = s5p_jpeg_find_format(ctx, V4L2_PIX_FMT_JPEG,
1000 ctx->mode = S5P_JPEG_DECODE;
1001 out_fmt = s5p_jpeg_find_format(ctx, V4L2_PIX_FMT_JPEG,
1003 cap_fmt = s5p_jpeg_find_format(ctx, V4L2_PIX_FMT_YUYV,
1005 ctx->scale_factor = EXYNOS3250_DEC_SCALE_FACTOR_8_8;
1008 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(jpeg->m2m_dev, ctx, queue_init);
1009 if (IS_ERR(ctx->fh.m2m_ctx)) {
1010 ret = PTR_ERR(ctx->fh.m2m_ctx);
1014 ctx->out_q.fmt = out_fmt;
1015 ctx->cap_q.fmt = cap_fmt;
1017 ret = s5p_jpeg_controls_create(ctx);
1021 mutex_unlock(&jpeg->lock);
1025 v4l2_fh_del(&ctx->fh);
1026 v4l2_fh_exit(&ctx->fh);
1027 mutex_unlock(&jpeg->lock);
1033 static int s5p_jpeg_release(struct file *file)
1035 struct s5p_jpeg *jpeg = video_drvdata(file);
1036 struct s5p_jpeg_ctx *ctx = fh_to_ctx(file->private_data);
1038 mutex_lock(&jpeg->lock);
1039 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
1040 v4l2_ctrl_handler_free(&ctx->ctrl_handler);
1041 v4l2_fh_del(&ctx->fh);
1042 v4l2_fh_exit(&ctx->fh);
1044 mutex_unlock(&jpeg->lock);
1049 static const struct v4l2_file_operations s5p_jpeg_fops = {
1050 .owner = THIS_MODULE,
1051 .open = s5p_jpeg_open,
1052 .release = s5p_jpeg_release,
1053 .poll = v4l2_m2m_fop_poll,
1054 .unlocked_ioctl = video_ioctl2,
1055 .mmap = v4l2_m2m_fop_mmap,
1059 * ============================================================================
1060 * video ioctl operations
1061 * ============================================================================
1064 static int get_byte(struct s5p_jpeg_buffer *buf)
1066 if (buf->curr >= buf->size)
1069 return ((unsigned char *)buf->data)[buf->curr++];
1072 static int get_word_be(struct s5p_jpeg_buffer *buf, unsigned int *word)
1077 byte = get_byte(buf);
1081 byte = get_byte(buf);
1084 *word = (unsigned int)byte | temp;
1088 static void skip(struct s5p_jpeg_buffer *buf, long len)
1097 static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
1098 unsigned long buffer, unsigned long size,
1099 struct s5p_jpeg_ctx *ctx)
1101 int c, components = 0, notfound, n_dht = 0, n_dqt = 0;
1102 unsigned int height = 0, width = 0, word, subsampling = 0;
1103 unsigned int sos = 0, sof = 0, sof_len = 0;
1104 unsigned int dht[S5P_JPEG_MAX_MARKER], dht_len[S5P_JPEG_MAX_MARKER];
1105 unsigned int dqt[S5P_JPEG_MAX_MARKER], dqt_len[S5P_JPEG_MAX_MARKER];
1107 struct s5p_jpeg_buffer jpeg_buffer;
1109 jpeg_buffer.size = size;
1110 jpeg_buffer.data = buffer;
1111 jpeg_buffer.curr = 0;
1114 while (notfound || !sos) {
1115 c = get_byte(&jpeg_buffer);
1121 c = get_byte(&jpeg_buffer);
1129 /* SOF0: baseline JPEG */
1131 if (get_word_be(&jpeg_buffer, &word))
1133 length = (long)word - 2;
1136 sof = jpeg_buffer.curr; /* after 0xffc0 */
1138 if (get_byte(&jpeg_buffer) == -1)
1140 if (get_word_be(&jpeg_buffer, &height))
1142 if (get_word_be(&jpeg_buffer, &width))
1144 components = get_byte(&jpeg_buffer);
1145 if (components == -1)
1148 if (components == 1) {
1151 skip(&jpeg_buffer, 1);
1152 subsampling = get_byte(&jpeg_buffer);
1153 skip(&jpeg_buffer, 1);
1157 skip(&jpeg_buffer, components * 2);
1162 if (get_word_be(&jpeg_buffer, &word))
1164 length = (long)word - 2;
1167 if (n_dqt >= S5P_JPEG_MAX_MARKER)
1169 dqt[n_dqt] = jpeg_buffer.curr; /* after 0xffdb */
1170 dqt_len[n_dqt++] = length;
1171 skip(&jpeg_buffer, length);
1175 if (get_word_be(&jpeg_buffer, &word))
1177 length = (long)word - 2;
1180 if (n_dht >= S5P_JPEG_MAX_MARKER)
1182 dht[n_dht] = jpeg_buffer.curr; /* after 0xffc4 */
1183 dht_len[n_dht++] = length;
1184 skip(&jpeg_buffer, length);
1188 sos = jpeg_buffer.curr - 2; /* 0xffda */
1191 /* skip payload-less markers */
1192 case RST ... RST + 7:
1198 /* skip uninteresting payload markers */
1200 if (get_word_be(&jpeg_buffer, &word))
1202 length = (long)word - 2;
1203 skip(&jpeg_buffer, length);
1210 result->dht.n = n_dht;
1212 result->dht.marker[n_dht] = dht[n_dht];
1213 result->dht.len[n_dht] = dht_len[n_dht];
1215 result->dqt.n = n_dqt;
1217 result->dqt.marker[n_dqt] = dqt[n_dqt];
1218 result->dqt.len[n_dqt] = dqt_len[n_dqt];
1221 result->sof_len = sof_len;
1222 result->size = result->components = components;
1224 switch (subsampling) {
1226 ctx->subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444;
1229 ctx->subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422;
1232 ctx->subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420;
1235 ctx->subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY;
1241 return !notfound && sos;
1244 static int s5p_jpeg_querycap(struct file *file, void *priv,
1245 struct v4l2_capability *cap)
1247 struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv);
1249 if (ctx->mode == S5P_JPEG_ENCODE) {
1250 strlcpy(cap->driver, S5P_JPEG_M2M_NAME,
1251 sizeof(cap->driver));
1252 strlcpy(cap->card, S5P_JPEG_M2M_NAME " encoder",
1255 strlcpy(cap->driver, S5P_JPEG_M2M_NAME,
1256 sizeof(cap->driver));
1257 strlcpy(cap->card, S5P_JPEG_M2M_NAME " decoder",
1260 snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s",
1261 dev_name(ctx->jpeg->dev));
1262 cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M;
1263 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
1267 static int enum_fmt(struct s5p_jpeg_fmt *sjpeg_formats, int n,
1268 struct v4l2_fmtdesc *f, u32 type)
1272 for (i = 0; i < n; ++i) {
1273 if (sjpeg_formats[i].flags & type) {
1274 /* index-th format of type type found ? */
1275 if (num == f->index)
1277 /* Correct type but haven't reached our index yet,
1278 * just increment per-type index
1284 /* Format not found */
1288 strlcpy(f->description, sjpeg_formats[i].name, sizeof(f->description));
1289 f->pixelformat = sjpeg_formats[i].fourcc;
1294 static int s5p_jpeg_enum_fmt_vid_cap(struct file *file, void *priv,
1295 struct v4l2_fmtdesc *f)
1297 struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv);
1299 if (ctx->mode == S5P_JPEG_ENCODE)
1300 return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f,
1301 SJPEG_FMT_FLAG_ENC_CAPTURE);
1303 return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f,
1304 SJPEG_FMT_FLAG_DEC_CAPTURE);
1307 static int s5p_jpeg_enum_fmt_vid_out(struct file *file, void *priv,
1308 struct v4l2_fmtdesc *f)
1310 struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv);
1312 if (ctx->mode == S5P_JPEG_ENCODE)
1313 return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f,
1314 SJPEG_FMT_FLAG_ENC_OUTPUT);
1316 return enum_fmt(sjpeg_formats, SJPEG_NUM_FORMATS, f,
1317 SJPEG_FMT_FLAG_DEC_OUTPUT);
1320 static struct s5p_jpeg_q_data *get_q_data(struct s5p_jpeg_ctx *ctx,
1321 enum v4l2_buf_type type)
1323 if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
1325 if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1331 static int s5p_jpeg_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
1333 struct vb2_queue *vq;
1334 struct s5p_jpeg_q_data *q_data = NULL;
1335 struct v4l2_pix_format *pix = &f->fmt.pix;
1336 struct s5p_jpeg_ctx *ct = fh_to_ctx(priv);
1338 vq = v4l2_m2m_get_vq(ct->fh.m2m_ctx, f->type);
1342 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1343 ct->mode == S5P_JPEG_DECODE && !ct->hdr_parsed)
1345 q_data = get_q_data(ct, f->type);
1346 BUG_ON(q_data == NULL);
1348 pix->width = q_data->w;
1349 pix->height = q_data->h;
1350 pix->field = V4L2_FIELD_NONE;
1351 pix->pixelformat = q_data->fmt->fourcc;
1352 pix->bytesperline = 0;
1353 if (q_data->fmt->fourcc != V4L2_PIX_FMT_JPEG) {
1354 u32 bpl = q_data->w;
1356 if (q_data->fmt->colplanes == 1)
1357 bpl = (bpl * q_data->fmt->depth) >> 3;
1358 pix->bytesperline = bpl;
1360 pix->sizeimage = q_data->size;
1365 static struct s5p_jpeg_fmt *s5p_jpeg_find_format(struct s5p_jpeg_ctx *ctx,
1366 u32 pixelformat, unsigned int fmt_type)
1368 unsigned int k, fmt_flag;
1370 if (ctx->mode == S5P_JPEG_ENCODE)
1371 fmt_flag = (fmt_type == FMT_TYPE_OUTPUT) ?
1372 SJPEG_FMT_FLAG_ENC_OUTPUT :
1373 SJPEG_FMT_FLAG_ENC_CAPTURE;
1375 fmt_flag = (fmt_type == FMT_TYPE_OUTPUT) ?
1376 SJPEG_FMT_FLAG_DEC_OUTPUT :
1377 SJPEG_FMT_FLAG_DEC_CAPTURE;
1379 for (k = 0; k < ARRAY_SIZE(sjpeg_formats); k++) {
1380 struct s5p_jpeg_fmt *fmt = &sjpeg_formats[k];
1382 if (fmt->fourcc == pixelformat &&
1383 fmt->flags & fmt_flag &&
1384 fmt->flags & ctx->jpeg->variant->fmt_ver_flag) {
1392 static void jpeg_bound_align_image(struct s5p_jpeg_ctx *ctx,
1393 u32 *w, unsigned int wmin, unsigned int wmax,
1394 unsigned int walign,
1395 u32 *h, unsigned int hmin, unsigned int hmax,
1396 unsigned int halign)
1398 int width, height, w_step, h_step;
1403 w_step = 1 << walign;
1404 h_step = 1 << halign;
1406 if (ctx->jpeg->variant->hw3250_compat) {
1408 * Rightmost and bottommost pixels are cropped by the
1409 * Exynos3250/compatible JPEG IP for RGB formats, for the
1410 * specific width and height values respectively. This
1411 * assignment will result in v4l_bound_align_image returning
1412 * dimensions reduced by 1 for the aforementioned cases.
1414 if (w_step == 4 && ((width & 3) == 1)) {
1420 v4l_bound_align_image(w, wmin, wmax, walign, h, hmin, hmax, halign, 0);
1422 if (*w < width && (*w + w_step) < wmax)
1424 if (*h < height && (*h + h_step) < hmax)
1428 static int vidioc_try_fmt(struct v4l2_format *f, struct s5p_jpeg_fmt *fmt,
1429 struct s5p_jpeg_ctx *ctx, int q_type)
1431 struct v4l2_pix_format *pix = &f->fmt.pix;
1433 if (pix->field == V4L2_FIELD_ANY)
1434 pix->field = V4L2_FIELD_NONE;
1435 else if (pix->field != V4L2_FIELD_NONE)
1438 /* V4L2 specification suggests the driver corrects the format struct
1439 * if any of the dimensions is unsupported
1441 if (q_type == FMT_TYPE_OUTPUT)
1442 jpeg_bound_align_image(ctx, &pix->width, S5P_JPEG_MIN_WIDTH,
1443 S5P_JPEG_MAX_WIDTH, 0,
1444 &pix->height, S5P_JPEG_MIN_HEIGHT,
1445 S5P_JPEG_MAX_HEIGHT, 0);
1447 jpeg_bound_align_image(ctx, &pix->width, S5P_JPEG_MIN_WIDTH,
1448 S5P_JPEG_MAX_WIDTH, fmt->h_align,
1449 &pix->height, S5P_JPEG_MIN_HEIGHT,
1450 S5P_JPEG_MAX_HEIGHT, fmt->v_align);
1452 if (fmt->fourcc == V4L2_PIX_FMT_JPEG) {
1453 if (pix->sizeimage <= 0)
1454 pix->sizeimage = PAGE_SIZE;
1455 pix->bytesperline = 0;
1457 u32 bpl = pix->bytesperline;
1459 if (fmt->colplanes > 1 && bpl < pix->width)
1460 bpl = pix->width; /* planar */
1462 if (fmt->colplanes == 1 && /* packed */
1463 (bpl << 3) / fmt->depth < pix->width)
1464 bpl = (pix->width * fmt->depth) >> 3;
1466 pix->bytesperline = bpl;
1467 pix->sizeimage = (pix->width * pix->height * fmt->depth) >> 3;
1473 static int s5p_jpeg_try_fmt_vid_cap(struct file *file, void *priv,
1474 struct v4l2_format *f)
1476 struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv);
1477 struct v4l2_pix_format *pix = &f->fmt.pix;
1478 struct s5p_jpeg_fmt *fmt;
1481 fmt = s5p_jpeg_find_format(ctx, f->fmt.pix.pixelformat,
1484 v4l2_err(&ctx->jpeg->v4l2_dev,
1485 "Fourcc format (0x%08x) invalid.\n",
1486 f->fmt.pix.pixelformat);
1490 if (!ctx->jpeg->variant->hw_ex4_compat || ctx->mode != S5P_JPEG_DECODE)
1494 * The exynos4x12 device requires resulting YUV image
1495 * subsampling not to be lower than the input jpeg subsampling.
1496 * If this requirement is not met then downgrade the requested
1497 * capture format to the one with subsampling equal to the input jpeg.
1499 if ((fmt->flags & SJPEG_FMT_NON_RGB) &&
1500 (fmt->subsampling < ctx->subsampling)) {
1501 ret = s5p_jpeg_adjust_fourcc_to_subsampling(ctx->subsampling,
1506 pix->pixelformat = V4L2_PIX_FMT_GREY;
1508 fmt = s5p_jpeg_find_format(ctx, pix->pixelformat,
1513 * Decompression of a JPEG file with 4:2:0 subsampling and odd
1514 * width to the YUV 4:2:0 compliant formats produces a raw image
1515 * with broken luma component. Adjust capture format to RGB565
1518 if (ctx->subsampling == V4L2_JPEG_CHROMA_SUBSAMPLING_420 &&
1519 (ctx->out_q.w & 1) &&
1520 (pix->pixelformat == V4L2_PIX_FMT_NV12 ||
1521 pix->pixelformat == V4L2_PIX_FMT_NV21 ||
1522 pix->pixelformat == V4L2_PIX_FMT_YUV420)) {
1523 pix->pixelformat = V4L2_PIX_FMT_RGB565;
1524 fmt = s5p_jpeg_find_format(ctx, pix->pixelformat,
1529 return vidioc_try_fmt(f, fmt, ctx, FMT_TYPE_CAPTURE);
1532 static int s5p_jpeg_try_fmt_vid_out(struct file *file, void *priv,
1533 struct v4l2_format *f)
1535 struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv);
1536 struct s5p_jpeg_fmt *fmt;
1538 fmt = s5p_jpeg_find_format(ctx, f->fmt.pix.pixelformat,
1541 v4l2_err(&ctx->jpeg->v4l2_dev,
1542 "Fourcc format (0x%08x) invalid.\n",
1543 f->fmt.pix.pixelformat);
1547 return vidioc_try_fmt(f, fmt, ctx, FMT_TYPE_OUTPUT);
1550 static int exynos4_jpeg_get_output_buffer_size(struct s5p_jpeg_ctx *ctx,
1551 struct v4l2_format *f,
1554 struct v4l2_pix_format *pix = &f->fmt.pix;
1555 u32 pix_fmt = f->fmt.pix.pixelformat;
1556 int w = pix->width, h = pix->height, wh_align;
1559 if (pix_fmt == V4L2_PIX_FMT_RGB32 ||
1560 pix_fmt == V4L2_PIX_FMT_RGB565 ||
1561 pix_fmt == V4L2_PIX_FMT_NV24 ||
1562 pix_fmt == V4L2_PIX_FMT_NV42 ||
1563 pix_fmt == V4L2_PIX_FMT_NV12 ||
1564 pix_fmt == V4L2_PIX_FMT_NV21 ||
1565 pix_fmt == V4L2_PIX_FMT_YUV420)
1570 jpeg_bound_align_image(ctx, &w, S5P_JPEG_MIN_WIDTH,
1571 S5P_JPEG_MAX_WIDTH, wh_align,
1572 &h, S5P_JPEG_MIN_HEIGHT,
1573 S5P_JPEG_MAX_HEIGHT, wh_align);
1575 if (ctx->jpeg->variant->version == SJPEG_EXYNOS4)
1576 padding = PAGE_SIZE;
1578 return (w * h * fmt_depth >> 3) + padding;
1581 static int exynos3250_jpeg_try_downscale(struct s5p_jpeg_ctx *ctx,
1582 struct v4l2_rect *r);
1584 static int s5p_jpeg_s_fmt(struct s5p_jpeg_ctx *ct, struct v4l2_format *f)
1586 struct vb2_queue *vq;
1587 struct s5p_jpeg_q_data *q_data = NULL;
1588 struct v4l2_pix_format *pix = &f->fmt.pix;
1589 struct v4l2_ctrl *ctrl_subs;
1590 struct v4l2_rect scale_rect;
1591 unsigned int f_type;
1593 vq = v4l2_m2m_get_vq(ct->fh.m2m_ctx, f->type);
1597 q_data = get_q_data(ct, f->type);
1598 BUG_ON(q_data == NULL);
1600 if (vb2_is_busy(vq)) {
1601 v4l2_err(&ct->jpeg->v4l2_dev, "%s queue busy\n", __func__);
1605 f_type = V4L2_TYPE_IS_OUTPUT(f->type) ?
1606 FMT_TYPE_OUTPUT : FMT_TYPE_CAPTURE;
1608 q_data->fmt = s5p_jpeg_find_format(ct, pix->pixelformat, f_type);
1609 q_data->w = pix->width;
1610 q_data->h = pix->height;
1611 if (q_data->fmt->fourcc != V4L2_PIX_FMT_JPEG) {
1613 * During encoding Exynos4x12 SoCs access wider memory area
1614 * than it results from Image_x and Image_y values written to
1615 * the JPEG_IMAGE_SIZE register. In order to avoid sysmmu
1616 * page fault calculate proper buffer size in such a case.
1618 if (ct->jpeg->variant->hw_ex4_compat &&
1619 f_type == FMT_TYPE_OUTPUT && ct->mode == S5P_JPEG_ENCODE)
1620 q_data->size = exynos4_jpeg_get_output_buffer_size(ct,
1622 q_data->fmt->depth);
1624 q_data->size = q_data->w * q_data->h *
1625 q_data->fmt->depth >> 3;
1627 q_data->size = pix->sizeimage;
1630 if (f_type == FMT_TYPE_OUTPUT) {
1631 ctrl_subs = v4l2_ctrl_find(&ct->ctrl_handler,
1632 V4L2_CID_JPEG_CHROMA_SUBSAMPLING);
1634 v4l2_ctrl_s_ctrl(ctrl_subs, q_data->fmt->subsampling);
1635 ct->crop_altered = false;
1639 * For decoding init crop_rect with capture buffer dimmensions which
1640 * contain aligned dimensions of the input JPEG image and do it only
1641 * if crop rectangle hasn't been altered by the user space e.g. with
1642 * S_SELECTION ioctl. For encoding assign output buffer dimensions.
1644 if (!ct->crop_altered &&
1645 ((ct->mode == S5P_JPEG_DECODE && f_type == FMT_TYPE_CAPTURE) ||
1646 (ct->mode == S5P_JPEG_ENCODE && f_type == FMT_TYPE_OUTPUT))) {
1647 ct->crop_rect.width = pix->width;
1648 ct->crop_rect.height = pix->height;
1652 * Prevent downscaling to YUV420 format by more than 2
1653 * for Exynos3250/compatible SoC as it produces broken raw image
1656 if (ct->mode == S5P_JPEG_DECODE &&
1657 f_type == FMT_TYPE_CAPTURE &&
1658 ct->jpeg->variant->hw3250_compat &&
1659 pix->pixelformat == V4L2_PIX_FMT_YUV420 &&
1660 ct->scale_factor > 2) {
1661 scale_rect.width = ct->out_q.w / 2;
1662 scale_rect.height = ct->out_q.h / 2;
1663 exynos3250_jpeg_try_downscale(ct, &scale_rect);
1669 static int s5p_jpeg_s_fmt_vid_cap(struct file *file, void *priv,
1670 struct v4l2_format *f)
1674 ret = s5p_jpeg_try_fmt_vid_cap(file, priv, f);
1678 return s5p_jpeg_s_fmt(fh_to_ctx(priv), f);
1681 static int s5p_jpeg_s_fmt_vid_out(struct file *file, void *priv,
1682 struct v4l2_format *f)
1686 ret = s5p_jpeg_try_fmt_vid_out(file, priv, f);
1690 return s5p_jpeg_s_fmt(fh_to_ctx(priv), f);
1693 static int exynos3250_jpeg_try_downscale(struct s5p_jpeg_ctx *ctx,
1694 struct v4l2_rect *r)
1696 int w_ratio, h_ratio, scale_factor, cur_ratio, i;
1698 w_ratio = ctx->out_q.w / r->width;
1699 h_ratio = ctx->out_q.h / r->height;
1701 scale_factor = w_ratio > h_ratio ? w_ratio : h_ratio;
1702 scale_factor = clamp_val(scale_factor, 1, 8);
1704 /* Align scale ratio to the nearest power of 2 */
1705 for (i = 0; i <= 3; ++i) {
1707 if (scale_factor <= cur_ratio) {
1708 ctx->scale_factor = cur_ratio;
1713 r->width = round_down(ctx->out_q.w / ctx->scale_factor, 2);
1714 r->height = round_down(ctx->out_q.h / ctx->scale_factor, 2);
1716 ctx->crop_rect.width = r->width;
1717 ctx->crop_rect.height = r->height;
1718 ctx->crop_rect.left = 0;
1719 ctx->crop_rect.top = 0;
1721 ctx->crop_altered = true;
1726 /* Return 1 if rectangle a is enclosed in rectangle b, or 0 otherwise. */
1727 static int enclosed_rectangle(struct v4l2_rect *a, struct v4l2_rect *b)
1729 if (a->left < b->left || a->top < b->top)
1731 if (a->left + a->width > b->left + b->width)
1733 if (a->top + a->height > b->top + b->height)
1739 static int exynos3250_jpeg_try_crop(struct s5p_jpeg_ctx *ctx,
1740 struct v4l2_rect *r)
1742 struct v4l2_rect base_rect;
1745 switch (ctx->cap_q.fmt->fourcc) {
1746 case V4L2_PIX_FMT_NV12:
1747 case V4L2_PIX_FMT_NV21:
1751 case V4L2_PIX_FMT_YUV420:
1763 base_rect.width = ctx->out_q.w;
1764 base_rect.height = ctx->out_q.h;
1766 r->width = round_down(r->width, w_step);
1767 r->height = round_down(r->height, h_step);
1768 r->left = round_down(r->left, 2);
1769 r->top = round_down(r->top, 2);
1771 if (!enclosed_rectangle(r, &base_rect))
1774 ctx->crop_rect.left = r->left;
1775 ctx->crop_rect.top = r->top;
1776 ctx->crop_rect.width = r->width;
1777 ctx->crop_rect.height = r->height;
1779 ctx->crop_altered = true;
1788 static int s5p_jpeg_g_selection(struct file *file, void *priv,
1789 struct v4l2_selection *s)
1791 struct s5p_jpeg_ctx *ctx = fh_to_ctx(priv);
1793 if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
1794 s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1797 /* For JPEG blob active == default == bounds */
1798 switch (s->target) {
1799 case V4L2_SEL_TGT_CROP:
1800 case V4L2_SEL_TGT_CROP_BOUNDS:
1801 case V4L2_SEL_TGT_CROP_DEFAULT:
1802 case V4L2_SEL_TGT_COMPOSE_DEFAULT:
1803 s->r.width = ctx->out_q.w;
1804 s->r.height = ctx->out_q.h;
1808 case V4L2_SEL_TGT_COMPOSE:
1809 case V4L2_SEL_TGT_COMPOSE_BOUNDS:
1810 case V4L2_SEL_TGT_COMPOSE_PADDED:
1811 s->r.width = ctx->crop_rect.width;
1812 s->r.height = ctx->crop_rect.height;
1813 s->r.left = ctx->crop_rect.left;
1814 s->r.top = ctx->crop_rect.top;
1825 static int s5p_jpeg_s_selection(struct file *file, void *fh,
1826 struct v4l2_selection *s)
1828 struct s5p_jpeg_ctx *ctx = fh_to_ctx(file->private_data);
1829 struct v4l2_rect *rect = &s->r;
1832 if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1835 if (s->target == V4L2_SEL_TGT_COMPOSE) {
1836 if (ctx->mode != S5P_JPEG_DECODE)
1838 if (ctx->jpeg->variant->hw3250_compat)
1839 ret = exynos3250_jpeg_try_downscale(ctx, rect);
1840 } else if (s->target == V4L2_SEL_TGT_CROP) {
1841 if (ctx->mode != S5P_JPEG_ENCODE)
1843 if (ctx->jpeg->variant->hw3250_compat)
1844 ret = exynos3250_jpeg_try_crop(ctx, rect);
1850 static int s5p_jpeg_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
1852 struct s5p_jpeg_ctx *ctx = ctrl_to_ctx(ctrl);
1853 struct s5p_jpeg *jpeg = ctx->jpeg;
1854 unsigned long flags;
1857 case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
1858 spin_lock_irqsave(&jpeg->slock, flags);
1859 ctrl->val = s5p_jpeg_to_user_subsampling(ctx);
1860 spin_unlock_irqrestore(&jpeg->slock, flags);
1867 static int s5p_jpeg_adjust_subs_ctrl(struct s5p_jpeg_ctx *ctx, int *ctrl_val)
1869 switch (ctx->jpeg->variant->version) {
1872 case SJPEG_EXYNOS3250:
1873 case SJPEG_EXYNOS5420:
1875 * The exynos3250/compatible device can produce JPEG image only
1876 * of 4:4:4 subsampling when given RGB32 source image.
1878 if (ctx->out_q.fmt->fourcc == V4L2_PIX_FMT_RGB32)
1883 * The exynos4x12 device requires input raw image fourcc
1884 * to be V4L2_PIX_FMT_GREY if gray jpeg format
1887 if (ctx->out_q.fmt->fourcc != V4L2_PIX_FMT_GREY &&
1888 *ctrl_val == V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY)
1894 * The exynos4x12 and exynos3250/compatible devices require resulting
1895 * jpeg subsampling not to be lower than the input raw image
1898 if (ctx->out_q.fmt->subsampling > *ctrl_val)
1899 *ctrl_val = ctx->out_q.fmt->subsampling;
1904 static int s5p_jpeg_try_ctrl(struct v4l2_ctrl *ctrl)
1906 struct s5p_jpeg_ctx *ctx = ctrl_to_ctx(ctrl);
1907 unsigned long flags;
1910 spin_lock_irqsave(&ctx->jpeg->slock, flags);
1912 if (ctrl->id == V4L2_CID_JPEG_CHROMA_SUBSAMPLING)
1913 ret = s5p_jpeg_adjust_subs_ctrl(ctx, &ctrl->val);
1915 spin_unlock_irqrestore(&ctx->jpeg->slock, flags);
1919 static int s5p_jpeg_s_ctrl(struct v4l2_ctrl *ctrl)
1921 struct s5p_jpeg_ctx *ctx = ctrl_to_ctx(ctrl);
1922 unsigned long flags;
1924 spin_lock_irqsave(&ctx->jpeg->slock, flags);
1927 case V4L2_CID_JPEG_COMPRESSION_QUALITY:
1928 ctx->compr_quality = ctrl->val;
1930 case V4L2_CID_JPEG_RESTART_INTERVAL:
1931 ctx->restart_interval = ctrl->val;
1933 case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:
1934 ctx->subsampling = ctrl->val;
1938 spin_unlock_irqrestore(&ctx->jpeg->slock, flags);
1942 static const struct v4l2_ctrl_ops s5p_jpeg_ctrl_ops = {
1943 .g_volatile_ctrl = s5p_jpeg_g_volatile_ctrl,
1944 .try_ctrl = s5p_jpeg_try_ctrl,
1945 .s_ctrl = s5p_jpeg_s_ctrl,
1948 static int s5p_jpeg_controls_create(struct s5p_jpeg_ctx *ctx)
1950 unsigned int mask = ~0x27; /* 444, 422, 420, GRAY */
1951 struct v4l2_ctrl *ctrl;
1954 v4l2_ctrl_handler_init(&ctx->ctrl_handler, 3);
1956 if (ctx->mode == S5P_JPEG_ENCODE) {
1957 v4l2_ctrl_new_std(&ctx->ctrl_handler, &s5p_jpeg_ctrl_ops,
1958 V4L2_CID_JPEG_COMPRESSION_QUALITY,
1959 0, 3, 1, S5P_JPEG_COMPR_QUAL_WORST);
1961 v4l2_ctrl_new_std(&ctx->ctrl_handler, &s5p_jpeg_ctrl_ops,
1962 V4L2_CID_JPEG_RESTART_INTERVAL,
1964 if (ctx->jpeg->variant->version == SJPEG_S5P)
1965 mask = ~0x06; /* 422, 420 */
1968 ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &s5p_jpeg_ctrl_ops,
1969 V4L2_CID_JPEG_CHROMA_SUBSAMPLING,
1970 V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY, mask,
1971 V4L2_JPEG_CHROMA_SUBSAMPLING_422);
1973 if (ctx->ctrl_handler.error) {
1974 ret = ctx->ctrl_handler.error;
1978 if (ctx->mode == S5P_JPEG_DECODE)
1979 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE |
1980 V4L2_CTRL_FLAG_READ_ONLY;
1982 ret = v4l2_ctrl_handler_setup(&ctx->ctrl_handler);
1989 v4l2_ctrl_handler_free(&ctx->ctrl_handler);
1993 static const struct v4l2_ioctl_ops s5p_jpeg_ioctl_ops = {
1994 .vidioc_querycap = s5p_jpeg_querycap,
1996 .vidioc_enum_fmt_vid_cap = s5p_jpeg_enum_fmt_vid_cap,
1997 .vidioc_enum_fmt_vid_out = s5p_jpeg_enum_fmt_vid_out,
1999 .vidioc_g_fmt_vid_cap = s5p_jpeg_g_fmt,
2000 .vidioc_g_fmt_vid_out = s5p_jpeg_g_fmt,
2002 .vidioc_try_fmt_vid_cap = s5p_jpeg_try_fmt_vid_cap,
2003 .vidioc_try_fmt_vid_out = s5p_jpeg_try_fmt_vid_out,
2005 .vidioc_s_fmt_vid_cap = s5p_jpeg_s_fmt_vid_cap,
2006 .vidioc_s_fmt_vid_out = s5p_jpeg_s_fmt_vid_out,
2008 .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs,
2009 .vidioc_querybuf = v4l2_m2m_ioctl_querybuf,
2010 .vidioc_qbuf = v4l2_m2m_ioctl_qbuf,
2011 .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf,
2013 .vidioc_streamon = v4l2_m2m_ioctl_streamon,
2014 .vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
2016 .vidioc_g_selection = s5p_jpeg_g_selection,
2017 .vidioc_s_selection = s5p_jpeg_s_selection,
2021 * ============================================================================
2023 * ============================================================================
2026 static void s5p_jpeg_device_run(void *priv)
2028 struct s5p_jpeg_ctx *ctx = priv;
2029 struct s5p_jpeg *jpeg = ctx->jpeg;
2030 struct vb2_buffer *src_buf, *dst_buf;
2031 unsigned long src_addr, dst_addr, flags;
2033 spin_lock_irqsave(&ctx->jpeg->slock, flags);
2035 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
2036 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
2037 src_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0);
2038 dst_addr = vb2_dma_contig_plane_dma_addr(dst_buf, 0);
2040 s5p_jpeg_reset(jpeg->regs);
2041 s5p_jpeg_poweron(jpeg->regs);
2042 s5p_jpeg_proc_mode(jpeg->regs, ctx->mode);
2043 if (ctx->mode == S5P_JPEG_ENCODE) {
2044 if (ctx->out_q.fmt->fourcc == V4L2_PIX_FMT_RGB565)
2045 s5p_jpeg_input_raw_mode(jpeg->regs,
2046 S5P_JPEG_RAW_IN_565);
2048 s5p_jpeg_input_raw_mode(jpeg->regs,
2049 S5P_JPEG_RAW_IN_422);
2050 s5p_jpeg_subsampling_mode(jpeg->regs, ctx->subsampling);
2051 s5p_jpeg_dri(jpeg->regs, ctx->restart_interval);
2052 s5p_jpeg_x(jpeg->regs, ctx->out_q.w);
2053 s5p_jpeg_y(jpeg->regs, ctx->out_q.h);
2054 s5p_jpeg_imgadr(jpeg->regs, src_addr);
2055 s5p_jpeg_jpgadr(jpeg->regs, dst_addr);
2057 /* ultimately comes from sizeimage from userspace */
2058 s5p_jpeg_enc_stream_int(jpeg->regs, ctx->cap_q.size);
2060 /* JPEG RGB to YCbCr conversion matrix */
2061 s5p_jpeg_coef(jpeg->regs, 1, 1, S5P_JPEG_COEF11);
2062 s5p_jpeg_coef(jpeg->regs, 1, 2, S5P_JPEG_COEF12);
2063 s5p_jpeg_coef(jpeg->regs, 1, 3, S5P_JPEG_COEF13);
2064 s5p_jpeg_coef(jpeg->regs, 2, 1, S5P_JPEG_COEF21);
2065 s5p_jpeg_coef(jpeg->regs, 2, 2, S5P_JPEG_COEF22);
2066 s5p_jpeg_coef(jpeg->regs, 2, 3, S5P_JPEG_COEF23);
2067 s5p_jpeg_coef(jpeg->regs, 3, 1, S5P_JPEG_COEF31);
2068 s5p_jpeg_coef(jpeg->regs, 3, 2, S5P_JPEG_COEF32);
2069 s5p_jpeg_coef(jpeg->regs, 3, 3, S5P_JPEG_COEF33);
2072 * JPEG IP allows storing 4 quantization tables
2073 * We fill table 0 for luma and table 1 for chroma
2075 s5p_jpeg_set_qtbl_lum(jpeg->regs, ctx->compr_quality);
2076 s5p_jpeg_set_qtbl_chr(jpeg->regs, ctx->compr_quality);
2077 /* use table 0 for Y */
2078 s5p_jpeg_qtbl(jpeg->regs, 1, 0);
2079 /* use table 1 for Cb and Cr*/
2080 s5p_jpeg_qtbl(jpeg->regs, 2, 1);
2081 s5p_jpeg_qtbl(jpeg->regs, 3, 1);
2083 /* Y, Cb, Cr use Huffman table 0 */
2084 s5p_jpeg_htbl_ac(jpeg->regs, 1);
2085 s5p_jpeg_htbl_dc(jpeg->regs, 1);
2086 s5p_jpeg_htbl_ac(jpeg->regs, 2);
2087 s5p_jpeg_htbl_dc(jpeg->regs, 2);
2088 s5p_jpeg_htbl_ac(jpeg->regs, 3);
2089 s5p_jpeg_htbl_dc(jpeg->regs, 3);
2090 } else { /* S5P_JPEG_DECODE */
2091 s5p_jpeg_rst_int_enable(jpeg->regs, true);
2092 s5p_jpeg_data_num_int_enable(jpeg->regs, true);
2093 s5p_jpeg_final_mcu_num_int_enable(jpeg->regs, true);
2094 if (ctx->cap_q.fmt->fourcc == V4L2_PIX_FMT_YUYV)
2095 s5p_jpeg_outform_raw(jpeg->regs, S5P_JPEG_RAW_OUT_422);
2097 s5p_jpeg_outform_raw(jpeg->regs, S5P_JPEG_RAW_OUT_420);
2098 s5p_jpeg_jpgadr(jpeg->regs, src_addr);
2099 s5p_jpeg_imgadr(jpeg->regs, dst_addr);
2102 s5p_jpeg_start(jpeg->regs);
2104 spin_unlock_irqrestore(&ctx->jpeg->slock, flags);
2107 static void exynos4_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx)
2109 struct s5p_jpeg *jpeg = ctx->jpeg;
2110 struct s5p_jpeg_fmt *fmt;
2111 struct vb2_buffer *vb;
2112 struct s5p_jpeg_addr jpeg_addr = {};
2113 u32 pix_size, padding_bytes = 0;
2118 pix_size = ctx->cap_q.w * ctx->cap_q.h;
2120 if (ctx->mode == S5P_JPEG_ENCODE) {
2121 vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
2122 fmt = ctx->out_q.fmt;
2123 if (ctx->out_q.w % 2 && fmt->h_align > 0)
2124 padding_bytes = ctx->out_q.h;
2126 fmt = ctx->cap_q.fmt;
2127 vb = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
2130 jpeg_addr.y = vb2_dma_contig_plane_dma_addr(vb, 0);
2132 if (fmt->colplanes == 2) {
2133 jpeg_addr.cb = jpeg_addr.y + pix_size - padding_bytes;
2134 } else if (fmt->colplanes == 3) {
2135 jpeg_addr.cb = jpeg_addr.y + pix_size;
2136 if (fmt->fourcc == V4L2_PIX_FMT_YUV420)
2137 jpeg_addr.cr = jpeg_addr.cb + pix_size / 4;
2139 jpeg_addr.cr = jpeg_addr.cb + pix_size / 2;
2142 exynos4_jpeg_set_frame_buf_address(jpeg->regs, &jpeg_addr);
2145 static void exynos4_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx)
2147 struct s5p_jpeg *jpeg = ctx->jpeg;
2148 struct vb2_buffer *vb;
2149 unsigned int jpeg_addr = 0;
2151 if (ctx->mode == S5P_JPEG_ENCODE)
2152 vb = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
2154 vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
2156 jpeg_addr = vb2_dma_contig_plane_dma_addr(vb, 0);
2157 if (jpeg->variant->version == SJPEG_EXYNOS5433 &&
2158 ctx->mode == S5P_JPEG_DECODE)
2159 jpeg_addr += ctx->out_q.sos;
2160 exynos4_jpeg_set_stream_buf_address(jpeg->regs, jpeg_addr);
2163 static inline void exynos4_jpeg_set_img_fmt(void __iomem *base,
2164 unsigned int img_fmt)
2166 __exynos4_jpeg_set_img_fmt(base, img_fmt, SJPEG_EXYNOS4);
2169 static inline void exynos5433_jpeg_set_img_fmt(void __iomem *base,
2170 unsigned int img_fmt)
2172 __exynos4_jpeg_set_img_fmt(base, img_fmt, SJPEG_EXYNOS5433);
2175 static inline void exynos4_jpeg_set_enc_out_fmt(void __iomem *base,
2176 unsigned int out_fmt)
2178 __exynos4_jpeg_set_enc_out_fmt(base, out_fmt, SJPEG_EXYNOS4);
2181 static inline void exynos5433_jpeg_set_enc_out_fmt(void __iomem *base,
2182 unsigned int out_fmt)
2184 __exynos4_jpeg_set_enc_out_fmt(base, out_fmt, SJPEG_EXYNOS5433);
2187 static void exynos4_jpeg_device_run(void *priv)
2189 struct s5p_jpeg_ctx *ctx = priv;
2190 struct s5p_jpeg *jpeg = ctx->jpeg;
2191 unsigned int bitstream_size;
2192 unsigned long flags;
2194 spin_lock_irqsave(&jpeg->slock, flags);
2196 if (ctx->mode == S5P_JPEG_ENCODE) {
2197 exynos4_jpeg_sw_reset(jpeg->regs);
2198 exynos4_jpeg_set_interrupt(jpeg->regs, jpeg->variant->version);
2199 exynos4_jpeg_set_huf_table_enable(jpeg->regs, 1);
2201 exynos4_jpeg_set_huff_tbl(jpeg->regs);
2204 * JPEG IP allows storing 4 quantization tables
2205 * We fill table 0 for luma and table 1 for chroma
2207 exynos4_jpeg_set_qtbl_lum(jpeg->regs, ctx->compr_quality);
2208 exynos4_jpeg_set_qtbl_chr(jpeg->regs, ctx->compr_quality);
2210 exynos4_jpeg_set_encode_tbl_select(jpeg->regs,
2211 ctx->compr_quality);
2212 exynos4_jpeg_set_stream_size(jpeg->regs, ctx->cap_q.w,
2215 if (ctx->jpeg->variant->version == SJPEG_EXYNOS4) {
2216 exynos4_jpeg_set_enc_out_fmt(jpeg->regs,
2218 exynos4_jpeg_set_img_fmt(jpeg->regs,
2219 ctx->out_q.fmt->fourcc);
2221 exynos5433_jpeg_set_enc_out_fmt(jpeg->regs,
2223 exynos5433_jpeg_set_img_fmt(jpeg->regs,
2224 ctx->out_q.fmt->fourcc);
2226 exynos4_jpeg_set_img_addr(ctx);
2227 exynos4_jpeg_set_jpeg_addr(ctx);
2228 exynos4_jpeg_set_encode_hoff_cnt(jpeg->regs,
2229 ctx->out_q.fmt->fourcc);
2231 exynos4_jpeg_sw_reset(jpeg->regs);
2232 exynos4_jpeg_set_interrupt(jpeg->regs,
2233 jpeg->variant->version);
2234 exynos4_jpeg_set_img_addr(ctx);
2235 exynos4_jpeg_set_jpeg_addr(ctx);
2237 if (jpeg->variant->version == SJPEG_EXYNOS5433) {
2238 exynos4_jpeg_parse_huff_tbl(ctx);
2239 exynos4_jpeg_parse_decode_h_tbl(ctx);
2241 exynos4_jpeg_parse_q_tbl(ctx);
2242 exynos4_jpeg_parse_decode_q_tbl(ctx);
2244 exynos4_jpeg_set_huf_table_enable(jpeg->regs, 1);
2246 exynos4_jpeg_set_stream_size(jpeg->regs, ctx->cap_q.w,
2248 exynos5433_jpeg_set_enc_out_fmt(jpeg->regs,
2250 exynos5433_jpeg_set_img_fmt(jpeg->regs,
2251 ctx->cap_q.fmt->fourcc);
2252 bitstream_size = DIV_ROUND_UP(ctx->out_q.size, 16);
2254 exynos4_jpeg_set_img_fmt(jpeg->regs,
2255 ctx->cap_q.fmt->fourcc);
2256 bitstream_size = DIV_ROUND_UP(ctx->out_q.size, 32);
2259 exynos4_jpeg_set_dec_bitstream_size(jpeg->regs, bitstream_size);
2262 exynos4_jpeg_set_enc_dec_mode(jpeg->regs, ctx->mode);
2264 spin_unlock_irqrestore(&jpeg->slock, flags);
2267 static void exynos3250_jpeg_set_img_addr(struct s5p_jpeg_ctx *ctx)
2269 struct s5p_jpeg *jpeg = ctx->jpeg;
2270 struct s5p_jpeg_fmt *fmt;
2271 struct vb2_buffer *vb;
2272 struct s5p_jpeg_addr jpeg_addr = {};
2275 pix_size = ctx->cap_q.w * ctx->cap_q.h;
2277 if (ctx->mode == S5P_JPEG_ENCODE) {
2278 vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
2279 fmt = ctx->out_q.fmt;
2281 vb = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
2282 fmt = ctx->cap_q.fmt;
2285 jpeg_addr.y = vb2_dma_contig_plane_dma_addr(vb, 0);
2287 if (fmt->colplanes == 2) {
2288 jpeg_addr.cb = jpeg_addr.y + pix_size;
2289 } else if (fmt->colplanes == 3) {
2290 jpeg_addr.cb = jpeg_addr.y + pix_size;
2291 if (fmt->fourcc == V4L2_PIX_FMT_YUV420)
2292 jpeg_addr.cr = jpeg_addr.cb + pix_size / 4;
2294 jpeg_addr.cr = jpeg_addr.cb + pix_size / 2;
2297 exynos3250_jpeg_imgadr(jpeg->regs, &jpeg_addr);
2300 static void exynos3250_jpeg_set_jpeg_addr(struct s5p_jpeg_ctx *ctx)
2302 struct s5p_jpeg *jpeg = ctx->jpeg;
2303 struct vb2_buffer *vb;
2304 unsigned int jpeg_addr = 0;
2306 if (ctx->mode == S5P_JPEG_ENCODE)
2307 vb = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
2309 vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
2311 jpeg_addr = vb2_dma_contig_plane_dma_addr(vb, 0);
2312 exynos3250_jpeg_jpgadr(jpeg->regs, jpeg_addr);
2315 static void exynos3250_jpeg_device_run(void *priv)
2317 struct s5p_jpeg_ctx *ctx = priv;
2318 struct s5p_jpeg *jpeg = ctx->jpeg;
2319 unsigned long flags;
2321 spin_lock_irqsave(&ctx->jpeg->slock, flags);
2323 exynos3250_jpeg_reset(jpeg->regs);
2324 exynos3250_jpeg_set_dma_num(jpeg->regs);
2325 exynos3250_jpeg_poweron(jpeg->regs);
2326 exynos3250_jpeg_clk_set(jpeg->regs);
2327 exynos3250_jpeg_proc_mode(jpeg->regs, ctx->mode);
2329 if (ctx->mode == S5P_JPEG_ENCODE) {
2330 exynos3250_jpeg_input_raw_fmt(jpeg->regs,
2331 ctx->out_q.fmt->fourcc);
2332 exynos3250_jpeg_dri(jpeg->regs, ctx->restart_interval);
2335 * JPEG IP allows storing 4 quantization tables
2336 * We fill table 0 for luma and table 1 for chroma
2338 s5p_jpeg_set_qtbl_lum(jpeg->regs, ctx->compr_quality);
2339 s5p_jpeg_set_qtbl_chr(jpeg->regs, ctx->compr_quality);
2340 /* use table 0 for Y */
2341 exynos3250_jpeg_qtbl(jpeg->regs, 1, 0);
2342 /* use table 1 for Cb and Cr*/
2343 exynos3250_jpeg_qtbl(jpeg->regs, 2, 1);
2344 exynos3250_jpeg_qtbl(jpeg->regs, 3, 1);
2347 * Some SoCs require setting Huffman tables before each run
2349 if (jpeg->variant->htbl_reinit) {
2350 s5p_jpeg_set_hdctbl(jpeg->regs);
2351 s5p_jpeg_set_hdctblg(jpeg->regs);
2352 s5p_jpeg_set_hactbl(jpeg->regs);
2353 s5p_jpeg_set_hactblg(jpeg->regs);
2356 /* Y, Cb, Cr use Huffman table 0 */
2357 exynos3250_jpeg_htbl_ac(jpeg->regs, 1);
2358 exynos3250_jpeg_htbl_dc(jpeg->regs, 1);
2359 exynos3250_jpeg_htbl_ac(jpeg->regs, 2);
2360 exynos3250_jpeg_htbl_dc(jpeg->regs, 2);
2361 exynos3250_jpeg_htbl_ac(jpeg->regs, 3);
2362 exynos3250_jpeg_htbl_dc(jpeg->regs, 3);
2364 exynos3250_jpeg_set_x(jpeg->regs, ctx->crop_rect.width);
2365 exynos3250_jpeg_set_y(jpeg->regs, ctx->crop_rect.height);
2366 exynos3250_jpeg_stride(jpeg->regs, ctx->out_q.fmt->fourcc,
2368 exynos3250_jpeg_offset(jpeg->regs, ctx->crop_rect.left,
2369 ctx->crop_rect.top);
2370 exynos3250_jpeg_set_img_addr(ctx);
2371 exynos3250_jpeg_set_jpeg_addr(ctx);
2372 exynos3250_jpeg_subsampling_mode(jpeg->regs, ctx->subsampling);
2374 /* ultimately comes from sizeimage from userspace */
2375 exynos3250_jpeg_enc_stream_bound(jpeg->regs, ctx->cap_q.size);
2377 if (ctx->out_q.fmt->fourcc == V4L2_PIX_FMT_RGB565 ||
2378 ctx->out_q.fmt->fourcc == V4L2_PIX_FMT_RGB565X ||
2379 ctx->out_q.fmt->fourcc == V4L2_PIX_FMT_RGB32)
2380 exynos3250_jpeg_set_y16(jpeg->regs, true);
2382 exynos3250_jpeg_set_img_addr(ctx);
2383 exynos3250_jpeg_set_jpeg_addr(ctx);
2384 exynos3250_jpeg_stride(jpeg->regs, ctx->cap_q.fmt->fourcc,
2386 exynos3250_jpeg_offset(jpeg->regs, 0, 0);
2387 exynos3250_jpeg_dec_scaling_ratio(jpeg->regs,
2389 exynos3250_jpeg_dec_stream_size(jpeg->regs, ctx->out_q.size);
2390 exynos3250_jpeg_output_raw_fmt(jpeg->regs,
2391 ctx->cap_q.fmt->fourcc);
2394 exynos3250_jpeg_interrupts_enable(jpeg->regs);
2396 /* JPEG RGB to YCbCr conversion matrix */
2397 exynos3250_jpeg_coef(jpeg->regs, ctx->mode);
2399 exynos3250_jpeg_set_timer(jpeg->regs, EXYNOS3250_IRQ_TIMEOUT);
2400 jpeg->irq_status = 0;
2401 exynos3250_jpeg_start(jpeg->regs);
2403 spin_unlock_irqrestore(&ctx->jpeg->slock, flags);
2406 static int s5p_jpeg_job_ready(void *priv)
2408 struct s5p_jpeg_ctx *ctx = priv;
2410 if (ctx->mode == S5P_JPEG_DECODE)
2411 return ctx->hdr_parsed;
2415 static void s5p_jpeg_job_abort(void *priv)
2419 static struct v4l2_m2m_ops s5p_jpeg_m2m_ops = {
2420 .device_run = s5p_jpeg_device_run,
2421 .job_ready = s5p_jpeg_job_ready,
2422 .job_abort = s5p_jpeg_job_abort,
2425 static struct v4l2_m2m_ops exynos3250_jpeg_m2m_ops = {
2426 .device_run = exynos3250_jpeg_device_run,
2427 .job_ready = s5p_jpeg_job_ready,
2428 .job_abort = s5p_jpeg_job_abort,
2431 static struct v4l2_m2m_ops exynos4_jpeg_m2m_ops = {
2432 .device_run = exynos4_jpeg_device_run,
2433 .job_ready = s5p_jpeg_job_ready,
2434 .job_abort = s5p_jpeg_job_abort,
2438 * ============================================================================
2440 * ============================================================================
2443 static int s5p_jpeg_queue_setup(struct vb2_queue *vq,
2444 unsigned int *nbuffers, unsigned int *nplanes,
2445 unsigned int sizes[], struct device *alloc_devs[])
2447 struct s5p_jpeg_ctx *ctx = vb2_get_drv_priv(vq);
2448 struct s5p_jpeg_q_data *q_data = NULL;
2449 unsigned int size, count = *nbuffers;
2451 q_data = get_q_data(ctx, vq->type);
2452 BUG_ON(q_data == NULL);
2454 size = q_data->size;
2457 * header is parsed during decoding and parsed information stored
2458 * in the context so we do not allow another buffer to overwrite it
2460 if (ctx->mode == S5P_JPEG_DECODE)
2470 static int s5p_jpeg_buf_prepare(struct vb2_buffer *vb)
2472 struct s5p_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
2473 struct s5p_jpeg_q_data *q_data = NULL;
2475 q_data = get_q_data(ctx, vb->vb2_queue->type);
2476 BUG_ON(q_data == NULL);
2478 if (vb2_plane_size(vb, 0) < q_data->size) {
2479 pr_err("%s data will not fit into plane (%lu < %lu)\n",
2480 __func__, vb2_plane_size(vb, 0),
2481 (long)q_data->size);
2485 vb2_set_plane_payload(vb, 0, q_data->size);
2490 static void s5p_jpeg_buf_queue(struct vb2_buffer *vb)
2492 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
2493 struct s5p_jpeg_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
2495 if (ctx->mode == S5P_JPEG_DECODE &&
2496 vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
2497 struct s5p_jpeg_q_data tmp, *q_data;
2499 ctx->hdr_parsed = s5p_jpeg_parse_hdr(&tmp,
2500 (unsigned long)vb2_plane_vaddr(vb, 0),
2501 min((unsigned long)ctx->out_q.size,
2502 vb2_get_plane_payload(vb, 0)), ctx);
2503 if (!ctx->hdr_parsed) {
2504 vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
2508 q_data = &ctx->out_q;
2511 q_data->sos = tmp.sos;
2512 memcpy(q_data->dht.marker, tmp.dht.marker,
2513 sizeof(tmp.dht.marker));
2514 memcpy(q_data->dht.len, tmp.dht.len, sizeof(tmp.dht.len));
2515 q_data->dht.n = tmp.dht.n;
2516 memcpy(q_data->dqt.marker, tmp.dqt.marker,
2517 sizeof(tmp.dqt.marker));
2518 memcpy(q_data->dqt.len, tmp.dqt.len, sizeof(tmp.dqt.len));
2519 q_data->dqt.n = tmp.dqt.n;
2520 q_data->sof = tmp.sof;
2521 q_data->sof_len = tmp.sof_len;
2523 q_data = &ctx->cap_q;
2528 v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
2531 static int s5p_jpeg_start_streaming(struct vb2_queue *q, unsigned int count)
2533 struct s5p_jpeg_ctx *ctx = vb2_get_drv_priv(q);
2536 ret = pm_runtime_get_sync(ctx->jpeg->dev);
2538 return ret > 0 ? 0 : ret;
2541 static void s5p_jpeg_stop_streaming(struct vb2_queue *q)
2543 struct s5p_jpeg_ctx *ctx = vb2_get_drv_priv(q);
2545 pm_runtime_put(ctx->jpeg->dev);
2548 static const struct vb2_ops s5p_jpeg_qops = {
2549 .queue_setup = s5p_jpeg_queue_setup,
2550 .buf_prepare = s5p_jpeg_buf_prepare,
2551 .buf_queue = s5p_jpeg_buf_queue,
2552 .wait_prepare = vb2_ops_wait_prepare,
2553 .wait_finish = vb2_ops_wait_finish,
2554 .start_streaming = s5p_jpeg_start_streaming,
2555 .stop_streaming = s5p_jpeg_stop_streaming,
2558 static int queue_init(void *priv, struct vb2_queue *src_vq,
2559 struct vb2_queue *dst_vq)
2561 struct s5p_jpeg_ctx *ctx = priv;
2564 src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
2565 src_vq->io_modes = VB2_MMAP | VB2_USERPTR;
2566 src_vq->drv_priv = ctx;
2567 src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
2568 src_vq->ops = &s5p_jpeg_qops;
2569 src_vq->mem_ops = &vb2_dma_contig_memops;
2570 src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2571 src_vq->lock = &ctx->jpeg->lock;
2572 src_vq->dev = ctx->jpeg->dev;
2574 ret = vb2_queue_init(src_vq);
2578 dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2579 dst_vq->io_modes = VB2_MMAP | VB2_USERPTR;
2580 dst_vq->drv_priv = ctx;
2581 dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
2582 dst_vq->ops = &s5p_jpeg_qops;
2583 dst_vq->mem_ops = &vb2_dma_contig_memops;
2584 dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2585 dst_vq->lock = &ctx->jpeg->lock;
2586 dst_vq->dev = ctx->jpeg->dev;
2588 return vb2_queue_init(dst_vq);
2592 * ============================================================================
2594 * ============================================================================
2597 static irqreturn_t s5p_jpeg_irq(int irq, void *dev_id)
2599 struct s5p_jpeg *jpeg = dev_id;
2600 struct s5p_jpeg_ctx *curr_ctx;
2601 struct vb2_v4l2_buffer *src_buf, *dst_buf;
2602 unsigned long payload_size = 0;
2603 enum vb2_buffer_state state = VB2_BUF_STATE_DONE;
2604 bool enc_jpeg_too_large = false;
2605 bool timer_elapsed = false;
2606 bool op_completed = false;
2608 spin_lock(&jpeg->slock);
2610 curr_ctx = v4l2_m2m_get_curr_priv(jpeg->m2m_dev);
2612 src_buf = v4l2_m2m_src_buf_remove(curr_ctx->fh.m2m_ctx);
2613 dst_buf = v4l2_m2m_dst_buf_remove(curr_ctx->fh.m2m_ctx);
2615 if (curr_ctx->mode == S5P_JPEG_ENCODE)
2616 enc_jpeg_too_large = s5p_jpeg_enc_stream_stat(jpeg->regs);
2617 timer_elapsed = s5p_jpeg_timer_stat(jpeg->regs);
2618 op_completed = s5p_jpeg_result_stat_ok(jpeg->regs);
2619 if (curr_ctx->mode == S5P_JPEG_DECODE)
2620 op_completed = op_completed &&
2621 s5p_jpeg_stream_stat_ok(jpeg->regs);
2623 if (enc_jpeg_too_large) {
2624 state = VB2_BUF_STATE_ERROR;
2625 s5p_jpeg_clear_enc_stream_stat(jpeg->regs);
2626 } else if (timer_elapsed) {
2627 state = VB2_BUF_STATE_ERROR;
2628 s5p_jpeg_clear_timer_stat(jpeg->regs);
2629 } else if (!op_completed) {
2630 state = VB2_BUF_STATE_ERROR;
2632 payload_size = s5p_jpeg_compressed_size(jpeg->regs);
2635 dst_buf->timecode = src_buf->timecode;
2636 dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
2637 dst_buf->flags &= ~V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
2639 src_buf->flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
2641 v4l2_m2m_buf_done(src_buf, state);
2642 if (curr_ctx->mode == S5P_JPEG_ENCODE)
2643 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, payload_size);
2644 v4l2_m2m_buf_done(dst_buf, state);
2646 curr_ctx->subsampling = s5p_jpeg_get_subsampling_mode(jpeg->regs);
2647 spin_unlock(&jpeg->slock);
2649 s5p_jpeg_clear_int(jpeg->regs);
2651 v4l2_m2m_job_finish(jpeg->m2m_dev, curr_ctx->fh.m2m_ctx);
2655 static irqreturn_t exynos4_jpeg_irq(int irq, void *priv)
2657 unsigned int int_status;
2658 struct vb2_v4l2_buffer *src_vb, *dst_vb;
2659 struct s5p_jpeg *jpeg = priv;
2660 struct s5p_jpeg_ctx *curr_ctx;
2661 unsigned long payload_size = 0;
2663 spin_lock(&jpeg->slock);
2665 curr_ctx = v4l2_m2m_get_curr_priv(jpeg->m2m_dev);
2667 src_vb = v4l2_m2m_src_buf_remove(curr_ctx->fh.m2m_ctx);
2668 dst_vb = v4l2_m2m_dst_buf_remove(curr_ctx->fh.m2m_ctx);
2670 int_status = exynos4_jpeg_get_int_status(jpeg->regs);
2673 switch (int_status & 0x1f) {
2675 jpeg->irq_ret = ERR_PROT;
2678 jpeg->irq_ret = OK_ENC_OR_DEC;
2681 jpeg->irq_ret = ERR_DEC_INVALID_FORMAT;
2684 jpeg->irq_ret = ERR_MULTI_SCAN;
2687 jpeg->irq_ret = ERR_FRAME;
2690 jpeg->irq_ret = ERR_UNKNOWN;
2694 jpeg->irq_ret = ERR_UNKNOWN;
2697 if (jpeg->irq_ret == OK_ENC_OR_DEC) {
2698 if (curr_ctx->mode == S5P_JPEG_ENCODE) {
2699 payload_size = exynos4_jpeg_get_stream_size(jpeg->regs);
2700 vb2_set_plane_payload(&dst_vb->vb2_buf,
2703 v4l2_m2m_buf_done(src_vb, VB2_BUF_STATE_DONE);
2704 v4l2_m2m_buf_done(dst_vb, VB2_BUF_STATE_DONE);
2706 v4l2_m2m_buf_done(src_vb, VB2_BUF_STATE_ERROR);
2707 v4l2_m2m_buf_done(dst_vb, VB2_BUF_STATE_ERROR);
2710 if (jpeg->variant->version == SJPEG_EXYNOS4)
2711 curr_ctx->subsampling = exynos4_jpeg_get_frame_fmt(jpeg->regs);
2713 spin_unlock(&jpeg->slock);
2715 v4l2_m2m_job_finish(jpeg->m2m_dev, curr_ctx->fh.m2m_ctx);
2719 static irqreturn_t exynos3250_jpeg_irq(int irq, void *dev_id)
2721 struct s5p_jpeg *jpeg = dev_id;
2722 struct s5p_jpeg_ctx *curr_ctx;
2723 struct vb2_v4l2_buffer *src_buf, *dst_buf;
2724 unsigned long payload_size = 0;
2725 enum vb2_buffer_state state = VB2_BUF_STATE_DONE;
2726 bool interrupt_timeout = false;
2729 spin_lock(&jpeg->slock);
2731 irq_status = exynos3250_jpeg_get_timer_status(jpeg->regs);
2732 if (irq_status & EXYNOS3250_TIMER_INT_STAT) {
2733 exynos3250_jpeg_clear_timer_status(jpeg->regs);
2734 interrupt_timeout = true;
2735 dev_err(jpeg->dev, "Interrupt timeout occurred.\n");
2738 irq_status = exynos3250_jpeg_get_int_status(jpeg->regs);
2739 exynos3250_jpeg_clear_int_status(jpeg->regs, irq_status);
2741 jpeg->irq_status |= irq_status;
2743 curr_ctx = v4l2_m2m_get_curr_priv(jpeg->m2m_dev);
2748 if ((irq_status & EXYNOS3250_HEADER_STAT) &&
2749 (curr_ctx->mode == S5P_JPEG_DECODE)) {
2750 exynos3250_jpeg_rstart(jpeg->regs);
2754 if (jpeg->irq_status & (EXYNOS3250_JPEG_DONE |
2755 EXYNOS3250_WDMA_DONE |
2756 EXYNOS3250_RDMA_DONE |
2757 EXYNOS3250_RESULT_STAT))
2758 payload_size = exynos3250_jpeg_compressed_size(jpeg->regs);
2759 else if (interrupt_timeout)
2760 state = VB2_BUF_STATE_ERROR;
2764 src_buf = v4l2_m2m_src_buf_remove(curr_ctx->fh.m2m_ctx);
2765 dst_buf = v4l2_m2m_dst_buf_remove(curr_ctx->fh.m2m_ctx);
2767 dst_buf->timecode = src_buf->timecode;
2768 dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
2770 v4l2_m2m_buf_done(src_buf, state);
2771 if (curr_ctx->mode == S5P_JPEG_ENCODE)
2772 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, payload_size);
2773 v4l2_m2m_buf_done(dst_buf, state);
2775 curr_ctx->subsampling =
2776 exynos3250_jpeg_get_subsampling_mode(jpeg->regs);
2778 spin_unlock(&jpeg->slock);
2780 v4l2_m2m_job_finish(jpeg->m2m_dev, curr_ctx->fh.m2m_ctx);
2784 spin_unlock(&jpeg->slock);
2788 static void *jpeg_get_drv_data(struct device *dev);
2791 * ============================================================================
2792 * Driver basic infrastructure
2793 * ============================================================================
2796 static int s5p_jpeg_probe(struct platform_device *pdev)
2798 struct s5p_jpeg *jpeg;
2799 struct resource *res;
2802 /* JPEG IP abstraction struct */
2803 jpeg = devm_kzalloc(&pdev->dev, sizeof(struct s5p_jpeg), GFP_KERNEL);
2807 jpeg->variant = jpeg_get_drv_data(&pdev->dev);
2809 mutex_init(&jpeg->lock);
2810 spin_lock_init(&jpeg->slock);
2811 jpeg->dev = &pdev->dev;
2813 /* memory-mapped registers */
2814 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2816 jpeg->regs = devm_ioremap_resource(&pdev->dev, res);
2817 if (IS_ERR(jpeg->regs))
2818 return PTR_ERR(jpeg->regs);
2820 /* interrupt service routine registration */
2821 jpeg->irq = ret = platform_get_irq(pdev, 0);
2823 dev_err(&pdev->dev, "cannot find IRQ\n");
2827 ret = devm_request_irq(&pdev->dev, jpeg->irq, jpeg->variant->jpeg_irq,
2828 0, dev_name(&pdev->dev), jpeg);
2830 dev_err(&pdev->dev, "cannot claim IRQ %d\n", jpeg->irq);
2835 for (i = 0; i < jpeg->variant->num_clocks; i++) {
2836 jpeg->clocks[i] = devm_clk_get(&pdev->dev,
2837 jpeg->variant->clk_names[i]);
2838 if (IS_ERR(jpeg->clocks[i])) {
2839 dev_err(&pdev->dev, "failed to get clock: %s\n",
2840 jpeg->variant->clk_names[i]);
2841 return PTR_ERR(jpeg->clocks[i]);
2846 ret = v4l2_device_register(&pdev->dev, &jpeg->v4l2_dev);
2848 dev_err(&pdev->dev, "Failed to register v4l2 device\n");
2852 /* mem2mem device */
2853 jpeg->m2m_dev = v4l2_m2m_init(jpeg->variant->m2m_ops);
2854 if (IS_ERR(jpeg->m2m_dev)) {
2855 v4l2_err(&jpeg->v4l2_dev, "Failed to init mem2mem device\n");
2856 ret = PTR_ERR(jpeg->m2m_dev);
2857 goto device_register_rollback;
2860 vb2_dma_contig_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32));
2862 /* JPEG encoder /dev/videoX node */
2863 jpeg->vfd_encoder = video_device_alloc();
2864 if (!jpeg->vfd_encoder) {
2865 v4l2_err(&jpeg->v4l2_dev, "Failed to allocate video device\n");
2867 goto m2m_init_rollback;
2869 snprintf(jpeg->vfd_encoder->name, sizeof(jpeg->vfd_encoder->name),
2870 "%s-enc", S5P_JPEG_M2M_NAME);
2871 jpeg->vfd_encoder->fops = &s5p_jpeg_fops;
2872 jpeg->vfd_encoder->ioctl_ops = &s5p_jpeg_ioctl_ops;
2873 jpeg->vfd_encoder->minor = -1;
2874 jpeg->vfd_encoder->release = video_device_release;
2875 jpeg->vfd_encoder->lock = &jpeg->lock;
2876 jpeg->vfd_encoder->v4l2_dev = &jpeg->v4l2_dev;
2877 jpeg->vfd_encoder->vfl_dir = VFL_DIR_M2M;
2879 ret = video_register_device(jpeg->vfd_encoder, VFL_TYPE_GRABBER, -1);
2881 v4l2_err(&jpeg->v4l2_dev, "Failed to register video device\n");
2882 video_device_release(jpeg->vfd_encoder);
2883 goto m2m_init_rollback;
2886 video_set_drvdata(jpeg->vfd_encoder, jpeg);
2887 v4l2_info(&jpeg->v4l2_dev,
2888 "encoder device registered as /dev/video%d\n",
2889 jpeg->vfd_encoder->num);
2891 /* JPEG decoder /dev/videoX node */
2892 jpeg->vfd_decoder = video_device_alloc();
2893 if (!jpeg->vfd_decoder) {
2894 v4l2_err(&jpeg->v4l2_dev, "Failed to allocate video device\n");
2896 goto enc_vdev_register_rollback;
2898 snprintf(jpeg->vfd_decoder->name, sizeof(jpeg->vfd_decoder->name),
2899 "%s-dec", S5P_JPEG_M2M_NAME);
2900 jpeg->vfd_decoder->fops = &s5p_jpeg_fops;
2901 jpeg->vfd_decoder->ioctl_ops = &s5p_jpeg_ioctl_ops;
2902 jpeg->vfd_decoder->minor = -1;
2903 jpeg->vfd_decoder->release = video_device_release;
2904 jpeg->vfd_decoder->lock = &jpeg->lock;
2905 jpeg->vfd_decoder->v4l2_dev = &jpeg->v4l2_dev;
2906 jpeg->vfd_decoder->vfl_dir = VFL_DIR_M2M;
2908 ret = video_register_device(jpeg->vfd_decoder, VFL_TYPE_GRABBER, -1);
2910 v4l2_err(&jpeg->v4l2_dev, "Failed to register video device\n");
2911 video_device_release(jpeg->vfd_decoder);
2912 goto enc_vdev_register_rollback;
2915 video_set_drvdata(jpeg->vfd_decoder, jpeg);
2916 v4l2_info(&jpeg->v4l2_dev,
2917 "decoder device registered as /dev/video%d\n",
2918 jpeg->vfd_decoder->num);
2920 /* final statements & power management */
2921 platform_set_drvdata(pdev, jpeg);
2923 pm_runtime_enable(&pdev->dev);
2925 v4l2_info(&jpeg->v4l2_dev, "Samsung S5P JPEG codec\n");
2929 enc_vdev_register_rollback:
2930 video_unregister_device(jpeg->vfd_encoder);
2933 v4l2_m2m_release(jpeg->m2m_dev);
2935 device_register_rollback:
2936 v4l2_device_unregister(&jpeg->v4l2_dev);
2941 static int s5p_jpeg_remove(struct platform_device *pdev)
2943 struct s5p_jpeg *jpeg = platform_get_drvdata(pdev);
2946 pm_runtime_disable(jpeg->dev);
2948 video_unregister_device(jpeg->vfd_decoder);
2949 video_unregister_device(jpeg->vfd_encoder);
2950 vb2_dma_contig_clear_max_seg_size(&pdev->dev);
2951 v4l2_m2m_release(jpeg->m2m_dev);
2952 v4l2_device_unregister(&jpeg->v4l2_dev);
2954 if (!pm_runtime_status_suspended(&pdev->dev)) {
2955 for (i = jpeg->variant->num_clocks - 1; i >= 0; i--)
2956 clk_disable_unprepare(jpeg->clocks[i]);
2963 static int s5p_jpeg_runtime_suspend(struct device *dev)
2965 struct s5p_jpeg *jpeg = dev_get_drvdata(dev);
2968 for (i = jpeg->variant->num_clocks - 1; i >= 0; i--)
2969 clk_disable_unprepare(jpeg->clocks[i]);
2974 static int s5p_jpeg_runtime_resume(struct device *dev)
2976 struct s5p_jpeg *jpeg = dev_get_drvdata(dev);
2977 unsigned long flags;
2980 for (i = 0; i < jpeg->variant->num_clocks; i++) {
2981 ret = clk_prepare_enable(jpeg->clocks[i]);
2984 clk_disable_unprepare(jpeg->clocks[i]);
2989 spin_lock_irqsave(&jpeg->slock, flags);
2992 * JPEG IP allows storing two Huffman tables for each component.
2993 * We fill table 0 for each component and do this here only
2994 * for S5PC210 and Exynos3250 SoCs. Exynos4x12 and Exynos542x SoC
2995 * require programming their Huffman tables each time the encoding
2996 * process is initialized, and thus it is accomplished in the
2997 * device_run callback of m2m_ops.
2999 if (!jpeg->variant->htbl_reinit) {
3000 s5p_jpeg_set_hdctbl(jpeg->regs);
3001 s5p_jpeg_set_hdctblg(jpeg->regs);
3002 s5p_jpeg_set_hactbl(jpeg->regs);
3003 s5p_jpeg_set_hactblg(jpeg->regs);
3006 spin_unlock_irqrestore(&jpeg->slock, flags);
3010 #endif /* CONFIG_PM */
3012 static const struct dev_pm_ops s5p_jpeg_pm_ops = {
3013 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
3014 pm_runtime_force_resume)
3015 SET_RUNTIME_PM_OPS(s5p_jpeg_runtime_suspend, s5p_jpeg_runtime_resume,
3019 static struct s5p_jpeg_variant s5p_jpeg_drvdata = {
3020 .version = SJPEG_S5P,
3021 .jpeg_irq = s5p_jpeg_irq,
3022 .m2m_ops = &s5p_jpeg_m2m_ops,
3023 .fmt_ver_flag = SJPEG_FMT_FLAG_S5P,
3024 .clk_names = {"jpeg"},
3028 static struct s5p_jpeg_variant exynos3250_jpeg_drvdata = {
3029 .version = SJPEG_EXYNOS3250,
3030 .jpeg_irq = exynos3250_jpeg_irq,
3031 .m2m_ops = &exynos3250_jpeg_m2m_ops,
3032 .fmt_ver_flag = SJPEG_FMT_FLAG_EXYNOS3250,
3034 .clk_names = {"jpeg", "sclk"},
3038 static struct s5p_jpeg_variant exynos4_jpeg_drvdata = {
3039 .version = SJPEG_EXYNOS4,
3040 .jpeg_irq = exynos4_jpeg_irq,
3041 .m2m_ops = &exynos4_jpeg_m2m_ops,
3042 .fmt_ver_flag = SJPEG_FMT_FLAG_EXYNOS4,
3044 .clk_names = {"jpeg"},
3049 static struct s5p_jpeg_variant exynos5420_jpeg_drvdata = {
3050 .version = SJPEG_EXYNOS5420,
3051 .jpeg_irq = exynos3250_jpeg_irq, /* intentionally 3250 */
3052 .m2m_ops = &exynos3250_jpeg_m2m_ops, /* intentionally 3250 */
3053 .fmt_ver_flag = SJPEG_FMT_FLAG_EXYNOS3250, /* intentionally 3250 */
3056 .clk_names = {"jpeg"},
3060 static struct s5p_jpeg_variant exynos5433_jpeg_drvdata = {
3061 .version = SJPEG_EXYNOS5433,
3062 .jpeg_irq = exynos4_jpeg_irq,
3063 .m2m_ops = &exynos4_jpeg_m2m_ops,
3064 .fmt_ver_flag = SJPEG_FMT_FLAG_EXYNOS4,
3066 .clk_names = {"pclk", "aclk", "aclk_xiu", "sclk"},
3071 static const struct of_device_id samsung_jpeg_match[] = {
3073 .compatible = "samsung,s5pv210-jpeg",
3074 .data = &s5p_jpeg_drvdata,
3076 .compatible = "samsung,exynos3250-jpeg",
3077 .data = &exynos3250_jpeg_drvdata,
3079 .compatible = "samsung,exynos4210-jpeg",
3080 .data = &exynos4_jpeg_drvdata,
3082 .compatible = "samsung,exynos4212-jpeg",
3083 .data = &exynos4_jpeg_drvdata,
3085 .compatible = "samsung,exynos5420-jpeg",
3086 .data = &exynos5420_jpeg_drvdata,
3088 .compatible = "samsung,exynos5433-jpeg",
3089 .data = &exynos5433_jpeg_drvdata,
3094 MODULE_DEVICE_TABLE(of, samsung_jpeg_match);
3096 static void *jpeg_get_drv_data(struct device *dev)
3098 struct s5p_jpeg_variant *driver_data = NULL;
3099 const struct of_device_id *match;
3101 if (!IS_ENABLED(CONFIG_OF) || !dev->of_node)
3102 return &s5p_jpeg_drvdata;
3104 match = of_match_node(samsung_jpeg_match, dev->of_node);
3107 driver_data = (struct s5p_jpeg_variant *)match->data;
3112 static struct platform_driver s5p_jpeg_driver = {
3113 .probe = s5p_jpeg_probe,
3114 .remove = s5p_jpeg_remove,
3116 .of_match_table = of_match_ptr(samsung_jpeg_match),
3117 .name = S5P_JPEG_M2M_NAME,
3118 .pm = &s5p_jpeg_pm_ops,
3122 module_platform_driver(s5p_jpeg_driver);
3124 MODULE_AUTHOR("Andrzej Pietrasiewicz <andrzej.p@samsung.com>");
3125 MODULE_AUTHOR("Jacek Anaszewski <j.anaszewski@samsung.com>");
3126 MODULE_DESCRIPTION("Samsung JPEG codec driver");
3127 MODULE_LICENSE("GPL");