15cc7522dSYong Deng /* SPDX-License-Identifier: GPL-2.0+ */
25cc7522dSYong Deng /*
35cc7522dSYong Deng  * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing)
45cc7522dSYong Deng  * Author: Yong Deng <yong.deng@magewell.com>
5*dc85e4cdSPaul Kocialkowski  * Copyright 2021-2022 Bootlin
6*dc85e4cdSPaul Kocialkowski  * Author: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
75cc7522dSYong Deng  */
85cc7522dSYong Deng 
9*dc85e4cdSPaul Kocialkowski #ifndef _SUN6I_CSI_REG_H_
10*dc85e4cdSPaul Kocialkowski #define _SUN6I_CSI_REG_H_
115cc7522dSYong Deng 
125cc7522dSYong Deng #include <linux/kernel.h>
135cc7522dSYong Deng 
14b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_ADDR_VALUE(a)			((a) >> 2)
155cc7522dSYong Deng 
16b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_REG			0x0
17b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_VER_EN			BIT(30)
18b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_PTN_CYCLE(v)		(((v) << 16) & GENMASK(23, 16))
19b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_SRAM_PWDN			BIT(8)
20b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_PTN_START			BIT(4)
21b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_CLK_CNT_SPL_VSYNC		BIT(3)
22b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_CLK_CNT_EN			BIT(2)
23b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_PTN_GEN_EN			BIT(1)
24b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_CSI_EN			BIT(0)
255cc7522dSYong Deng 
26b3a07d8eSPaul Kocialkowski /* Note that Allwinner manuals and code invert positive/negative definitions. */
275cc7522dSYong Deng 
28b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_REG			0x4
29b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_DT_PCLK_SHIFT(v)	(((v) << 24) & GENMASK(27, 24))
30b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_SRC_TYPE_PROGRESSIVE	(0 << 21)
31b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_SRC_TYPE_INTERLACED	(1 << 21)
32b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FPS_DS			BIT(20)
33b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_POSITIVE		(0 << 19)
34b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_NEGATIVE		(1 << 19)
35b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_VREF_POL_POSITIVE	(0 << 18)
36b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_VREF_POL_NEGATIVE	(1 << 18)
37b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_HREF_POL_POSITIVE	(0 << 17)
38b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_HREF_POL_NEGATIVE	(1 << 17)
39b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_CLK_POL_FALLING	(0 << 16)
40b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_CLK_POL_RISING		(1 << 16)
41b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_DT_FIELD_VSYNC	(0 << 14)
42b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_DT_FIELD		(1 << 14)
43b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_DT_VSYNC		(2 << 14)
44b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_8		(0 << 8)
45b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_10		(1 << 8)
46b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_12		(2 << 8)
47b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_8_PLUS_2	(3 << 8)
48b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_2_TIMES_8	(4 << 8)
49b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI			(0 << 7)
50b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_MIPI		(1 << 7)
51b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI_YUV_RAW		(0 << 0)
52b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI_YUV_COMBINED	(1 << 0)
53b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI_BT656		(4 << 0)
54b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI_BT1120		(5 << 0)
555cc7522dSYong Deng 
56b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CAP_REG			0x8
57b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CAP_MASK(v)			(((v) << 2) & GENMASK(5, 2))
58b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CAP_VCAP_ON			BIT(1)
59b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CAP_SCAP_ON			BIT(0)
605cc7522dSYong Deng 
61b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_SYNC_CNT_REG			0xc
62b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_FIFO_THRS_REG			0x10
63b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_BT656_HEAD_CFG_REG		0x14
645cc7522dSYong Deng 
65b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_PTN_LEN_REG			0x30
66b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_PTN_ADDR_REG			0x34
67b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_VER_REG			0x3c
685cc7522dSYong Deng 
69b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_REG			0x44
70b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_PAD_VAL(v)		(((v) << 24) & GENMASK(31, 24))
71b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_INPUT_FMT(v)		(((v) << 20) & GENMASK(23, 20))
72b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_OUTPUT_FMT(v)		(((v) << 16) & GENMASK(19, 16))
73b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_VFLIP_EN		BIT(13)
74b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_HFLIP_EN		BIT(12)
75b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_FIELD_SEL_FIELD0	(0 << 10)
76b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_FIELD_SEL_FIELD1	(1 << 10)
77b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_FIELD_SEL_EITHER	(2 << 10)
78b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_INPUT_YUV_SEQ(v)	(((v) << 8) & GENMASK(9, 8))
795cc7522dSYong Deng 
80b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_FMT_RAW			0
81b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_FMT_YUV422		3
82b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_FMT_YUV420		4
835cc7522dSYong Deng 
84b3a07d8eSPaul Kocialkowski /* Note that Allwinner manuals and code invert frame/field definitions. */
855cc7522dSYong Deng 
86b3a07d8eSPaul Kocialkowski /* RAW */
87b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8	0
88b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_10	1
89b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_12	2
90b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RGB565	4
91b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RGB888	5
92b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_PRGB888	6
93b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8	8
94b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_10	9
95b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_12	10
96b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RGB565	12
97b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RGB888	13
98b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_PRGB888	14
995cc7522dSYong Deng 
100b3a07d8eSPaul Kocialkowski /* YUV */
101b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422P	0
102b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420P	1
103b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420P	2
104b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV422P	3
105b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422SP	4
106b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420SP	5
107b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420SP	6
108b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV422SP	7
109b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422MB	8
110b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420MB	9
111b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420MB	10
112b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV422MB	11
113b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422SP_10	12
114b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420SP_10	13
1155cc7522dSYong Deng 
116b3a07d8eSPaul Kocialkowski /* YUV Planar */
117b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_YUYV		0
118b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_YVYU		1
119b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_UYVY		2
120b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_VYUY		3
1215cc7522dSYong Deng 
122b3a07d8eSPaul Kocialkowski /* YUV Semi-planar */
123b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_UV		0
124b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_VU		1
1255cc7522dSYong Deng 
126b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_SCALE_REG			0x4c
127b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_SCALE_QUART_EN		BIT(0)
1285cc7522dSYong Deng 
129b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FIFO0_ADDR_REG		0x50
130b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FIFO1_ADDR_REG		0x58
131b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FIFO2_ADDR_REG		0x60
1325cc7522dSYong Deng 
133b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_STA_REG			0x6c
134b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_STA_FIELD			BIT(2)
135b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_STA_VCAP			BIT(1)
136b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_STA_SCAP			BIT(0)
1375cc7522dSYong Deng 
138b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_REG			0x70
139b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_VS			BIT(7)
140b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_HB_OF		BIT(6)
141b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_MUL_ERR		BIT(5)
142b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_FIFO2_OF		BIT(4)
143b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_FIFO1_OF		BIT(3)
144b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_FIFO0_OF		BIT(2)
145b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_FD			BIT(1)
146b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_CD			BIT(0)
147b3a07d8eSPaul Kocialkowski 
148b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_REG		0x74
149b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_CLEAR		0xff
150b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_VS			BIT(7)
151b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_HB_OF		BIT(6)
152b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_MUL_ERR		BIT(5)
153b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_FIFO2_OF		BIT(4)
154b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_FIFO1_OF		BIT(3)
155b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_FIFO0_OF		BIT(2)
156b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_FD			BIT(1)
157b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_CD			BIT(0)
158b3a07d8eSPaul Kocialkowski 
159b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLD1_VSIZE_REG		0x78
160b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLD1_VSIZE_VER_LEN(v)	(((v) << 16) & GENMASK(28, 16))
161b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLD1_VSIZE_VER_START(v)	((v) & GENMASK(12, 0))
162b3a07d8eSPaul Kocialkowski 
163b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_HSIZE_REG			0x80
164b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_HSIZE_LEN(v)		(((v) << 16) & GENMASK(28, 16))
165b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_HSIZE_START(v)		((v) & GENMASK(12, 0))
166b3a07d8eSPaul Kocialkowski 
167b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_VSIZE_REG			0x84
168b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_VSIZE_LEN(v)		(((v) << 16) & GENMASK(28, 16))
169b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_VSIZE_START(v)		((v) & GENMASK(12, 0))
170b3a07d8eSPaul Kocialkowski 
171b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_BUF_LEN_REG		0x88
172b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_BUF_LEN_CHROMA_LINE(v)	(((v) << 16) & GENMASK(29, 16))
173b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_BUF_LEN_LUMA_LINE(v)	((v) & GENMASK(13, 0))
174b3a07d8eSPaul Kocialkowski 
175b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLIP_SIZE_REG		0x8c
176b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLIP_SIZE_VER_LEN(v)	(((v) << 16) & GENMASK(28, 16))
177b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLIP_SIZE_VALID_LEN(v)	((v) & GENMASK(12, 0))
178b3a07d8eSPaul Kocialkowski 
179b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FRM_CLK_CNT_REG		0x90
180b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_ACC_ITNL_CLK_CNT_REG	0x94
181b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FIFO_STAT_REG		0x98
182b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_PCLK_STAT_REG		0x9c
1835cc7522dSYong Deng 
184*dc85e4cdSPaul Kocialkowski #endif
185