1 diff -u linux-2.4.22/drivers/sound/btaudio.c linux/drivers/sound/btaudio.c
2 --- linux-2.4.22/drivers/sound/btaudio.c 2003-09-08 17:26:58.000000000 +0200
3 +++ linux/drivers/sound/btaudio.c 2003-09-08 17:30:22.000000000 +0200
6 - btaudio - bt878 audio dma driver for linux 2.4.x
7 + btaudio - bt878 audio dma driver for linux 2.4 / 2.5
9 - (c) 2000-2002 Gerd Knorr <kraxel@bytesex.org>
10 + (c) 2000-2003 Gerd Knorr <kraxel@bytesex.org>
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
18 -#include <linux/version.h>
19 #include <linux/module.h>
20 #include <linux/errno.h>
21 #include <linux/pci.h>
22 #include <linux/sched.h>
23 #include <linux/signal.h>
24 #include <linux/types.h>
25 -#include <linux/wrapper.h>
26 #include <linux/interrupt.h>
27 #include <linux/init.h>
28 #include <linux/poll.h>
30 #include <asm/uaccess.h>
33 +# define irqreturn_t void
34 +# define IRQ_RETVAL(foobar)
35 +# define strlcpy(dest,src,len) strncpy(dest,src,(len)-1)
38 #define btwrite(dat,adr) writel((dat), (bta->mmio+(adr)))
43 -static struct btaudio *btaudios = NULL;
44 -static unsigned int debug = 0;
45 -static unsigned int irq_debug = 0;
46 +static struct btaudio *btaudios = NULL;
47 +static unsigned int btcount = 0;
48 +static unsigned int debug = 0;
49 +static unsigned int irq_debug = 0;
51 /* -------------------------------------------------------------- */
53 #define BUF_DEFAULT 128*1024
56 +static void free_buffer(struct btaudio *bta)
58 + if (NULL != bta->buf_cpu) {
59 + pci_free_consistent(bta->pci, bta->buf_size,
60 + bta->buf_cpu, bta->buf_dma);
61 + bta->buf_cpu = NULL;
63 + if (NULL != bta->risc_cpu) {
64 + pci_free_consistent(bta->pci, bta->risc_size,
65 + bta->risc_cpu, bta->risc_dma);
66 + bta->risc_cpu = NULL;
70 static int alloc_buffer(struct btaudio *bta)
72 if (NULL == bta->buf_cpu) {
76 if (NULL == bta->buf_cpu)
79 memset(bta->buf_cpu,0,bta->buf_size);
81 if (NULL == bta->risc_cpu) {
83 bta->risc_cpu = pci_alloc_consistent
84 (bta->pci, bta->risc_size, &bta->risc_dma);
85 if (NULL == bta->risc_cpu)
92 -static void free_buffer(struct btaudio *bta)
94 - if (NULL != bta->buf_cpu) {
95 - pci_free_consistent(bta->pci, bta->buf_size,
96 - bta->buf_cpu, bta->buf_dma);
97 - bta->buf_cpu = NULL;
99 - if (NULL != bta->risc_cpu) {
100 - pci_free_consistent(bta->pci, bta->risc_size,
101 - bta->risc_cpu, bta->risc_dma);
102 - bta->risc_cpu = NULL;
109 static int make_risc(struct btaudio *bta)
111 if (cmd == SOUND_MIXER_INFO) {
113 memset(&info,0,sizeof(info));
114 - strncpy(info.id,"bt878",sizeof(info.id)-1);
115 - strncpy(info.name,"Brooktree Bt878 audio",sizeof(info.name)-1);
116 + strlcpy(info.id,"bt878",sizeof(info.id));
117 + strlcpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
118 info.modify_counter = bta->mixcount;
119 if (copy_to_user((void *)arg, &info, sizeof(info)))
122 if (cmd == SOUND_OLD_MIXER_INFO) {
123 _old_mixer_info info;
124 memset(&info,0,sizeof(info));
125 - strncpy(info.id,"bt878",sizeof(info.id)-1);
126 - strncpy(info.name,"Brooktree Bt878 audio",sizeof(info.name)-1);
127 + strlcpy(info.id,"bt878",sizeof(info.id));
128 + strlcpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
129 if (copy_to_user((void *)arg, &info, sizeof(info)))
132 @@ -426,11 +432,11 @@
135 static struct file_operations btaudio_mixer_fops = {
136 - owner: THIS_MODULE,
138 - open: btaudio_mixer_open,
139 - release: btaudio_mixer_release,
140 - ioctl: btaudio_mixer_ioctl,
141 + .owner = THIS_MODULE,
142 + .llseek = no_llseek,
143 + .open = btaudio_mixer_open,
144 + .release = btaudio_mixer_release,
145 + .ioctl = btaudio_mixer_ioctl,
148 /* -------------------------------------------------------------- */
149 @@ -791,25 +797,25 @@
152 static struct file_operations btaudio_digital_dsp_fops = {
153 - owner: THIS_MODULE,
155 - open: btaudio_dsp_open_digital,
156 - release: btaudio_dsp_release,
157 - read: btaudio_dsp_read,
158 - write: btaudio_dsp_write,
159 - ioctl: btaudio_dsp_ioctl,
160 - poll: btaudio_dsp_poll,
161 + .owner = THIS_MODULE,
162 + .llseek = no_llseek,
163 + .open = btaudio_dsp_open_digital,
164 + .release = btaudio_dsp_release,
165 + .read = btaudio_dsp_read,
166 + .write = btaudio_dsp_write,
167 + .ioctl = btaudio_dsp_ioctl,
168 + .poll = btaudio_dsp_poll,
171 static struct file_operations btaudio_analog_dsp_fops = {
172 - owner: THIS_MODULE,
174 - open: btaudio_dsp_open_analog,
175 - release: btaudio_dsp_release,
176 - read: btaudio_dsp_read,
177 - write: btaudio_dsp_write,
178 - ioctl: btaudio_dsp_ioctl,
179 - poll: btaudio_dsp_poll,
180 + .owner = THIS_MODULE,
181 + .llseek = no_llseek,
182 + .open = btaudio_dsp_open_analog,
183 + .release = btaudio_dsp_release,
184 + .read = btaudio_dsp_read,
185 + .write = btaudio_dsp_write,
186 + .ioctl = btaudio_dsp_ioctl,
187 + .poll = btaudio_dsp_poll,
190 /* -------------------------------------------------------------- */
191 @@ -818,18 +824,20 @@
192 "RISCI", "FBUS", "FTRGT", "FDSR", "PPERR",
193 "RIPERR", "PABORT", "OCERR", "SCERR" };
195 -static void btaudio_irq(int irq, void *dev_id, struct pt_regs * regs)
196 +static irqreturn_t btaudio_irq(int irq, void *dev_id, struct pt_regs * regs)
200 struct btaudio *bta = dev_id;
205 stat = btread(REG_INT_STAT);
206 astat = stat & btread(REG_INT_MASK);
211 btwrite(astat,REG_INT_STAT);
214 @@ -865,29 +873,31 @@
215 btwrite(0, REG_INT_MASK);
219 + return IRQ_RETVAL(handled);
222 /* -------------------------------------------------------------- */
224 -static unsigned int dsp1 = -1;
225 -static unsigned int dsp2 = -1;
226 -static unsigned int mixer = -1;
227 +#define BTAUDIO_MAX 16
229 +static unsigned int dsp1[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = -1 };
230 +static unsigned int dsp2[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = -1 };
231 +static unsigned int mixer[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = -1 };
232 +static int digital[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = 1 };
233 +static int analog[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = 1 };
234 +static int rate[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = 0 };
235 static int latency = -1;
236 -static int digital = 1;
237 -static int analog = 1;
238 -static int rate = 0;
240 #define BTA_OSPREY200 1
242 static struct cardinfo cards[] = {
250 - name: "Osprey 200",
252 + .name = "Osprey 200",
258 unsigned char revision,lat;
261 + if (BTAUDIO_MAX == btcount)
264 if (pci_enable_device(pci_dev))
266 if (!request_mem_region(pci_resource_start(pci_dev,0),
270 bta->rate = card->rate;
274 + bta->rate = rate[btcount];
276 init_MUTEX(&bta->lock);
277 init_waitqueue_head(&bta->readq);
280 btwrite(0, REG_GPIO_DMA_CTL);
281 btwrite(0, REG_INT_MASK);
282 - btwrite(~0x0UL, REG_INT_STAT);
283 + btwrite(~(u32)0, REG_INT_STAT);
284 pci_set_master(pci_dev);
286 if ((rc = request_irq(bta->irq, btaudio_irq, SA_SHIRQ|SA_INTERRUPT,
290 /* register devices */
292 + if (digital[btcount]) {
293 rc = bta->dsp_digital =
294 - register_sound_dsp(&btaudio_digital_dsp_fops,dsp1);
295 + register_sound_dsp(&btaudio_digital_dsp_fops,dsp1[btcount]);
298 "btaudio: can't register digital dsp (rc=%d)\n",rc);
300 printk(KERN_INFO "btaudio: registered device dsp%d [digital]\n",
301 bta->dsp_digital >> 4);
304 + if (analog[btcount]) {
305 rc = bta->dsp_analog =
306 - register_sound_dsp(&btaudio_analog_dsp_fops,dsp2);
307 + register_sound_dsp(&btaudio_analog_dsp_fops,dsp2[btcount]);
310 "btaudio: can't register analog dsp (rc=%d)\n",rc);
313 printk(KERN_INFO "btaudio: registered device dsp%d [analog]\n",
314 bta->dsp_analog >> 4);
315 - rc = bta->mixer_dev = register_sound_mixer(&btaudio_mixer_fops,mixer);
316 + rc = bta->mixer_dev = register_sound_mixer(&btaudio_mixer_fops,
320 "btaudio: can't register mixer (rc=%d)\n",rc);
321 @@ -1000,6 +1014,7 @@
322 /* hook into linked list */
323 bta->next = btaudios;
327 pci_set_drvdata(pci_dev,bta);
329 @@ -1027,7 +1042,7 @@
330 /* turn off all DMA / IRQs */
331 btand(~15, REG_GPIO_DMA_CTL);
332 btwrite(0, REG_INT_MASK);
333 - btwrite(~0x0UL, REG_INT_STAT);
334 + btwrite(~(u32)0, REG_INT_STAT);
336 /* unregister devices */
338 @@ -1052,6 +1067,7 @@
339 ; /* if (NULL == walk->next) BUG(); */
340 walk->next = bta->next;
344 pci_set_drvdata(pci_dev, NULL);
346 @@ -1060,33 +1076,33 @@
348 /* -------------------------------------------------------------- */
350 -static struct pci_device_id btaudio_pci_tbl[] __devinitdata = {
351 +static struct pci_device_id btaudio_pci_tbl[] = {
353 - vendor: PCI_VENDOR_ID_BROOKTREE,
357 - driver_data: BTA_OSPREY200,
358 + .vendor = PCI_VENDOR_ID_BROOKTREE,
360 + .subvendor = 0x0070,
361 + .subdevice = 0xff01,
362 + .driver_data = BTA_OSPREY200,
364 - vendor: PCI_VENDOR_ID_BROOKTREE,
366 - subvendor: PCI_ANY_ID,
367 - subdevice: PCI_ANY_ID,
368 + .vendor = PCI_VENDOR_ID_BROOKTREE,
370 + .subvendor = PCI_ANY_ID,
371 + .subdevice = PCI_ANY_ID,
373 - vendor: PCI_VENDOR_ID_BROOKTREE,
375 - subvendor: PCI_ANY_ID,
376 - subdevice: PCI_ANY_ID,
377 + .vendor = PCI_VENDOR_ID_BROOKTREE,
379 + .subvendor = PCI_ANY_ID,
380 + .subdevice = PCI_ANY_ID,
382 /* --- end of list --- */
386 static struct pci_driver btaudio_pci_driver = {
388 - id_table: btaudio_pci_tbl,
389 - probe: btaudio_probe,
390 - remove: __devexit_p(btaudio_remove),
392 + .id_table = btaudio_pci_tbl,
393 + .probe = btaudio_probe,
394 + .remove = __devexit_p(btaudio_remove),
397 static int btaudio_init_module(void)
398 @@ -1107,15 +1123,21 @@
399 module_init(btaudio_init_module);
400 module_exit(btaudio_cleanup_module);
402 -MODULE_PARM(dsp1,"i");
403 -MODULE_PARM(dsp2,"i");
404 -MODULE_PARM(mixer,"i");
405 -MODULE_PARM(debug,"i");
406 -MODULE_PARM(irq_debug,"i");
407 -MODULE_PARM(digital,"i");
408 -MODULE_PARM(analog,"i");
409 -MODULE_PARM(rate,"i");
410 -MODULE_PARM(latency,"i");
411 +MODULE_PARM(dsp1, "1-" __stringify(BTAUDIO_MAX) "i");
412 +MODULE_PARM_DESC(dsp1,"digital dsp nr");
413 +MODULE_PARM(dsp2, "1-" __stringify(BTAUDIO_MAX) "i");
414 +MODULE_PARM_DESC(dsp2,"analog dsp nr");
415 +MODULE_PARM(mixer, "1-" __stringify(BTAUDIO_MAX) "i");
416 +MODULE_PARM_DESC(mixer,"mixer nr");
417 +MODULE_PARM(debug, "i");
418 +MODULE_PARM(irq_debug, "i");
419 +MODULE_PARM(digital, "1-" __stringify(BTAUDIO_MAX) "i");
420 +MODULE_PARM_DESC(digital,"register digital dsp device");
421 +MODULE_PARM(analog, "1-" __stringify(BTAUDIO_MAX) "i");
422 +MODULE_PARM_DESC(analog,"register analog dsp device (and mixer)");
423 +MODULE_PARM(rate, "1-" __stringify(BTAUDIO_MAX) "i");
424 +MODULE_PARM_DESC(rate,"sample rate supported by the hardware");
425 +MODULE_PARM(latency, "i");
426 MODULE_PARM_DESC(latency,"pci latency timer");
428 MODULE_DEVICE_TABLE(pci, btaudio_pci_tbl);