import of ftp.dlink.com/GPL/DSMG-600_reB/ppclinux.tar.gz
[linux-2.4.21-pre4.git] / drivers / sbus / audio / dbri.h
1 /* $Id: dbri.h,v 1.1.1.1 2005/04/11 02:50:34 jack Exp $
2  * drivers/sbus/audio/cs4231.h
3  *
4  * Copyright (C) 1997 Rudolf Koenig (rfkoenig@immd4.informatik.uni-erlangen.de)
5  */
6
7 #ifndef _DBRI_H_
8 #define _DBRI_H_
9
10 #include <linux/types.h>
11
12 /* DBRI main registers */
13 #define REG0    0x00UL          /* Status and Control */
14 #define REG1    0x04UL          /* Mode and Interrupt */
15 #define REG2    0x08UL          /* Parallel IO */
16 #define REG3    0x0cUL          /* Test */
17 #define REG8    0x20UL          /* Command Queue Pointer */
18 #define REG9    0x24UL          /* Interrupt Queue Pointer */
19
20 #define DBRI_NO_CMDS    64
21 #define DBRI_NO_INTS    1       /* Note: the value of this define was
22                                  * originally 2.  The ringbuffer to store
23                                  * interrupts in dma is currently broken.
24                                  * This is a temporary fix until the ringbuffer
25                                  * is fixed.
26                                  */
27 #define DBRI_INT_BLK    64
28 #define DBRI_NO_DESCS   64
29
30 #define DBRI_MM_ONB     1
31 #define DBRI_MM_SB      2
32
33 struct dbri_mem {
34         volatile __u32  word1;
35         volatile __u32  ba;                     /* Transmit/Receive Buffer Address */
36         volatile __u32  nda;                    /* Next Descriptor Address */
37         volatile __u32  word4;
38 };
39
40 #include "cs4215.h"
41
42 /* This structure is in a DMA region where it can accessed by both
43  * the CPU and the DBRI
44  */
45 struct dbri_dma {
46         volatile s32 cmd[DBRI_NO_CMDS];                 /* Place for commands */
47         volatile s32 intr[DBRI_NO_INTS * DBRI_INT_BLK]; /* Interrupt field */
48         struct dbri_mem desc[DBRI_NO_DESCS];            /* Xmit/receive descriptors */
49 };
50
51 #define dbri_dma_off(member, elem)      \
52         ((u32)(unsigned long)           \
53          (&(((struct dbri_dma *)0)->member[elem])))
54
55 enum in_or_out { PIPEinput, PIPEoutput };
56
57 enum direction { in, out };
58
59 struct dbri_pipe {
60         u32 sdp;                                /* SDP command word */
61         enum direction direction;
62         int nextpipe;                           /* Next pipe in linked list */
63         int prevpipe;
64         int cycle;                              /* Offset of timeslot (bits) */
65         int length;                             /* Length of timeslot (bits) */
66         int desc;                               /* Index of active descriptor*/
67         volatile __u32 *recv_fixed_ptr;         /* Ptr to receive fixed data */
68 };
69
70 struct dbri_desc {
71         int inuse;                              /* Boolean flag */
72         int next;                               /* Index of next desc, or -1 */
73         void *buffer;                           /* CPU view of buffer */
74         u32 buffer_dvma;                        /* Device view */
75         unsigned int len;
76         void (*output_callback)(void *, int);
77         void *output_callback_arg;
78         void (*input_callback)(void *, int, unsigned int);
79         void *input_callback_arg;
80 };
81
82 /* This structure holds the information for both chips (DBRI & CS4215) */
83
84 struct dbri {
85         int regs_size, irq;             /* Needed for unload */
86         struct sbus_dev *sdev;          /* SBUS device info */
87
88         volatile struct dbri_dma *dma;  /* Pointer to our DMA block */
89         u32 dma_dvma;                   /* DBRI visible DMA address */
90
91         unsigned long regs;             /* dbri HW regs */
92         int dbri_version;               /* 'e' and up is OK */
93         int dbri_irqp;                  /* intr queue pointer */
94         int wait_seen;
95
96         struct dbri_pipe pipes[32];     /* DBRI's 32 data pipes */
97         struct dbri_desc descs[DBRI_NO_DESCS];
98
99         int chi_in_pipe;
100         int chi_out_pipe;
101         int chi_bpf;
102
103         struct cs4215 mm;               /* mmcodec special info */
104
105 #if 0
106         /* Where to sleep if busy */
107         wait_queue_head_t wait, int_wait;
108 #endif
109         struct audio_info perchip_info;
110
111         /* Track ISDN LIU and notify changes */
112         int liu_state;
113         void (*liu_callback)(void *);
114         void *liu_callback_arg;
115 };
116
117 /* DBRI Reg0 - Status Control Register - defines. (Page 17) */
118 #define D_P             (1<<15) /* Program command & queue pointer valid */
119 #define D_G             (1<<14) /* Allow 4-Word SBus Burst */
120 #define D_S             (1<<13) /* Allow 16-Word SBus Burst */
121 #define D_E             (1<<12) /* Allow 8-Word SBus Burst */
122 #define D_X             (1<<7)  /* Sanity Timer Disable */
123 #define D_T             (1<<6)  /* Permit activation of the TE interface */
124 #define D_N             (1<<5)  /* Permit activation of the NT interface */
125 #define D_C             (1<<4)  /* Permit activation of the CHI interface */
126 #define D_F             (1<<3)  /* Force Sanity Timer Time-Out */
127 #define D_D             (1<<2)  /* Disable Master Mode */
128 #define D_H             (1<<1)  /* Halt for Analysis */
129 #define D_R             (1<<0)  /* Soft Reset */
130
131
132 /* DBRI Reg1 - Mode and Interrupt Register - defines. (Page 18) */
133 #define D_LITTLE_END    (1<<8)  /* Byte Order */
134 #define D_BIG_END       (0<<8)  /* Byte Order */
135 #define D_MRR           (1<<4)  /* Multiple Error Ack on SBus (readonly) */
136 #define D_MLE           (1<<3)  /* Multiple Late Error on SBus (readonly) */
137 #define D_LBG           (1<<2)  /* Lost Bus Grant on SBus (readonly) */
138 #define D_MBE           (1<<1)  /* Burst Error on SBus (readonly) */
139 #define D_IR            (1<<0)  /* Interrupt Indicator (readonly) */
140
141
142 /* DBRI Reg2 - Parallel IO Register - defines. (Page 18) */
143 #define D_ENPIO3        (1<<7)  /* Enable Pin 3 */
144 #define D_ENPIO2        (1<<6)  /* Enable Pin 2 */
145 #define D_ENPIO1        (1<<5)  /* Enable Pin 1 */
146 #define D_ENPIO0        (1<<4)  /* Enable Pin 0 */
147 #define D_ENPIO         (0xf0)  /* Enable all the pins */
148 #define D_PIO3          (1<<3)  /* Pin 3: 1: Data mode, 0: Ctrl mode */
149 #define D_PIO2          (1<<2)  /* Pin 2: 1: Onboard PDN */
150 #define D_PIO1          (1<<1)  /* Pin 1: 0: Reset */
151 #define D_PIO0          (1<<0)  /* Pin 0: 1: Speakerbox PDN */
152
153
154 /* DBRI Commands (Page 20) */
155 #define D_WAIT          0x0     /* Stop execution */
156 #define D_PAUSE         0x1     /* Flush long pipes */
157 #define D_JUMP          0x2     /* New command queue */
158 #define D_IIQ           0x3     /* Initialize Interrupt Queue */
159 #define D_REX           0x4     /* Report command execution via interrupt */
160 #define D_SDP           0x5     /* Setup Data Pipe */
161 #define D_CDP           0x6     /* Continue Data Pipe (reread NULL Pointer) */
162 #define D_DTS           0x7     /* Define Time Slot */
163 #define D_SSP           0x8     /* Set short Data Pipe */
164 #define D_CHI           0x9     /* Set CHI Global Mode */
165 #define D_NT            0xa     /* NT Command */
166 #define D_TE            0xb     /* TE Command */
167 #define D_CDEC          0xc     /* Codec setup */
168 #define D_TEST          0xd     /* No comment */
169 #define D_CDM           0xe     /* CHI Data mode command */
170
171
172
173 /* Special bits for some commands */
174 #define D_PIPE(v)      ((v)<<0)        /* Pipe Nr: 0-15 long, 16-21 short */
175
176 /* Setup Data Pipe */
177 /* IRM */
178 #define D_SDP_2SAME     (1<<18) /* Report 2nd time in a row value rcvd*/
179 #define D_SDP_CHANGE    (2<<18) /* Report any changes */
180 #define D_SDP_EVERY     (3<<18) /* Report any changes */
181 #define D_SDP_EOL       (1<<17) /* EOL interrupt enable */
182 #define D_SDP_IDLE      (1<<16) /* HDLC idle interrupt enable */
183
184 /* Pipe data MODE */
185 #define D_SDP_MEM       (0<<13) /* To/from memory */
186 #define D_SDP_HDLC      (2<<13)
187 #define D_SDP_HDLC_D    (3<<13) /* D Channel (prio control)*/
188 #define D_SDP_SER       (4<<13) /* Serial to serial */
189 #define D_SDP_FIXED     (6<<13) /* Short only */
190 #define D_SDP_MODE(v)   ((v)&(7<<13))
191
192 #define D_SDP_TO_SER    (1<<12) /* Direction */
193 #define D_SDP_FROM_SER  (0<<12) /* Direction */
194 #define D_SDP_MSB       (1<<11) /* Bit order within Byte */
195 #define D_SDP_LSB       (0<<11) /* Bit order within Byte */
196 #define D_SDP_P         (1<<10) /* Pointer Valid */
197 #define D_SDP_A         (1<<8)  /* Abort */
198 #define D_SDP_C         (1<<7)  /* Clear */
199
200 /* Define Time Slot */
201 #define D_DTS_VI        (1<<17) /* Valid Input Time-Slot Descriptor */
202 #define D_DTS_VO        (1<<16) /* Valid Output Time-Slot Descriptor */
203 #define D_DTS_INS       (1<<15) /* Insert Time Slot */
204 #define D_DTS_DEL       (0<<15) /* Delete Time Slot */
205 #define D_DTS_PRVIN(v) ((v)<<10) /* Previous In Pipe */
206 #define D_DTS_PRVOUT(v)        ((v)<<5)  /* Previous Out Pipe */
207
208 /* Time Slot defines */
209 #define D_TS_LEN(v)     ((v)<<24)       /* Number of bits in this time slot */
210 #define D_TS_CYCLE(v)   ((v)<<14)       /* Bit Count at start of TS */
211 #define D_TS_DI         (1<<13) /* Data Invert */
212 #define D_TS_1CHANNEL   (0<<10) /* Single Channel / Normal mode */
213 #define D_TS_MONITOR    (2<<10) /* Monitor pipe */
214 #define D_TS_NONCONTIG  (3<<10) /* Non contiguous mode */
215 #define D_TS_ANCHOR     (7<<10) /* Starting short pipes */
216 #define D_TS_MON(v)    ((v)<<5)        /* Monitor Pipe */
217 #define D_TS_NEXT(v)   ((v)<<0)        /* Pipe Nr: 0-15 long, 16-21 short */
218
219 /* Concentration Highway Interface Modes */
220 #define D_CHI_CHICM(v)  ((v)<<16)       /* Clock mode */
221 #define D_CHI_IR        (1<<15) /* Immediate Interrupt Report */
222 #define D_CHI_EN        (1<<14) /* CHIL Interrupt enabled */
223 #define D_CHI_OD        (1<<13) /* Open Drain Enable */
224 #define D_CHI_FE        (1<<12) /* Sample CHIFS on Rising Frame Edge */
225 #define D_CHI_FD        (1<<11) /* Frame Drive */
226 #define D_CHI_BPF(v)    ((v)<<0)        /* Bits per Frame */
227
228 /* NT: These are here for completeness */
229 #define D_NT_FBIT       (1<<17) /* Frame Bit */
230 #define D_NT_NBF        (1<<16) /* Number of bad frames to loose framing */
231 #define D_NT_IRM_IMM    (1<<15) /* Interrupt Report & Mask: Immediate */
232 #define D_NT_IRM_EN     (1<<14) /* Interrupt Report & Mask: Enable */
233 #define D_NT_ISNT       (1<<13) /* Configfure interface as NT */
234 #define D_NT_FT         (1<<12) /* Fixed Timing */
235 #define D_NT_EZ         (1<<11) /* Echo Channel is Zeros */
236 #define D_NT_IFA        (1<<10) /* Inhibit Final Activation */
237 #define D_NT_ACT        (1<<9)  /* Activate Interface */
238 #define D_NT_MFE        (1<<8)  /* Multiframe Enable */
239 #define D_NT_RLB(v)     ((v)<<5)        /* Remote Loopback */
240 #define D_NT_LLB(v)     ((v)<<2)        /* Local Loopback */
241 #define D_NT_FACT       (1<<1)  /* Force Activation */
242 #define D_NT_ABV        (1<<0)  /* Activate Bipolar Violation */
243
244 /* Codec Setup */
245 #define D_CDEC_CK(v)    ((v)<<24)       /* Clock Select */
246 #define D_CDEC_FED(v)   ((v)<<12)       /* FSCOD Falling Edge Delay */
247 #define D_CDEC_RED(v)   ((v)<<0)        /* FSCOD Rising Edge Delay */
248
249 /* Test */
250 #define D_TEST_RAM(v)   ((v)<<16)       /* RAM Pointer */
251 #define D_TEST_SIZE(v)  ((v)<<11)       /* */
252 #define D_TEST_ROMONOFF 0x5     /* Toggle ROM opcode monitor on/off */
253 #define D_TEST_PROC     0x6     /* MicroProcessor test */
254 #define D_TEST_SER      0x7     /* Serial-Controller test */
255 #define D_TEST_RAMREAD  0x8     /* Copy from Ram to system memory */
256 #define D_TEST_RAMWRITE 0x9     /* Copy into Ram from system memory */
257 #define D_TEST_RAMBIST  0xa     /* RAM Built-In Self Test */
258 #define D_TEST_MCBIST   0xb     /* Microcontroller Built-In Self Test */
259 #define D_TEST_DUMP     0xe     /* ROM Dump */
260
261 /* CHI Data Mode */
262 #define D_CDM_THI       (1<<8)  /* Transmit Data on CHIDR Pin */
263 #define D_CDM_RHI       (1<<7)  /* Receive Data on CHIDX Pin */
264 #define D_CDM_RCE       (1<<6)  /* Receive on Rising Edge of CHICK */
265 #define D_CDM_XCE       (1<<2)  /* Transmit Data on Rising Edge of CHICK */
266 #define D_CDM_XEN       (1<<1)  /* Transmit Highway Enable */
267 #define D_CDM_REN       (1<<0)  /* Receive Highway Enable */
268
269 /* The Interrupts */
270 #define D_INTR_BRDY     1       /* Buffer Ready for processing */
271 #define D_INTR_MINT     2       /* Marked Interrupt in RD/TD */
272 #define D_INTR_IBEG     3       /* Flag to idle transition detected (HDLC) */
273 #define D_INTR_IEND     4       /* Idle to flag transition detected (HDLC) */
274 #define D_INTR_EOL      5       /* End of List */
275 #define D_INTR_CMDI     6       /* Command has bean read */
276 #define D_INTR_XCMP     8       /* Transmission of frame complete */
277 #define D_INTR_SBRI     9       /* BRI status change info */
278 #define D_INTR_FXDT     10      /* Fixed data change */
279 #define D_INTR_CHIL     11      /* CHI lost frame sync (channel 36 only) */
280 #define D_INTR_COLL     11      /* Unrecoverable D-Channel collision */
281 #define D_INTR_DBYT     12      /* Dropped by frame slip */
282 #define D_INTR_RBYT     13      /* Repeated by frame slip */
283 #define D_INTR_LINT     14      /* Lost Interrupt */
284 #define D_INTR_UNDR     15      /* DMA underrun */
285
286 #define D_INTR_TE       32
287 #define D_INTR_NT       34
288 #define D_INTR_CHI      36
289 #define D_INTR_CMD      38
290
291 #define D_INTR_GETCHAN(v)       (((v)>>24) & 0x3f)
292 #define D_INTR_GETCODE(v)       (((v)>>20) & 0xf)
293 #define D_INTR_GETCMD(v)        (((v)>>16) & 0xf)
294 #define D_INTR_GETVAL(v)        ((v) & 0xffff)
295 #define D_INTR_GETRVAL(v)       ((v) & 0xfffff)
296
297 #define D_P_0           0       /* TE receive anchor */
298 #define D_P_1           1       /* TE transmit anchor */
299 #define D_P_2           2       /* NT transmit anchor */
300 #define D_P_3           3       /* NT receive anchor */
301 #define D_P_4           4       /* CHI send data */
302 #define D_P_5           5       /* CHI receive data */
303 #define D_P_6           6       /* */
304 #define D_P_7           7       /* */
305 #define D_P_8           8       /* */
306 #define D_P_9           9       /* */
307 #define D_P_10          10      /* */
308 #define D_P_11          11      /* */
309 #define D_P_12          12      /* */
310 #define D_P_13          13      /* */
311 #define D_P_14          14      /* */
312 #define D_P_15          15      /* */
313 #define D_P_16          16      /* CHI anchor pipe */
314 #define D_P_17          17      /* CHI send */
315 #define D_P_18          18      /* CHI receive */
316 #define D_P_19          19      /* CHI receive */
317 #define D_P_20          20      /* CHI receive */
318 #define D_P_21          21      /* */
319 #define D_P_22          22      /* */
320 #define D_P_23          23      /* */
321 #define D_P_24          24      /* */
322 #define D_P_25          25      /* */
323 #define D_P_26          26      /* */
324 #define D_P_27          27      /* */
325 #define D_P_28          28      /* */
326 #define D_P_29          29      /* */
327 #define D_P_30          30      /* */
328 #define D_P_31          31      /* */
329
330
331 /* Transmit descriptor defines */
332 #define DBRI_TD_F       (1<<31) /* End of Frame */
333 #define DBRI_TD_D       (1<<30) /* Do not append CRC */
334 #define DBRI_TD_CNT(v)  ((v)<<16)       /* Number of valid bytes in the buffer */
335 #define DBRI_TD_B       (1<<15) /* Final interrupt */
336 #define DBRI_TD_M       (1<<14) /* Marker interrupt */
337 #define DBRI_TD_I       (1<<13) /* Transmit Idle Characters */
338 #define DBRI_TD_FCNT(v) (v)     /* Flag Count */
339 #define DBRI_TD_UNR     (1<<3)  /* Underrun: transmitter is out of data */
340 #define DBRI_TD_ABT     (1<<2)  /* Abort: frame aborted */
341 #define DBRI_TD_TBC     (1<<0)  /* Transmit buffer Complete */
342 #define DBRI_TD_STATUS(v)       ((v)&0xff)      /* Transmit status */
343
344 /* Receive descriptor defines */
345 #define DBRI_RD_F       (1<<31) /* End of Frame */
346 #define DBRI_RD_C       (1<<30) /* Completed buffer */
347 #define DBRI_RD_B       (1<<15) /* Final interrupt */
348 #define DBRI_RD_M       (1<<14) /* Marker interrupt */
349 #define DBRI_RD_BCNT(v) (v)     /* Buffer size */
350 #define DBRI_RD_CRC     (1<<7)  /* 0: CRC is correct */
351 #define DBRI_RD_BBC     (1<<6)  /* 1: Bad Byte received */
352 #define DBRI_RD_ABT     (1<<5)  /* Abort: frame aborted */
353 #define DBRI_RD_OVRN    (1<<3)  /* Overrun: data lost */
354 #define DBRI_RD_STATUS(v)      ((v)&0xff)      /* Receive status */
355 #define DBRI_RD_CNT(v) (((v)>>16)&0x1fff)        /* Number of valid bytes in the buffer */
356
357 #endif /* _DBRI_H_ */