1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Register interface file for EXYNOS FIMC-LITE (camera interface) driver
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2012 Samsung Electronics Co., Ltd.
6*4882a593Smuzhiyun * Author: Sylwester Nawrocki <s.nawrocki@samsung.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/bitops.h>
10*4882a593Smuzhiyun #include <linux/delay.h>
11*4882a593Smuzhiyun #include <linux/io.h>
12*4882a593Smuzhiyun #include <media/drv-intf/exynos-fimc.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #include "fimc-lite-reg.h"
15*4882a593Smuzhiyun #include "fimc-lite.h"
16*4882a593Smuzhiyun #include "fimc-core.h"
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #define FLITE_RESET_TIMEOUT 50 /* in ms */
19*4882a593Smuzhiyun
flite_hw_reset(struct fimc_lite * dev)20*4882a593Smuzhiyun void flite_hw_reset(struct fimc_lite *dev)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun unsigned long end = jiffies + msecs_to_jiffies(FLITE_RESET_TIMEOUT);
23*4882a593Smuzhiyun u32 cfg;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
26*4882a593Smuzhiyun cfg |= FLITE_REG_CIGCTRL_SWRST_REQ;
27*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun while (time_is_after_jiffies(end)) {
30*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
31*4882a593Smuzhiyun if (cfg & FLITE_REG_CIGCTRL_SWRST_RDY)
32*4882a593Smuzhiyun break;
33*4882a593Smuzhiyun usleep_range(1000, 5000);
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun cfg |= FLITE_REG_CIGCTRL_SWRST;
37*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
flite_hw_clear_pending_irq(struct fimc_lite * dev)40*4882a593Smuzhiyun void flite_hw_clear_pending_irq(struct fimc_lite *dev)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CISTATUS);
43*4882a593Smuzhiyun cfg &= ~FLITE_REG_CISTATUS_IRQ_CAM;
44*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CISTATUS);
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun
flite_hw_get_interrupt_source(struct fimc_lite * dev)47*4882a593Smuzhiyun u32 flite_hw_get_interrupt_source(struct fimc_lite *dev)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun u32 intsrc = readl(dev->regs + FLITE_REG_CISTATUS);
50*4882a593Smuzhiyun return intsrc & FLITE_REG_CISTATUS_IRQ_MASK;
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun
flite_hw_clear_last_capture_end(struct fimc_lite * dev)53*4882a593Smuzhiyun void flite_hw_clear_last_capture_end(struct fimc_lite *dev)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CISTATUS2);
57*4882a593Smuzhiyun cfg &= ~FLITE_REG_CISTATUS2_LASTCAPEND;
58*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CISTATUS2);
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
flite_hw_set_interrupt_mask(struct fimc_lite * dev)61*4882a593Smuzhiyun void flite_hw_set_interrupt_mask(struct fimc_lite *dev)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun u32 cfg, intsrc;
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun /* Select interrupts to be enabled for each output mode */
66*4882a593Smuzhiyun if (atomic_read(&dev->out_path) == FIMC_IO_DMA) {
67*4882a593Smuzhiyun intsrc = FLITE_REG_CIGCTRL_IRQ_OVFEN |
68*4882a593Smuzhiyun FLITE_REG_CIGCTRL_IRQ_LASTEN |
69*4882a593Smuzhiyun FLITE_REG_CIGCTRL_IRQ_STARTEN |
70*4882a593Smuzhiyun FLITE_REG_CIGCTRL_IRQ_ENDEN;
71*4882a593Smuzhiyun } else {
72*4882a593Smuzhiyun /* An output to the FIMC-IS */
73*4882a593Smuzhiyun intsrc = FLITE_REG_CIGCTRL_IRQ_OVFEN |
74*4882a593Smuzhiyun FLITE_REG_CIGCTRL_IRQ_LASTEN;
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
78*4882a593Smuzhiyun cfg |= FLITE_REG_CIGCTRL_IRQ_DISABLE_MASK;
79*4882a593Smuzhiyun cfg &= ~intsrc;
80*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
flite_hw_capture_start(struct fimc_lite * dev)83*4882a593Smuzhiyun void flite_hw_capture_start(struct fimc_lite *dev)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CIIMGCPT);
86*4882a593Smuzhiyun cfg |= FLITE_REG_CIIMGCPT_IMGCPTEN;
87*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIIMGCPT);
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
flite_hw_capture_stop(struct fimc_lite * dev)90*4882a593Smuzhiyun void flite_hw_capture_stop(struct fimc_lite *dev)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CIIMGCPT);
93*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIIMGCPT_IMGCPTEN;
94*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIIMGCPT);
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun /*
98*4882a593Smuzhiyun * Test pattern (color bars) enable/disable. External sensor
99*4882a593Smuzhiyun * pixel clock must be active for the test pattern to work.
100*4882a593Smuzhiyun */
flite_hw_set_test_pattern(struct fimc_lite * dev,bool on)101*4882a593Smuzhiyun void flite_hw_set_test_pattern(struct fimc_lite *dev, bool on)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
104*4882a593Smuzhiyun if (on)
105*4882a593Smuzhiyun cfg |= FLITE_REG_CIGCTRL_TEST_PATTERN_COLORBAR;
106*4882a593Smuzhiyun else
107*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIGCTRL_TEST_PATTERN_COLORBAR;
108*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun static const u32 src_pixfmt_map[8][3] = {
112*4882a593Smuzhiyun { MEDIA_BUS_FMT_YUYV8_2X8, FLITE_REG_CISRCSIZE_ORDER422_IN_YCBYCR,
113*4882a593Smuzhiyun FLITE_REG_CIGCTRL_YUV422_1P },
114*4882a593Smuzhiyun { MEDIA_BUS_FMT_YVYU8_2X8, FLITE_REG_CISRCSIZE_ORDER422_IN_YCRYCB,
115*4882a593Smuzhiyun FLITE_REG_CIGCTRL_YUV422_1P },
116*4882a593Smuzhiyun { MEDIA_BUS_FMT_UYVY8_2X8, FLITE_REG_CISRCSIZE_ORDER422_IN_CBYCRY,
117*4882a593Smuzhiyun FLITE_REG_CIGCTRL_YUV422_1P },
118*4882a593Smuzhiyun { MEDIA_BUS_FMT_VYUY8_2X8, FLITE_REG_CISRCSIZE_ORDER422_IN_CRYCBY,
119*4882a593Smuzhiyun FLITE_REG_CIGCTRL_YUV422_1P },
120*4882a593Smuzhiyun { MEDIA_BUS_FMT_SGRBG8_1X8, 0, FLITE_REG_CIGCTRL_RAW8 },
121*4882a593Smuzhiyun { MEDIA_BUS_FMT_SGRBG10_1X10, 0, FLITE_REG_CIGCTRL_RAW10 },
122*4882a593Smuzhiyun { MEDIA_BUS_FMT_SGRBG12_1X12, 0, FLITE_REG_CIGCTRL_RAW12 },
123*4882a593Smuzhiyun { MEDIA_BUS_FMT_JPEG_1X8, 0, FLITE_REG_CIGCTRL_USER(1) },
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun /* Set camera input pixel format and resolution */
flite_hw_set_source_format(struct fimc_lite * dev,struct flite_frame * f)127*4882a593Smuzhiyun void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun u32 pixelcode = f->fmt->mbus_code;
130*4882a593Smuzhiyun int i = ARRAY_SIZE(src_pixfmt_map);
131*4882a593Smuzhiyun u32 cfg;
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun while (--i) {
134*4882a593Smuzhiyun if (src_pixfmt_map[i][0] == pixelcode)
135*4882a593Smuzhiyun break;
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun if (i == 0 && src_pixfmt_map[i][0] != pixelcode) {
139*4882a593Smuzhiyun v4l2_err(&dev->ve.vdev,
140*4882a593Smuzhiyun "Unsupported pixel code, falling back to %#08x\n",
141*4882a593Smuzhiyun src_pixfmt_map[i][0]);
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
145*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIGCTRL_FMT_MASK;
146*4882a593Smuzhiyun cfg |= src_pixfmt_map[i][2];
147*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CISRCSIZE);
150*4882a593Smuzhiyun cfg &= ~(FLITE_REG_CISRCSIZE_ORDER422_MASK |
151*4882a593Smuzhiyun FLITE_REG_CISRCSIZE_SIZE_CAM_MASK);
152*4882a593Smuzhiyun cfg |= (f->f_width << 16) | f->f_height;
153*4882a593Smuzhiyun cfg |= src_pixfmt_map[i][1];
154*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CISRCSIZE);
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun /* Set the camera host input window offsets (cropping) */
flite_hw_set_window_offset(struct fimc_lite * dev,struct flite_frame * f)158*4882a593Smuzhiyun void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun u32 hoff2, voff2;
161*4882a593Smuzhiyun u32 cfg;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CIWDOFST);
164*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIWDOFST_OFST_MASK;
165*4882a593Smuzhiyun cfg |= (f->rect.left << 16) | f->rect.top;
166*4882a593Smuzhiyun cfg |= FLITE_REG_CIWDOFST_WINOFSEN;
167*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIWDOFST);
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun hoff2 = f->f_width - f->rect.width - f->rect.left;
170*4882a593Smuzhiyun voff2 = f->f_height - f->rect.height - f->rect.top;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun cfg = (hoff2 << 16) | voff2;
173*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIWDOFST2);
174*4882a593Smuzhiyun }
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun /* Select camera port (A, B) */
flite_hw_set_camera_port(struct fimc_lite * dev,int id)177*4882a593Smuzhiyun static void flite_hw_set_camera_port(struct fimc_lite *dev, int id)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CIGENERAL);
180*4882a593Smuzhiyun if (id == 0)
181*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIGENERAL_CAM_B;
182*4882a593Smuzhiyun else
183*4882a593Smuzhiyun cfg |= FLITE_REG_CIGENERAL_CAM_B;
184*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIGENERAL);
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun /* Select serial or parallel bus, camera port (A,B) and set signals polarity */
flite_hw_set_camera_bus(struct fimc_lite * dev,struct fimc_source_info * si)188*4882a593Smuzhiyun void flite_hw_set_camera_bus(struct fimc_lite *dev,
189*4882a593Smuzhiyun struct fimc_source_info *si)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
192*4882a593Smuzhiyun unsigned int flags = si->flags;
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun if (si->sensor_bus_type != FIMC_BUS_TYPE_MIPI_CSI2) {
195*4882a593Smuzhiyun cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI |
196*4882a593Smuzhiyun FLITE_REG_CIGCTRL_INVPOLPCLK |
197*4882a593Smuzhiyun FLITE_REG_CIGCTRL_INVPOLVSYNC |
198*4882a593Smuzhiyun FLITE_REG_CIGCTRL_INVPOLHREF);
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun if (flags & V4L2_MBUS_PCLK_SAMPLE_FALLING)
201*4882a593Smuzhiyun cfg |= FLITE_REG_CIGCTRL_INVPOLPCLK;
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
204*4882a593Smuzhiyun cfg |= FLITE_REG_CIGCTRL_INVPOLVSYNC;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun if (flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
207*4882a593Smuzhiyun cfg |= FLITE_REG_CIGCTRL_INVPOLHREF;
208*4882a593Smuzhiyun } else {
209*4882a593Smuzhiyun cfg |= FLITE_REG_CIGCTRL_SELCAM_MIPI;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun flite_hw_set_camera_port(dev, si->mux_id);
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun
flite_hw_set_pack12(struct fimc_lite * dev,int on)217*4882a593Smuzhiyun static void flite_hw_set_pack12(struct fimc_lite *dev, int on)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CIODMAFMT);
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIODMAFMT_PACK12;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun if (on)
224*4882a593Smuzhiyun cfg |= FLITE_REG_CIODMAFMT_PACK12;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIODMAFMT);
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun
flite_hw_set_out_order(struct fimc_lite * dev,struct flite_frame * f)229*4882a593Smuzhiyun static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun static const u32 pixcode[4][2] = {
232*4882a593Smuzhiyun { MEDIA_BUS_FMT_YUYV8_2X8, FLITE_REG_CIODMAFMT_YCBYCR },
233*4882a593Smuzhiyun { MEDIA_BUS_FMT_YVYU8_2X8, FLITE_REG_CIODMAFMT_YCRYCB },
234*4882a593Smuzhiyun { MEDIA_BUS_FMT_UYVY8_2X8, FLITE_REG_CIODMAFMT_CBYCRY },
235*4882a593Smuzhiyun { MEDIA_BUS_FMT_VYUY8_2X8, FLITE_REG_CIODMAFMT_CRYCBY },
236*4882a593Smuzhiyun };
237*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CIODMAFMT);
238*4882a593Smuzhiyun int i = ARRAY_SIZE(pixcode);
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun while (--i)
241*4882a593Smuzhiyun if (pixcode[i][0] == f->fmt->mbus_code)
242*4882a593Smuzhiyun break;
243*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIODMAFMT_YCBCR_ORDER_MASK;
244*4882a593Smuzhiyun writel(cfg | pixcode[i][1], dev->regs + FLITE_REG_CIODMAFMT);
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun
flite_hw_set_dma_window(struct fimc_lite * dev,struct flite_frame * f)247*4882a593Smuzhiyun void flite_hw_set_dma_window(struct fimc_lite *dev, struct flite_frame *f)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun u32 cfg;
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun /* Maximum output pixel size */
252*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CIOCAN);
253*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIOCAN_MASK;
254*4882a593Smuzhiyun cfg |= (f->f_height << 16) | f->f_width;
255*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIOCAN);
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun /* DMA offsets */
258*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CIOOFF);
259*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIOOFF_MASK;
260*4882a593Smuzhiyun cfg |= (f->rect.top << 16) | f->rect.left;
261*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIOOFF);
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
flite_hw_set_dma_buffer(struct fimc_lite * dev,struct flite_buffer * buf)264*4882a593Smuzhiyun void flite_hw_set_dma_buffer(struct fimc_lite *dev, struct flite_buffer *buf)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun unsigned int index;
267*4882a593Smuzhiyun u32 cfg;
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun if (dev->dd->max_dma_bufs == 1)
270*4882a593Smuzhiyun index = 0;
271*4882a593Smuzhiyun else
272*4882a593Smuzhiyun index = buf->index;
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun if (index == 0)
275*4882a593Smuzhiyun writel(buf->paddr, dev->regs + FLITE_REG_CIOSA);
276*4882a593Smuzhiyun else
277*4882a593Smuzhiyun writel(buf->paddr, dev->regs + FLITE_REG_CIOSAN(index - 1));
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CIFCNTSEQ);
280*4882a593Smuzhiyun cfg |= BIT(index);
281*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIFCNTSEQ);
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
flite_hw_mask_dma_buffer(struct fimc_lite * dev,u32 index)284*4882a593Smuzhiyun void flite_hw_mask_dma_buffer(struct fimc_lite *dev, u32 index)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun u32 cfg;
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun if (dev->dd->max_dma_bufs == 1)
289*4882a593Smuzhiyun index = 0;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun cfg = readl(dev->regs + FLITE_REG_CIFCNTSEQ);
292*4882a593Smuzhiyun cfg &= ~BIT(index);
293*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIFCNTSEQ);
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun /* Enable/disable output DMA, set output pixel size and offsets (composition) */
flite_hw_set_output_dma(struct fimc_lite * dev,struct flite_frame * f,bool enable)297*4882a593Smuzhiyun void flite_hw_set_output_dma(struct fimc_lite *dev, struct flite_frame *f,
298*4882a593Smuzhiyun bool enable)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun if (!enable) {
303*4882a593Smuzhiyun cfg |= FLITE_REG_CIGCTRL_ODMA_DISABLE;
304*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
305*4882a593Smuzhiyun return;
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun cfg &= ~FLITE_REG_CIGCTRL_ODMA_DISABLE;
309*4882a593Smuzhiyun writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun flite_hw_set_out_order(dev, f);
312*4882a593Smuzhiyun flite_hw_set_dma_window(dev, f);
313*4882a593Smuzhiyun flite_hw_set_pack12(dev, 0);
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun
flite_hw_dump_regs(struct fimc_lite * dev,const char * label)316*4882a593Smuzhiyun void flite_hw_dump_regs(struct fimc_lite *dev, const char *label)
317*4882a593Smuzhiyun {
318*4882a593Smuzhiyun struct {
319*4882a593Smuzhiyun u32 offset;
320*4882a593Smuzhiyun const char * const name;
321*4882a593Smuzhiyun } registers[] = {
322*4882a593Smuzhiyun { 0x00, "CISRCSIZE" },
323*4882a593Smuzhiyun { 0x04, "CIGCTRL" },
324*4882a593Smuzhiyun { 0x08, "CIIMGCPT" },
325*4882a593Smuzhiyun { 0x0c, "CICPTSEQ" },
326*4882a593Smuzhiyun { 0x10, "CIWDOFST" },
327*4882a593Smuzhiyun { 0x14, "CIWDOFST2" },
328*4882a593Smuzhiyun { 0x18, "CIODMAFMT" },
329*4882a593Smuzhiyun { 0x20, "CIOCAN" },
330*4882a593Smuzhiyun { 0x24, "CIOOFF" },
331*4882a593Smuzhiyun { 0x30, "CIOSA" },
332*4882a593Smuzhiyun { 0x40, "CISTATUS" },
333*4882a593Smuzhiyun { 0x44, "CISTATUS2" },
334*4882a593Smuzhiyun { 0xf0, "CITHOLD" },
335*4882a593Smuzhiyun { 0xfc, "CIGENERAL" },
336*4882a593Smuzhiyun };
337*4882a593Smuzhiyun u32 i;
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun v4l2_info(&dev->subdev, "--- %s ---\n", label);
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(registers); i++) {
342*4882a593Smuzhiyun u32 cfg = readl(dev->regs + registers[i].offset);
343*4882a593Smuzhiyun v4l2_info(&dev->subdev, "%9s: 0x%08x\n",
344*4882a593Smuzhiyun registers[i].name, cfg);
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun }
347