hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
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__ */