1*f4104b78SMauro Carvalho Chehab // SPDX-License-Identifier: GPL-2.0-only
2*f4104b78SMauro Carvalho Chehab /* linux/drivers/media/platform/samsung/s5p-jpeg/jpeg-hw.h
3*f4104b78SMauro Carvalho Chehab  *
4*f4104b78SMauro Carvalho Chehab  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
5*f4104b78SMauro Carvalho Chehab  *		http://www.samsung.com
6*f4104b78SMauro Carvalho Chehab  *
7*f4104b78SMauro Carvalho Chehab  * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.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 
13*f4104b78SMauro Carvalho Chehab #include "jpeg-core.h"
14*f4104b78SMauro Carvalho Chehab #include "jpeg-regs.h"
15*f4104b78SMauro Carvalho Chehab #include "jpeg-hw-s5p.h"
16*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_reset(void __iomem * regs)17*f4104b78SMauro Carvalho Chehab void s5p_jpeg_reset(void __iomem *regs)
18*f4104b78SMauro Carvalho Chehab {
19*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
20*f4104b78SMauro Carvalho Chehab 
21*f4104b78SMauro Carvalho Chehab 	writel(1, regs + S5P_JPG_SW_RESET);
22*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPG_SW_RESET);
23*f4104b78SMauro Carvalho Chehab 	/* no other way but polling for when JPEG IP becomes operational */
24*f4104b78SMauro Carvalho Chehab 	while (reg != 0) {
25*f4104b78SMauro Carvalho Chehab 		cpu_relax();
26*f4104b78SMauro Carvalho Chehab 		reg = readl(regs + S5P_JPG_SW_RESET);
27*f4104b78SMauro Carvalho Chehab 	}
28*f4104b78SMauro Carvalho Chehab }
29*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_poweron(void __iomem * regs)30*f4104b78SMauro Carvalho Chehab void s5p_jpeg_poweron(void __iomem *regs)
31*f4104b78SMauro Carvalho Chehab {
32*f4104b78SMauro Carvalho Chehab 	writel(S5P_POWER_ON, regs + S5P_JPGCLKCON);
33*f4104b78SMauro Carvalho Chehab }
34*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_input_raw_mode(void __iomem * regs,unsigned long mode)35*f4104b78SMauro Carvalho Chehab void s5p_jpeg_input_raw_mode(void __iomem *regs, unsigned long mode)
36*f4104b78SMauro Carvalho Chehab {
37*f4104b78SMauro Carvalho Chehab 	unsigned long reg, m;
38*f4104b78SMauro Carvalho Chehab 
39*f4104b78SMauro Carvalho Chehab 	m = S5P_MOD_SEL_565;
40*f4104b78SMauro Carvalho Chehab 	if (mode == S5P_JPEG_RAW_IN_565)
41*f4104b78SMauro Carvalho Chehab 		m = S5P_MOD_SEL_565;
42*f4104b78SMauro Carvalho Chehab 	else if (mode == S5P_JPEG_RAW_IN_422)
43*f4104b78SMauro Carvalho Chehab 		m = S5P_MOD_SEL_422;
44*f4104b78SMauro Carvalho Chehab 
45*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGCMOD);
46*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_MOD_SEL_MASK;
47*f4104b78SMauro Carvalho Chehab 	reg |= m;
48*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGCMOD);
49*f4104b78SMauro Carvalho Chehab }
50*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_proc_mode(void __iomem * regs,unsigned long mode)51*f4104b78SMauro Carvalho Chehab void s5p_jpeg_proc_mode(void __iomem *regs, unsigned long mode)
52*f4104b78SMauro Carvalho Chehab {
53*f4104b78SMauro Carvalho Chehab 	unsigned long reg, m;
54*f4104b78SMauro Carvalho Chehab 
55*f4104b78SMauro Carvalho Chehab 	if (mode == S5P_JPEG_ENCODE)
56*f4104b78SMauro Carvalho Chehab 		m = S5P_PROC_MODE_COMPR;
57*f4104b78SMauro Carvalho Chehab 	else
58*f4104b78SMauro Carvalho Chehab 		m = S5P_PROC_MODE_DECOMPR;
59*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGMOD);
60*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_PROC_MODE_MASK;
61*f4104b78SMauro Carvalho Chehab 	reg |= m;
62*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGMOD);
63*f4104b78SMauro Carvalho Chehab }
64*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_subsampling_mode(void __iomem * regs,unsigned int mode)65*f4104b78SMauro Carvalho Chehab void s5p_jpeg_subsampling_mode(void __iomem *regs, unsigned int mode)
66*f4104b78SMauro Carvalho Chehab {
67*f4104b78SMauro Carvalho Chehab 	unsigned long reg, m;
68*f4104b78SMauro Carvalho Chehab 
69*f4104b78SMauro Carvalho Chehab 	if (mode == V4L2_JPEG_CHROMA_SUBSAMPLING_420)
70*f4104b78SMauro Carvalho Chehab 		m = S5P_SUBSAMPLING_MODE_420;
71*f4104b78SMauro Carvalho Chehab 	else
72*f4104b78SMauro Carvalho Chehab 		m = S5P_SUBSAMPLING_MODE_422;
73*f4104b78SMauro Carvalho Chehab 
74*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGMOD);
75*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_SUBSAMPLING_MODE_MASK;
76*f4104b78SMauro Carvalho Chehab 	reg |= m;
77*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGMOD);
78*f4104b78SMauro Carvalho Chehab }
79*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_get_subsampling_mode(void __iomem * regs)80*f4104b78SMauro Carvalho Chehab unsigned int s5p_jpeg_get_subsampling_mode(void __iomem *regs)
81*f4104b78SMauro Carvalho Chehab {
82*f4104b78SMauro Carvalho Chehab 	return readl(regs + S5P_JPGMOD) & S5P_SUBSAMPLING_MODE_MASK;
83*f4104b78SMauro Carvalho Chehab }
84*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_dri(void __iomem * regs,unsigned int dri)85*f4104b78SMauro Carvalho Chehab void s5p_jpeg_dri(void __iomem *regs, unsigned int dri)
86*f4104b78SMauro Carvalho Chehab {
87*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
88*f4104b78SMauro Carvalho Chehab 
89*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGDRI_U);
90*f4104b78SMauro Carvalho Chehab 	reg &= ~0xff;
91*f4104b78SMauro Carvalho Chehab 	reg |= (dri >> 8) & 0xff;
92*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGDRI_U);
93*f4104b78SMauro Carvalho Chehab 
94*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGDRI_L);
95*f4104b78SMauro Carvalho Chehab 	reg &= ~0xff;
96*f4104b78SMauro Carvalho Chehab 	reg |= dri & 0xff;
97*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGDRI_L);
98*f4104b78SMauro Carvalho Chehab }
99*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_qtbl(void __iomem * regs,unsigned int t,unsigned int n)100*f4104b78SMauro Carvalho Chehab void s5p_jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n)
101*f4104b78SMauro Carvalho Chehab {
102*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
103*f4104b78SMauro Carvalho Chehab 
104*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPG_QTBL);
105*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_QT_NUMt_MASK(t);
106*f4104b78SMauro Carvalho Chehab 	reg |= (n << S5P_QT_NUMt_SHIFT(t)) & S5P_QT_NUMt_MASK(t);
107*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPG_QTBL);
108*f4104b78SMauro Carvalho Chehab }
109*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_htbl_ac(void __iomem * regs,unsigned int t)110*f4104b78SMauro Carvalho Chehab void s5p_jpeg_htbl_ac(void __iomem *regs, unsigned int t)
111*f4104b78SMauro Carvalho Chehab {
112*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
113*f4104b78SMauro Carvalho Chehab 
114*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPG_HTBL);
115*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_HT_NUMt_AC_MASK(t);
116*f4104b78SMauro Carvalho Chehab 	/* this driver uses table 0 for all color components */
117*f4104b78SMauro Carvalho Chehab 	reg |= (0 << S5P_HT_NUMt_AC_SHIFT(t)) & S5P_HT_NUMt_AC_MASK(t);
118*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPG_HTBL);
119*f4104b78SMauro Carvalho Chehab }
120*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_htbl_dc(void __iomem * regs,unsigned int t)121*f4104b78SMauro Carvalho Chehab void s5p_jpeg_htbl_dc(void __iomem *regs, unsigned int t)
122*f4104b78SMauro Carvalho Chehab {
123*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
124*f4104b78SMauro Carvalho Chehab 
125*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPG_HTBL);
126*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_HT_NUMt_DC_MASK(t);
127*f4104b78SMauro Carvalho Chehab 	/* this driver uses table 0 for all color components */
128*f4104b78SMauro Carvalho Chehab 	reg |= (0 << S5P_HT_NUMt_DC_SHIFT(t)) & S5P_HT_NUMt_DC_MASK(t);
129*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPG_HTBL);
130*f4104b78SMauro Carvalho Chehab }
131*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_y(void __iomem * regs,unsigned int y)132*f4104b78SMauro Carvalho Chehab void s5p_jpeg_y(void __iomem *regs, unsigned int y)
133*f4104b78SMauro Carvalho Chehab {
134*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
135*f4104b78SMauro Carvalho Chehab 
136*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGY_U);
137*f4104b78SMauro Carvalho Chehab 	reg &= ~0xff;
138*f4104b78SMauro Carvalho Chehab 	reg |= (y >> 8) & 0xff;
139*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGY_U);
140*f4104b78SMauro Carvalho Chehab 
141*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGY_L);
142*f4104b78SMauro Carvalho Chehab 	reg &= ~0xff;
143*f4104b78SMauro Carvalho Chehab 	reg |= y & 0xff;
144*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGY_L);
145*f4104b78SMauro Carvalho Chehab }
146*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_x(void __iomem * regs,unsigned int x)147*f4104b78SMauro Carvalho Chehab void s5p_jpeg_x(void __iomem *regs, unsigned int x)
148*f4104b78SMauro Carvalho Chehab {
149*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
150*f4104b78SMauro Carvalho Chehab 
151*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGX_U);
152*f4104b78SMauro Carvalho Chehab 	reg &= ~0xff;
153*f4104b78SMauro Carvalho Chehab 	reg |= (x >> 8) & 0xff;
154*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGX_U);
155*f4104b78SMauro Carvalho Chehab 
156*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGX_L);
157*f4104b78SMauro Carvalho Chehab 	reg &= ~0xff;
158*f4104b78SMauro Carvalho Chehab 	reg |= x & 0xff;
159*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGX_L);
160*f4104b78SMauro Carvalho Chehab }
161*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_rst_int_enable(void __iomem * regs,bool enable)162*f4104b78SMauro Carvalho Chehab void s5p_jpeg_rst_int_enable(void __iomem *regs, bool enable)
163*f4104b78SMauro Carvalho Chehab {
164*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
165*f4104b78SMauro Carvalho Chehab 
166*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGINTSE);
167*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_RSTm_INT_EN_MASK;
168*f4104b78SMauro Carvalho Chehab 	if (enable)
169*f4104b78SMauro Carvalho Chehab 		reg |= S5P_RSTm_INT_EN;
170*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGINTSE);
171*f4104b78SMauro Carvalho Chehab }
172*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_data_num_int_enable(void __iomem * regs,bool enable)173*f4104b78SMauro Carvalho Chehab void s5p_jpeg_data_num_int_enable(void __iomem *regs, bool enable)
174*f4104b78SMauro Carvalho Chehab {
175*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
176*f4104b78SMauro Carvalho Chehab 
177*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGINTSE);
178*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_DATA_NUM_INT_EN_MASK;
179*f4104b78SMauro Carvalho Chehab 	if (enable)
180*f4104b78SMauro Carvalho Chehab 		reg |= S5P_DATA_NUM_INT_EN;
181*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGINTSE);
182*f4104b78SMauro Carvalho Chehab }
183*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_final_mcu_num_int_enable(void __iomem * regs,bool enbl)184*f4104b78SMauro Carvalho Chehab void s5p_jpeg_final_mcu_num_int_enable(void __iomem *regs, bool enbl)
185*f4104b78SMauro Carvalho Chehab {
186*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
187*f4104b78SMauro Carvalho Chehab 
188*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPGINTSE);
189*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_FINAL_MCU_NUM_INT_EN_MASK;
190*f4104b78SMauro Carvalho Chehab 	if (enbl)
191*f4104b78SMauro Carvalho Chehab 		reg |= S5P_FINAL_MCU_NUM_INT_EN;
192*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPGINTSE);
193*f4104b78SMauro Carvalho Chehab }
194*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_timer_stat(void __iomem * regs)195*f4104b78SMauro Carvalho Chehab int s5p_jpeg_timer_stat(void __iomem *regs)
196*f4104b78SMauro Carvalho Chehab {
197*f4104b78SMauro Carvalho Chehab 	return (int)((readl(regs + S5P_JPG_TIMER_ST) & S5P_TIMER_INT_STAT_MASK)
198*f4104b78SMauro Carvalho Chehab 		     >> S5P_TIMER_INT_STAT_SHIFT);
199*f4104b78SMauro Carvalho Chehab }
200*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_clear_timer_stat(void __iomem * regs)201*f4104b78SMauro Carvalho Chehab void s5p_jpeg_clear_timer_stat(void __iomem *regs)
202*f4104b78SMauro Carvalho Chehab {
203*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
204*f4104b78SMauro Carvalho Chehab 
205*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPG_TIMER_SE);
206*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_TIMER_INT_STAT_MASK;
207*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPG_TIMER_SE);
208*f4104b78SMauro Carvalho Chehab }
209*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_enc_stream_int(void __iomem * regs,unsigned long size)210*f4104b78SMauro Carvalho Chehab void s5p_jpeg_enc_stream_int(void __iomem *regs, unsigned long size)
211*f4104b78SMauro Carvalho Chehab {
212*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
213*f4104b78SMauro Carvalho Chehab 
214*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
215*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_ENC_STREAM_BOUND_MASK;
216*f4104b78SMauro Carvalho Chehab 	reg |= S5P_ENC_STREAM_INT_EN;
217*f4104b78SMauro Carvalho Chehab 	reg |= size & S5P_ENC_STREAM_BOUND_MASK;
218*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
219*f4104b78SMauro Carvalho Chehab }
220*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_enc_stream_stat(void __iomem * regs)221*f4104b78SMauro Carvalho Chehab int s5p_jpeg_enc_stream_stat(void __iomem *regs)
222*f4104b78SMauro Carvalho Chehab {
223*f4104b78SMauro Carvalho Chehab 	return (int)(readl(regs + S5P_JPG_ENC_STREAM_INTST) &
224*f4104b78SMauro Carvalho Chehab 		     S5P_ENC_STREAM_INT_STAT_MASK);
225*f4104b78SMauro Carvalho Chehab }
226*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_clear_enc_stream_stat(void __iomem * regs)227*f4104b78SMauro Carvalho Chehab void s5p_jpeg_clear_enc_stream_stat(void __iomem *regs)
228*f4104b78SMauro Carvalho Chehab {
229*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
230*f4104b78SMauro Carvalho Chehab 
231*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
232*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_ENC_STREAM_INT_MASK;
233*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
234*f4104b78SMauro Carvalho Chehab }
235*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_outform_raw(void __iomem * regs,unsigned long format)236*f4104b78SMauro Carvalho Chehab void s5p_jpeg_outform_raw(void __iomem *regs, unsigned long format)
237*f4104b78SMauro Carvalho Chehab {
238*f4104b78SMauro Carvalho Chehab 	unsigned long reg, f;
239*f4104b78SMauro Carvalho Chehab 
240*f4104b78SMauro Carvalho Chehab 	f = S5P_DEC_OUT_FORMAT_422;
241*f4104b78SMauro Carvalho Chehab 	if (format == S5P_JPEG_RAW_OUT_422)
242*f4104b78SMauro Carvalho Chehab 		f = S5P_DEC_OUT_FORMAT_422;
243*f4104b78SMauro Carvalho Chehab 	else if (format == S5P_JPEG_RAW_OUT_420)
244*f4104b78SMauro Carvalho Chehab 		f = S5P_DEC_OUT_FORMAT_420;
245*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPG_OUTFORM);
246*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_DEC_OUT_FORMAT_MASK;
247*f4104b78SMauro Carvalho Chehab 	reg |= f;
248*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPG_OUTFORM);
249*f4104b78SMauro Carvalho Chehab }
250*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_jpgadr(void __iomem * regs,unsigned long addr)251*f4104b78SMauro Carvalho Chehab void s5p_jpeg_jpgadr(void __iomem *regs, unsigned long addr)
252*f4104b78SMauro Carvalho Chehab {
253*f4104b78SMauro Carvalho Chehab 	writel(addr, regs + S5P_JPG_JPGADR);
254*f4104b78SMauro Carvalho Chehab }
255*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_imgadr(void __iomem * regs,unsigned long addr)256*f4104b78SMauro Carvalho Chehab void s5p_jpeg_imgadr(void __iomem *regs, unsigned long addr)
257*f4104b78SMauro Carvalho Chehab {
258*f4104b78SMauro Carvalho Chehab 	writel(addr, regs + S5P_JPG_IMGADR);
259*f4104b78SMauro Carvalho Chehab }
260*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_coef(void __iomem * regs,unsigned int i,unsigned int j,unsigned int coef)261*f4104b78SMauro Carvalho Chehab void s5p_jpeg_coef(void __iomem *regs, unsigned int i,
262*f4104b78SMauro Carvalho Chehab 			     unsigned int j, unsigned int coef)
263*f4104b78SMauro Carvalho Chehab {
264*f4104b78SMauro Carvalho Chehab 	unsigned long reg;
265*f4104b78SMauro Carvalho Chehab 
266*f4104b78SMauro Carvalho Chehab 	reg = readl(regs + S5P_JPG_COEF(i));
267*f4104b78SMauro Carvalho Chehab 	reg &= ~S5P_COEFn_MASK(j);
268*f4104b78SMauro Carvalho Chehab 	reg |= (coef << S5P_COEFn_SHIFT(j)) & S5P_COEFn_MASK(j);
269*f4104b78SMauro Carvalho Chehab 	writel(reg, regs + S5P_JPG_COEF(i));
270*f4104b78SMauro Carvalho Chehab }
271*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_start(void __iomem * regs)272*f4104b78SMauro Carvalho Chehab void s5p_jpeg_start(void __iomem *regs)
273*f4104b78SMauro Carvalho Chehab {
274*f4104b78SMauro Carvalho Chehab 	writel(1, regs + S5P_JSTART);
275*f4104b78SMauro Carvalho Chehab }
276*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_result_stat_ok(void __iomem * regs)277*f4104b78SMauro Carvalho Chehab int s5p_jpeg_result_stat_ok(void __iomem *regs)
278*f4104b78SMauro Carvalho Chehab {
279*f4104b78SMauro Carvalho Chehab 	return (int)((readl(regs + S5P_JPGINTST) & S5P_RESULT_STAT_MASK)
280*f4104b78SMauro Carvalho Chehab 		     >> S5P_RESULT_STAT_SHIFT);
281*f4104b78SMauro Carvalho Chehab }
282*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_stream_stat_ok(void __iomem * regs)283*f4104b78SMauro Carvalho Chehab int s5p_jpeg_stream_stat_ok(void __iomem *regs)
284*f4104b78SMauro Carvalho Chehab {
285*f4104b78SMauro Carvalho Chehab 	return !(int)((readl(regs + S5P_JPGINTST) & S5P_STREAM_STAT_MASK)
286*f4104b78SMauro Carvalho Chehab 		      >> S5P_STREAM_STAT_SHIFT);
287*f4104b78SMauro Carvalho Chehab }
288*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_clear_int(void __iomem * regs)289*f4104b78SMauro Carvalho Chehab void s5p_jpeg_clear_int(void __iomem *regs)
290*f4104b78SMauro Carvalho Chehab {
291*f4104b78SMauro Carvalho Chehab 	readl(regs + S5P_JPGINTST);
292*f4104b78SMauro Carvalho Chehab 	writel(S5P_INT_RELEASE, regs + S5P_JPGCOM);
293*f4104b78SMauro Carvalho Chehab 	readl(regs + S5P_JPGOPR);
294*f4104b78SMauro Carvalho Chehab }
295*f4104b78SMauro Carvalho Chehab 
s5p_jpeg_compressed_size(void __iomem * regs)296*f4104b78SMauro Carvalho Chehab unsigned int s5p_jpeg_compressed_size(void __iomem *regs)
297*f4104b78SMauro Carvalho Chehab {
298*f4104b78SMauro Carvalho Chehab 	unsigned long jpeg_size = 0;
299*f4104b78SMauro Carvalho Chehab 
300*f4104b78SMauro Carvalho Chehab 	jpeg_size |= (readl(regs + S5P_JPGCNT_U) & 0xff) << 16;
301*f4104b78SMauro Carvalho Chehab 	jpeg_size |= (readl(regs + S5P_JPGCNT_M) & 0xff) << 8;
302*f4104b78SMauro Carvalho Chehab 	jpeg_size |= (readl(regs + S5P_JPGCNT_L) & 0xff);
303*f4104b78SMauro Carvalho Chehab 
304*f4104b78SMauro Carvalho Chehab 	return (unsigned int)jpeg_size;
305*f4104b78SMauro Carvalho Chehab }
306