Commit | Line | Data |
---|---|---|
2c3fb08b | 1 | /* linux/drivers/media/platform/s5p-jpeg/jpeg-core.h |
bb677f3a AP |
2 | * |
3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | |
4 | * http://www.samsung.com | |
5 | * | |
6 | * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU General Public License version 2 as | |
10 | * published by the Free Software Foundation. | |
11 | */ | |
12 | ||
13 | #ifndef JPEG_CORE_H_ | |
14 | #define JPEG_CORE_H_ | |
15 | ||
80529ae5 | 16 | #include <linux/interrupt.h> |
bb677f3a | 17 | #include <media/v4l2-device.h> |
275de24d | 18 | #include <media/v4l2-fh.h> |
15f4bc3b | 19 | #include <media/v4l2-ctrls.h> |
bb677f3a AP |
20 | |
21 | #define S5P_JPEG_M2M_NAME "s5p-jpeg" | |
22 | ||
23 | /* JPEG compression quality setting */ | |
24 | #define S5P_JPEG_COMPR_QUAL_BEST 0 | |
25 | #define S5P_JPEG_COMPR_QUAL_WORST 3 | |
26 | ||
27 | /* JPEG RGB to YCbCr conversion matrix coefficients */ | |
28 | #define S5P_JPEG_COEF11 0x4d | |
29 | #define S5P_JPEG_COEF12 0x97 | |
30 | #define S5P_JPEG_COEF13 0x1e | |
31 | #define S5P_JPEG_COEF21 0x2c | |
32 | #define S5P_JPEG_COEF22 0x57 | |
33 | #define S5P_JPEG_COEF23 0x83 | |
34 | #define S5P_JPEG_COEF31 0x83 | |
35 | #define S5P_JPEG_COEF32 0x6e | |
36 | #define S5P_JPEG_COEF33 0x13 | |
37 | ||
3246fdaa JA |
38 | #define EXYNOS3250_IRQ_TIMEOUT 0x10000000 |
39 | ||
bb677f3a AP |
40 | /* a selection of JPEG markers */ |
41 | #define TEM 0x01 | |
42 | #define SOF0 0xc0 | |
43 | #define RST 0xd0 | |
44 | #define SOI 0xd8 | |
45 | #define EOI 0xd9 | |
46 | #define DHP 0xde | |
47 | ||
80529ae5 JA |
48 | /* Flags that indicate a format can be used for capture/output */ |
49 | #define SJPEG_FMT_FLAG_ENC_CAPTURE (1 << 0) | |
50 | #define SJPEG_FMT_FLAG_ENC_OUTPUT (1 << 1) | |
51 | #define SJPEG_FMT_FLAG_DEC_CAPTURE (1 << 2) | |
52 | #define SJPEG_FMT_FLAG_DEC_OUTPUT (1 << 3) | |
53 | #define SJPEG_FMT_FLAG_S5P (1 << 4) | |
3246fdaa JA |
54 | #define SJPEG_FMT_FLAG_EXYNOS3250 (1 << 5) |
55 | #define SJPEG_FMT_FLAG_EXYNOS4 (1 << 6) | |
56 | #define SJPEG_FMT_RGB (1 << 7) | |
57 | #define SJPEG_FMT_NON_RGB (1 << 8) | |
80529ae5 | 58 | |
9f7b62d9 JA |
59 | #define S5P_JPEG_ENCODE 0 |
60 | #define S5P_JPEG_DECODE 1 | |
61 | ||
80529ae5 JA |
62 | #define FMT_TYPE_OUTPUT 0 |
63 | #define FMT_TYPE_CAPTURE 1 | |
64 | ||
65 | #define SJPEG_SUBSAMPLING_444 0x11 | |
66 | #define SJPEG_SUBSAMPLING_422 0x21 | |
67 | #define SJPEG_SUBSAMPLING_420 0x22 | |
bb677f3a | 68 | |
80529ae5 JA |
69 | /* Version numbers */ |
70 | ||
3246fdaa JA |
71 | #define SJPEG_S5P 1 |
72 | #define SJPEG_EXYNOS3250 2 | |
73 | #define SJPEG_EXYNOS4 3 | |
80529ae5 JA |
74 | |
75 | enum exynos4_jpeg_result { | |
76 | OK_ENC_OR_DEC, | |
77 | ERR_PROT, | |
78 | ERR_DEC_INVALID_FORMAT, | |
79 | ERR_MULTI_SCAN, | |
80 | ERR_FRAME, | |
81 | ERR_UNKNOWN, | |
82 | }; | |
9f7b62d9 | 83 | |
80529ae5 JA |
84 | enum exynos4_jpeg_img_quality_level { |
85 | QUALITY_LEVEL_1 = 0, /* high */ | |
86 | QUALITY_LEVEL_2, | |
87 | QUALITY_LEVEL_3, | |
88 | QUALITY_LEVEL_4, /* low */ | |
89 | }; | |
9f7b62d9 | 90 | |
bb677f3a AP |
91 | /** |
92 | * struct s5p_jpeg - JPEG IP abstraction | |
93 | * @lock: the mutex protecting this structure | |
15f4bc3b | 94 | * @slock: spinlock protecting the device contexts |
bb677f3a AP |
95 | * @v4l2_dev: v4l2 device for mem2mem mode |
96 | * @vfd_encoder: video device node for encoder mem2mem mode | |
97 | * @vfd_decoder: video device node for decoder mem2mem mode | |
98 | * @m2m_dev: v4l2 mem2mem device data | |
bb677f3a AP |
99 | * @regs: JPEG IP registers mapping |
100 | * @irq: JPEG IP irq | |
101 | * @clk: JPEG IP clock | |
3246fdaa | 102 | * @sclk: Exynos3250 JPEG IP special clock |
bb677f3a AP |
103 | * @dev: JPEG IP struct device |
104 | * @alloc_ctx: videobuf2 memory allocator's context | |
3246fdaa JA |
105 | * @variant: driver variant to be used |
106 | * @irq_status interrupt flags set during single encode/decode | |
107 | operation | |
108 | ||
bb677f3a AP |
109 | */ |
110 | struct s5p_jpeg { | |
111 | struct mutex lock; | |
a75831f3 | 112 | spinlock_t slock; |
bb677f3a AP |
113 | |
114 | struct v4l2_device v4l2_dev; | |
115 | struct video_device *vfd_encoder; | |
116 | struct video_device *vfd_decoder; | |
117 | struct v4l2_m2m_dev *m2m_dev; | |
118 | ||
bb677f3a AP |
119 | void __iomem *regs; |
120 | unsigned int irq; | |
80529ae5 | 121 | enum exynos4_jpeg_result irq_ret; |
bb677f3a | 122 | struct clk *clk; |
3246fdaa | 123 | struct clk *sclk; |
bb677f3a AP |
124 | struct device *dev; |
125 | void *alloc_ctx; | |
80529ae5 | 126 | struct s5p_jpeg_variant *variant; |
3246fdaa | 127 | u32 irq_status; |
80529ae5 JA |
128 | }; |
129 | ||
130 | struct s5p_jpeg_variant { | |
bf689bb8 JA |
131 | unsigned int version; |
132 | unsigned int fmt_ver_flag; | |
133 | struct v4l2_m2m_ops *m2m_ops; | |
134 | irqreturn_t (*jpeg_irq)(int irq, void *priv); | |
bb677f3a AP |
135 | }; |
136 | ||
137 | /** | |
138 | * struct jpeg_fmt - driver's internal color format data | |
139 | * @name: format descritpion | |
140 | * @fourcc: the fourcc code, 0 if not applicable | |
141 | * @depth: number of bits per pixel | |
142 | * @colplanes: number of color planes (1 for packed formats) | |
143 | * @h_align: horizontal alignment order (align to 2^h_align) | |
144 | * @v_align: vertical alignment order (align to 2^v_align) | |
80529ae5 | 145 | * @flags: flags describing format applicability |
bb677f3a AP |
146 | */ |
147 | struct s5p_jpeg_fmt { | |
148 | char *name; | |
149 | u32 fourcc; | |
150 | int depth; | |
151 | int colplanes; | |
80529ae5 | 152 | int memplanes; |
bb677f3a AP |
153 | int h_align; |
154 | int v_align; | |
80529ae5 JA |
155 | int subsampling; |
156 | u32 flags; | |
bb677f3a AP |
157 | }; |
158 | ||
159 | /** | |
160 | * s5p_jpeg_q_data - parameters of one queue | |
161 | * @fmt: driver-specific format of this queue | |
162 | * @w: image width | |
163 | * @h: image height | |
164 | * @size: image buffer size in bytes | |
165 | */ | |
166 | struct s5p_jpeg_q_data { | |
167 | struct s5p_jpeg_fmt *fmt; | |
168 | u32 w; | |
169 | u32 h; | |
170 | u32 size; | |
171 | }; | |
172 | ||
173 | /** | |
174 | * s5p_jpeg_ctx - the device context data | |
175 | * @jpeg: JPEG IP device for this context | |
176 | * @mode: compression (encode) operation or decompression (decode) | |
177 | * @compr_quality: destination image quality in compression (encode) mode | |
3246fdaa JA |
178 | * @restart_interval: JPEG restart interval for JPEG encoding |
179 | * @subsampling: subsampling of a raw format or a JPEG | |
bb677f3a | 180 | * @out_q: source (output) queue information |
3246fdaa JA |
181 | * @cap_q: destination (capture) queue queue information |
182 | * @scale_factor: scale factor for JPEG decoding | |
183 | * @crop_rect: a rectangle representing crop area of the output buffer | |
184 | * @fh: V4L2 file handle | |
bb677f3a | 185 | * @hdr_parsed: set if header has been parsed during decompression |
3246fdaa | 186 | * @crop_altered: set if crop rectangle has been altered by the user space |
15f4bc3b | 187 | * @ctrl_handler: controls handler |
bb677f3a AP |
188 | */ |
189 | struct s5p_jpeg_ctx { | |
190 | struct s5p_jpeg *jpeg; | |
191 | unsigned int mode; | |
15f4bc3b SN |
192 | unsigned short compr_quality; |
193 | unsigned short restart_interval; | |
194 | unsigned short subsampling; | |
bb677f3a AP |
195 | struct s5p_jpeg_q_data out_q; |
196 | struct s5p_jpeg_q_data cap_q; | |
3246fdaa JA |
197 | unsigned int scale_factor; |
198 | struct v4l2_rect crop_rect; | |
275de24d | 199 | struct v4l2_fh fh; |
bb677f3a | 200 | bool hdr_parsed; |
3246fdaa | 201 | bool crop_altered; |
15f4bc3b | 202 | struct v4l2_ctrl_handler ctrl_handler; |
bb677f3a AP |
203 | }; |
204 | ||
205 | /** | |
206 | * s5p_jpeg_buffer - description of memory containing input JPEG data | |
207 | * @size: buffer size | |
208 | * @curr: current position in the buffer | |
209 | * @data: pointer to the data | |
210 | */ | |
211 | struct s5p_jpeg_buffer { | |
212 | unsigned long size; | |
213 | unsigned long curr; | |
214 | unsigned long data; | |
215 | }; | |
216 | ||
80529ae5 JA |
217 | /** |
218 | * struct s5p_jpeg_addr - JPEG converter physical address set for DMA | |
219 | * @y: luminance plane physical address | |
220 | * @cb: Cb plane physical address | |
221 | * @cr: Cr plane physical address | |
222 | */ | |
223 | struct s5p_jpeg_addr { | |
224 | u32 y; | |
225 | u32 cb; | |
226 | u32 cr; | |
227 | }; | |
228 | ||
bb677f3a | 229 | #endif /* JPEG_CORE_H */ |