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, n;
88 int base = hw_config->io_base, irq = hw_config->irq;
89 int dma1 = hw_config->dma, dma2 = hw_config->dma2;
90
91 static wait_handle *cs_sleeper = NULL;
92 static volatile struct snd_wait cs_sleep_flag =
93 {0};
94
95 osp = hw_config->osp;
96
97
98
99
100
101 if (check_region (base, 4))
102 {
103 printk ("cs4232.c: I/O port 0x%03x not free\n", base);
104 return 0;
105 }
106
107 if (ad1848_detect (hw_config->io_base, NULL, hw_config->osp))
108 return 1;
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 for (n = 0; n < 4; n++)
124 {
125 cs_sleep_flag.mode = WK_NONE;
126
127
128
129 for (i = 0; i < 32; i++)
130 CS_OUT (crystal_key[i]);
131
132
133 {
134 unsigned long tl;
135
136 if (HZ / 10)
137 current_set_timeout (tl = jiffies + (HZ / 10));
138 else
139 tl = (unsigned long) -1;
140 cs_sleep_flag.mode = WK_SLEEP;
141 module_interruptible_sleep_on (&cs_sleeper);
142 if (!(cs_sleep_flag.mode & WK_WAKEUP))
143 {
144 if (jiffies >= tl)
145 cs_sleep_flag.mode |= WK_TIMEOUT;
146 }
147 cs_sleep_flag.mode &= ~WK_SLEEP;
148 };
149
150
151
152
153
154 CS_OUT2 (0x06, CSN_NUM);
155
156
157
158
159
160
161 CS_OUT2 (0x15, 0x00);
162 CS_OUT3 (0x47, (base >> 8) & 0xff, base & 0xff);
163
164 if (check_region (0x388, 4))
165 CS_OUT3 (0x48, 0x00, 0x00)
166 else
167 CS_OUT3 (0x48, 0x03, 0x88);
168
169 CS_OUT3 (0x42, 0x00, 0x00);
170 CS_OUT2 (0x22, irq);
171 CS_OUT2 (0x2a, dma1);
172
173 if (dma2 != -1)
174 CS_OUT2 (0x25, dma2)
175 else
176 CS_OUT2 (0x25, 4);
177
178 CS_OUT2 (0x33, 0x01);
179
180
181 {
182 unsigned long tl;
183
184 if (HZ / 10)
185 current_set_timeout (tl = jiffies + (HZ / 10));
186 else
187 tl = (unsigned long) -1;
188 cs_sleep_flag.mode = WK_SLEEP;
189 module_interruptible_sleep_on (&cs_sleeper);
190 if (!(cs_sleep_flag.mode & WK_WAKEUP))
191 {
192 if (jiffies >= tl)
193 cs_sleep_flag.mode |= WK_TIMEOUT;
194 }
195 cs_sleep_flag.mode &= ~WK_SLEEP;
196 };
197
198
199
200
201
202 #if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
203 if (mpu_base != 0 && mpu_irq != 0)
204 {
205 CS_OUT2 (0x15, 0x03);
206 CS_OUT3 (0x47, (mpu_base >> 8) & 0xff, mpu_base & 0xff);
207 CS_OUT2 (0x22, mpu_irq);
208 CS_OUT2 (0x33, 0x01);
209 }
210 #endif
211
212
213
214
215 CS_OUT (0x79);
216
217
218 {
219 unsigned long tl;
220
221 if (HZ / 5)
222 current_set_timeout (tl = jiffies + (HZ / 5));
223 else
224 tl = (unsigned long) -1;
225 cs_sleep_flag.mode = WK_SLEEP;
226 module_interruptible_sleep_on (&cs_sleeper);
227 if (!(cs_sleep_flag.mode & WK_WAKEUP))
228 {
229 if (jiffies >= tl)
230 cs_sleep_flag.mode |= WK_TIMEOUT;
231 }
232 cs_sleep_flag.mode &= ~WK_SLEEP;
233 };
234
235
236
237
238
239 if (ad1848_detect (hw_config->io_base, NULL, hw_config->osp))
240 return 1;
241
242
243 {
244 unsigned long tl;
245
246 if (HZ)
247 current_set_timeout (tl = jiffies + (HZ));
248 else
249 tl = (unsigned long) -1;
250 cs_sleep_flag.mode = WK_SLEEP;
251 module_interruptible_sleep_on (&cs_sleeper);
252 if (!(cs_sleep_flag.mode & WK_WAKEUP))
253 {
254 if (jiffies >= tl)
255 cs_sleep_flag.mode |= WK_TIMEOUT;
256 }
257 cs_sleep_flag.mode &= ~WK_SLEEP;
258 };
259 }
260
261 return 0;
262 }
263
264 long
265 attach_cs4232 (long mem_start, struct address_info *hw_config)
266 {
267 int base = hw_config->io_base, irq = hw_config->irq;
268 int dma1 = hw_config->dma, dma2 = hw_config->dma2;
269
270 if (dma2 == -1)
271 dma2 = dma1;
272
273 ad1848_init ("CS4232", base,
274 irq,
275 dma1,
276 dma2,
277 0,
278 hw_config->osp);
279
280 #if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
281 if (mpu_base != 0 && mpu_irq != 0)
282 {
283 static struct address_info hw_config2 =
284 {0};
285
286 hw_config2.io_base = mpu_base;
287 hw_config2.irq = mpu_irq;
288 hw_config2.dma = -1;
289 hw_config2.dma2 = -1;
290 hw_config2.always_detect = 0;
291 hw_config2.name = NULL;
292 hw_config2.driver_use_1 = 0;
293 hw_config2.driver_use_2 = 0;
294 hw_config2.card_subtype = 0;
295 hw_config2.osp = hw_config->osp;
296
297 if (probe_mpu401 (&hw_config2))
298 {
299 mpu_detected = 1;
300 mem_start = attach_mpu401 (mem_start, &hw_config2);
301 }
302 else
303 {
304 mpu_base = mpu_irq = 0;
305 }
306 }
307 #endif
308 return mem_start;
309 }
310
311 void
312 unload_cs4232 (struct address_info *hw_config)
313 {
314 int base = hw_config->io_base, irq = hw_config->irq;
315 int dma1 = hw_config->dma, dma2 = hw_config->dma2;
316
317 if (dma2 == -1)
318 dma2 = dma1;
319
320 ad1848_unload (base,
321 irq,
322 dma1,
323 dma2,
324 0);
325
326 #if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
327 if (mpu_base != 0 && mpu_irq != 0 && mpu_detected)
328 {
329 static struct address_info hw_config2 =
330 {0};
331
332 hw_config2.io_base = mpu_base;
333 hw_config2.irq = mpu_irq;
334 hw_config2.dma = -1;
335 hw_config2.dma2 = -1;
336 hw_config2.always_detect = 0;
337 hw_config2.name = NULL;
338 hw_config2.driver_use_1 = 0;
339 hw_config2.driver_use_2 = 0;
340 hw_config2.card_subtype = 0;
341 hw_config2.osp = hw_config->osp;
342
343 unload_mpu401 (&hw_config2);
344 }
345 #endif
346 }
347
348 void
349 unload_cs4232_mpu (struct address_info *hw_config)
350 {
351
352 }
353
354
355 #endif