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