This source file includes following definitions.
- CS_OUT
- probe_cs4232_mpu
- attach_cs4232_mpu
- probe_cs4232
- attach_cs4232
- unload_cs4232
- unload_cs4232_mpu
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 #include <linux/config.h>
35
36
37 #include "sound_config.h"
38
39 #if defined(CONFIG_CS4232)
40
41 #define KEY_PORT 0x279
42 #define CSN_NUM 0x99
43
44 static int *osp;
45
46 static void
47 CS_OUT (unsigned char a)
48 {
49 outb (a, KEY_PORT);
50 }
51 #define CS_OUT2(a, b) {CS_OUT(a);CS_OUT(b);}
52 #define CS_OUT3(a, b, c) {CS_OUT(a);CS_OUT(b);CS_OUT(c);}
53
54 static int mpu_base = 0, mpu_irq = 0;
55 static int mpu_detected = 0;
56
57 int
58 probe_cs4232_mpu (struct address_info *hw_config)
59 {
60
61
62
63
64 mpu_base = hw_config->io_base;
65 mpu_irq = hw_config->irq;
66
67 return 0;
68 }
69
70 long
71 attach_cs4232_mpu (long mem_start, struct address_info *hw_config)
72 {
73 return mem_start;
74 }
75
76 static unsigned char crystal_key[] =
77 {
78 0x96, 0x35, 0x9a, 0xcd, 0xe6, 0xf3, 0x79, 0xbc,
79 0x5e, 0xaf, 0x57, 0x2b, 0x15, 0x8a, 0xc5, 0xe2,
80 0xf1, 0xf8, 0x7c, 0x3e, 0x9f, 0x4f, 0x27, 0x13,
81 0x09, 0x84, 0x42, 0xa1, 0xd0, 0x68, 0x34, 0x1a
82 };
83
84 int
85 probe_cs4232 (struct address_info *hw_config)
86 {
87 int i;
88 int base = hw_config->io_base, irq = hw_config->irq;
89 int dma1 = hw_config->dma, dma2 = hw_config->dma2;
90
91 osp = hw_config->osp;
92
93
94
95
96
97 if (check_region (base, 4))
98 {
99 printk ("cs4232.c: I/O port 0x%03x not free\n", base);
100 return 0;
101 }
102
103 if (ad1848_detect (hw_config->io_base, NULL, hw_config->osp))
104 return 1;
105
106
107
108
109
110
111
112
113
114
115
116
117 for (i = 0; i < 32; i++)
118 CS_OUT (crystal_key[i]);
119
120
121
122
123
124 CS_OUT2 (0x06, CSN_NUM);
125
126
127
128
129
130
131 CS_OUT2 (0x15, 0x00);
132 CS_OUT3 (0x47, (base >> 8) & 0xff, base & 0xff);
133
134 if (check_region (0x388, 4))
135 CS_OUT3 (0x48, 0x00, 0x00)
136 else
137 CS_OUT3 (0x48, 0x03, 0x88);
138
139 CS_OUT3 (0x42, 0x00, 0x00);
140 CS_OUT2 (0x22, irq);
141 CS_OUT2 (0x2a, dma1);
142
143 if (dma2 != -1)
144 CS_OUT2 (0x25, dma2)
145 else
146 CS_OUT2 (0x25, 4);
147
148 CS_OUT2 (0x33, 0x01);
149
150
151
152
153
154 #if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
155 if (mpu_base != 0 && mpu_irq != 0)
156 {
157 CS_OUT2 (0x15, 0x03);
158 CS_OUT3 (0x47, (mpu_base >> 8) & 0xff, mpu_base & 0xff);
159 CS_OUT2 (0x22, mpu_irq);
160 CS_OUT2 (0x33, 0x01);
161 }
162 #endif
163
164
165
166
167 CS_OUT (0x79);
168
169
170
171
172
173 return ad1848_detect (hw_config->io_base, NULL, hw_config->osp);
174 }
175
176 long
177 attach_cs4232 (long mem_start, struct address_info *hw_config)
178 {
179 int base = hw_config->io_base, irq = hw_config->irq;
180 int dma1 = hw_config->dma, dma2 = hw_config->dma2;
181
182 if (dma2 == -1)
183 dma2 = dma1;
184
185 ad1848_init ("CS4232", base,
186 irq,
187 dma1,
188 dma2,
189 0,
190 hw_config->osp);
191
192 #if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
193 if (mpu_base != 0 && mpu_irq != 0)
194 {
195 static struct address_info hw_config2 =
196 {0};
197
198 hw_config2.io_base = mpu_base;
199 hw_config2.irq = mpu_irq;
200 hw_config2.dma = -1;
201 hw_config2.dma2 = -1;
202 hw_config2.always_detect = 0;
203 hw_config2.name = NULL;
204 hw_config2.driver_use_1 = 0;
205 hw_config2.driver_use_2 = 0;
206 hw_config2.card_subtype = 0;
207 hw_config2.osp = hw_config->osp;
208
209 if (probe_mpu401 (&hw_config2))
210 {
211 mpu_detected = 1;
212 mem_start = attach_mpu401 (mem_start, &hw_config2);
213 }
214 else
215 {
216 mpu_base = mpu_irq = 0;
217 }
218 }
219 #endif
220 return mem_start;
221 }
222
223 void
224 unload_cs4232 (struct address_info *hw_config)
225 {
226 int base = hw_config->io_base, irq = hw_config->irq;
227 int dma1 = hw_config->dma, dma2 = hw_config->dma2;
228
229 if (dma2 == -1)
230 dma2 = dma1;
231
232 ad1848_unload (base,
233 irq,
234 dma1,
235 dma2,
236 0);
237
238 #if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
239 if (mpu_base != 0 && mpu_irq != 0 && mpu_detected)
240 {
241 static struct address_info hw_config2 =
242 {0};
243
244 hw_config2.io_base = mpu_base;
245 hw_config2.irq = mpu_irq;
246 hw_config2.dma = -1;
247 hw_config2.dma2 = -1;
248 hw_config2.always_detect = 0;
249 hw_config2.name = NULL;
250 hw_config2.driver_use_1 = 0;
251 hw_config2.driver_use_2 = 0;
252 hw_config2.card_subtype = 0;
253 hw_config2.osp = hw_config->osp;
254
255 unload_mpu401 (&hw_config2);
256 }
257 #endif
258 }
259
260 void
261 unload_cs4232_mpu (struct address_info *hw_config)
262 {
263
264 }
265
266
267 #endif