1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing)
4  * All rights reserved.
5  * Author: Yong Deng <yong.deng@magewell.com>
6  */
7 
8 #ifndef __SUN6I_CSI_REG_H__
9 #define __SUN6I_CSI_REG_H__
10 
11 #include <linux/kernel.h>
12 
13 #define CSI_EN_REG			0x0
14 #define CSI_EN_VER_EN				BIT(30)
15 #define CSI_EN_CSI_EN				BIT(0)
16 
17 #define CSI_IF_CFG_REG			0x4
18 #define CSI_IF_CFG_SRC_TYPE_MASK		BIT(21)
19 #define CSI_IF_CFG_SRC_TYPE_PROGRESSED		((0 << 21) & CSI_IF_CFG_SRC_TYPE_MASK)
20 #define CSI_IF_CFG_SRC_TYPE_INTERLACED		((1 << 21) & CSI_IF_CFG_SRC_TYPE_MASK)
21 #define CSI_IF_CFG_FPS_DS_EN			BIT(20)
22 #define CSI_IF_CFG_FIELD_MASK			BIT(19)
23 #define CSI_IF_CFG_FIELD_NEGATIVE		((0 << 19) & CSI_IF_CFG_FIELD_MASK)
24 #define CSI_IF_CFG_FIELD_POSITIVE		((1 << 19) & CSI_IF_CFG_FIELD_MASK)
25 #define CSI_IF_CFG_VREF_POL_MASK		BIT(18)
26 #define CSI_IF_CFG_VREF_POL_NEGATIVE		((0 << 18) & CSI_IF_CFG_VREF_POL_MASK)
27 #define CSI_IF_CFG_VREF_POL_POSITIVE		((1 << 18) & CSI_IF_CFG_VREF_POL_MASK)
28 #define CSI_IF_CFG_HREF_POL_MASK		BIT(17)
29 #define CSI_IF_CFG_HREF_POL_NEGATIVE		((0 << 17) & CSI_IF_CFG_HREF_POL_MASK)
30 #define CSI_IF_CFG_HREF_POL_POSITIVE		((1 << 17) & CSI_IF_CFG_HREF_POL_MASK)
31 #define CSI_IF_CFG_CLK_POL_MASK			BIT(16)
32 #define CSI_IF_CFG_CLK_POL_RISING_EDGE		((0 << 16) & CSI_IF_CFG_CLK_POL_MASK)
33 #define CSI_IF_CFG_CLK_POL_FALLING_EDGE		((1 << 16) & CSI_IF_CFG_CLK_POL_MASK)
34 #define CSI_IF_CFG_IF_DATA_WIDTH_MASK		GENMASK(10, 8)
35 #define CSI_IF_CFG_IF_DATA_WIDTH_8BIT		((0 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK)
36 #define CSI_IF_CFG_IF_DATA_WIDTH_10BIT		((1 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK)
37 #define CSI_IF_CFG_IF_DATA_WIDTH_12BIT		((2 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK)
38 #define CSI_IF_CFG_MIPI_IF_MASK			BIT(7)
39 #define CSI_IF_CFG_MIPI_IF_CSI			(0 << 7)
40 #define CSI_IF_CFG_MIPI_IF_MIPI			BIT(7)
41 #define CSI_IF_CFG_CSI_IF_MASK			GENMASK(4, 0)
42 #define CSI_IF_CFG_CSI_IF_YUV422_INTLV		((0 << 0) & CSI_IF_CFG_CSI_IF_MASK)
43 #define CSI_IF_CFG_CSI_IF_YUV422_16BIT		((1 << 0) & CSI_IF_CFG_CSI_IF_MASK)
44 #define CSI_IF_CFG_CSI_IF_BT656			((4 << 0) & CSI_IF_CFG_CSI_IF_MASK)
45 #define CSI_IF_CFG_CSI_IF_BT1120		((5 << 0) & CSI_IF_CFG_CSI_IF_MASK)
46 
47 #define CSI_CAP_REG			0x8
48 #define CSI_CAP_CH0_CAP_MASK_MASK		GENMASK(5, 2)
49 #define CSI_CAP_CH0_CAP_MASK(count)		(((count) << 2) & CSI_CAP_CH0_CAP_MASK_MASK)
50 #define CSI_CAP_CH0_VCAP_ON			BIT(1)
51 #define CSI_CAP_CH0_SCAP_ON			BIT(0)
52 
53 #define CSI_SYNC_CNT_REG		0xc
54 #define CSI_FIFO_THRS_REG		0x10
55 #define CSI_BT656_HEAD_CFG_REG		0x14
56 #define CSI_PTN_LEN_REG			0x30
57 #define CSI_PTN_ADDR_REG		0x34
58 #define CSI_VER_REG			0x3c
59 
60 #define CSI_CH_CFG_REG			0x44
61 #define CSI_CH_CFG_INPUT_FMT_MASK		GENMASK(23, 20)
62 #define CSI_CH_CFG_INPUT_FMT(fmt)		(((fmt) << 20) & CSI_CH_CFG_INPUT_FMT_MASK)
63 #define CSI_CH_CFG_OUTPUT_FMT_MASK		GENMASK(19, 16)
64 #define CSI_CH_CFG_OUTPUT_FMT(fmt)		(((fmt) << 16) & CSI_CH_CFG_OUTPUT_FMT_MASK)
65 #define CSI_CH_CFG_VFLIP_EN			BIT(13)
66 #define CSI_CH_CFG_HFLIP_EN			BIT(12)
67 #define CSI_CH_CFG_FIELD_SEL_MASK		GENMASK(11, 10)
68 #define CSI_CH_CFG_FIELD_SEL_FIELD0		((0 << 10) & CSI_CH_CFG_FIELD_SEL_MASK)
69 #define CSI_CH_CFG_FIELD_SEL_FIELD1		((1 << 10) & CSI_CH_CFG_FIELD_SEL_MASK)
70 #define CSI_CH_CFG_FIELD_SEL_BOTH		((2 << 10) & CSI_CH_CFG_FIELD_SEL_MASK)
71 #define CSI_CH_CFG_INPUT_SEQ_MASK		GENMASK(9, 8)
72 #define CSI_CH_CFG_INPUT_SEQ(seq)		(((seq) << 8) & CSI_CH_CFG_INPUT_SEQ_MASK)
73 
74 #define CSI_CH_SCALE_REG		0x4c
75 #define CSI_CH_SCALE_QUART_EN			BIT(0)
76 
77 #define CSI_CH_F0_BUFA_REG		0x50
78 
79 #define CSI_CH_F1_BUFA_REG		0x58
80 
81 #define CSI_CH_F2_BUFA_REG		0x60
82 
83 #define CSI_CH_STA_REG			0x6c
84 #define CSI_CH_STA_FIELD_STA_MASK		BIT(2)
85 #define CSI_CH_STA_FIELD_STA_FIELD0		((0 << 2) & CSI_CH_STA_FIELD_STA_MASK)
86 #define CSI_CH_STA_FIELD_STA_FIELD1		((1 << 2) & CSI_CH_STA_FIELD_STA_MASK)
87 #define CSI_CH_STA_VCAP_STA			BIT(1)
88 #define CSI_CH_STA_SCAP_STA			BIT(0)
89 
90 #define CSI_CH_INT_EN_REG		0x70
91 #define CSI_CH_INT_EN_VS_INT_EN			BIT(7)
92 #define CSI_CH_INT_EN_HB_OF_INT_EN		BIT(6)
93 #define CSI_CH_INT_EN_MUL_ERR_INT_EN		BIT(5)
94 #define CSI_CH_INT_EN_FIFO2_OF_INT_EN		BIT(4)
95 #define CSI_CH_INT_EN_FIFO1_OF_INT_EN		BIT(3)
96 #define CSI_CH_INT_EN_FIFO0_OF_INT_EN		BIT(2)
97 #define CSI_CH_INT_EN_FD_INT_EN			BIT(1)
98 #define CSI_CH_INT_EN_CD_INT_EN			BIT(0)
99 
100 #define CSI_CH_INT_STA_REG		0x74
101 #define CSI_CH_INT_STA_VS_PD			BIT(7)
102 #define CSI_CH_INT_STA_HB_OF_PD			BIT(6)
103 #define CSI_CH_INT_STA_MUL_ERR_PD		BIT(5)
104 #define CSI_CH_INT_STA_FIFO2_OF_PD		BIT(4)
105 #define CSI_CH_INT_STA_FIFO1_OF_PD		BIT(3)
106 #define CSI_CH_INT_STA_FIFO0_OF_PD		BIT(2)
107 #define CSI_CH_INT_STA_FD_PD			BIT(1)
108 #define CSI_CH_INT_STA_CD_PD			BIT(0)
109 
110 #define CSI_CH_FLD1_VSIZE_REG		0x78
111 
112 #define CSI_CH_HSIZE_REG		0x80
113 #define CSI_CH_HSIZE_HOR_LEN_MASK		GENMASK(28, 16)
114 #define CSI_CH_HSIZE_HOR_LEN(len)		(((len) << 16) & CSI_CH_HSIZE_HOR_LEN_MASK)
115 #define CSI_CH_HSIZE_HOR_START_MASK		GENMASK(12, 0)
116 #define CSI_CH_HSIZE_HOR_START(start)		(((start) << 0) & CSI_CH_HSIZE_HOR_START_MASK)
117 
118 #define CSI_CH_VSIZE_REG		0x84
119 #define CSI_CH_VSIZE_VER_LEN_MASK		GENMASK(28, 16)
120 #define CSI_CH_VSIZE_VER_LEN(len)		(((len) << 16) & CSI_CH_VSIZE_VER_LEN_MASK)
121 #define CSI_CH_VSIZE_VER_START_MASK		GENMASK(12, 0)
122 #define CSI_CH_VSIZE_VER_START(start)		(((start) << 0) & CSI_CH_VSIZE_VER_START_MASK)
123 
124 #define CSI_CH_BUF_LEN_REG		0x88
125 #define CSI_CH_BUF_LEN_BUF_LEN_C_MASK		GENMASK(29, 16)
126 #define CSI_CH_BUF_LEN_BUF_LEN_C(len)		(((len) << 16) & CSI_CH_BUF_LEN_BUF_LEN_C_MASK)
127 #define CSI_CH_BUF_LEN_BUF_LEN_Y_MASK		GENMASK(13, 0)
128 #define CSI_CH_BUF_LEN_BUF_LEN_Y(len)		(((len) << 0) & CSI_CH_BUF_LEN_BUF_LEN_Y_MASK)
129 
130 #define CSI_CH_FLIP_SIZE_REG		0x8c
131 #define CSI_CH_FLIP_SIZE_VER_LEN_MASK		GENMASK(28, 16)
132 #define CSI_CH_FLIP_SIZE_VER_LEN(len)		(((len) << 16) & CSI_CH_FLIP_SIZE_VER_LEN_MASK)
133 #define CSI_CH_FLIP_SIZE_VALID_LEN_MASK		GENMASK(12, 0)
134 #define CSI_CH_FLIP_SIZE_VALID_LEN(len)		(((len) << 0) & CSI_CH_FLIP_SIZE_VALID_LEN_MASK)
135 
136 #define CSI_CH_FRM_CLK_CNT_REG		0x90
137 #define CSI_CH_ACC_ITNL_CLK_CNT_REG	0x94
138 #define CSI_CH_FIFO_STAT_REG		0x98
139 #define CSI_CH_PCLK_STAT_REG		0x9c
140 
141 /*
142  * csi input data format
143  */
144 enum csi_input_fmt {
145 	CSI_INPUT_FORMAT_RAW		= 0,
146 	CSI_INPUT_FORMAT_YUV422		= 3,
147 	CSI_INPUT_FORMAT_YUV420		= 4,
148 };
149 
150 /*
151  * csi output data format
152  */
153 enum csi_output_fmt {
154 	/* only when input format is RAW */
155 	CSI_FIELD_RAW_8			= 0,
156 	CSI_FIELD_RAW_10		= 1,
157 	CSI_FIELD_RAW_12		= 2,
158 	CSI_FIELD_RGB565		= 4,
159 	CSI_FIELD_RGB888		= 5,
160 	CSI_FIELD_PRGB888		= 6,
161 	CSI_FRAME_RAW_8			= 8,
162 	CSI_FRAME_RAW_10		= 9,
163 	CSI_FRAME_RAW_12		= 10,
164 	CSI_FRAME_RGB565		= 12,
165 	CSI_FRAME_RGB888		= 13,
166 	CSI_FRAME_PRGB888		= 14,
167 
168 	/* only when input format is YUV422 */
169 	CSI_FIELD_PLANAR_YUV422		= 0,
170 	CSI_FIELD_PLANAR_YUV420		= 1,
171 	CSI_FRAME_PLANAR_YUV420		= 2,
172 	CSI_FRAME_PLANAR_YUV422		= 3,
173 	CSI_FIELD_UV_CB_YUV422		= 4,
174 	CSI_FIELD_UV_CB_YUV420		= 5,
175 	CSI_FRAME_UV_CB_YUV420		= 6,
176 	CSI_FRAME_UV_CB_YUV422		= 7,
177 	CSI_FIELD_MB_YUV422		= 8,
178 	CSI_FIELD_MB_YUV420		= 9,
179 	CSI_FRAME_MB_YUV420		= 10,
180 	CSI_FRAME_MB_YUV422		= 11,
181 	CSI_FIELD_UV_CB_YUV422_10	= 12,
182 	CSI_FIELD_UV_CB_YUV420_10	= 13,
183 };
184 
185 /*
186  * csi YUV input data sequence
187  */
188 enum csi_input_seq {
189 	/* only when input format is YUV422 */
190 	CSI_INPUT_SEQ_YUYV = 0,
191 	CSI_INPUT_SEQ_YVYU,
192 	CSI_INPUT_SEQ_UYVY,
193 	CSI_INPUT_SEQ_VYUY,
194 };
195 
196 #endif /* __SUN6I_CSI_REG_H__ */
197