Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / media / platform / s5p-jpeg / jpeg-core.h
1 /* linux/drivers/media/platform/s5p-jpeg/jpeg-core.h
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
16 #include <linux/interrupt.h>
17 #include <media/v4l2-device.h>
18 #include <media/v4l2-fh.h>
19 #include <media/v4l2-ctrls.h>
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
38 #define EXYNOS3250_IRQ_TIMEOUT          0x10000000
39
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
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)
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)
58
59 #define S5P_JPEG_ENCODE         0
60 #define S5P_JPEG_DECODE         1
61
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
68
69 /* Version numbers */
70 enum sjpeg_version {
71         SJPEG_S5P,
72         SJPEG_EXYNOS3250,
73         SJPEG_EXYNOS4,
74         SJPEG_EXYNOS5420,
75 };
76
77 enum exynos4_jpeg_result {
78         OK_ENC_OR_DEC,
79         ERR_PROT,
80         ERR_DEC_INVALID_FORMAT,
81         ERR_MULTI_SCAN,
82         ERR_FRAME,
83         ERR_UNKNOWN,
84 };
85
86 enum  exynos4_jpeg_img_quality_level {
87         QUALITY_LEVEL_1 = 0,    /* high */
88         QUALITY_LEVEL_2,
89         QUALITY_LEVEL_3,
90         QUALITY_LEVEL_4,        /* low */
91 };
92
93 /**
94  * struct s5p_jpeg - JPEG IP abstraction
95  * @lock:               the mutex protecting this structure
96  * @slock:              spinlock protecting the device contexts
97  * @v4l2_dev:           v4l2 device for mem2mem mode
98  * @vfd_encoder:        video device node for encoder mem2mem mode
99  * @vfd_decoder:        video device node for decoder mem2mem mode
100  * @m2m_dev:            v4l2 mem2mem device data
101  * @regs:               JPEG IP registers mapping
102  * @irq:                JPEG IP irq
103  * @clk:                JPEG IP clock
104  * @sclk:               Exynos3250 JPEG IP special clock
105  * @dev:                JPEG IP struct device
106  * @alloc_ctx:          videobuf2 memory allocator's context
107  * @variant:            driver variant to be used
108  * @irq_status          interrupt flags set during single encode/decode
109                         operation
110
111  */
112 struct s5p_jpeg {
113         struct mutex            lock;
114         spinlock_t              slock;
115
116         struct v4l2_device      v4l2_dev;
117         struct video_device     *vfd_encoder;
118         struct video_device     *vfd_decoder;
119         struct v4l2_m2m_dev     *m2m_dev;
120
121         void __iomem            *regs;
122         unsigned int            irq;
123         enum exynos4_jpeg_result irq_ret;
124         struct clk              *clk;
125         struct clk              *sclk;
126         struct device           *dev;
127         void                    *alloc_ctx;
128         struct s5p_jpeg_variant *variant;
129         u32                     irq_status;
130 };
131
132 struct s5p_jpeg_variant {
133         unsigned int            version;
134         unsigned int            fmt_ver_flag;
135         unsigned int            hw3250_compat:1;
136         unsigned int            htbl_reinit:1;
137         struct v4l2_m2m_ops     *m2m_ops;
138         irqreturn_t             (*jpeg_irq)(int irq, void *priv);
139 };
140
141 /**
142  * struct jpeg_fmt - driver's internal color format data
143  * @name:       format descritpion
144  * @fourcc:     the fourcc code, 0 if not applicable
145  * @depth:      number of bits per pixel
146  * @colplanes:  number of color planes (1 for packed formats)
147  * @h_align:    horizontal alignment order (align to 2^h_align)
148  * @v_align:    vertical alignment order (align to 2^v_align)
149  * @flags:      flags describing format applicability
150  */
151 struct s5p_jpeg_fmt {
152         char    *name;
153         u32     fourcc;
154         int     depth;
155         int     colplanes;
156         int     memplanes;
157         int     h_align;
158         int     v_align;
159         int     subsampling;
160         u32     flags;
161 };
162
163 /**
164  * s5p_jpeg_q_data - parameters of one queue
165  * @fmt:        driver-specific format of this queue
166  * @w:          image width
167  * @h:          image height
168  * @size:       image buffer size in bytes
169  */
170 struct s5p_jpeg_q_data {
171         struct s5p_jpeg_fmt     *fmt;
172         u32                     w;
173         u32                     h;
174         u32                     size;
175 };
176
177 /**
178  * s5p_jpeg_ctx - the device context data
179  * @jpeg:               JPEG IP device for this context
180  * @mode:               compression (encode) operation or decompression (decode)
181  * @compr_quality:      destination image quality in compression (encode) mode
182  * @restart_interval:   JPEG restart interval for JPEG encoding
183  * @subsampling:        subsampling of a raw format or a JPEG
184  * @out_q:              source (output) queue information
185  * @cap_q:              destination (capture) queue queue information
186  * @scale_factor:       scale factor for JPEG decoding
187  * @crop_rect:          a rectangle representing crop area of the output buffer
188  * @fh:                 V4L2 file handle
189  * @hdr_parsed:         set if header has been parsed during decompression
190  * @crop_altered:       set if crop rectangle has been altered by the user space
191  * @ctrl_handler:       controls handler
192  */
193 struct s5p_jpeg_ctx {
194         struct s5p_jpeg         *jpeg;
195         unsigned int            mode;
196         unsigned short          compr_quality;
197         unsigned short          restart_interval;
198         unsigned short          subsampling;
199         struct s5p_jpeg_q_data  out_q;
200         struct s5p_jpeg_q_data  cap_q;
201         unsigned int            scale_factor;
202         struct v4l2_rect        crop_rect;
203         struct v4l2_fh          fh;
204         bool                    hdr_parsed;
205         bool                    crop_altered;
206         struct v4l2_ctrl_handler ctrl_handler;
207 };
208
209 /**
210  * s5p_jpeg_buffer - description of memory containing input JPEG data
211  * @size:       buffer size
212  * @curr:       current position in the buffer
213  * @data:       pointer to the data
214  */
215 struct s5p_jpeg_buffer {
216         unsigned long size;
217         unsigned long curr;
218         unsigned long data;
219 };
220
221 /**
222  * struct s5p_jpeg_addr - JPEG converter physical address set for DMA
223  * @y:   luminance plane physical address
224  * @cb:  Cb plane physical address
225  * @cr:  Cr plane physical address
226  */
227 struct s5p_jpeg_addr {
228         u32     y;
229         u32     cb;
230         u32     cr;
231 };
232
233 #endif /* JPEG_CORE_H */