1 /* linux/drivers/media/video/s5p-jpeg/jpeg-hw.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 #ifndef JPEG_HW_H_
13 #define JPEG_HW_H_
14 
15 #include <linux/io.h>
16 
17 #include "jpeg-hw.h"
18 #include "jpeg-regs.h"
19 
20 #define S5P_JPEG_MIN_WIDTH		32
21 #define S5P_JPEG_MIN_HEIGHT		32
22 #define S5P_JPEG_MAX_WIDTH		8192
23 #define S5P_JPEG_MAX_HEIGHT		8192
24 #define S5P_JPEG_ENCODE			0
25 #define S5P_JPEG_DECODE			1
26 #define S5P_JPEG_RAW_IN_565		0
27 #define S5P_JPEG_RAW_IN_422		1
28 #define S5P_JPEG_SUBSAMPLING_422	0
29 #define S5P_JPEG_SUBSAMPLING_420	1
30 #define S5P_JPEG_RAW_OUT_422		0
31 #define S5P_JPEG_RAW_OUT_420		1
32 
jpeg_reset(void __iomem * regs)33 static inline void jpeg_reset(void __iomem *regs)
34 {
35 	unsigned long reg;
36 
37 	writel(1, regs + S5P_JPG_SW_RESET);
38 	reg = readl(regs + S5P_JPG_SW_RESET);
39 	/* no other way but polling for when JPEG IP becomes operational */
40 	while (reg != 0) {
41 		cpu_relax();
42 		reg = readl(regs + S5P_JPG_SW_RESET);
43 	}
44 }
45 
jpeg_poweron(void __iomem * regs)46 static inline void jpeg_poweron(void __iomem *regs)
47 {
48 	writel(S5P_POWER_ON, regs + S5P_JPGCLKCON);
49 }
50 
jpeg_input_raw_mode(void __iomem * regs,unsigned long mode)51 static inline void jpeg_input_raw_mode(void __iomem *regs, unsigned long mode)
52 {
53 	unsigned long reg, m;
54 
55 	m = S5P_MOD_SEL_565;
56 	if (mode == S5P_JPEG_RAW_IN_565)
57 		m = S5P_MOD_SEL_565;
58 	else if (mode == S5P_JPEG_RAW_IN_422)
59 		m = S5P_MOD_SEL_422;
60 
61 	reg = readl(regs + S5P_JPGCMOD);
62 	reg &= ~S5P_MOD_SEL_MASK;
63 	reg |= m;
64 	writel(reg, regs + S5P_JPGCMOD);
65 }
66 
jpeg_input_raw_y16(void __iomem * regs,bool y16)67 static inline void jpeg_input_raw_y16(void __iomem *regs, bool y16)
68 {
69 	unsigned long reg;
70 
71 	reg = readl(regs + S5P_JPGCMOD);
72 	if (y16)
73 		reg |= S5P_MODE_Y16;
74 	else
75 		reg &= ~S5P_MODE_Y16_MASK;
76 	writel(reg, regs + S5P_JPGCMOD);
77 }
78 
jpeg_proc_mode(void __iomem * regs,unsigned long mode)79 static inline void jpeg_proc_mode(void __iomem *regs, unsigned long mode)
80 {
81 	unsigned long reg, m;
82 
83 	m = S5P_PROC_MODE_DECOMPR;
84 	if (mode == S5P_JPEG_ENCODE)
85 		m = S5P_PROC_MODE_COMPR;
86 	else
87 		m = S5P_PROC_MODE_DECOMPR;
88 	reg = readl(regs + S5P_JPGMOD);
89 	reg &= ~S5P_PROC_MODE_MASK;
90 	reg |= m;
91 	writel(reg, regs + S5P_JPGMOD);
92 }
93 
jpeg_subsampling_mode(void __iomem * regs,unsigned long mode)94 static inline void jpeg_subsampling_mode(void __iomem *regs, unsigned long mode)
95 {
96 	unsigned long reg, m;
97 
98 	m = S5P_SUBSAMPLING_MODE_422;
99 	if (mode == S5P_JPEG_SUBSAMPLING_422)
100 		m = S5P_SUBSAMPLING_MODE_422;
101 	else if (mode == S5P_JPEG_SUBSAMPLING_420)
102 		m = S5P_SUBSAMPLING_MODE_420;
103 	reg = readl(regs + S5P_JPGMOD);
104 	reg &= ~S5P_SUBSAMPLING_MODE_MASK;
105 	reg |= m;
106 	writel(reg, regs + S5P_JPGMOD);
107 }
108 
jpeg_dri(void __iomem * regs,unsigned int dri)109 static inline void jpeg_dri(void __iomem *regs, unsigned int dri)
110 {
111 	unsigned long reg;
112 
113 	reg = readl(regs + S5P_JPGDRI_U);
114 	reg &= ~0xff;
115 	reg |= (dri >> 8) & 0xff;
116 	writel(reg, regs + S5P_JPGDRI_U);
117 
118 	reg = readl(regs + S5P_JPGDRI_L);
119 	reg &= ~0xff;
120 	reg |= dri & 0xff;
121 	writel(reg, regs + S5P_JPGDRI_L);
122 }
123 
jpeg_qtbl(void __iomem * regs,unsigned int t,unsigned int n)124 static inline void jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n)
125 {
126 	unsigned long reg;
127 
128 	reg = readl(regs + S5P_JPG_QTBL);
129 	reg &= ~S5P_QT_NUMt_MASK(t);
130 	reg |= (n << S5P_QT_NUMt_SHIFT(t)) & S5P_QT_NUMt_MASK(t);
131 	writel(reg, regs + S5P_JPG_QTBL);
132 }
133 
jpeg_htbl_ac(void __iomem * regs,unsigned int t)134 static inline void jpeg_htbl_ac(void __iomem *regs, unsigned int t)
135 {
136 	unsigned long reg;
137 
138 	reg = readl(regs + S5P_JPG_HTBL);
139 	reg &= ~S5P_HT_NUMt_AC_MASK(t);
140 	/* this driver uses table 0 for all color components */
141 	reg |= (0 << S5P_HT_NUMt_AC_SHIFT(t)) & S5P_HT_NUMt_AC_MASK(t);
142 	writel(reg, regs + S5P_JPG_HTBL);
143 }
144 
jpeg_htbl_dc(void __iomem * regs,unsigned int t)145 static inline void jpeg_htbl_dc(void __iomem *regs, unsigned int t)
146 {
147 	unsigned long reg;
148 
149 	reg = readl(regs + S5P_JPG_HTBL);
150 	reg &= ~S5P_HT_NUMt_DC_MASK(t);
151 	/* this driver uses table 0 for all color components */
152 	reg |= (0 << S5P_HT_NUMt_DC_SHIFT(t)) & S5P_HT_NUMt_DC_MASK(t);
153 	writel(reg, regs + S5P_JPG_HTBL);
154 }
155 
jpeg_y(void __iomem * regs,unsigned int y)156 static inline void jpeg_y(void __iomem *regs, unsigned int y)
157 {
158 	unsigned long reg;
159 
160 	reg = readl(regs + S5P_JPGY_U);
161 	reg &= ~0xff;
162 	reg |= (y >> 8) & 0xff;
163 	writel(reg, regs + S5P_JPGY_U);
164 
165 	reg = readl(regs + S5P_JPGY_L);
166 	reg &= ~0xff;
167 	reg |= y & 0xff;
168 	writel(reg, regs + S5P_JPGY_L);
169 }
170 
jpeg_x(void __iomem * regs,unsigned int x)171 static inline void jpeg_x(void __iomem *regs, unsigned int x)
172 {
173 	unsigned long reg;
174 
175 	reg = readl(regs + S5P_JPGX_U);
176 	reg &= ~0xff;
177 	reg |= (x >> 8) & 0xff;
178 	writel(reg, regs + S5P_JPGX_U);
179 
180 	reg = readl(regs + S5P_JPGX_L);
181 	reg &= ~0xff;
182 	reg |= x & 0xff;
183 	writel(reg, regs + S5P_JPGX_L);
184 }
185 
jpeg_rst_int_enable(void __iomem * regs,bool enable)186 static inline void jpeg_rst_int_enable(void __iomem *regs, bool enable)
187 {
188 	unsigned long reg;
189 
190 	reg = readl(regs + S5P_JPGINTSE);
191 	reg &= ~S5P_RSTm_INT_EN_MASK;
192 	if (enable)
193 		reg |= S5P_RSTm_INT_EN;
194 	writel(reg, regs + S5P_JPGINTSE);
195 }
196 
jpeg_data_num_int_enable(void __iomem * regs,bool enable)197 static inline void jpeg_data_num_int_enable(void __iomem *regs, bool enable)
198 {
199 	unsigned long reg;
200 
201 	reg = readl(regs + S5P_JPGINTSE);
202 	reg &= ~S5P_DATA_NUM_INT_EN_MASK;
203 	if (enable)
204 		reg |= S5P_DATA_NUM_INT_EN;
205 	writel(reg, regs + S5P_JPGINTSE);
206 }
207 
jpeg_final_mcu_num_int_enable(void __iomem * regs,bool enbl)208 static inline void jpeg_final_mcu_num_int_enable(void __iomem *regs, bool enbl)
209 {
210 	unsigned long reg;
211 
212 	reg = readl(regs + S5P_JPGINTSE);
213 	reg &= ~S5P_FINAL_MCU_NUM_INT_EN_MASK;
214 	if (enbl)
215 		reg |= S5P_FINAL_MCU_NUM_INT_EN;
216 	writel(reg, regs + S5P_JPGINTSE);
217 }
218 
jpeg_timer_enable(void __iomem * regs,unsigned long val)219 static inline void jpeg_timer_enable(void __iomem *regs, unsigned long val)
220 {
221 	unsigned long reg;
222 
223 	reg = readl(regs + S5P_JPG_TIMER_SE);
224 	reg |= S5P_TIMER_INT_EN;
225 	reg &= ~S5P_TIMER_INIT_MASK;
226 	reg |= val & S5P_TIMER_INIT_MASK;
227 	writel(reg, regs + S5P_JPG_TIMER_SE);
228 }
229 
jpeg_timer_disable(void __iomem * regs)230 static inline void jpeg_timer_disable(void __iomem *regs)
231 {
232 	unsigned long reg;
233 
234 	reg = readl(regs + S5P_JPG_TIMER_SE);
235 	reg &= ~S5P_TIMER_INT_EN_MASK;
236 	writel(reg, regs + S5P_JPG_TIMER_SE);
237 }
238 
jpeg_timer_stat(void __iomem * regs)239 static inline int jpeg_timer_stat(void __iomem *regs)
240 {
241 	return (int)((readl(regs + S5P_JPG_TIMER_ST) & S5P_TIMER_INT_STAT_MASK)
242 		     >> S5P_TIMER_INT_STAT_SHIFT);
243 }
244 
jpeg_clear_timer_stat(void __iomem * regs)245 static inline void jpeg_clear_timer_stat(void __iomem *regs)
246 {
247 	unsigned long reg;
248 
249 	reg = readl(regs + S5P_JPG_TIMER_SE);
250 	reg &= ~S5P_TIMER_INT_STAT_MASK;
251 	writel(reg, regs + S5P_JPG_TIMER_SE);
252 }
253 
jpeg_enc_stream_int(void __iomem * regs,unsigned long size)254 static inline void jpeg_enc_stream_int(void __iomem *regs, unsigned long size)
255 {
256 	unsigned long reg;
257 
258 	reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
259 	reg &= ~S5P_ENC_STREAM_BOUND_MASK;
260 	reg |= S5P_ENC_STREAM_INT_EN;
261 	reg |= size & S5P_ENC_STREAM_BOUND_MASK;
262 	writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
263 }
264 
jpeg_enc_stream_stat(void __iomem * regs)265 static inline int jpeg_enc_stream_stat(void __iomem *regs)
266 {
267 	return (int)(readl(regs + S5P_JPG_ENC_STREAM_INTST) &
268 		     S5P_ENC_STREAM_INT_STAT_MASK);
269 }
270 
jpeg_clear_enc_stream_stat(void __iomem * regs)271 static inline void jpeg_clear_enc_stream_stat(void __iomem *regs)
272 {
273 	unsigned long reg;
274 
275 	reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
276 	reg &= ~S5P_ENC_STREAM_INT_MASK;
277 	writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
278 }
279 
jpeg_outform_raw(void __iomem * regs,unsigned long format)280 static inline void jpeg_outform_raw(void __iomem *regs, unsigned long format)
281 {
282 	unsigned long reg, f;
283 
284 	f = S5P_DEC_OUT_FORMAT_422;
285 	if (format == S5P_JPEG_RAW_OUT_422)
286 		f = S5P_DEC_OUT_FORMAT_422;
287 	else if (format == S5P_JPEG_RAW_OUT_420)
288 		f = S5P_DEC_OUT_FORMAT_420;
289 	reg = readl(regs + S5P_JPG_OUTFORM);
290 	reg &= ~S5P_DEC_OUT_FORMAT_MASK;
291 	reg |= f;
292 	writel(reg, regs + S5P_JPG_OUTFORM);
293 }
294 
jpeg_jpgadr(void __iomem * regs,unsigned long addr)295 static inline void jpeg_jpgadr(void __iomem *regs, unsigned long addr)
296 {
297 	writel(addr, regs + S5P_JPG_JPGADR);
298 }
299 
jpeg_imgadr(void __iomem * regs,unsigned long addr)300 static inline void jpeg_imgadr(void __iomem *regs, unsigned long addr)
301 {
302 	writel(addr, regs + S5P_JPG_IMGADR);
303 }
304 
jpeg_coef(void __iomem * regs,unsigned int i,unsigned int j,unsigned int coef)305 static inline void jpeg_coef(void __iomem *regs, unsigned int i,
306 			     unsigned int j, unsigned int coef)
307 {
308 	unsigned long reg;
309 
310 	reg = readl(regs + S5P_JPG_COEF(i));
311 	reg &= ~S5P_COEFn_MASK(j);
312 	reg |= (coef << S5P_COEFn_SHIFT(j)) & S5P_COEFn_MASK(j);
313 	writel(reg, regs + S5P_JPG_COEF(i));
314 }
315 
jpeg_start(void __iomem * regs)316 static inline void jpeg_start(void __iomem *regs)
317 {
318 	writel(1, regs + S5P_JSTART);
319 }
320 
jpeg_result_stat_ok(void __iomem * regs)321 static inline int jpeg_result_stat_ok(void __iomem *regs)
322 {
323 	return (int)((readl(regs + S5P_JPGINTST) & S5P_RESULT_STAT_MASK)
324 		     >> S5P_RESULT_STAT_SHIFT);
325 }
326 
jpeg_stream_stat_ok(void __iomem * regs)327 static inline int jpeg_stream_stat_ok(void __iomem *regs)
328 {
329 	return !(int)((readl(regs + S5P_JPGINTST) & S5P_STREAM_STAT_MASK)
330 		      >> S5P_STREAM_STAT_SHIFT);
331 }
332 
jpeg_clear_int(void __iomem * regs)333 static inline void jpeg_clear_int(void __iomem *regs)
334 {
335 	unsigned long reg;
336 
337 	reg = readl(regs + S5P_JPGINTST);
338 	writel(S5P_INT_RELEASE, regs + S5P_JPGCOM);
339 	reg = readl(regs + S5P_JPGOPR);
340 }
341 
jpeg_compressed_size(void __iomem * regs)342 static inline unsigned int jpeg_compressed_size(void __iomem *regs)
343 {
344 	unsigned long jpeg_size = 0;
345 
346 	jpeg_size |= (readl(regs + S5P_JPGCNT_U) & 0xff) << 16;
347 	jpeg_size |= (readl(regs + S5P_JPGCNT_M) & 0xff) << 8;
348 	jpeg_size |= (readl(regs + S5P_JPGCNT_L) & 0xff);
349 
350 	return (unsigned int)jpeg_size;
351 }
352 
353 #endif /* JPEG_HW_H_ */
354