[go: nahoru, domu]

12c3fb08b3f74b8792004095a1f6881a3296ff643Mauro Carvalho Chehab/* linux/drivers/media/platform/s5p-jpeg/jpeg-hw.h
2bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz *
3bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz *		http://www.samsung.com
5bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz *
6bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
7bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz *
8bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * This program is free software; you can redistribute it and/or modify
9bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * it under the terms of the GNU General Public License version 2 as
10bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * published by the Free Software Foundation.
11bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz */
12bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
13bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz#include <linux/io.h>
1415f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki#include <linux/videodev2.h>
15bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
169f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewski#include "jpeg-core.h"
17bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz#include "jpeg-regs.h"
189f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewski#include "jpeg-hw-s5p.h"
19bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
209f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_reset(void __iomem *regs)
21bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
22bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
23bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
24bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(1, regs + S5P_JPG_SW_RESET);
25bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_SW_RESET);
26bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	/* no other way but polling for when JPEG IP becomes operational */
27bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	while (reg != 0) {
28bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		cpu_relax();
29bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		reg = readl(regs + S5P_JPG_SW_RESET);
30bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	}
31bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
32bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
339f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_poweron(void __iomem *regs)
34bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
35bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(S5P_POWER_ON, regs + S5P_JPGCLKCON);
36bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
37bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
389f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_input_raw_mode(void __iomem *regs, unsigned long mode)
39bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
40bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg, m;
41bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
42bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	m = S5P_MOD_SEL_565;
43bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	if (mode == S5P_JPEG_RAW_IN_565)
44bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		m = S5P_MOD_SEL_565;
45bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	else if (mode == S5P_JPEG_RAW_IN_422)
46bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		m = S5P_MOD_SEL_422;
47bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
48bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGCMOD);
49bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_MOD_SEL_MASK;
50bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= m;
51bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGCMOD);
52bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
53bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
549f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_input_raw_y16(void __iomem *regs, bool y16)
55bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
56bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
57bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
58bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGCMOD);
59bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	if (y16)
60bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		reg |= S5P_MODE_Y16;
61bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	else
62bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		reg &= ~S5P_MODE_Y16_MASK;
63bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGCMOD);
64bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
65bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
669f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_proc_mode(void __iomem *regs, unsigned long mode)
67bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
68bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg, m;
69bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
70bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	m = S5P_PROC_MODE_DECOMPR;
71bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	if (mode == S5P_JPEG_ENCODE)
72bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		m = S5P_PROC_MODE_COMPR;
73bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	else
74bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		m = S5P_PROC_MODE_DECOMPR;
75bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGMOD);
76bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_PROC_MODE_MASK;
77bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= m;
78bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGMOD);
79bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
80bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
819f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_subsampling_mode(void __iomem *regs, unsigned int mode)
82bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
83bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg, m;
84bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
8515f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki	if (mode == V4L2_JPEG_CHROMA_SUBSAMPLING_420)
86bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		m = S5P_SUBSAMPLING_MODE_420;
8715f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki	else
8815f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki		m = S5P_SUBSAMPLING_MODE_422;
8915f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki
90bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGMOD);
91bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_SUBSAMPLING_MODE_MASK;
92bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= m;
93bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGMOD);
94bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
95bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
969f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiunsigned int s5p_jpeg_get_subsampling_mode(void __iomem *regs)
9715f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki{
9815f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki	return readl(regs + S5P_JPGMOD) & S5P_SUBSAMPLING_MODE_MASK;
9915f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki}
10015f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki
1019f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_dri(void __iomem *regs, unsigned int dri)
102bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
103bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
104bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
105bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGDRI_U);
106bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~0xff;
107bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= (dri >> 8) & 0xff;
108bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGDRI_U);
109bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
110bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGDRI_L);
111bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~0xff;
112bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= dri & 0xff;
113bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGDRI_L);
114bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
115bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
1169f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n)
117bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
118bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
119bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
120bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_QTBL);
121bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_QT_NUMt_MASK(t);
122bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= (n << S5P_QT_NUMt_SHIFT(t)) & S5P_QT_NUMt_MASK(t);
123bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_QTBL);
124bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
125bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
1269f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_htbl_ac(void __iomem *regs, unsigned int t)
127bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
128bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
129bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
130bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_HTBL);
131bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_HT_NUMt_AC_MASK(t);
132bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	/* this driver uses table 0 for all color components */
133bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= (0 << S5P_HT_NUMt_AC_SHIFT(t)) & S5P_HT_NUMt_AC_MASK(t);
134bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_HTBL);
135bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
136bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
1379f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_htbl_dc(void __iomem *regs, unsigned int t)
138bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
139bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
140bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
141bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_HTBL);
142bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_HT_NUMt_DC_MASK(t);
143bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	/* this driver uses table 0 for all color components */
144bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= (0 << S5P_HT_NUMt_DC_SHIFT(t)) & S5P_HT_NUMt_DC_MASK(t);
145bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_HTBL);
146bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
147bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
1489f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_y(void __iomem *regs, unsigned int y)
149bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
150bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
151bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
152bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGY_U);
153bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~0xff;
154bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= (y >> 8) & 0xff;
155bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGY_U);
156bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
157bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGY_L);
158bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~0xff;
159bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= y & 0xff;
160bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGY_L);
161bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
162bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
1639f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_x(void __iomem *regs, unsigned int x)
164bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
165bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
166bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
167bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGX_U);
168bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~0xff;
169bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= (x >> 8) & 0xff;
170bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGX_U);
171bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
172bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGX_L);
173bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~0xff;
174bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= x & 0xff;
175bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGX_L);
176bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
177bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
1789f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_rst_int_enable(void __iomem *regs, bool enable)
179bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
180bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
181bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
182bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGINTSE);
183bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_RSTm_INT_EN_MASK;
184bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	if (enable)
185bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		reg |= S5P_RSTm_INT_EN;
186bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGINTSE);
187bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
188bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
1899f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_data_num_int_enable(void __iomem *regs, bool enable)
190bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
191bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
192bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
193bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGINTSE);
194bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_DATA_NUM_INT_EN_MASK;
195bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	if (enable)
196bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		reg |= S5P_DATA_NUM_INT_EN;
197bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGINTSE);
198bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
199bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2009f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_final_mcu_num_int_enable(void __iomem *regs, bool enbl)
201bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
202bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
203bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
204bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPGINTSE);
205bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_FINAL_MCU_NUM_INT_EN_MASK;
206bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	if (enbl)
207bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		reg |= S5P_FINAL_MCU_NUM_INT_EN;
208bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPGINTSE);
209bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
210bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2119f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_timer_enable(void __iomem *regs, unsigned long val)
212bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
213bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
214bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
215bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_TIMER_SE);
216bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= S5P_TIMER_INT_EN;
217bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_TIMER_INIT_MASK;
218bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= val & S5P_TIMER_INIT_MASK;
219bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_TIMER_SE);
220bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
221bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2229f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_timer_disable(void __iomem *regs)
223bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
224bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
225bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
226bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_TIMER_SE);
227bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_TIMER_INT_EN_MASK;
228bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_TIMER_SE);
229bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
230bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2319f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiint s5p_jpeg_timer_stat(void __iomem *regs)
232bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
233bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	return (int)((readl(regs + S5P_JPG_TIMER_ST) & S5P_TIMER_INT_STAT_MASK)
234bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		     >> S5P_TIMER_INT_STAT_SHIFT);
235bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
236bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2379f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_clear_timer_stat(void __iomem *regs)
238bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
239bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
240bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
241bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_TIMER_SE);
242bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_TIMER_INT_STAT_MASK;
243bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_TIMER_SE);
244bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
245bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2469f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_enc_stream_int(void __iomem *regs, unsigned long size)
247bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
248bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
249bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
250bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
251bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_ENC_STREAM_BOUND_MASK;
252bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= S5P_ENC_STREAM_INT_EN;
253bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= size & S5P_ENC_STREAM_BOUND_MASK;
254bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
255bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
256bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2579f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiint s5p_jpeg_enc_stream_stat(void __iomem *regs)
258bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
259bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	return (int)(readl(regs + S5P_JPG_ENC_STREAM_INTST) &
260bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		     S5P_ENC_STREAM_INT_STAT_MASK);
261bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
262bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2639f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_clear_enc_stream_stat(void __iomem *regs)
264bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
265bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
266bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
267bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
268bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_ENC_STREAM_INT_MASK;
269bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
270bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
271bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2729f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_outform_raw(void __iomem *regs, unsigned long format)
273bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
274bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg, f;
275bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
276bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	f = S5P_DEC_OUT_FORMAT_422;
277bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	if (format == S5P_JPEG_RAW_OUT_422)
278bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		f = S5P_DEC_OUT_FORMAT_422;
279bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	else if (format == S5P_JPEG_RAW_OUT_420)
280bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		f = S5P_DEC_OUT_FORMAT_420;
281bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_OUTFORM);
282bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_DEC_OUT_FORMAT_MASK;
283bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= f;
284bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_OUTFORM);
285bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
286bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2879f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_jpgadr(void __iomem *regs, unsigned long addr)
288bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
289bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(addr, regs + S5P_JPG_JPGADR);
290bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
291bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2929f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_imgadr(void __iomem *regs, unsigned long addr)
293bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
294bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(addr, regs + S5P_JPG_IMGADR);
295bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
296bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
2979f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_coef(void __iomem *regs, unsigned int i,
298bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz			     unsigned int j, unsigned int coef)
299bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
300bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long reg;
301bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
302bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg = readl(regs + S5P_JPG_COEF(i));
303bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg &= ~S5P_COEFn_MASK(j);
304bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	reg |= (coef << S5P_COEFn_SHIFT(j)) & S5P_COEFn_MASK(j);
305bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(reg, regs + S5P_JPG_COEF(i));
306bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
307bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
3089f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_start(void __iomem *regs)
309bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
310bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(1, regs + S5P_JSTART);
311bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
312bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
3139f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiint s5p_jpeg_result_stat_ok(void __iomem *regs)
314bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
315bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	return (int)((readl(regs + S5P_JPGINTST) & S5P_RESULT_STAT_MASK)
316bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		     >> S5P_RESULT_STAT_SHIFT);
317bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
318bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
3199f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiint s5p_jpeg_stream_stat_ok(void __iomem *regs)
320bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
321bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	return !(int)((readl(regs + S5P_JPGINTST) & S5P_STREAM_STAT_MASK)
322bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz		      >> S5P_STREAM_STAT_SHIFT);
323bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
324bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
3259f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_clear_int(void __iomem *regs)
326bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
327c438269948c420518101a836b526f71d389f80ddMauro Carvalho Chehab	readl(regs + S5P_JPGINTST);
328bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	writel(S5P_INT_RELEASE, regs + S5P_JPGCOM);
3290cd9b21ed5453055752e7f8ef4887fbc409b77dcJacek Anaszewski	readl(regs + S5P_JPGOPR);
330bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
331bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
3329f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiunsigned int s5p_jpeg_compressed_size(void __iomem *regs)
333bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{
334bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	unsigned long jpeg_size = 0;
335bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
336bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	jpeg_size |= (readl(regs + S5P_JPGCNT_U) & 0xff) << 16;
337bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	jpeg_size |= (readl(regs + S5P_JPGCNT_M) & 0xff) << 8;
338bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	jpeg_size |= (readl(regs + S5P_JPGCNT_L) & 0xff);
339bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz
340bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz	return (unsigned int)jpeg_size;
341bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz}
342