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