summaryrefslogtreecommitdiffstats
path: root/drivers/sbus/audio/cs4231.h
blob: cd1525051d1e465958fc5de5cbc95779c1de4267 (plain)
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
/*
 * drivers/sbus/audio/cs4231.h
 *
 * Copyright (C) 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu)
 * Copyright (C) 1997 Derrick J. Brashear (shadow@dementia.org)
 */

#ifndef _CS4231_H_
#define _CS4231_H_

#include <linux/types.h>

struct cs4231_regs {
         u_char iar;            /* Index Address Register */
         u_char pad0[3];         
         u_char idr;            /* Indexed Data Register */
         u_char pad1[3];        
         u_char statr;          /* Status Register */
         u_char pad2[3];        
         u_char piodr;          /* PIO Data Register I/O */
         u_char pad3[3];        
};

struct cs4231_dma {
         u_long         dmacsr;         /* APC CSR */
         u_long         dmapad[3];        
         u_long         dmacva;         /* Capture Virtual Address */
         u_long         dmacc;          /* Capture Count */
         u_long         dmacnva;        /* Capture Next Virtual Address */
         u_long         dmacnc;         /* Capture Next Count */
         u_long         dmapva;         /* Playback Virtual Address */
         u_long         dmapc;          /* Playback Count */
         u_long         dmapnva;        /* Playback Next Virtual Address */
         u_long         dmapnc;         /* Playback Next Count */
};

struct cs4231_chip {
        struct cs4231_regs *pioregs;
        struct cs4231_dma dmaregs;
	struct audio_info perchip_info;
	int irq;
	unsigned long regs_size;

	/* Keep track of various info */
	volatile unsigned int status;

        int dma;
        int dma2;
};

/* Status bits */
#define CS_STATUS_NEED_INIT 0x01
#define CS_STATUS_INIT_ON_CLOSE 0x02
#define CS_STATUS_REV_A 0x04

#define CS_TIMEOUT      9000000

#define GAIN_SET(var, gain)     ((var & ~(0x3f)) | gain)
#define RECGAIN_SET(var, gain)  ((var & ~(0x1f)) | gain)

#define IAR_AUTOCAL_BEGIN       0x40 /* IAR_MCE */
#define IAR_AUTOCAL_END         ~(0x40) /* IAR_MCD */
#define IAR_NOT_READY            0x80    /* 80h not ready CODEC state */

/* Each register assumed mode 1 and 2 unless noted */

/* 0 - Left Input Control */
/* 1 - Right Input Control */
#define MIC_ENABLE(var)         ((var & 0x2f) | 0x80)
#define LINE_ENABLE(var)        (var & 0x2f)
#define CDROM_ENABLE(var)       ((var & 0x2f) | 0x40)
#define INPUTCR_AUX1            0x40

/* 2 - Left Aux 1 Input Control */
/* 3 - Right Aux 1 Input Control */
/* 4 - Left Aux 2 Input Control */
/* 5 - Right Aux 2 Input Control */

/* 6 - Left Output Control */
/* 7 - Right Output Control */
#define OUTCR_MUTE              0x80
#define OUTCR_UNMUTE            ~0x80

/* 8 - Playback Data Format (Mode 2) */
#define CHANGE_DFR(var, val)            ((var & ~(0xF)) | val)
#define CHANGE_ENCODING(var, val)       ((var & ~(0xe0)) | val)
#define DEFAULT_DATA_FMAT               CS4231_DFR_ULAW
#define CS4231_DFR_8000                 0x00
#define CS4231_DFR_9600                 0x0e
#define CS4231_DFR_11025                0x03
#define CS4231_DFR_16000                0x02
#define CS4231_DFR_18900                0x05
#define CS4231_DFR_22050                0x07
#define CS4231_DFR_32000                0x06
#define CS4231_DFR_37800                0x09
#define CS4231_DFR_44100                0x0b
#define CS4231_DFR_48000                0x0c
#define CS4231_DFR_LINEAR8              0x00
#define CS4231_DFR_ULAW                 0x20
#define CS4231_DFR_ALAW                 0x60
#define CS4231_DFR_ADPCM                0xa0
#define CS4231_DFR_LINEARBE             0xc0
#define CS4231_STEREO_ON(val)           (val | 0x10)
#define CS4231_MONO_ON(val)             (val & ~0x10)

/* 9 - Interface Config. Register */
#define CHIP_INACTIVE           0x08
#define PEN_ENABLE              (0x01)
#define PEN_DISABLE             (~0x01)
#define CEN_ENABLE              (0x02)
#define CEN_DISABLE             (~0x02)
#define ACAL_DISABLE            (~0x08)
#define ICR_AUTOCAL_INIT        0x01

/* 10 - Pin Control Register */
#define INTR_ON                 0x82
#define INTR_OFF                0x80
#define PINCR_LINE_MUTE         0x40
#define PINCR_HDPH_MUTE         0x80

/* 11 - Test/Initialization */
#define DRQ_STAT                0x10
#define AUTOCAL_IN_PROGRESS      0x20

/* 12 - Misc Information */
#define MISC_IR_MODE2           0x40

/* 13 - Loopback Control */
#define LOOPB_ON                0x01
#define LOOPB_OFF               0x00

/* 14 - Unused (mode 1) */
/* 15 - Unused (mode 1) */

/* 14 - Playback Upper (mode 2) */
/* 15 - Playback Lower (mode 2) */

/* The rest are mode 2 only */

/* 16 - Alternate Feature 1 Enable */
#define OLB_ENABLE              0x80

/* 17 - Alternate Feature 2 Enable */
#define HPF_ON                  0x01
#define XTALE_ON                0x20

/* 18 - Left Line Input Gain */
/* 19 - Right Line Input Gain */

/* 20 - Timer High */
/* 21 - Timer Low */

/* 22 - unused */
/* 23 - unused */

/* 24 - Alternate Feature Status */
#define CS_PU                   0x01 /* Underrun */
#define CS_PO                   0x20 /* Overrun */

/* 25 - Version */
#define CS4231A         0x20
#define CS4231CDE       0x80

/* 26 - Mono I/O Control */
#define CHANGE_MONO_GAIN(val)   ((val & ~(0xFF)) | val)
#define MONO_IOCR_MUTE       0x40

/* 27 - Unused */

/* 28 - Capture Data Format */
/* see register 8 */

/* 29 - Unused */

/* 30 - Capture Upper */
/* 31 - Capture Lower */

/* Following are CSR register definitions for the Sparc */
/* Also list "Solaris" equivs for now, not really useful tho */
#define CS_INT_PENDING 0x800000 /* APC_IP */ /* Interrupt Pending */
#define CS_PLAY_INT    0x400000 /* APC_PI */ /* Playback interrupt */
#define CS_CAPT_INT    0x200000 /* APC_CI */ /* Capture interrupt */
#define CS_GENL_INT    0x100000 /* APC_EI */ /* General interrupt */
#define CS_XINT_ENA    0x80000  /* APC_IE */ /* General ext int. enable */
#define CS_XINT_PLAY   0x40000  /* APC_PIE */ /* Playback ext intr */
#define CS_XINT_CAPT   0x20000  /* APC_CIE */ /* Capture ext intr */
#define CS_XINT_GENL   0x10000  /* APC_EIE */ /* Error ext intr */
#define CS_XINT_EMPT   0x8000   /* APC_PMI */ /* Pipe empty interrupt */
#define CS_XINT_PEMP   0x4000   /* APC_PM */ /* Play pipe empty */
#define CS_XINT_PNVA   0x2000   /* APC_PD */ /* Playback NVA dirty */
#define CS_XINT_PENA   0x1000   /* APC_PMIE */ /* play pipe empty Int enable */
#define CS_XINT_COVF   0x800    /* APC_CM */ /* Cap data dropped on floor */
#define CS_XINT_CNVA   0x400    /* APC_CD */ /* Capture NVA dirty */
#define CS_XINT_CEMP   0x200    /* APC_CMI */ /* Capture pipe empty interrupt */
#define CS_XINT_CENA   0x100    /* APC_CMIE */ /* Cap. pipe empty int enable */
#define CS_PPAUSE      0x80     /* APC_PPAUSE */ /* Pause the play DMA */
#define CS_CPAUSE      0x40     /* APC_CPAUSE */ /* Pause the capture DMA */
#define CS_CDC_RESET   0x20     /* APC_CODEC_PDN */ /* CODEC RESET */
#define PDMA_READY     0x08     /* PDMA_GO */
#define CDMA_READY     0x04     /* CDMA_GO */
#define CS_CHIP_RESET  0x01     /* APC_RESET */       /* Reset the chip */

#define CS_INIT_SETUP  (CDMA_READY | PDMA_READY | CS_XINT_ENA | CS_XINT_PLAY | CS_XINT_GENL | CS_INT_PENDING | CS_PLAY_INT | CS_CAPT_INT | CS_GENL_INT) 

#define CS_PLAY_SETUP  (CS_GENL_INT | CS_PLAY_INT | CS_XINT_ENA | CS_XINT_PLAY | CS_XINT_EMPT | CS_XINT_GENL | CS_XINT_PENA | PDMA_READY)

#define CS_CAPT_SETUP  (CS_GENL_INT | CS_CAPT_INT | CS_XINT_ENA | CS_XINT_CAPT | CS_XINT_CEMP | CS_XINT_GENL | CDMA_READY)

#define CS4231_MIN_ATEN     (0)
#define CS4231_MAX_ATEN     (31)
#define CS4231_MAX_DEV_ATEN (63)

#define CS4231_MON_MIN_ATEN         (0)
#define CS4231_MON_MAX_ATEN         (63)

#define CS4231_DEFAULT_PLAYGAIN     (132)
#define CS4231_DEFAULT_RECGAIN      (126)

#define CS4231_MIN_GAIN     (0)
#define CS4231_MAX_GAIN     (15)

#define CS4231_PRECISION    (8)             /* # of bits/sample */
#define CS4231_CHANNELS     (1)             /* channels/sample */

#define CS4231_RATE   (8000)                /* default sample rate */
/* Other rates supported are:
 * 9600, 11025, 16000, 18900, 22050, 32000, 37800, 44100, 48000 
 */

#endif