hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
/*
 * include/asm-ppc/mpc52xx_psc.h
 *
 * Definitions of consts/structs to drive the Freescale MPC52xx OnChip
 * PSCs. Theses are shared between multiple drivers since a PSC can be
 * UART, AC97, IR, I2S, ... So this header is in asm-ppc.
 *
 *
 * Maintainer : Sylvain Munaut <tnt@246tNt.com>
 *
 * Based/Extracted from some header of the 2.4 originally written by
 * Dale Farnsworth <dfarnsworth@mvista.com>
 *
 * Copyright (C) 2004 Sylvain Munaut <tnt@246tNt.com>
 * Copyright (C) 2003 MontaVista, Software, Inc.
 *
 * This file is licensed under the terms of the GNU General Public License
 * version 2. This program is licensed "as is" without any warranty of any
 * kind, whether express or implied.
 */
 
#ifndef __ASM_MPC52xx_PSC_H__
#define __ASM_MPC52xx_PSC_H__
 
#include <asm/types.h>
 
/* Max number of PSCs */
#ifdef CONFIG_PPC_MPC512x
#define MPC52xx_PSC_MAXNUM     12
#else
#define MPC52xx_PSC_MAXNUM    6
#endif
 
/* Programmable Serial Controller (PSC) status register bits */
#define MPC52xx_PSC_SR_UNEX_RX    0x0001
#define MPC52xx_PSC_SR_DATA_VAL    0x0002
#define MPC52xx_PSC_SR_DATA_OVR    0x0004
#define MPC52xx_PSC_SR_CMDSEND    0x0008
#define MPC52xx_PSC_SR_CDE    0x0080
#define MPC52xx_PSC_SR_RXRDY    0x0100
#define MPC52xx_PSC_SR_RXFULL    0x0200
#define MPC52xx_PSC_SR_TXRDY    0x0400
#define MPC52xx_PSC_SR_TXEMP    0x0800
#define MPC52xx_PSC_SR_OE    0x1000
#define MPC52xx_PSC_SR_PE    0x2000
#define MPC52xx_PSC_SR_FE    0x4000
#define MPC52xx_PSC_SR_RB    0x8000
 
/* PSC Command values */
#define MPC52xx_PSC_RX_ENABLE        0x0001
#define MPC52xx_PSC_RX_DISABLE        0x0002
#define MPC52xx_PSC_TX_ENABLE        0x0004
#define MPC52xx_PSC_TX_DISABLE        0x0008
#define MPC52xx_PSC_SEL_MODE_REG_1    0x0010
#define MPC52xx_PSC_RST_RX        0x0020
#define MPC52xx_PSC_RST_TX        0x0030
#define MPC52xx_PSC_RST_ERR_STAT    0x0040
#define MPC52xx_PSC_RST_BRK_CHG_INT    0x0050
#define MPC52xx_PSC_START_BRK        0x0060
#define MPC52xx_PSC_STOP_BRK        0x0070
 
/* PSC TxRx FIFO status bits */
#define MPC52xx_PSC_RXTX_FIFO_ERR    0x0040
#define MPC52xx_PSC_RXTX_FIFO_UF    0x0020
#define MPC52xx_PSC_RXTX_FIFO_OF    0x0010
#define MPC52xx_PSC_RXTX_FIFO_FR    0x0008
#define MPC52xx_PSC_RXTX_FIFO_FULL    0x0004
#define MPC52xx_PSC_RXTX_FIFO_ALARM    0x0002
#define MPC52xx_PSC_RXTX_FIFO_EMPTY    0x0001
 
/* PSC interrupt status/mask bits */
#define MPC52xx_PSC_IMR_UNEX_RX_SLOT 0x0001
#define MPC52xx_PSC_IMR_DATA_VALID    0x0002
#define MPC52xx_PSC_IMR_DATA_OVR    0x0004
#define MPC52xx_PSC_IMR_CMD_SEND    0x0008
#define MPC52xx_PSC_IMR_ERROR        0x0040
#define MPC52xx_PSC_IMR_DEOF        0x0080
#define MPC52xx_PSC_IMR_TXRDY        0x0100
#define MPC52xx_PSC_IMR_RXRDY        0x0200
#define MPC52xx_PSC_IMR_DB        0x0400
#define MPC52xx_PSC_IMR_TXEMP        0x0800
#define MPC52xx_PSC_IMR_ORERR        0x1000
#define MPC52xx_PSC_IMR_IPC        0x8000
 
/* PSC input port change bits */
#define MPC52xx_PSC_CTS            0x01
#define MPC52xx_PSC_DCD            0x02
#define MPC52xx_PSC_D_CTS        0x10
#define MPC52xx_PSC_D_DCD        0x20
 
/* PSC acr bits */
#define MPC52xx_PSC_IEC_CTS        0x01
#define MPC52xx_PSC_IEC_DCD        0x02
 
/* PSC output port bits */
#define MPC52xx_PSC_OP_RTS        0x01
#define MPC52xx_PSC_OP_RES        0x02
 
/* PSC mode fields */
#define MPC52xx_PSC_MODE_5_BITS            0x00
#define MPC52xx_PSC_MODE_6_BITS            0x01
#define MPC52xx_PSC_MODE_7_BITS            0x02
#define MPC52xx_PSC_MODE_8_BITS            0x03
#define MPC52xx_PSC_MODE_BITS_MASK        0x03
#define MPC52xx_PSC_MODE_PAREVEN        0x00
#define MPC52xx_PSC_MODE_PARODD            0x04
#define MPC52xx_PSC_MODE_PARFORCE        0x08
#define MPC52xx_PSC_MODE_PARNONE        0x10
#define MPC52xx_PSC_MODE_ERR            0x20
#define MPC52xx_PSC_MODE_FFULL            0x40
#define MPC52xx_PSC_MODE_RXRTS            0x80
 
#define MPC52xx_PSC_MODE_ONE_STOP_5_BITS    0x00
#define MPC52xx_PSC_MODE_ONE_STOP        0x07
#define MPC52xx_PSC_MODE_TWO_STOP        0x0f
#define MPC52xx_PSC_MODE_TXCTS            0x10
 
#define MPC52xx_PSC_RFNUM_MASK    0x01ff
 
#define MPC52xx_PSC_SICR_DTS1            (1 << 29)
#define MPC52xx_PSC_SICR_SHDR            (1 << 28)
#define MPC52xx_PSC_SICR_SIM_MASK        (0xf << 24)
#define MPC52xx_PSC_SICR_SIM_UART        (0x0 << 24)
#define MPC52xx_PSC_SICR_SIM_UART_DCD        (0x8 << 24)
#define MPC52xx_PSC_SICR_SIM_CODEC_8        (0x1 << 24)
#define MPC52xx_PSC_SICR_SIM_CODEC_16        (0x2 << 24)
#define MPC52xx_PSC_SICR_SIM_AC97        (0x3 << 24)
#define MPC52xx_PSC_SICR_SIM_SIR        (0x8 << 24)
#define MPC52xx_PSC_SICR_SIM_SIR_DCD        (0xc << 24)
#define MPC52xx_PSC_SICR_SIM_MIR        (0x5 << 24)
#define MPC52xx_PSC_SICR_SIM_FIR        (0x6 << 24)
#define MPC52xx_PSC_SICR_SIM_CODEC_24        (0x7 << 24)
#define MPC52xx_PSC_SICR_SIM_CODEC_32        (0xf << 24)
#define MPC52xx_PSC_SICR_ACRB            (0x8 << 24)
#define MPC52xx_PSC_SICR_AWR            (1 << 30)
#define MPC52xx_PSC_SICR_GENCLK            (1 << 23)
#define MPC52xx_PSC_SICR_I2S            (1 << 22)
#define MPC52xx_PSC_SICR_CLKPOL            (1 << 21)
#define MPC52xx_PSC_SICR_SYNCPOL        (1 << 20)
#define MPC52xx_PSC_SICR_CELLSLAVE        (1 << 19)
#define MPC52xx_PSC_SICR_CELL2XCLK        (1 << 18)
#define MPC52xx_PSC_SICR_ESAI            (1 << 17)
#define MPC52xx_PSC_SICR_ENAC97            (1 << 16)
#define MPC52xx_PSC_SICR_SPI            (1 << 15)
#define MPC52xx_PSC_SICR_MSTR            (1 << 14)
#define MPC52xx_PSC_SICR_CPOL            (1 << 13)
#define MPC52xx_PSC_SICR_CPHA            (1 << 12)
#define MPC52xx_PSC_SICR_USEEOF            (1 << 11)
#define MPC52xx_PSC_SICR_DISABLEEOF        (1 << 10)
 
/* Structure of the hardware registers */
struct mpc52xx_psc {
   union {
       u8    mode;        /* PSC + 0x00 */
       u8    mr2;
   };
   u8        reserved0[3];
   union {                /* PSC + 0x04 */
       u16    status;
       u16    clock_select;
   } sr_csr;
#define mpc52xx_psc_status    sr_csr.status
#define mpc52xx_psc_clock_select sr_csr.clock_select
   u16        reserved1;
   u8        command;    /* PSC + 0x08 */
   u8        reserved2[3];
   union {                /* PSC + 0x0c */
       u8    buffer_8;
       u16    buffer_16;
       u32    buffer_32;
   } buffer;
#define mpc52xx_psc_buffer_8    buffer.buffer_8
#define mpc52xx_psc_buffer_16    buffer.buffer_16
#define mpc52xx_psc_buffer_32    buffer.buffer_32
   union {                /* PSC + 0x10 */
       u8    ipcr;
       u8    acr;
   } ipcr_acr;
#define mpc52xx_psc_ipcr    ipcr_acr.ipcr
#define mpc52xx_psc_acr        ipcr_acr.acr
   u8        reserved3[3];
   union {                /* PSC + 0x14 */
       u16    isr;
       u16    imr;
   } isr_imr;
#define mpc52xx_psc_isr        isr_imr.isr
#define mpc52xx_psc_imr        isr_imr.imr
   u16        reserved4;
   u8        ctur;        /* PSC + 0x18 */
   u8        reserved5[3];
   u8        ctlr;        /* PSC + 0x1c */
   u8        reserved6[3];
   /* BitClkDiv field of CCR is byte swapped in
    * the hardware for mpc5200/b compatibility */
   u32        ccr;        /* PSC + 0x20 */
   u32        ac97_slots;    /* PSC + 0x24 */
   u32        ac97_cmd;    /* PSC + 0x28 */
   u32        ac97_data;    /* PSC + 0x2c */
   u8        ivr;        /* PSC + 0x30 */
   u8        reserved8[3];
   u8        ip;        /* PSC + 0x34 */
   u8        reserved9[3];
   u8        op1;        /* PSC + 0x38 */
   u8        reserved10[3];
   u8        op0;        /* PSC + 0x3c */
   u8        reserved11[3];
   u32        sicr;        /* PSC + 0x40 */
   u8        ircr1;        /* PSC + 0x44 */
   u8        reserved13[3];
   u8        ircr2;        /* PSC + 0x44 */
   u8        reserved14[3];
   u8        irsdr;        /* PSC + 0x4c */
   u8        reserved15[3];
   u8        irmdr;        /* PSC + 0x50 */
   u8        reserved16[3];
   u8        irfdr;        /* PSC + 0x54 */
   u8        reserved17[3];
};
 
struct mpc52xx_psc_fifo {
   u16        rfnum;        /* PSC + 0x58 */
   u16        reserved18;
   u16        tfnum;        /* PSC + 0x5c */
   u16        reserved19;
   u32        rfdata;        /* PSC + 0x60 */
   u16        rfstat;        /* PSC + 0x64 */
   u16        reserved20;
   u8        rfcntl;        /* PSC + 0x68 */
   u8        reserved21[5];
   u16        rfalarm;    /* PSC + 0x6e */
   u16        reserved22;
   u16        rfrptr;        /* PSC + 0x72 */
   u16        reserved23;
   u16        rfwptr;        /* PSC + 0x76 */
   u16        reserved24;
   u16        rflrfptr;    /* PSC + 0x7a */
   u16        reserved25;
   u16        rflwfptr;    /* PSC + 0x7e */
   u32        tfdata;        /* PSC + 0x80 */
   u16        tfstat;        /* PSC + 0x84 */
   u16        reserved26;
   u8        tfcntl;        /* PSC + 0x88 */
   u8        reserved27[5];
   u16        tfalarm;    /* PSC + 0x8e */
   u16        reserved28;
   u16        tfrptr;        /* PSC + 0x92 */
   u16        reserved29;
   u16        tfwptr;        /* PSC + 0x96 */
   u16        reserved30;
   u16        tflrfptr;    /* PSC + 0x9a */
   u16        reserved31;
   u16        tflwfptr;    /* PSC + 0x9e */
};
 
#define MPC512x_PSC_FIFO_EOF        0x100
#define MPC512x_PSC_FIFO_RESET_SLICE    0x80
#define MPC512x_PSC_FIFO_ENABLE_SLICE    0x01
#define MPC512x_PSC_FIFO_ENABLE_DMA    0x04
 
#define MPC512x_PSC_FIFO_EMPTY        0x1
#define MPC512x_PSC_FIFO_FULL        0x2
#define MPC512x_PSC_FIFO_ALARM        0x4
#define MPC512x_PSC_FIFO_URERR        0x8
 
struct mpc512x_psc_fifo {
   u32        reserved1[10];
   u32        txcmd;        /* PSC + 0x80 */
   u32        txalarm;    /* PSC + 0x84 */
   u32        txsr;        /* PSC + 0x88 */
   u32        txisr;        /* PSC + 0x8c */
   u32        tximr;        /* PSC + 0x90 */
   u32        txcnt;        /* PSC + 0x94 */
   u32        txptr;        /* PSC + 0x98 */
   u32        txsz;        /* PSC + 0x9c */
   u32        reserved2[7];
   union {
       u8    txdata_8;
       u16    txdata_16;
       u32    txdata_32;
   } txdata;             /* PSC + 0xbc */
#define txdata_8 txdata.txdata_8
#define txdata_16 txdata.txdata_16
#define txdata_32 txdata.txdata_32
   u32        rxcmd;        /* PSC + 0xc0 */
   u32        rxalarm;    /* PSC + 0xc4 */
   u32        rxsr;        /* PSC + 0xc8 */
   u32        rxisr;        /* PSC + 0xcc */
   u32        rximr;        /* PSC + 0xd0 */
   u32        rxcnt;        /* PSC + 0xd4 */
   u32        rxptr;        /* PSC + 0xd8 */
   u32        rxsz;        /* PSC + 0xdc */
   u32        reserved3[7];
   union {
       u8    rxdata_8;
       u16    rxdata_16;
       u32    rxdata_32;
   } rxdata;             /* PSC + 0xfc */
#define rxdata_8 rxdata.rxdata_8
#define rxdata_16 rxdata.rxdata_16
#define rxdata_32 rxdata.rxdata_32
};
 
struct mpc5125_psc {
   u8        mr1;            /* PSC + 0x00 */
   u8        reserved0[3];
   u8        mr2;            /* PSC + 0x04 */
   u8        reserved1[3];
   struct {
       u16        status;        /* PSC + 0x08 */
       u8        reserved2[2];
       u8        clock_select;    /* PSC + 0x0c */
       u8        reserved3[3];
   } sr_csr;
   u8        command;        /* PSC + 0x10 */
   u8        reserved4[3];
   union {                    /* PSC + 0x14 */
       u8        buffer_8;
       u16        buffer_16;
       u32        buffer_32;
   } buffer;
   struct {
       u8        ipcr;        /* PSC + 0x18 */
       u8        reserved5[3];
       u8        acr;        /* PSC + 0x1c */
       u8        reserved6[3];
   } ipcr_acr;
   struct {
       u16        isr;        /* PSC + 0x20 */
       u8        reserved7[2];
       u16        imr;        /* PSC + 0x24 */
       u8        reserved8[2];
   } isr_imr;
   u8        ctur;            /* PSC + 0x28 */
   u8        reserved9[3];
   u8        ctlr;            /* PSC + 0x2c */
   u8        reserved10[3];
   u32        ccr;            /* PSC + 0x30 */
   u32        ac97slots;        /* PSC + 0x34 */
   u32        ac97cmd;        /* PSC + 0x38 */
   u32        ac97data;        /* PSC + 0x3c */
   u8        reserved11[4];
   u8        ip;            /* PSC + 0x44 */
   u8        reserved12[3];
   u8        op1;            /* PSC + 0x48 */
   u8        reserved13[3];
   u8        op0;            /* PSC + 0x4c */
   u8        reserved14[3];
   u32        sicr;            /* PSC + 0x50 */
   u8        reserved15[4];    /* make eq. sizeof(mpc52xx_psc) */
};
 
#endif  /* __ASM_MPC52xx_PSC_H__ */