summaryrefslogtreecommitdiff
path: root/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_reg.h
blob: 703fa14bb313848981221dae609ea1e85e98e0cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing)
 * All rights reserved.
 * Author: Yong Deng <yong.deng@magewell.com>
 */

#ifndef __SUN6I_CSI_REG_H__
#define __SUN6I_CSI_REG_H__

#include <linux/kernel.h>

#define CSI_EN_REG			0x0
#define CSI_EN_VER_EN				BIT(30)
#define CSI_EN_CSI_EN				BIT(0)

#define CSI_IF_CFG_REG			0x4
#define CSI_IF_CFG_SRC_TYPE_MASK		BIT(21)
#define CSI_IF_CFG_SRC_TYPE_PROGRESSED		((0 << 21) & CSI_IF_CFG_SRC_TYPE_MASK)
#define CSI_IF_CFG_SRC_TYPE_INTERLACED		((1 << 21) & CSI_IF_CFG_SRC_TYPE_MASK)
#define CSI_IF_CFG_FPS_DS_EN			BIT(20)
#define CSI_IF_CFG_FIELD_MASK			BIT(19)
#define CSI_IF_CFG_FIELD_NEGATIVE		((0 << 19) & CSI_IF_CFG_FIELD_MASK)
#define CSI_IF_CFG_FIELD_POSITIVE		((1 << 19) & CSI_IF_CFG_FIELD_MASK)
#define CSI_IF_CFG_VREF_POL_MASK		BIT(18)
#define CSI_IF_CFG_VREF_POL_NEGATIVE		((0 << 18) & CSI_IF_CFG_VREF_POL_MASK)
#define CSI_IF_CFG_VREF_POL_POSITIVE		((1 << 18) & CSI_IF_CFG_VREF_POL_MASK)
#define CSI_IF_CFG_HREF_POL_MASK		BIT(17)
#define CSI_IF_CFG_HREF_POL_NEGATIVE		((0 << 17) & CSI_IF_CFG_HREF_POL_MASK)
#define CSI_IF_CFG_HREF_POL_POSITIVE		((1 << 17) & CSI_IF_CFG_HREF_POL_MASK)
#define CSI_IF_CFG_CLK_POL_MASK			BIT(16)
#define CSI_IF_CFG_CLK_POL_RISING_EDGE		((0 << 16) & CSI_IF_CFG_CLK_POL_MASK)
#define CSI_IF_CFG_CLK_POL_FALLING_EDGE		((1 << 16) & CSI_IF_CFG_CLK_POL_MASK)
#define CSI_IF_CFG_IF_DATA_WIDTH_MASK		GENMASK(10, 8)
#define CSI_IF_CFG_IF_DATA_WIDTH_8BIT		((0 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK)
#define CSI_IF_CFG_IF_DATA_WIDTH_10BIT		((1 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK)
#define CSI_IF_CFG_IF_DATA_WIDTH_12BIT		((2 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK)
#define CSI_IF_CFG_MIPI_IF_MASK			BIT(7)
#define CSI_IF_CFG_MIPI_IF_CSI			(0 << 7)
#define CSI_IF_CFG_MIPI_IF_MIPI			BIT(7)
#define CSI_IF_CFG_CSI_IF_MASK			GENMASK(4, 0)
#define CSI_IF_CFG_CSI_IF_YUV422_INTLV		((0 << 0) & CSI_IF_CFG_CSI_IF_MASK)
#define CSI_IF_CFG_CSI_IF_YUV422_16BIT		((1 << 0) & CSI_IF_CFG_CSI_IF_MASK)
#define CSI_IF_CFG_CSI_IF_BT656			((4 << 0) & CSI_IF_CFG_CSI_IF_MASK)
#define CSI_IF_CFG_CSI_IF_BT1120		((5 << 0) & CSI_IF_CFG_CSI_IF_MASK)

#define CSI_CAP_REG			0x8
#define CSI_CAP_CH0_CAP_MASK_MASK		GENMASK(5, 2)
#define CSI_CAP_CH0_CAP_MASK(count)		(((count) << 2) & CSI_CAP_CH0_CAP_MASK_MASK)
#define CSI_CAP_CH0_VCAP_ON			BIT(1)
#define CSI_CAP_CH0_SCAP_ON			BIT(0)

#define CSI_SYNC_CNT_REG		0xc
#define CSI_FIFO_THRS_REG		0x10
#define CSI_BT656_HEAD_CFG_REG		0x14
#define CSI_PTN_LEN_REG			0x30
#define CSI_PTN_ADDR_REG		0x34
#define CSI_VER_REG			0x3c

#define CSI_CH_CFG_REG			0x44
#define CSI_CH_CFG_INPUT_FMT_MASK		GENMASK(23, 20)
#define CSI_CH_CFG_INPUT_FMT(fmt)		(((fmt) << 20) & CSI_CH_CFG_INPUT_FMT_MASK)
#define CSI_CH_CFG_OUTPUT_FMT_MASK		GENMASK(19, 16)
#define CSI_CH_CFG_OUTPUT_FMT(fmt)		(((fmt) << 16) & CSI_CH_CFG_OUTPUT_FMT_MASK)
#define CSI_CH_CFG_VFLIP_EN			BIT(13)
#define CSI_CH_CFG_HFLIP_EN			BIT(12)
#define CSI_CH_CFG_FIELD_SEL_MASK		GENMASK(11, 10)
#define CSI_CH_CFG_FIELD_SEL_FIELD0		((0 << 10) & CSI_CH_CFG_FIELD_SEL_MASK)
#define CSI_CH_CFG_FIELD_SEL_FIELD1		((1 << 10) & CSI_CH_CFG_FIELD_SEL_MASK)
#define CSI_CH_CFG_FIELD_SEL_BOTH		((2 << 10) & CSI_CH_CFG_FIELD_SEL_MASK)
#define CSI_CH_CFG_INPUT_SEQ_MASK		GENMASK(9, 8)
#define CSI_CH_CFG_INPUT_SEQ(seq)		(((seq) << 8) & CSI_CH_CFG_INPUT_SEQ_MASK)

#define CSI_CH_SCALE_REG		0x4c
#define CSI_CH_SCALE_QUART_EN			BIT(0)

#define CSI_CH_F0_BUFA_REG		0x50

#define CSI_CH_F1_BUFA_REG		0x58

#define CSI_CH_F2_BUFA_REG		0x60

#define CSI_CH_STA_REG			0x6c
#define CSI_CH_STA_FIELD_STA_MASK		BIT(2)
#define CSI_CH_STA_FIELD_STA_FIELD0		((0 << 2) & CSI_CH_STA_FIELD_STA_MASK)
#define CSI_CH_STA_FIELD_STA_FIELD1		((1 << 2) & CSI_CH_STA_FIELD_STA_MASK)
#define CSI_CH_STA_VCAP_STA			BIT(1)
#define CSI_CH_STA_SCAP_STA			BIT(0)

#define CSI_CH_INT_EN_REG		0x70
#define CSI_CH_INT_EN_VS_INT_EN			BIT(7)
#define CSI_CH_INT_EN_HB_OF_INT_EN		BIT(6)
#define CSI_CH_INT_EN_MUL_ERR_INT_EN		BIT(5)
#define CSI_CH_INT_EN_FIFO2_OF_INT_EN		BIT(4)
#define CSI_CH_INT_EN_FIFO1_OF_INT_EN		BIT(3)
#define CSI_CH_INT_EN_FIFO0_OF_INT_EN		BIT(2)
#define CSI_CH_INT_EN_FD_INT_EN			BIT(1)
#define CSI_CH_INT_EN_CD_INT_EN			BIT(0)

#define CSI_CH_INT_STA_REG		0x74
#define CSI_CH_INT_STA_VS_PD			BIT(7)
#define CSI_CH_INT_STA_HB_OF_PD			BIT(6)
#define CSI_CH_INT_STA_MUL_ERR_PD		BIT(5)
#define CSI_CH_INT_STA_FIFO2_OF_PD		BIT(4)
#define CSI_CH_INT_STA_FIFO1_OF_PD		BIT(3)
#define CSI_CH_INT_STA_FIFO0_OF_PD		BIT(2)
#define CSI_CH_INT_STA_FD_PD			BIT(1)
#define CSI_CH_INT_STA_CD_PD			BIT(0)

#define CSI_CH_FLD1_VSIZE_REG		0x78

#define CSI_CH_HSIZE_REG		0x80
#define CSI_CH_HSIZE_HOR_LEN_MASK		GENMASK(28, 16)
#define CSI_CH_HSIZE_HOR_LEN(len)		(((len) << 16) & CSI_CH_HSIZE_HOR_LEN_MASK)
#define CSI_CH_HSIZE_HOR_START_MASK		GENMASK(12, 0)
#define CSI_CH_HSIZE_HOR_START(start)		(((start) << 0) & CSI_CH_HSIZE_HOR_START_MASK)

#define CSI_CH_VSIZE_REG		0x84
#define CSI_CH_VSIZE_VER_LEN_MASK		GENMASK(28, 16)
#define CSI_CH_VSIZE_VER_LEN(len)		(((len) << 16) & CSI_CH_VSIZE_VER_LEN_MASK)
#define CSI_CH_VSIZE_VER_START_MASK		GENMASK(12, 0)
#define CSI_CH_VSIZE_VER_START(start)		(((start) << 0) & CSI_CH_VSIZE_VER_START_MASK)

#define CSI_CH_BUF_LEN_REG		0x88
#define CSI_CH_BUF_LEN_BUF_LEN_C_MASK		GENMASK(29, 16)
#define CSI_CH_BUF_LEN_BUF_LEN_C(len)		(((len) << 16) & CSI_CH_BUF_LEN_BUF_LEN_C_MASK)
#define CSI_CH_BUF_LEN_BUF_LEN_Y_MASK		GENMASK(13, 0)
#define CSI_CH_BUF_LEN_BUF_LEN_Y(len)		(((len) << 0) & CSI_CH_BUF_LEN_BUF_LEN_Y_MASK)

#define CSI_CH_FLIP_SIZE_REG		0x8c
#define CSI_CH_FLIP_SIZE_VER_LEN_MASK		GENMASK(28, 16)
#define CSI_CH_FLIP_SIZE_VER_LEN(len)		(((len) << 16) & CSI_CH_FLIP_SIZE_VER_LEN_MASK)
#define CSI_CH_FLIP_SIZE_VALID_LEN_MASK		GENMASK(12, 0)
#define CSI_CH_FLIP_SIZE_VALID_LEN(len)		(((len) << 0) & CSI_CH_FLIP_SIZE_VALID_LEN_MASK)

#define CSI_CH_FRM_CLK_CNT_REG		0x90
#define CSI_CH_ACC_ITNL_CLK_CNT_REG	0x94
#define CSI_CH_FIFO_STAT_REG		0x98
#define CSI_CH_PCLK_STAT_REG		0x9c

/*
 * csi input data format
 */
enum csi_input_fmt {
	CSI_INPUT_FORMAT_RAW		= 0,
	CSI_INPUT_FORMAT_YUV422		= 3,
	CSI_INPUT_FORMAT_YUV420		= 4,
};

/*
 * csi output data format
 */
enum csi_output_fmt {
	/* only when input format is RAW */
	CSI_FIELD_RAW_8			= 0,
	CSI_FIELD_RAW_10		= 1,
	CSI_FIELD_RAW_12		= 2,
	CSI_FIELD_RGB565		= 4,
	CSI_FIELD_RGB888		= 5,
	CSI_FIELD_PRGB888		= 6,
	CSI_FRAME_RAW_8			= 8,
	CSI_FRAME_RAW_10		= 9,
	CSI_FRAME_RAW_12		= 10,
	CSI_FRAME_RGB565		= 12,
	CSI_FRAME_RGB888		= 13,
	CSI_FRAME_PRGB888		= 14,

	/* only when input format is YUV422 */
	CSI_FIELD_PLANAR_YUV422		= 0,
	CSI_FIELD_PLANAR_YUV420		= 1,
	CSI_FRAME_PLANAR_YUV420		= 2,
	CSI_FRAME_PLANAR_YUV422		= 3,
	CSI_FIELD_UV_CB_YUV422		= 4,
	CSI_FIELD_UV_CB_YUV420		= 5,
	CSI_FRAME_UV_CB_YUV420		= 6,
	CSI_FRAME_UV_CB_YUV422		= 7,
	CSI_FIELD_MB_YUV422		= 8,
	CSI_FIELD_MB_YUV420		= 9,
	CSI_FRAME_MB_YUV420		= 10,
	CSI_FRAME_MB_YUV422		= 11,
	CSI_FIELD_UV_CB_YUV422_10	= 12,
	CSI_FIELD_UV_CB_YUV420_10	= 13,
};

/*
 * csi YUV input data sequence
 */
enum csi_input_seq {
	/* only when input format is YUV422 */
	CSI_INPUT_SEQ_YUYV = 0,
	CSI_INPUT_SEQ_YVYU,
	CSI_INPUT_SEQ_UYVY,
	CSI_INPUT_SEQ_VYUY,
};

#endif /* __SUN6I_CSI_REG_H__ */