Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / media / platform / sunxi / sun6i-csi / sun6i_csi_reg.h
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__ */