[ubicom32]: move new files out from platform support patch
[openwrt.git] / target / linux / ubicom32 / files / arch / ubicom32 / include / asm / plio.h
1 /*
2  * plio.h
3  *      PLIO defines.
4  *
5  * Copyright © 2009 Ubicom Inc. <www.ubicom.com>.  All Rights Reserved.
6  *
7  * This file is part of the Ubicom32 Linux Kernel Port.
8  *
9  * The Ubicom32 Linux Kernel Port is free software: you can
10  * redistribute it and/or modify it under the terms of the GNU General
11  * Public License as published by the Free Software Foundation, either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * The Ubicom32 Linux Kernel Port is distributed in the hope that it
15  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
16  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17  * See the GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with the Ubicom32 Linux Kernel Port.  If not,
21  * see <http://www.gnu.org/licenses/>.
22  * This file contains confidential information of Ubicom, Inc. and your use of
23  * this file is subject to the Ubicom Software License Agreement distributed with
24  * this file. If you are uncertain whether you are an authorized user or to report
25  * any unauthorized use, please contact Ubicom, Inc. at +1-408-789-2200.
26  * Unauthorized reproduction or distribution of this file is subject to civil and
27  * criminal penalties.
28  */
29
30 #ifndef __PLIO__H__
31 #define __PLIO__H__
32
33 #include <asm/ip5000.h>
34 #include <asm/thread.h>
35
36 #define PLIO_PORT               RD
37 #define PLIO_EXT_PORT           RI
38
39 #define TRANSMIT_FIFO_WATERMARK 8
40
41 /*
42  * PLIO non-blocking register definitions
43  */
44 #define PLIO_FN         2
45
46 typedef struct {
47         unsigned        : 10;
48         unsigned        rxfifo_thread_enable: 1;   /* allowed rxfifo thread enable */
49         unsigned        : 1;
50         unsigned        rxfifo_thread: 4;          /* allowed rxfifo thread access */
51         unsigned        : 4;
52         unsigned        br_thread: 4;              /* allowed blocking region thread access */
53         unsigned        fn_reset: 4;               /* function reset bit vector */
54         unsigned        rxfifo_sel: 1;             /* select between RXFIFO 0 and 1 */
55         unsigned        fn_sel: 3;                 /* select port function */
56 } plio_io_function_t;
57
58 typedef struct {
59         unsigned        : 24;
60         unsigned        pin:8;
61 } plio_gpio_t;
62
63 typedef struct {
64         unsigned        : 16;
65         unsigned        txfifo_uf: 1;              /* TXFIFO underflow */
66         unsigned        txfifo_wm: 1;              /* TXFIFO watermark */
67         unsigned        rxfifo_of: 1;              /* RXFIFO overflow */
68         unsigned        rxfifo_wm: 1;              /* RXFIFO watermark */
69         unsigned        : 5;
70         unsigned        lreg_int_addr_rd: 1;       /* read from specified LREG address */
71         unsigned        lreg_int_addr_wr: 1;       /* write to specified LREG address */
72         unsigned        extctl_int: 4;             /* synchronized external interrupts */
73         unsigned        pfsm_int: 1;               /* state machine */
74 } plio_intstat_t;
75
76 typedef struct {
77         unsigned        txfifo_reset: 1;           /* TXFIFO reset for int_set only */
78         unsigned        rxfifo_reset: 1;           /* RXFIFO reset for int_set only */
79         unsigned        : 11;
80         unsigned        idif_txfifo_flush: 1;      /* flush TXFIFO and idif_txfifo */
81         unsigned        idif_rxfifo_flush: 1;      /* flush RXFIFO and idif_rxfifo */
82         unsigned        pfsm_start: 1;             /* input to fsm */
83         unsigned        txfifo_uf: 1;              /* TXFIFO underflow */
84         unsigned        txfifo_wm: 1;              /* TXFIFO watermark */
85         unsigned        rxfifo_of: 1;              /* RXFIFO overflow */
86         unsigned        rxfifo_wm: 1;              /* RXFIFO watermark */
87         unsigned        : 5;
88         unsigned        lreg_int_addr_rd: 1;       /* read from specified LREG address */
89         unsigned        lreg_int_addr_wr: 1;       /* write to specified LREG address */
90         unsigned        extctl_int: 4;             /* synchronized external interrupts */
91         unsigned        pfsm_int: 1;               /* state machine */
92 } plio_intset_t;
93
94 typedef enum {
95         PLIO_PORT_MODE_D,
96         PLIO_PORT_MODE_DE,
97         PLIO_PORT_MODE_DI,
98         PLIO_PORT_MODE_DEI,
99         PLIO_PORT_MODE_DC,
100 } plio_port_mode_t;
101
102 typedef enum {
103         PLIO_CLK_CORE,  /* CORE CLK */
104         PLIO_CLK_IO,    /* IO CLK */
105         PLIO_CLK_EXT,   /* EXT CLK */
106 } plio_clk_src_t;
107 typedef struct {
108         unsigned                : 4;
109         unsigned                edif_iaena_sel: 1;         /* Input Address Enable Select */
110         unsigned                edif_iaclk_sel: 1;         /* Input Address Clock Select */
111         unsigned                edif_iald_inv: 1;          /* Input Address Strobe Invert */
112         unsigned                edif_idclk_sel: 1;         /* Input Data Clock Select */
113         unsigned                edif_idld_inv: 1;          /* Input Data Strobe Invert */
114         unsigned                edif_ds: 3;                /* specify IDR and ODR data shift */
115         unsigned                edif_cmp_mode: 1;          /* configure IDR comparator output */
116         unsigned                edif_idena_sel: 1;         /* Input Data Enable Select */
117         unsigned                ecif_extclk_ena: 1;        /* plio_extctl output select */
118         unsigned                idif_tx_fifo_cmd_sel: 1;   /* select pfsm_cmd data word position */
119         unsigned                ptif_porti_cfg: 2;         /* select port I pin configuration */
120         unsigned                ptif_portd_cfg: 3;         /* select port D pin configuration */
121         plio_port_mode_t        ptif_port_mode: 3;      /* select other plio ports  */
122         unsigned                icif_clk_plio_ext_inv: 1;  /* invert external plio clock when set */
123         unsigned                icif_rst_plio: 1;          /* reset plio function and io fifos */
124         plio_clk_src_t          icif_clk_src_sel: 2;      /* select plio clock source */
125         unsigned                pfsm_prog: 1;              /* enable pfsm programming */
126         unsigned                pfsm_cmd: 3;               /* software input to pfsm */
127 } plio_fctl0_t;
128
129 typedef struct {
130         unsigned        : 2;
131         unsigned        idif_byteswap_tx: 3;       /* swap TXFIFO byte order */
132         unsigned        idif_byteswap_rx: 3;       /* swap RXFIFO byte order */
133         unsigned        : 1;
134         unsigned        lreg_ena: 1;               /* enable local register map */
135         unsigned        lreg_addr_fifo_cmp_ena: 1; /* enable a specific LREG address from/to TX/RX fifos */
136         unsigned        lreg_addr_fifo_cmp: 5;     /* LREG address routed from/to TX/RX fifos */
137         unsigned        : 1;
138         unsigned        dcod_iald_idld_sel: 2;     /* select address/data strobes */
139         unsigned        dcod_rw_src_sel: 1;        /* select LREG strobe source */
140         unsigned        dcod_rd_sel: 5;            /* select read strobe source */
141         unsigned        dcod_wr_sel: 5;            /* select write strobe source */
142         unsigned        dcod_rd_lvl: 1;            /* select active level of read strobe */
143         unsigned        dcod_wr_lvl: 1;            /* select active level of read strobe */
144 } plio_fctl1_t;
145
146 typedef struct {
147         unsigned        icif_eclk_div: 16;         /* external plio clock divider */
148         unsigned        icif_iclk_div: 16;         /* internal plio clock divider */
149 } plio_fctl2_t;
150
151 typedef struct {
152         unsigned        : 27;
153         unsigned        pfsm_state: 5;             /* current pfsm state */
154 } plio_stat_0_t;
155
156 typedef struct {
157         unsigned        : 3;
158         unsigned        lreg_r_int_addr: 5;
159         unsigned        : 11;
160         unsigned        lreg_w_int_addr: 5;
161         unsigned        lreg_w_int_data: 8;
162 } plio_stat_1_t;
163
164 typedef struct {
165         unsigned        : 32;
166 } plio_stat_2_t;
167
168 typedef struct {
169         unsigned        tx: 16;
170         unsigned        rx: 16;
171 } plio_io_fifo_wm_t, plio_io_fifo_lvl_t;
172
173
174 /* plio blocking region register definitions
175  */
176 typedef struct {
177         unsigned         ns1: 5;
178         unsigned         ic1: 7;
179         unsigned         ec1: 4;
180         unsigned         ns0: 5;
181         unsigned         ic0: 7;
182         unsigned         ec0: 4;
183 } plio_sram_t;
184
185 typedef struct {
186         unsigned         : 2;
187         unsigned         s9: 3;
188         unsigned         s8: 3;
189         unsigned         s7: 3;
190         unsigned         s6: 3;
191         unsigned         s5: 3;
192         unsigned         s4: 3;
193         unsigned         s3: 3;
194         unsigned         s2: 3;
195         unsigned         s1: 3;
196         unsigned         s0: 3;
197 } plio_grpsel_t;
198
199 typedef struct {
200         unsigned        s7: 4;
201         unsigned        s6: 4;
202         unsigned        s5: 4;
203         unsigned        s4: 4;
204         unsigned        s3: 4;
205         unsigned        s2: 4;
206         unsigned        s1: 4;
207         unsigned        s0: 4;
208 } plio_cs_lut_t;
209
210 typedef struct {
211         unsigned        lut3: 8;
212         unsigned        lut2: 8;
213         unsigned        lut1: 8;
214         unsigned        lut0: 8;
215 } plio_extctl_t;
216
217 typedef struct {
218         plio_grpsel_t   grpsel[4];
219         u16_t           cv[16];
220         plio_cs_lut_t   cs_lut[4];
221         plio_extctl_t   extctl_o_lut[8];
222 } plio_pfsm_t;
223
224 typedef struct {
225         u32_t           odr_oe_sel;
226         u32_t           odr_oe;
227         u32_t           cmp;
228         u32_t           ncmp;
229         u32_t           cmp_mask;
230 } plio_edif_t;
231
232 typedef enum {
233         PLIO_ECIF_CLK_OUT       = 9,
234         PLIO_ECIF_IALD          = 9,
235         PLIO_ECIF_CLK_IN        = 8,
236         PLIO_ECIF_IDLD          = 8,
237         PLIO_ECIF_INT           = 2,
238 } plio_ecif_output_t;
239
240 typedef struct {
241         u32_t           bypass_sync;
242         u32_t           ift;
243         u32_t           output_type;
244         u32_t           output_ena;
245         u32_t           output_lvl;
246 } plio_ecif_t;
247
248 typedef struct {
249         u32_t           idr_addr_pos_mask;
250         u32_t           reserved;
251         u32_t           lreg_bar;
252 } plio_dcod_t;
253
254 typedef struct {
255         u32_t           addr_rd_ena;
256         u32_t           addr_wr_ena;
257         u32_t           addr_rd_int_ena;
258         u32_t           addr_wr_int_ena;
259 } plio_lcfg_t;
260
261
262 /*
263  * PLIO configuration
264  */
265 typedef struct {
266         plio_fctl0_t    fctl0;
267         plio_fctl1_t    fctl1;
268         plio_fctl2_t    fctl2;
269 } plio_fctl_t;
270
271 typedef struct {
272         plio_pfsm_t     pfsm;
273         plio_edif_t     edif;
274         plio_ecif_t     ecif;
275         plio_dcod_t     dcod;
276         plio_lcfg_t     lcfg;
277 } plio_config_t;
278
279 typedef struct {
280         plio_io_function_t      function;
281         plio_gpio_t             gpio_ctl;
282         plio_gpio_t             gpio_out;
283         plio_gpio_t             gpio_in;
284         plio_intstat_t          intstat;
285         plio_intstat_t          intmask;
286         plio_intset_t           intset;
287         plio_intstat_t          intclr;
288         unsigned                tx_lo;
289         unsigned                tx_hi;
290         unsigned                rx_lo;
291         unsigned                rx_hi;
292         plio_fctl0_t            fctl0;
293         plio_fctl1_t            fctl1;
294         plio_fctl2_t            fctl2;
295         plio_stat_0_t           stat0;
296         plio_stat_1_t           stat1;
297         plio_stat_2_t           stat2;
298         plio_io_fifo_wm_t       fifo_wm;
299         plio_io_fifo_lvl_t      fifo_lvl;
300 } plio_nbr_t;
301
302 typedef struct {
303         u32_t                   pfsm_sram[256];
304         plio_config_t           config;
305 } plio_br_t;
306
307 #define PLIO_NBR        ((plio_nbr_t *)(PLIO_PORT))
308 #define PLIO_BR         ((plio_br_t *)((PLIO_PORT + IO_PORT_BR_OFFSET)))
309 #define PEXT_NBR        ((plio_nbr_t *)(PLIO_EXT_PORT))
310
311 extern void plio_init(const plio_fctl_t *plio_fctl, const plio_config_t *plio_config, const plio_sram_t plio_sram_cfg[], int sram_cfg_size);
312
313 #endif // __PLIO__H__