162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Register interface file for EXYNOS FIMC-LITE (camera interface) driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2012 Samsung Electronics Co., Ltd.
662306a36Sopenharmony_ci * Author: Sylwester Nawrocki <s.nawrocki@samsung.com>
762306a36Sopenharmony_ci*/
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/bitops.h>
1062306a36Sopenharmony_ci#include <linux/delay.h>
1162306a36Sopenharmony_ci#include <linux/io.h>
1262306a36Sopenharmony_ci#include <media/drv-intf/exynos-fimc.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "fimc-lite-reg.h"
1562306a36Sopenharmony_ci#include "fimc-lite.h"
1662306a36Sopenharmony_ci#include "fimc-core.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define FLITE_RESET_TIMEOUT 50 /* in ms */
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_civoid flite_hw_reset(struct fimc_lite *dev)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	unsigned long end = jiffies + msecs_to_jiffies(FLITE_RESET_TIMEOUT);
2362306a36Sopenharmony_ci	u32 cfg;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
2662306a36Sopenharmony_ci	cfg |= FLITE_REG_CIGCTRL_SWRST_REQ;
2762306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	while (time_is_after_jiffies(end)) {
3062306a36Sopenharmony_ci		cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
3162306a36Sopenharmony_ci		if (cfg & FLITE_REG_CIGCTRL_SWRST_RDY)
3262306a36Sopenharmony_ci			break;
3362306a36Sopenharmony_ci		usleep_range(1000, 5000);
3462306a36Sopenharmony_ci	}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	cfg |= FLITE_REG_CIGCTRL_SWRST;
3762306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_civoid flite_hw_clear_pending_irq(struct fimc_lite *dev)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CISTATUS);
4362306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CISTATUS_IRQ_CAM;
4462306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CISTATUS);
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ciu32 flite_hw_get_interrupt_source(struct fimc_lite *dev)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	u32 intsrc = readl(dev->regs + FLITE_REG_CISTATUS);
5062306a36Sopenharmony_ci	return intsrc & FLITE_REG_CISTATUS_IRQ_MASK;
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_civoid flite_hw_clear_last_capture_end(struct fimc_lite *dev)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CISTATUS2);
5762306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CISTATUS2_LASTCAPEND;
5862306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CISTATUS2);
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_civoid flite_hw_set_interrupt_mask(struct fimc_lite *dev)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	u32 cfg, intsrc;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	/* Select interrupts to be enabled for each output mode */
6662306a36Sopenharmony_ci	if (atomic_read(&dev->out_path) == FIMC_IO_DMA) {
6762306a36Sopenharmony_ci		intsrc = FLITE_REG_CIGCTRL_IRQ_OVFEN |
6862306a36Sopenharmony_ci			 FLITE_REG_CIGCTRL_IRQ_LASTEN |
6962306a36Sopenharmony_ci			 FLITE_REG_CIGCTRL_IRQ_STARTEN |
7062306a36Sopenharmony_ci			 FLITE_REG_CIGCTRL_IRQ_ENDEN;
7162306a36Sopenharmony_ci	} else {
7262306a36Sopenharmony_ci		/* An output to the FIMC-IS */
7362306a36Sopenharmony_ci		intsrc = FLITE_REG_CIGCTRL_IRQ_OVFEN |
7462306a36Sopenharmony_ci			 FLITE_REG_CIGCTRL_IRQ_LASTEN;
7562306a36Sopenharmony_ci	}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
7862306a36Sopenharmony_ci	cfg |= FLITE_REG_CIGCTRL_IRQ_DISABLE_MASK;
7962306a36Sopenharmony_ci	cfg &= ~intsrc;
8062306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_civoid flite_hw_capture_start(struct fimc_lite *dev)
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CIIMGCPT);
8662306a36Sopenharmony_ci	cfg |= FLITE_REG_CIIMGCPT_IMGCPTEN;
8762306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIIMGCPT);
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_civoid flite_hw_capture_stop(struct fimc_lite *dev)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CIIMGCPT);
9362306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CIIMGCPT_IMGCPTEN;
9462306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIIMGCPT);
9562306a36Sopenharmony_ci}
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/*
9862306a36Sopenharmony_ci * Test pattern (color bars) enable/disable. External sensor
9962306a36Sopenharmony_ci * pixel clock must be active for the test pattern to work.
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_civoid flite_hw_set_test_pattern(struct fimc_lite *dev, bool on)
10262306a36Sopenharmony_ci{
10362306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
10462306a36Sopenharmony_ci	if (on)
10562306a36Sopenharmony_ci		cfg |= FLITE_REG_CIGCTRL_TEST_PATTERN_COLORBAR;
10662306a36Sopenharmony_ci	else
10762306a36Sopenharmony_ci		cfg &= ~FLITE_REG_CIGCTRL_TEST_PATTERN_COLORBAR;
10862306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
10962306a36Sopenharmony_ci}
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistatic const u32 src_pixfmt_map[8][3] = {
11262306a36Sopenharmony_ci	{ MEDIA_BUS_FMT_YUYV8_2X8, FLITE_REG_CISRCSIZE_ORDER422_IN_YCBYCR,
11362306a36Sopenharmony_ci	  FLITE_REG_CIGCTRL_YUV422_1P },
11462306a36Sopenharmony_ci	{ MEDIA_BUS_FMT_YVYU8_2X8, FLITE_REG_CISRCSIZE_ORDER422_IN_YCRYCB,
11562306a36Sopenharmony_ci	  FLITE_REG_CIGCTRL_YUV422_1P },
11662306a36Sopenharmony_ci	{ MEDIA_BUS_FMT_UYVY8_2X8, FLITE_REG_CISRCSIZE_ORDER422_IN_CBYCRY,
11762306a36Sopenharmony_ci	  FLITE_REG_CIGCTRL_YUV422_1P },
11862306a36Sopenharmony_ci	{ MEDIA_BUS_FMT_VYUY8_2X8, FLITE_REG_CISRCSIZE_ORDER422_IN_CRYCBY,
11962306a36Sopenharmony_ci	  FLITE_REG_CIGCTRL_YUV422_1P },
12062306a36Sopenharmony_ci	{ MEDIA_BUS_FMT_SGRBG8_1X8, 0, FLITE_REG_CIGCTRL_RAW8 },
12162306a36Sopenharmony_ci	{ MEDIA_BUS_FMT_SGRBG10_1X10, 0, FLITE_REG_CIGCTRL_RAW10 },
12262306a36Sopenharmony_ci	{ MEDIA_BUS_FMT_SGRBG12_1X12, 0, FLITE_REG_CIGCTRL_RAW12 },
12362306a36Sopenharmony_ci	{ MEDIA_BUS_FMT_JPEG_1X8, 0, FLITE_REG_CIGCTRL_USER(1) },
12462306a36Sopenharmony_ci};
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci/* Set camera input pixel format and resolution */
12762306a36Sopenharmony_civoid flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f)
12862306a36Sopenharmony_ci{
12962306a36Sopenharmony_ci	u32 pixelcode = f->fmt->mbus_code;
13062306a36Sopenharmony_ci	int i = ARRAY_SIZE(src_pixfmt_map);
13162306a36Sopenharmony_ci	u32 cfg;
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	while (--i) {
13462306a36Sopenharmony_ci		if (src_pixfmt_map[i][0] == pixelcode)
13562306a36Sopenharmony_ci			break;
13662306a36Sopenharmony_ci	}
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	if (i == 0 && src_pixfmt_map[i][0] != pixelcode) {
13962306a36Sopenharmony_ci		v4l2_err(&dev->ve.vdev,
14062306a36Sopenharmony_ci			 "Unsupported pixel code, falling back to %#08x\n",
14162306a36Sopenharmony_ci			 src_pixfmt_map[i][0]);
14262306a36Sopenharmony_ci	}
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
14562306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CIGCTRL_FMT_MASK;
14662306a36Sopenharmony_ci	cfg |= src_pixfmt_map[i][2];
14762306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	cfg = readl(dev->regs + FLITE_REG_CISRCSIZE);
15062306a36Sopenharmony_ci	cfg &= ~(FLITE_REG_CISRCSIZE_ORDER422_MASK |
15162306a36Sopenharmony_ci		 FLITE_REG_CISRCSIZE_SIZE_CAM_MASK);
15262306a36Sopenharmony_ci	cfg |= (f->f_width << 16) | f->f_height;
15362306a36Sopenharmony_ci	cfg |= src_pixfmt_map[i][1];
15462306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CISRCSIZE);
15562306a36Sopenharmony_ci}
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci/* Set the camera host input window offsets (cropping) */
15862306a36Sopenharmony_civoid flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f)
15962306a36Sopenharmony_ci{
16062306a36Sopenharmony_ci	u32 hoff2, voff2;
16162306a36Sopenharmony_ci	u32 cfg;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	cfg = readl(dev->regs + FLITE_REG_CIWDOFST);
16462306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CIWDOFST_OFST_MASK;
16562306a36Sopenharmony_ci	cfg |= (f->rect.left << 16) | f->rect.top;
16662306a36Sopenharmony_ci	cfg |= FLITE_REG_CIWDOFST_WINOFSEN;
16762306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIWDOFST);
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	hoff2 = f->f_width - f->rect.width - f->rect.left;
17062306a36Sopenharmony_ci	voff2 = f->f_height - f->rect.height - f->rect.top;
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci	cfg = (hoff2 << 16) | voff2;
17362306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIWDOFST2);
17462306a36Sopenharmony_ci}
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci/* Select camera port (A, B) */
17762306a36Sopenharmony_cistatic void flite_hw_set_camera_port(struct fimc_lite *dev, int id)
17862306a36Sopenharmony_ci{
17962306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CIGENERAL);
18062306a36Sopenharmony_ci	if (id == 0)
18162306a36Sopenharmony_ci		cfg &= ~FLITE_REG_CIGENERAL_CAM_B;
18262306a36Sopenharmony_ci	else
18362306a36Sopenharmony_ci		cfg |= FLITE_REG_CIGENERAL_CAM_B;
18462306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIGENERAL);
18562306a36Sopenharmony_ci}
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/* Select serial or parallel bus, camera port (A,B) and set signals polarity */
18862306a36Sopenharmony_civoid flite_hw_set_camera_bus(struct fimc_lite *dev,
18962306a36Sopenharmony_ci			     struct fimc_source_info *si)
19062306a36Sopenharmony_ci{
19162306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
19262306a36Sopenharmony_ci	unsigned int flags = si->flags;
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	if (si->sensor_bus_type != FIMC_BUS_TYPE_MIPI_CSI2) {
19562306a36Sopenharmony_ci		cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI |
19662306a36Sopenharmony_ci			 FLITE_REG_CIGCTRL_INVPOLPCLK |
19762306a36Sopenharmony_ci			 FLITE_REG_CIGCTRL_INVPOLVSYNC |
19862306a36Sopenharmony_ci			 FLITE_REG_CIGCTRL_INVPOLHREF);
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci		if (flags & V4L2_MBUS_PCLK_SAMPLE_FALLING)
20162306a36Sopenharmony_ci			cfg |= FLITE_REG_CIGCTRL_INVPOLPCLK;
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci		if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
20462306a36Sopenharmony_ci			cfg |= FLITE_REG_CIGCTRL_INVPOLVSYNC;
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci		if (flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
20762306a36Sopenharmony_ci			cfg |= FLITE_REG_CIGCTRL_INVPOLHREF;
20862306a36Sopenharmony_ci	} else {
20962306a36Sopenharmony_ci		cfg |= FLITE_REG_CIGCTRL_SELCAM_MIPI;
21062306a36Sopenharmony_ci	}
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	flite_hw_set_camera_port(dev, si->mux_id);
21562306a36Sopenharmony_ci}
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_cistatic void flite_hw_set_pack12(struct fimc_lite *dev, int on)
21862306a36Sopenharmony_ci{
21962306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CIODMAFMT);
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CIODMAFMT_PACK12;
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	if (on)
22462306a36Sopenharmony_ci		cfg |= FLITE_REG_CIODMAFMT_PACK12;
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIODMAFMT);
22762306a36Sopenharmony_ci}
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_cistatic void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f)
23062306a36Sopenharmony_ci{
23162306a36Sopenharmony_ci	static const u32 pixcode[4][2] = {
23262306a36Sopenharmony_ci		{ MEDIA_BUS_FMT_YUYV8_2X8, FLITE_REG_CIODMAFMT_YCBYCR },
23362306a36Sopenharmony_ci		{ MEDIA_BUS_FMT_YVYU8_2X8, FLITE_REG_CIODMAFMT_YCRYCB },
23462306a36Sopenharmony_ci		{ MEDIA_BUS_FMT_UYVY8_2X8, FLITE_REG_CIODMAFMT_CBYCRY },
23562306a36Sopenharmony_ci		{ MEDIA_BUS_FMT_VYUY8_2X8, FLITE_REG_CIODMAFMT_CRYCBY },
23662306a36Sopenharmony_ci	};
23762306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CIODMAFMT);
23862306a36Sopenharmony_ci	int i = ARRAY_SIZE(pixcode);
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci	while (--i)
24162306a36Sopenharmony_ci		if (pixcode[i][0] == f->fmt->mbus_code)
24262306a36Sopenharmony_ci			break;
24362306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CIODMAFMT_YCBCR_ORDER_MASK;
24462306a36Sopenharmony_ci	writel(cfg | pixcode[i][1], dev->regs + FLITE_REG_CIODMAFMT);
24562306a36Sopenharmony_ci}
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_civoid flite_hw_set_dma_window(struct fimc_lite *dev, struct flite_frame *f)
24862306a36Sopenharmony_ci{
24962306a36Sopenharmony_ci	u32 cfg;
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci	/* Maximum output pixel size */
25262306a36Sopenharmony_ci	cfg = readl(dev->regs + FLITE_REG_CIOCAN);
25362306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CIOCAN_MASK;
25462306a36Sopenharmony_ci	cfg |= (f->f_height << 16) | f->f_width;
25562306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIOCAN);
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	/* DMA offsets */
25862306a36Sopenharmony_ci	cfg = readl(dev->regs + FLITE_REG_CIOOFF);
25962306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CIOOFF_MASK;
26062306a36Sopenharmony_ci	cfg |= (f->rect.top << 16) | f->rect.left;
26162306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIOOFF);
26262306a36Sopenharmony_ci}
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_civoid flite_hw_set_dma_buffer(struct fimc_lite *dev, struct flite_buffer *buf)
26562306a36Sopenharmony_ci{
26662306a36Sopenharmony_ci	unsigned int index;
26762306a36Sopenharmony_ci	u32 cfg;
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci	if (dev->dd->max_dma_bufs == 1)
27062306a36Sopenharmony_ci		index = 0;
27162306a36Sopenharmony_ci	else
27262306a36Sopenharmony_ci		index = buf->index;
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci	if (index == 0)
27562306a36Sopenharmony_ci		writel(buf->addr, dev->regs + FLITE_REG_CIOSA);
27662306a36Sopenharmony_ci	else
27762306a36Sopenharmony_ci		writel(buf->addr, dev->regs + FLITE_REG_CIOSAN(index - 1));
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	cfg = readl(dev->regs + FLITE_REG_CIFCNTSEQ);
28062306a36Sopenharmony_ci	cfg |= BIT(index);
28162306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIFCNTSEQ);
28262306a36Sopenharmony_ci}
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_civoid flite_hw_mask_dma_buffer(struct fimc_lite *dev, u32 index)
28562306a36Sopenharmony_ci{
28662306a36Sopenharmony_ci	u32 cfg;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	if (dev->dd->max_dma_bufs == 1)
28962306a36Sopenharmony_ci		index = 0;
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	cfg = readl(dev->regs + FLITE_REG_CIFCNTSEQ);
29262306a36Sopenharmony_ci	cfg &= ~BIT(index);
29362306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIFCNTSEQ);
29462306a36Sopenharmony_ci}
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci/* Enable/disable output DMA, set output pixel size and offsets (composition) */
29762306a36Sopenharmony_civoid flite_hw_set_output_dma(struct fimc_lite *dev, struct flite_frame *f,
29862306a36Sopenharmony_ci			     bool enable)
29962306a36Sopenharmony_ci{
30062306a36Sopenharmony_ci	u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL);
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	if (!enable) {
30362306a36Sopenharmony_ci		cfg |= FLITE_REG_CIGCTRL_ODMA_DISABLE;
30462306a36Sopenharmony_ci		writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
30562306a36Sopenharmony_ci		return;
30662306a36Sopenharmony_ci	}
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	cfg &= ~FLITE_REG_CIGCTRL_ODMA_DISABLE;
30962306a36Sopenharmony_ci	writel(cfg, dev->regs + FLITE_REG_CIGCTRL);
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	flite_hw_set_out_order(dev, f);
31262306a36Sopenharmony_ci	flite_hw_set_dma_window(dev, f);
31362306a36Sopenharmony_ci	flite_hw_set_pack12(dev, 0);
31462306a36Sopenharmony_ci}
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_civoid flite_hw_dump_regs(struct fimc_lite *dev, const char *label)
31762306a36Sopenharmony_ci{
31862306a36Sopenharmony_ci	struct {
31962306a36Sopenharmony_ci		u32 offset;
32062306a36Sopenharmony_ci		const char * const name;
32162306a36Sopenharmony_ci	} registers[] = {
32262306a36Sopenharmony_ci		{ 0x00, "CISRCSIZE" },
32362306a36Sopenharmony_ci		{ 0x04, "CIGCTRL" },
32462306a36Sopenharmony_ci		{ 0x08, "CIIMGCPT" },
32562306a36Sopenharmony_ci		{ 0x0c, "CICPTSEQ" },
32662306a36Sopenharmony_ci		{ 0x10, "CIWDOFST" },
32762306a36Sopenharmony_ci		{ 0x14, "CIWDOFST2" },
32862306a36Sopenharmony_ci		{ 0x18, "CIODMAFMT" },
32962306a36Sopenharmony_ci		{ 0x20, "CIOCAN" },
33062306a36Sopenharmony_ci		{ 0x24, "CIOOFF" },
33162306a36Sopenharmony_ci		{ 0x30, "CIOSA" },
33262306a36Sopenharmony_ci		{ 0x40, "CISTATUS" },
33362306a36Sopenharmony_ci		{ 0x44, "CISTATUS2" },
33462306a36Sopenharmony_ci		{ 0xf0, "CITHOLD" },
33562306a36Sopenharmony_ci		{ 0xfc, "CIGENERAL" },
33662306a36Sopenharmony_ci	};
33762306a36Sopenharmony_ci	u32 i;
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci	v4l2_info(&dev->subdev, "--- %s ---\n", label);
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(registers); i++) {
34262306a36Sopenharmony_ci		u32 cfg = readl(dev->regs + registers[i].offset);
34362306a36Sopenharmony_ci		v4l2_info(&dev->subdev, "%9s: 0x%08x\n",
34462306a36Sopenharmony_ci			  registers[i].name, cfg);
34562306a36Sopenharmony_ci	}
34662306a36Sopenharmony_ci}
347