2 diff -u linux-2.4.23-pre7/drivers/sound/btaudio.c linux/drivers/sound/btaudio.c
3 --- linux-2.4.23-pre7/drivers/sound/btaudio.c 2003-10-10 13:36:01.413814360 +0200
4 +++ linux/drivers/sound/btaudio.c 2003-10-10 15:04:24.120070522 +0200
7 - btaudio - bt878 audio dma driver for linux 2.4.x
8 + btaudio - bt878 audio dma driver for linux 2.4 / 2.5
10 - (c) 2000-2002 Gerd Knorr <kraxel@bytesex.org>
11 + (c) 2000-2003 Gerd Knorr <kraxel@bytesex.org>
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
19 -#include <linux/version.h>
20 #include <linux/module.h>
21 #include <linux/errno.h>
22 #include <linux/pci.h>
23 #include <linux/sched.h>
24 #include <linux/signal.h>
25 #include <linux/types.h>
26 -#include <linux/wrapper.h>
27 #include <linux/interrupt.h>
28 #include <linux/init.h>
29 #include <linux/poll.h>
31 #include <asm/uaccess.h>
34 +# define strlcpy(dest,src,len) strncpy(dest,src,(len)-1)
35 +# define iminor(inode) minor(inode->i_rdev)
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)
112 static int btaudio_mixer_open(struct inode *inode, struct file *file)
114 - int minor = minor(inode->i_rdev);
115 + int minor = iminor(inode);
118 for (bta = btaudios; bta != NULL; bta = bta->next)
120 if (cmd == SOUND_MIXER_INFO) {
122 memset(&info,0,sizeof(info));
123 - strncpy(info.id,"bt878",sizeof(info.id)-1);
124 - strncpy(info.name,"Brooktree Bt878 audio",sizeof(info.name)-1);
125 + strlcpy(info.id,"bt878",sizeof(info.id));
126 + strlcpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
127 info.modify_counter = bta->mixcount;
128 if (copy_to_user((void *)arg, &info, sizeof(info)))
131 if (cmd == SOUND_OLD_MIXER_INFO) {
132 _old_mixer_info info;
133 memset(&info,0,sizeof(info));
134 - strncpy(info.id,"bt878",sizeof(info.id)-1);
135 - strncpy(info.name,"Brooktree Bt878 audio",sizeof(info.name)-1);
136 + strlcpy(info.id,"bt878",sizeof(info.id));
137 + strlcpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
138 if (copy_to_user((void *)arg, &info, sizeof(info)))
141 @@ -426,11 +431,11 @@
144 static struct file_operations btaudio_mixer_fops = {
145 - owner: THIS_MODULE,
147 - open: btaudio_mixer_open,
148 - release: btaudio_mixer_release,
149 - ioctl: btaudio_mixer_ioctl,
150 + .owner = THIS_MODULE,
151 + .llseek = no_llseek,
152 + .open = btaudio_mixer_open,
153 + .release = btaudio_mixer_release,
154 + .ioctl = btaudio_mixer_ioctl,
157 /* -------------------------------------------------------------- */
160 static int btaudio_dsp_open_digital(struct inode *inode, struct file *file)
162 - int minor = minor(inode->i_rdev);
163 + int minor = iminor(inode);
166 for (bta = btaudios; bta != NULL; bta = bta->next)
169 static int btaudio_dsp_open_analog(struct inode *inode, struct file *file)
171 - int minor = minor(inode->i_rdev);
172 + int minor = iminor(inode);
175 for (bta = btaudios; bta != NULL; bta = bta->next)
176 @@ -791,25 +796,25 @@
179 static struct file_operations btaudio_digital_dsp_fops = {
180 - owner: THIS_MODULE,
182 - open: btaudio_dsp_open_digital,
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,
188 + .owner = THIS_MODULE,
189 + .llseek = no_llseek,
190 + .open = btaudio_dsp_open_digital,
191 + .release = btaudio_dsp_release,
192 + .read = btaudio_dsp_read,
193 + .write = btaudio_dsp_write,
194 + .ioctl = btaudio_dsp_ioctl,
195 + .poll = btaudio_dsp_poll,
198 static struct file_operations btaudio_analog_dsp_fops = {
199 - owner: THIS_MODULE,
201 - open: btaudio_dsp_open_analog,
202 - release: btaudio_dsp_release,
203 - read: btaudio_dsp_read,
204 - write: btaudio_dsp_write,
205 - ioctl: btaudio_dsp_ioctl,
206 - poll: btaudio_dsp_poll,
207 + .owner = THIS_MODULE,
208 + .llseek = no_llseek,
209 + .open = btaudio_dsp_open_analog,
210 + .release = btaudio_dsp_release,
211 + .read = btaudio_dsp_read,
212 + .write = btaudio_dsp_write,
213 + .ioctl = btaudio_dsp_ioctl,
214 + .poll = btaudio_dsp_poll,
217 /* -------------------------------------------------------------- */
218 @@ -818,18 +823,20 @@
219 "RISCI", "FBUS", "FTRGT", "FDSR", "PPERR",
220 "RIPERR", "PABORT", "OCERR", "SCERR" };
222 -static void btaudio_irq(int irq, void *dev_id, struct pt_regs * regs)
223 +static irqreturn_t btaudio_irq(int irq, void *dev_id, struct pt_regs * regs)
227 struct btaudio *bta = dev_id;
232 stat = btread(REG_INT_STAT);
233 astat = stat & btread(REG_INT_MASK);
238 btwrite(astat,REG_INT_STAT);
241 @@ -865,29 +872,31 @@
242 btwrite(0, REG_INT_MASK);
246 + return IRQ_RETVAL(handled);
249 /* -------------------------------------------------------------- */
251 -static unsigned int dsp1 = -1;
252 -static unsigned int dsp2 = -1;
253 -static unsigned int mixer = -1;
254 +#define BTAUDIO_MAX 16
256 +static unsigned int dsp1[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = -1 };
257 +static unsigned int dsp2[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = -1 };
258 +static unsigned int mixer[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = -1 };
259 +static int digital[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = 1 };
260 +static int analog[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = 1 };
261 +static int rate[BTAUDIO_MAX] = { [ 0 ... BTAUDIO_MAX-1 ] = 0 };
262 static int latency = -1;
263 -static int digital = 1;
264 -static int analog = 1;
265 -static int rate = 0;
267 #define BTA_OSPREY200 1
269 static struct cardinfo cards[] = {
277 - name: "Osprey 200",
279 + .name = "Osprey 200",
285 unsigned char revision,lat;
288 + if (BTAUDIO_MAX == btcount)
291 if (pci_enable_device(pci_dev))
293 if (!request_mem_region(pci_resource_start(pci_dev,0),
297 bta->rate = card->rate;
301 + bta->rate = rate[btcount];
303 init_MUTEX(&bta->lock);
304 init_waitqueue_head(&bta->readq);
307 btwrite(0, REG_GPIO_DMA_CTL);
308 btwrite(0, REG_INT_MASK);
309 - btwrite(~0x0UL, REG_INT_STAT);
310 + btwrite(~(u32)0, REG_INT_STAT);
311 pci_set_master(pci_dev);
313 if ((rc = request_irq(bta->irq, btaudio_irq, SA_SHIRQ|SA_INTERRUPT,
317 /* register devices */
319 + if (digital[btcount]) {
320 rc = bta->dsp_digital =
321 - register_sound_dsp(&btaudio_digital_dsp_fops,dsp1);
322 + register_sound_dsp(&btaudio_digital_dsp_fops,dsp1[btcount]);
325 "btaudio: can't register digital dsp (rc=%d)\n",rc);
327 printk(KERN_INFO "btaudio: registered device dsp%d [digital]\n",
328 bta->dsp_digital >> 4);
331 + if (analog[btcount]) {
332 rc = bta->dsp_analog =
333 - register_sound_dsp(&btaudio_analog_dsp_fops,dsp2);
334 + register_sound_dsp(&btaudio_analog_dsp_fops,dsp2[btcount]);
337 "btaudio: can't register analog dsp (rc=%d)\n",rc);
340 printk(KERN_INFO "btaudio: registered device dsp%d [analog]\n",
341 bta->dsp_analog >> 4);
342 - rc = bta->mixer_dev = register_sound_mixer(&btaudio_mixer_fops,mixer);
343 + rc = bta->mixer_dev = register_sound_mixer(&btaudio_mixer_fops,
347 "btaudio: can't register mixer (rc=%d)\n",rc);
348 @@ -1000,6 +1013,7 @@
349 /* hook into linked list */
350 bta->next = btaudios;
354 pci_set_drvdata(pci_dev,bta);
356 @@ -1027,7 +1041,7 @@
357 /* turn off all DMA / IRQs */
358 btand(~15, REG_GPIO_DMA_CTL);
359 btwrite(0, REG_INT_MASK);
360 - btwrite(~0x0UL, REG_INT_STAT);
361 + btwrite(~(u32)0, REG_INT_STAT);
363 /* unregister devices */
365 @@ -1052,6 +1066,7 @@
366 ; /* if (NULL == walk->next) BUG(); */
367 walk->next = bta->next;
371 pci_set_drvdata(pci_dev, NULL);
373 @@ -1060,33 +1075,33 @@
375 /* -------------------------------------------------------------- */
377 -static struct pci_device_id btaudio_pci_tbl[] __devinitdata = {
378 +static struct pci_device_id btaudio_pci_tbl[] = {
380 - vendor: PCI_VENDOR_ID_BROOKTREE,
384 - driver_data: BTA_OSPREY200,
385 + .vendor = PCI_VENDOR_ID_BROOKTREE,
387 + .subvendor = 0x0070,
388 + .subdevice = 0xff01,
389 + .driver_data = BTA_OSPREY200,
391 - vendor: PCI_VENDOR_ID_BROOKTREE,
393 - subvendor: PCI_ANY_ID,
394 - subdevice: PCI_ANY_ID,
395 + .vendor = PCI_VENDOR_ID_BROOKTREE,
397 + .subvendor = PCI_ANY_ID,
398 + .subdevice = PCI_ANY_ID,
400 - vendor: PCI_VENDOR_ID_BROOKTREE,
402 - subvendor: PCI_ANY_ID,
403 - subdevice: PCI_ANY_ID,
404 + .vendor = PCI_VENDOR_ID_BROOKTREE,
406 + .subvendor = PCI_ANY_ID,
407 + .subdevice = PCI_ANY_ID,
409 /* --- end of list --- */
413 static struct pci_driver btaudio_pci_driver = {
415 - id_table: btaudio_pci_tbl,
416 - probe: btaudio_probe,
417 - remove: __devexit_p(btaudio_remove),
419 + .id_table = btaudio_pci_tbl,
420 + .probe = btaudio_probe,
421 + .remove = __devexit_p(btaudio_remove),
424 static int btaudio_init_module(void)
425 @@ -1107,15 +1122,21 @@
426 module_init(btaudio_init_module);
427 module_exit(btaudio_cleanup_module);
429 -MODULE_PARM(dsp1,"i");
430 -MODULE_PARM(dsp2,"i");
431 -MODULE_PARM(mixer,"i");
432 -MODULE_PARM(debug,"i");
433 -MODULE_PARM(irq_debug,"i");
434 -MODULE_PARM(digital,"i");
435 -MODULE_PARM(analog,"i");
436 -MODULE_PARM(rate,"i");
437 -MODULE_PARM(latency,"i");
438 +MODULE_PARM(dsp1, "1-" __stringify(BTAUDIO_MAX) "i");
439 +MODULE_PARM_DESC(dsp1,"digital dsp nr");
440 +MODULE_PARM(dsp2, "1-" __stringify(BTAUDIO_MAX) "i");
441 +MODULE_PARM_DESC(dsp2,"analog dsp nr");
442 +MODULE_PARM(mixer, "1-" __stringify(BTAUDIO_MAX) "i");
443 +MODULE_PARM_DESC(mixer,"mixer nr");
444 +MODULE_PARM(debug, "i");
445 +MODULE_PARM(irq_debug, "i");
446 +MODULE_PARM(digital, "1-" __stringify(BTAUDIO_MAX) "i");
447 +MODULE_PARM_DESC(digital,"register digital dsp device");
448 +MODULE_PARM(analog, "1-" __stringify(BTAUDIO_MAX) "i");
449 +MODULE_PARM_DESC(analog,"register analog dsp device (and mixer)");
450 +MODULE_PARM(rate, "1-" __stringify(BTAUDIO_MAX) "i");
451 +MODULE_PARM_DESC(rate,"sample rate supported by the hardware");
452 +MODULE_PARM(latency, "i");
453 MODULE_PARM_DESC(latency,"pci latency timer");
455 MODULE_DEVICE_TABLE(pci, btaudio_pci_tbl);