xref: /OK3568_Linux_fs/kernel/drivers/media/platform/s5p-jpeg/jpeg-hw-exynos3250.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /* linux/drivers/media/platform/exynos3250-jpeg/jpeg-hw.h
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
5*4882a593Smuzhiyun  *		http://www.samsung.com
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/io.h>
11*4882a593Smuzhiyun #include <linux/videodev2.h>
12*4882a593Smuzhiyun #include <linux/delay.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include "jpeg-core.h"
15*4882a593Smuzhiyun #include "jpeg-regs.h"
16*4882a593Smuzhiyun #include "jpeg-hw-exynos3250.h"
17*4882a593Smuzhiyun 
exynos3250_jpeg_reset(void __iomem * regs)18*4882a593Smuzhiyun void exynos3250_jpeg_reset(void __iomem *regs)
19*4882a593Smuzhiyun {
20*4882a593Smuzhiyun 	u32 reg = 1;
21*4882a593Smuzhiyun 	int count = 1000;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 	writel(1, regs + EXYNOS3250_SW_RESET);
24*4882a593Smuzhiyun 	/* no other way but polling for when JPEG IP becomes operational */
25*4882a593Smuzhiyun 	while (reg != 0 && --count > 0) {
26*4882a593Smuzhiyun 		udelay(1);
27*4882a593Smuzhiyun 		cpu_relax();
28*4882a593Smuzhiyun 		reg = readl(regs + EXYNOS3250_SW_RESET);
29*4882a593Smuzhiyun 	}
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 	reg = 0;
32*4882a593Smuzhiyun 	count = 1000;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	while (reg != 1 && --count > 0) {
35*4882a593Smuzhiyun 		writel(1, regs + EXYNOS3250_JPGDRI);
36*4882a593Smuzhiyun 		udelay(1);
37*4882a593Smuzhiyun 		cpu_relax();
38*4882a593Smuzhiyun 		reg = readl(regs + EXYNOS3250_JPGDRI);
39*4882a593Smuzhiyun 	}
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	writel(0, regs + EXYNOS3250_JPGDRI);
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun 
exynos3250_jpeg_poweron(void __iomem * regs)44*4882a593Smuzhiyun void exynos3250_jpeg_poweron(void __iomem *regs)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun 	writel(EXYNOS3250_POWER_ON, regs + EXYNOS3250_JPGCLKCON);
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun 
exynos3250_jpeg_set_dma_num(void __iomem * regs)49*4882a593Smuzhiyun void exynos3250_jpeg_set_dma_num(void __iomem *regs)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun 	writel(((EXYNOS3250_DMA_MO_COUNT << EXYNOS3250_WDMA_ISSUE_NUM_SHIFT) &
52*4882a593Smuzhiyun 			EXYNOS3250_WDMA_ISSUE_NUM_MASK) |
53*4882a593Smuzhiyun 	       ((EXYNOS3250_DMA_MO_COUNT << EXYNOS3250_RDMA_ISSUE_NUM_SHIFT) &
54*4882a593Smuzhiyun 			EXYNOS3250_RDMA_ISSUE_NUM_MASK) |
55*4882a593Smuzhiyun 	       ((EXYNOS3250_DMA_MO_COUNT << EXYNOS3250_ISSUE_GATHER_NUM_SHIFT) &
56*4882a593Smuzhiyun 			EXYNOS3250_ISSUE_GATHER_NUM_MASK),
57*4882a593Smuzhiyun 		regs + EXYNOS3250_DMA_ISSUE_NUM);
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun 
exynos3250_jpeg_clk_set(void __iomem * base)60*4882a593Smuzhiyun void exynos3250_jpeg_clk_set(void __iomem *base)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun 	u32 reg;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	reg = readl(base + EXYNOS3250_JPGCMOD) & ~EXYNOS3250_HALF_EN_MASK;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	writel(reg | EXYNOS3250_HALF_EN, base + EXYNOS3250_JPGCMOD);
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
exynos3250_jpeg_input_raw_fmt(void __iomem * regs,unsigned int fmt)69*4882a593Smuzhiyun void exynos3250_jpeg_input_raw_fmt(void __iomem *regs, unsigned int fmt)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun 	u32 reg;
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	reg = readl(regs + EXYNOS3250_JPGCMOD) &
74*4882a593Smuzhiyun 			EXYNOS3250_MODE_Y16_MASK;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	switch (fmt) {
77*4882a593Smuzhiyun 	case V4L2_PIX_FMT_RGB32:
78*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_ARGB8888;
79*4882a593Smuzhiyun 		break;
80*4882a593Smuzhiyun 	case V4L2_PIX_FMT_BGR32:
81*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_ARGB8888 | EXYNOS3250_SRC_SWAP_RGB;
82*4882a593Smuzhiyun 		break;
83*4882a593Smuzhiyun 	case V4L2_PIX_FMT_RGB565:
84*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_RGB565;
85*4882a593Smuzhiyun 		break;
86*4882a593Smuzhiyun 	case V4L2_PIX_FMT_RGB565X:
87*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_RGB565 | EXYNOS3250_SRC_SWAP_RGB;
88*4882a593Smuzhiyun 		break;
89*4882a593Smuzhiyun 	case V4L2_PIX_FMT_YUYV:
90*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_422_1P_LUM_CHR;
91*4882a593Smuzhiyun 		break;
92*4882a593Smuzhiyun 	case V4L2_PIX_FMT_YVYU:
93*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_422_1P_LUM_CHR |
94*4882a593Smuzhiyun 			EXYNOS3250_SRC_SWAP_UV;
95*4882a593Smuzhiyun 		break;
96*4882a593Smuzhiyun 	case V4L2_PIX_FMT_UYVY:
97*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_422_1P_CHR_LUM;
98*4882a593Smuzhiyun 		break;
99*4882a593Smuzhiyun 	case V4L2_PIX_FMT_VYUY:
100*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_422_1P_CHR_LUM |
101*4882a593Smuzhiyun 			EXYNOS3250_SRC_SWAP_UV;
102*4882a593Smuzhiyun 		break;
103*4882a593Smuzhiyun 	case V4L2_PIX_FMT_NV12:
104*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_420_2P | EXYNOS3250_SRC_NV12;
105*4882a593Smuzhiyun 		break;
106*4882a593Smuzhiyun 	case V4L2_PIX_FMT_NV21:
107*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_420_2P | EXYNOS3250_SRC_NV21;
108*4882a593Smuzhiyun 		break;
109*4882a593Smuzhiyun 	case V4L2_PIX_FMT_YUV420:
110*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_SEL_420_3P;
111*4882a593Smuzhiyun 		break;
112*4882a593Smuzhiyun 	default:
113*4882a593Smuzhiyun 		break;
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	}
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_JPGCMOD);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
exynos3250_jpeg_set_y16(void __iomem * regs,bool y16)120*4882a593Smuzhiyun void exynos3250_jpeg_set_y16(void __iomem *regs, bool y16)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	u32 reg;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	reg = readl(regs + EXYNOS3250_JPGCMOD);
125*4882a593Smuzhiyun 	if (y16)
126*4882a593Smuzhiyun 		reg |= EXYNOS3250_MODE_Y16;
127*4882a593Smuzhiyun 	else
128*4882a593Smuzhiyun 		reg &= ~EXYNOS3250_MODE_Y16_MASK;
129*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_JPGCMOD);
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun 
exynos3250_jpeg_proc_mode(void __iomem * regs,unsigned int mode)132*4882a593Smuzhiyun void exynos3250_jpeg_proc_mode(void __iomem *regs, unsigned int mode)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun 	u32 reg, m;
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	if (mode == S5P_JPEG_ENCODE)
137*4882a593Smuzhiyun 		m = EXYNOS3250_PROC_MODE_COMPR;
138*4882a593Smuzhiyun 	else
139*4882a593Smuzhiyun 		m = EXYNOS3250_PROC_MODE_DECOMPR;
140*4882a593Smuzhiyun 	reg = readl(regs + EXYNOS3250_JPGMOD);
141*4882a593Smuzhiyun 	reg &= ~EXYNOS3250_PROC_MODE_MASK;
142*4882a593Smuzhiyun 	reg |= m;
143*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_JPGMOD);
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun 
exynos3250_jpeg_subsampling_mode(void __iomem * regs,unsigned int mode)146*4882a593Smuzhiyun void exynos3250_jpeg_subsampling_mode(void __iomem *regs, unsigned int mode)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun 	u32 reg, m = 0;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	switch (mode) {
151*4882a593Smuzhiyun 	case V4L2_JPEG_CHROMA_SUBSAMPLING_444:
152*4882a593Smuzhiyun 		m = EXYNOS3250_SUBSAMPLING_MODE_444;
153*4882a593Smuzhiyun 		break;
154*4882a593Smuzhiyun 	case V4L2_JPEG_CHROMA_SUBSAMPLING_422:
155*4882a593Smuzhiyun 		m = EXYNOS3250_SUBSAMPLING_MODE_422;
156*4882a593Smuzhiyun 		break;
157*4882a593Smuzhiyun 	case V4L2_JPEG_CHROMA_SUBSAMPLING_420:
158*4882a593Smuzhiyun 		m = EXYNOS3250_SUBSAMPLING_MODE_420;
159*4882a593Smuzhiyun 		break;
160*4882a593Smuzhiyun 	}
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	reg = readl(regs + EXYNOS3250_JPGMOD);
163*4882a593Smuzhiyun 	reg &= ~EXYNOS3250_SUBSAMPLING_MODE_MASK;
164*4882a593Smuzhiyun 	reg |= m;
165*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_JPGMOD);
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
exynos3250_jpeg_get_subsampling_mode(void __iomem * regs)168*4882a593Smuzhiyun unsigned int exynos3250_jpeg_get_subsampling_mode(void __iomem *regs)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun 	return readl(regs + EXYNOS3250_JPGMOD) &
171*4882a593Smuzhiyun 				EXYNOS3250_SUBSAMPLING_MODE_MASK;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun 
exynos3250_jpeg_dri(void __iomem * regs,unsigned int dri)174*4882a593Smuzhiyun void exynos3250_jpeg_dri(void __iomem *regs, unsigned int dri)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun 	u32 reg;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	reg = dri & EXYNOS3250_JPGDRI_MASK;
179*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_JPGDRI);
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun 
exynos3250_jpeg_qtbl(void __iomem * regs,unsigned int t,unsigned int n)182*4882a593Smuzhiyun void exynos3250_jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun 	unsigned long reg;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	reg = readl(regs + EXYNOS3250_QHTBL);
187*4882a593Smuzhiyun 	reg &= ~EXYNOS3250_QT_NUM_MASK(t);
188*4882a593Smuzhiyun 	reg |= (n << EXYNOS3250_QT_NUM_SHIFT(t)) &
189*4882a593Smuzhiyun 					EXYNOS3250_QT_NUM_MASK(t);
190*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_QHTBL);
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun 
exynos3250_jpeg_htbl_ac(void __iomem * regs,unsigned int t)193*4882a593Smuzhiyun void exynos3250_jpeg_htbl_ac(void __iomem *regs, unsigned int t)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun 	unsigned long reg;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	reg = readl(regs + EXYNOS3250_QHTBL);
198*4882a593Smuzhiyun 	reg &= ~EXYNOS3250_HT_NUM_AC_MASK(t);
199*4882a593Smuzhiyun 	/* this driver uses table 0 for all color components */
200*4882a593Smuzhiyun 	reg |= (0 << EXYNOS3250_HT_NUM_AC_SHIFT(t)) &
201*4882a593Smuzhiyun 					EXYNOS3250_HT_NUM_AC_MASK(t);
202*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_QHTBL);
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun 
exynos3250_jpeg_htbl_dc(void __iomem * regs,unsigned int t)205*4882a593Smuzhiyun void exynos3250_jpeg_htbl_dc(void __iomem *regs, unsigned int t)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun 	unsigned long reg;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	reg = readl(regs + EXYNOS3250_QHTBL);
210*4882a593Smuzhiyun 	reg &= ~EXYNOS3250_HT_NUM_DC_MASK(t);
211*4882a593Smuzhiyun 	/* this driver uses table 0 for all color components */
212*4882a593Smuzhiyun 	reg |= (0 << EXYNOS3250_HT_NUM_DC_SHIFT(t)) &
213*4882a593Smuzhiyun 					EXYNOS3250_HT_NUM_DC_MASK(t);
214*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_QHTBL);
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun 
exynos3250_jpeg_set_y(void __iomem * regs,unsigned int y)217*4882a593Smuzhiyun void exynos3250_jpeg_set_y(void __iomem *regs, unsigned int y)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun 	u32 reg;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	reg = y & EXYNOS3250_JPGY_MASK;
222*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_JPGY);
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun 
exynos3250_jpeg_set_x(void __iomem * regs,unsigned int x)225*4882a593Smuzhiyun void exynos3250_jpeg_set_x(void __iomem *regs, unsigned int x)
226*4882a593Smuzhiyun {
227*4882a593Smuzhiyun 	u32 reg;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	reg = x & EXYNOS3250_JPGX_MASK;
230*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_JPGX);
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun #if 0	/* Currently unused */
234*4882a593Smuzhiyun unsigned int exynos3250_jpeg_get_y(void __iomem *regs)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun 	return readl(regs + EXYNOS3250_JPGY);
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun unsigned int exynos3250_jpeg_get_x(void __iomem *regs)
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun 	return readl(regs + EXYNOS3250_JPGX);
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun #endif
244*4882a593Smuzhiyun 
exynos3250_jpeg_interrupts_enable(void __iomem * regs)245*4882a593Smuzhiyun void exynos3250_jpeg_interrupts_enable(void __iomem *regs)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	u32 reg;
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	reg = readl(regs + EXYNOS3250_JPGINTSE);
250*4882a593Smuzhiyun 	reg |= (EXYNOS3250_JPEG_DONE_EN |
251*4882a593Smuzhiyun 		EXYNOS3250_WDMA_DONE_EN |
252*4882a593Smuzhiyun 		EXYNOS3250_RDMA_DONE_EN |
253*4882a593Smuzhiyun 		EXYNOS3250_ENC_STREAM_INT_EN |
254*4882a593Smuzhiyun 		EXYNOS3250_CORE_DONE_EN |
255*4882a593Smuzhiyun 		EXYNOS3250_ERR_INT_EN |
256*4882a593Smuzhiyun 		EXYNOS3250_HEAD_INT_EN);
257*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_JPGINTSE);
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun 
exynos3250_jpeg_enc_stream_bound(void __iomem * regs,unsigned int size)260*4882a593Smuzhiyun void exynos3250_jpeg_enc_stream_bound(void __iomem *regs, unsigned int size)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun 	u32 reg;
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	reg = size & EXYNOS3250_ENC_STREAM_BOUND_MASK;
265*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_ENC_STREAM_BOUND);
266*4882a593Smuzhiyun }
267*4882a593Smuzhiyun 
exynos3250_jpeg_output_raw_fmt(void __iomem * regs,unsigned int fmt)268*4882a593Smuzhiyun void exynos3250_jpeg_output_raw_fmt(void __iomem *regs, unsigned int fmt)
269*4882a593Smuzhiyun {
270*4882a593Smuzhiyun 	u32 reg;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	switch (fmt) {
273*4882a593Smuzhiyun 	case V4L2_PIX_FMT_RGB32:
274*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_ARGB8888;
275*4882a593Smuzhiyun 		break;
276*4882a593Smuzhiyun 	case V4L2_PIX_FMT_BGR32:
277*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_ARGB8888 | EXYNOS3250_OUT_SWAP_RGB;
278*4882a593Smuzhiyun 		break;
279*4882a593Smuzhiyun 	case V4L2_PIX_FMT_RGB565:
280*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_RGB565;
281*4882a593Smuzhiyun 		break;
282*4882a593Smuzhiyun 	case V4L2_PIX_FMT_RGB565X:
283*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_RGB565 | EXYNOS3250_OUT_SWAP_RGB;
284*4882a593Smuzhiyun 		break;
285*4882a593Smuzhiyun 	case V4L2_PIX_FMT_YUYV:
286*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_422_1P_LUM_CHR;
287*4882a593Smuzhiyun 		break;
288*4882a593Smuzhiyun 	case V4L2_PIX_FMT_YVYU:
289*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_422_1P_LUM_CHR |
290*4882a593Smuzhiyun 			EXYNOS3250_OUT_SWAP_UV;
291*4882a593Smuzhiyun 		break;
292*4882a593Smuzhiyun 	case V4L2_PIX_FMT_UYVY:
293*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_422_1P_CHR_LUM;
294*4882a593Smuzhiyun 		break;
295*4882a593Smuzhiyun 	case V4L2_PIX_FMT_VYUY:
296*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_422_1P_CHR_LUM |
297*4882a593Smuzhiyun 			EXYNOS3250_OUT_SWAP_UV;
298*4882a593Smuzhiyun 		break;
299*4882a593Smuzhiyun 	case V4L2_PIX_FMT_NV12:
300*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_420_2P | EXYNOS3250_OUT_NV12;
301*4882a593Smuzhiyun 		break;
302*4882a593Smuzhiyun 	case V4L2_PIX_FMT_NV21:
303*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_420_2P | EXYNOS3250_OUT_NV21;
304*4882a593Smuzhiyun 		break;
305*4882a593Smuzhiyun 	case V4L2_PIX_FMT_YUV420:
306*4882a593Smuzhiyun 		reg = EXYNOS3250_OUT_FMT_420_3P;
307*4882a593Smuzhiyun 		break;
308*4882a593Smuzhiyun 	default:
309*4882a593Smuzhiyun 		reg = 0;
310*4882a593Smuzhiyun 		break;
311*4882a593Smuzhiyun 	}
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_OUTFORM);
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun 
exynos3250_jpeg_jpgadr(void __iomem * regs,unsigned int addr)316*4882a593Smuzhiyun void exynos3250_jpeg_jpgadr(void __iomem *regs, unsigned int addr)
317*4882a593Smuzhiyun {
318*4882a593Smuzhiyun 	writel(addr, regs + EXYNOS3250_JPG_JPGADR);
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun 
exynos3250_jpeg_imgadr(void __iomem * regs,struct s5p_jpeg_addr * img_addr)321*4882a593Smuzhiyun void exynos3250_jpeg_imgadr(void __iomem *regs, struct s5p_jpeg_addr *img_addr)
322*4882a593Smuzhiyun {
323*4882a593Smuzhiyun 	writel(img_addr->y, regs + EXYNOS3250_LUMA_BASE);
324*4882a593Smuzhiyun 	writel(img_addr->cb, regs + EXYNOS3250_CHROMA_BASE);
325*4882a593Smuzhiyun 	writel(img_addr->cr, regs + EXYNOS3250_CHROMA_CR_BASE);
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun 
exynos3250_jpeg_stride(void __iomem * regs,unsigned int img_fmt,unsigned int width)328*4882a593Smuzhiyun void exynos3250_jpeg_stride(void __iomem *regs, unsigned int img_fmt,
329*4882a593Smuzhiyun 			    unsigned int width)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	u32 reg_luma = 0, reg_cr = 0, reg_cb = 0;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	switch (img_fmt) {
334*4882a593Smuzhiyun 	case V4L2_PIX_FMT_RGB32:
335*4882a593Smuzhiyun 		reg_luma = 4 * width;
336*4882a593Smuzhiyun 		break;
337*4882a593Smuzhiyun 	case V4L2_PIX_FMT_RGB565:
338*4882a593Smuzhiyun 	case V4L2_PIX_FMT_RGB565X:
339*4882a593Smuzhiyun 	case V4L2_PIX_FMT_YUYV:
340*4882a593Smuzhiyun 	case V4L2_PIX_FMT_YVYU:
341*4882a593Smuzhiyun 	case V4L2_PIX_FMT_UYVY:
342*4882a593Smuzhiyun 	case V4L2_PIX_FMT_VYUY:
343*4882a593Smuzhiyun 		reg_luma = 2 * width;
344*4882a593Smuzhiyun 		break;
345*4882a593Smuzhiyun 	case V4L2_PIX_FMT_NV12:
346*4882a593Smuzhiyun 	case V4L2_PIX_FMT_NV21:
347*4882a593Smuzhiyun 		reg_luma = width;
348*4882a593Smuzhiyun 		reg_cb = reg_luma;
349*4882a593Smuzhiyun 		break;
350*4882a593Smuzhiyun 	case V4L2_PIX_FMT_YUV420:
351*4882a593Smuzhiyun 		reg_luma = width;
352*4882a593Smuzhiyun 		reg_cb = reg_cr = reg_luma / 2;
353*4882a593Smuzhiyun 		break;
354*4882a593Smuzhiyun 	default:
355*4882a593Smuzhiyun 		break;
356*4882a593Smuzhiyun 	}
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	writel(reg_luma, regs + EXYNOS3250_LUMA_STRIDE);
359*4882a593Smuzhiyun 	writel(reg_cb, regs + EXYNOS3250_CHROMA_STRIDE);
360*4882a593Smuzhiyun 	writel(reg_cr, regs + EXYNOS3250_CHROMA_CR_STRIDE);
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun 
exynos3250_jpeg_offset(void __iomem * regs,unsigned int x_offset,unsigned int y_offset)363*4882a593Smuzhiyun void exynos3250_jpeg_offset(void __iomem *regs, unsigned int x_offset,
364*4882a593Smuzhiyun 				unsigned int y_offset)
365*4882a593Smuzhiyun {
366*4882a593Smuzhiyun 	u32 reg;
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 	reg = (y_offset << EXYNOS3250_LUMA_YY_OFFSET_SHIFT) &
369*4882a593Smuzhiyun 			EXYNOS3250_LUMA_YY_OFFSET_MASK;
370*4882a593Smuzhiyun 	reg |= (x_offset << EXYNOS3250_LUMA_YX_OFFSET_SHIFT) &
371*4882a593Smuzhiyun 			EXYNOS3250_LUMA_YX_OFFSET_MASK;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_LUMA_XY_OFFSET);
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	reg = (y_offset << EXYNOS3250_CHROMA_YY_OFFSET_SHIFT) &
376*4882a593Smuzhiyun 			EXYNOS3250_CHROMA_YY_OFFSET_MASK;
377*4882a593Smuzhiyun 	reg |= (x_offset << EXYNOS3250_CHROMA_YX_OFFSET_SHIFT) &
378*4882a593Smuzhiyun 			EXYNOS3250_CHROMA_YX_OFFSET_MASK;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_CHROMA_XY_OFFSET);
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 	reg = (y_offset << EXYNOS3250_CHROMA_CR_YY_OFFSET_SHIFT) &
383*4882a593Smuzhiyun 			EXYNOS3250_CHROMA_CR_YY_OFFSET_MASK;
384*4882a593Smuzhiyun 	reg |= (x_offset << EXYNOS3250_CHROMA_CR_YX_OFFSET_SHIFT) &
385*4882a593Smuzhiyun 			EXYNOS3250_CHROMA_CR_YX_OFFSET_MASK;
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 	writel(reg, regs + EXYNOS3250_CHROMA_CR_XY_OFFSET);
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun 
exynos3250_jpeg_coef(void __iomem * base,unsigned int mode)390*4882a593Smuzhiyun void exynos3250_jpeg_coef(void __iomem *base, unsigned int mode)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun 	if (mode == S5P_JPEG_ENCODE) {
393*4882a593Smuzhiyun 		writel(EXYNOS3250_JPEG_ENC_COEF1,
394*4882a593Smuzhiyun 					base + EXYNOS3250_JPG_COEF(1));
395*4882a593Smuzhiyun 		writel(EXYNOS3250_JPEG_ENC_COEF2,
396*4882a593Smuzhiyun 					base + EXYNOS3250_JPG_COEF(2));
397*4882a593Smuzhiyun 		writel(EXYNOS3250_JPEG_ENC_COEF3,
398*4882a593Smuzhiyun 					base + EXYNOS3250_JPG_COEF(3));
399*4882a593Smuzhiyun 	} else {
400*4882a593Smuzhiyun 		writel(EXYNOS3250_JPEG_DEC_COEF1,
401*4882a593Smuzhiyun 					base + EXYNOS3250_JPG_COEF(1));
402*4882a593Smuzhiyun 		writel(EXYNOS3250_JPEG_DEC_COEF2,
403*4882a593Smuzhiyun 					base + EXYNOS3250_JPG_COEF(2));
404*4882a593Smuzhiyun 		writel(EXYNOS3250_JPEG_DEC_COEF3,
405*4882a593Smuzhiyun 					base + EXYNOS3250_JPG_COEF(3));
406*4882a593Smuzhiyun 	}
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun 
exynos3250_jpeg_start(void __iomem * regs)409*4882a593Smuzhiyun void exynos3250_jpeg_start(void __iomem *regs)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun 	writel(1, regs + EXYNOS3250_JSTART);
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun 
exynos3250_jpeg_rstart(void __iomem * regs)414*4882a593Smuzhiyun void exynos3250_jpeg_rstart(void __iomem *regs)
415*4882a593Smuzhiyun {
416*4882a593Smuzhiyun 	writel(1, regs + EXYNOS3250_JRSTART);
417*4882a593Smuzhiyun }
418*4882a593Smuzhiyun 
exynos3250_jpeg_get_int_status(void __iomem * regs)419*4882a593Smuzhiyun unsigned int exynos3250_jpeg_get_int_status(void __iomem *regs)
420*4882a593Smuzhiyun {
421*4882a593Smuzhiyun 	return readl(regs + EXYNOS3250_JPGINTST);
422*4882a593Smuzhiyun }
423*4882a593Smuzhiyun 
exynos3250_jpeg_clear_int_status(void __iomem * regs,unsigned int value)424*4882a593Smuzhiyun void exynos3250_jpeg_clear_int_status(void __iomem *regs,
425*4882a593Smuzhiyun 				      unsigned int value)
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun 	writel(value, regs + EXYNOS3250_JPGINTST);
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun 
exynos3250_jpeg_operating(void __iomem * regs)430*4882a593Smuzhiyun unsigned int exynos3250_jpeg_operating(void __iomem *regs)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun 	return readl(regs + S5P_JPGOPR) & EXYNOS3250_JPGOPR_MASK;
433*4882a593Smuzhiyun }
434*4882a593Smuzhiyun 
exynos3250_jpeg_compressed_size(void __iomem * regs)435*4882a593Smuzhiyun unsigned int exynos3250_jpeg_compressed_size(void __iomem *regs)
436*4882a593Smuzhiyun {
437*4882a593Smuzhiyun 	return readl(regs + EXYNOS3250_JPGCNT) & EXYNOS3250_JPGCNT_MASK;
438*4882a593Smuzhiyun }
439*4882a593Smuzhiyun 
exynos3250_jpeg_dec_stream_size(void __iomem * regs,unsigned int size)440*4882a593Smuzhiyun void exynos3250_jpeg_dec_stream_size(void __iomem *regs,
441*4882a593Smuzhiyun 						unsigned int size)
442*4882a593Smuzhiyun {
443*4882a593Smuzhiyun 	writel(size & EXYNOS3250_DEC_STREAM_MASK,
444*4882a593Smuzhiyun 				regs + EXYNOS3250_DEC_STREAM_SIZE);
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun 
exynos3250_jpeg_dec_scaling_ratio(void __iomem * regs,unsigned int sratio)447*4882a593Smuzhiyun void exynos3250_jpeg_dec_scaling_ratio(void __iomem *regs,
448*4882a593Smuzhiyun 						unsigned int sratio)
449*4882a593Smuzhiyun {
450*4882a593Smuzhiyun 	switch (sratio) {
451*4882a593Smuzhiyun 	case 1:
452*4882a593Smuzhiyun 	default:
453*4882a593Smuzhiyun 		sratio = EXYNOS3250_DEC_SCALE_FACTOR_8_8;
454*4882a593Smuzhiyun 		break;
455*4882a593Smuzhiyun 	case 2:
456*4882a593Smuzhiyun 		sratio = EXYNOS3250_DEC_SCALE_FACTOR_4_8;
457*4882a593Smuzhiyun 		break;
458*4882a593Smuzhiyun 	case 4:
459*4882a593Smuzhiyun 		sratio = EXYNOS3250_DEC_SCALE_FACTOR_2_8;
460*4882a593Smuzhiyun 		break;
461*4882a593Smuzhiyun 	case 8:
462*4882a593Smuzhiyun 		sratio = EXYNOS3250_DEC_SCALE_FACTOR_1_8;
463*4882a593Smuzhiyun 		break;
464*4882a593Smuzhiyun 	}
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 	writel(sratio & EXYNOS3250_DEC_SCALE_FACTOR_MASK,
467*4882a593Smuzhiyun 				regs + EXYNOS3250_DEC_SCALING_RATIO);
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun 
exynos3250_jpeg_set_timer(void __iomem * regs,unsigned int time_value)470*4882a593Smuzhiyun void exynos3250_jpeg_set_timer(void __iomem *regs, unsigned int time_value)
471*4882a593Smuzhiyun {
472*4882a593Smuzhiyun 	time_value &= EXYNOS3250_TIMER_INIT_MASK;
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	writel(EXYNOS3250_TIMER_INT_STAT | time_value,
475*4882a593Smuzhiyun 					regs + EXYNOS3250_TIMER_SE);
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun 
exynos3250_jpeg_get_timer_status(void __iomem * regs)478*4882a593Smuzhiyun unsigned int exynos3250_jpeg_get_timer_status(void __iomem *regs)
479*4882a593Smuzhiyun {
480*4882a593Smuzhiyun 	return readl(regs + EXYNOS3250_TIMER_ST);
481*4882a593Smuzhiyun }
482*4882a593Smuzhiyun 
exynos3250_jpeg_clear_timer_status(void __iomem * regs)483*4882a593Smuzhiyun void exynos3250_jpeg_clear_timer_status(void __iomem *regs)
484*4882a593Smuzhiyun {
485*4882a593Smuzhiyun 	writel(EXYNOS3250_TIMER_INT_STAT, regs + EXYNOS3250_TIMER_ST);
486*4882a593Smuzhiyun }
487