1 // SPDX-License-Identifier: GPL-2.0-only
2 /* linux/drivers/media/platform/samsung/s5p-jpeg/jpeg-hw.h
4 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com
7 * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
11 #include <linux/videodev2.h>
13 #include "jpeg-core.h"
14 #include "jpeg-regs.h"
15 #include "jpeg-hw-s5p.h"
17 void s5p_jpeg_reset(void __iomem *regs)
21 writel(1, regs + S5P_JPG_SW_RESET);
22 reg = readl(regs + S5P_JPG_SW_RESET);
23 /* no other way but polling for when JPEG IP becomes operational */
26 reg = readl(regs + S5P_JPG_SW_RESET);
30 void s5p_jpeg_poweron(void __iomem *regs)
32 writel(S5P_POWER_ON, regs + S5P_JPGCLKCON);
35 void s5p_jpeg_input_raw_mode(void __iomem *regs, unsigned long mode)
40 if (mode == S5P_JPEG_RAW_IN_565)
42 else if (mode == S5P_JPEG_RAW_IN_422)
45 reg = readl(regs + S5P_JPGCMOD);
46 reg &= ~S5P_MOD_SEL_MASK;
48 writel(reg, regs + S5P_JPGCMOD);
51 void s5p_jpeg_proc_mode(void __iomem *regs, unsigned long mode)
55 if (mode == S5P_JPEG_ENCODE)
56 m = S5P_PROC_MODE_COMPR;
58 m = S5P_PROC_MODE_DECOMPR;
59 reg = readl(regs + S5P_JPGMOD);
60 reg &= ~S5P_PROC_MODE_MASK;
62 writel(reg, regs + S5P_JPGMOD);
65 void s5p_jpeg_subsampling_mode(void __iomem *regs, unsigned int mode)
69 if (mode == V4L2_JPEG_CHROMA_SUBSAMPLING_420)
70 m = S5P_SUBSAMPLING_MODE_420;
72 m = S5P_SUBSAMPLING_MODE_422;
74 reg = readl(regs + S5P_JPGMOD);
75 reg &= ~S5P_SUBSAMPLING_MODE_MASK;
77 writel(reg, regs + S5P_JPGMOD);
80 unsigned int s5p_jpeg_get_subsampling_mode(void __iomem *regs)
82 return readl(regs + S5P_JPGMOD) & S5P_SUBSAMPLING_MODE_MASK;
85 void s5p_jpeg_dri(void __iomem *regs, unsigned int dri)
89 reg = readl(regs + S5P_JPGDRI_U);
91 reg |= (dri >> 8) & 0xff;
92 writel(reg, regs + S5P_JPGDRI_U);
94 reg = readl(regs + S5P_JPGDRI_L);
97 writel(reg, regs + S5P_JPGDRI_L);
100 void s5p_jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n)
104 reg = readl(regs + S5P_JPG_QTBL);
105 reg &= ~S5P_QT_NUMt_MASK(t);
106 reg |= (n << S5P_QT_NUMt_SHIFT(t)) & S5P_QT_NUMt_MASK(t);
107 writel(reg, regs + S5P_JPG_QTBL);
110 void s5p_jpeg_htbl_ac(void __iomem *regs, unsigned int t)
114 reg = readl(regs + S5P_JPG_HTBL);
115 reg &= ~S5P_HT_NUMt_AC_MASK(t);
116 /* this driver uses table 0 for all color components */
117 reg |= (0 << S5P_HT_NUMt_AC_SHIFT(t)) & S5P_HT_NUMt_AC_MASK(t);
118 writel(reg, regs + S5P_JPG_HTBL);
121 void s5p_jpeg_htbl_dc(void __iomem *regs, unsigned int t)
125 reg = readl(regs + S5P_JPG_HTBL);
126 reg &= ~S5P_HT_NUMt_DC_MASK(t);
127 /* this driver uses table 0 for all color components */
128 reg |= (0 << S5P_HT_NUMt_DC_SHIFT(t)) & S5P_HT_NUMt_DC_MASK(t);
129 writel(reg, regs + S5P_JPG_HTBL);
132 void s5p_jpeg_y(void __iomem *regs, unsigned int y)
136 reg = readl(regs + S5P_JPGY_U);
138 reg |= (y >> 8) & 0xff;
139 writel(reg, regs + S5P_JPGY_U);
141 reg = readl(regs + S5P_JPGY_L);
144 writel(reg, regs + S5P_JPGY_L);
147 void s5p_jpeg_x(void __iomem *regs, unsigned int x)
151 reg = readl(regs + S5P_JPGX_U);
153 reg |= (x >> 8) & 0xff;
154 writel(reg, regs + S5P_JPGX_U);
156 reg = readl(regs + S5P_JPGX_L);
159 writel(reg, regs + S5P_JPGX_L);
162 void s5p_jpeg_rst_int_enable(void __iomem *regs, bool enable)
166 reg = readl(regs + S5P_JPGINTSE);
167 reg &= ~S5P_RSTm_INT_EN_MASK;
169 reg |= S5P_RSTm_INT_EN;
170 writel(reg, regs + S5P_JPGINTSE);
173 void s5p_jpeg_data_num_int_enable(void __iomem *regs, bool enable)
177 reg = readl(regs + S5P_JPGINTSE);
178 reg &= ~S5P_DATA_NUM_INT_EN_MASK;
180 reg |= S5P_DATA_NUM_INT_EN;
181 writel(reg, regs + S5P_JPGINTSE);
184 void s5p_jpeg_final_mcu_num_int_enable(void __iomem *regs, bool enbl)
188 reg = readl(regs + S5P_JPGINTSE);
189 reg &= ~S5P_FINAL_MCU_NUM_INT_EN_MASK;
191 reg |= S5P_FINAL_MCU_NUM_INT_EN;
192 writel(reg, regs + S5P_JPGINTSE);
195 int s5p_jpeg_timer_stat(void __iomem *regs)
197 return (int)((readl(regs + S5P_JPG_TIMER_ST) & S5P_TIMER_INT_STAT_MASK)
198 >> S5P_TIMER_INT_STAT_SHIFT);
201 void s5p_jpeg_clear_timer_stat(void __iomem *regs)
205 reg = readl(regs + S5P_JPG_TIMER_SE);
206 reg &= ~S5P_TIMER_INT_STAT_MASK;
207 writel(reg, regs + S5P_JPG_TIMER_SE);
210 void s5p_jpeg_enc_stream_int(void __iomem *regs, unsigned long size)
214 reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
215 reg &= ~S5P_ENC_STREAM_BOUND_MASK;
216 reg |= S5P_ENC_STREAM_INT_EN;
217 reg |= size & S5P_ENC_STREAM_BOUND_MASK;
218 writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
221 int s5p_jpeg_enc_stream_stat(void __iomem *regs)
223 return (int)(readl(regs + S5P_JPG_ENC_STREAM_INTST) &
224 S5P_ENC_STREAM_INT_STAT_MASK);
227 void s5p_jpeg_clear_enc_stream_stat(void __iomem *regs)
231 reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
232 reg &= ~S5P_ENC_STREAM_INT_MASK;
233 writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
236 void s5p_jpeg_outform_raw(void __iomem *regs, unsigned long format)
238 unsigned long reg, f;
240 f = S5P_DEC_OUT_FORMAT_422;
241 if (format == S5P_JPEG_RAW_OUT_422)
242 f = S5P_DEC_OUT_FORMAT_422;
243 else if (format == S5P_JPEG_RAW_OUT_420)
244 f = S5P_DEC_OUT_FORMAT_420;
245 reg = readl(regs + S5P_JPG_OUTFORM);
246 reg &= ~S5P_DEC_OUT_FORMAT_MASK;
248 writel(reg, regs + S5P_JPG_OUTFORM);
251 void s5p_jpeg_jpgadr(void __iomem *regs, unsigned long addr)
253 writel(addr, regs + S5P_JPG_JPGADR);
256 void s5p_jpeg_imgadr(void __iomem *regs, unsigned long addr)
258 writel(addr, regs + S5P_JPG_IMGADR);
261 void s5p_jpeg_coef(void __iomem *regs, unsigned int i,
262 unsigned int j, unsigned int coef)
266 reg = readl(regs + S5P_JPG_COEF(i));
267 reg &= ~S5P_COEFn_MASK(j);
268 reg |= (coef << S5P_COEFn_SHIFT(j)) & S5P_COEFn_MASK(j);
269 writel(reg, regs + S5P_JPG_COEF(i));
272 void s5p_jpeg_start(void __iomem *regs)
274 writel(1, regs + S5P_JSTART);
277 int s5p_jpeg_result_stat_ok(void __iomem *regs)
279 return (int)((readl(regs + S5P_JPGINTST) & S5P_RESULT_STAT_MASK)
280 >> S5P_RESULT_STAT_SHIFT);
283 int s5p_jpeg_stream_stat_ok(void __iomem *regs)
285 return !(int)((readl(regs + S5P_JPGINTST) & S5P_STREAM_STAT_MASK)
286 >> S5P_STREAM_STAT_SHIFT);
289 void s5p_jpeg_clear_int(void __iomem *regs)
291 readl(regs + S5P_JPGINTST);
292 writel(S5P_INT_RELEASE, regs + S5P_JPGCOM);
293 readl(regs + S5P_JPGOPR);
296 unsigned int s5p_jpeg_compressed_size(void __iomem *regs)
298 unsigned long jpeg_size = 0;
300 jpeg_size |= (readl(regs + S5P_JPGCNT_U) & 0xff) << 16;
301 jpeg_size |= (readl(regs + S5P_JPGCNT_M) & 0xff) << 8;
302 jpeg_size |= (readl(regs + S5P_JPGCNT_L) & 0xff);
304 return (unsigned int)jpeg_size;