cmi8330.c (c95eadd2f1afd2ba643e85a8dfc9079a3f03ae47) cmi8330.c (48972cc5101dee24243c1b53d409cc27880e7a29)
1/*
2 * Driver for C-Media's CMI8330 soundcards.
3 * Copyright (c) by George Talusan <gstalusan@uwaterloo.ca>
4 * http://www.undergrad.math.uwaterloo.ca/~gstalusa
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 37 unchanged lines hidden (view full) ---

46#include <linux/init.h>
47#include <linux/err.h>
48#include <linux/isa.h>
49#include <linux/slab.h>
50#include <linux/pnp.h>
51#include <linux/moduleparam.h>
52#include <sound/core.h>
53#include <sound/wss.h>
1/*
2 * Driver for C-Media's CMI8330 soundcards.
3 * Copyright (c) by George Talusan <gstalusan@uwaterloo.ca>
4 * http://www.undergrad.math.uwaterloo.ca/~gstalusa
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 37 unchanged lines hidden (view full) ---

46#include <linux/init.h>
47#include <linux/err.h>
48#include <linux/isa.h>
49#include <linux/slab.h>
50#include <linux/pnp.h>
51#include <linux/moduleparam.h>
52#include <sound/core.h>
53#include <sound/wss.h>
54#include <sound/opl3.h>
54#include <sound/sb.h>
55#include <sound/initval.h>
56
57/*
58 */
59/* #define ENABLE_SB_MIXER */
60#define PLAYBACK_ON_SB
61

--- 12 unchanged lines hidden (view full) ---

74#endif
75static long sbport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
76static int sbirq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
77static int sbdma8[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
78static int sbdma16[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
79static long wssport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
80static int wssirq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
81static int wssdma[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
55#include <sound/sb.h>
56#include <sound/initval.h>
57
58/*
59 */
60/* #define ENABLE_SB_MIXER */
61#define PLAYBACK_ON_SB
62

--- 12 unchanged lines hidden (view full) ---

75#endif
76static long sbport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
77static int sbirq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
78static int sbdma8[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
79static int sbdma16[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
80static long wssport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
81static int wssirq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
82static int wssdma[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
83static long fmport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
82
83module_param_array(index, int, NULL, 0444);
84MODULE_PARM_DESC(index, "Index value for CMI8330 soundcard.");
85module_param_array(id, charp, NULL, 0444);
86MODULE_PARM_DESC(id, "ID string for CMI8330 soundcard.");
87module_param_array(enable, bool, NULL, 0444);
88MODULE_PARM_DESC(enable, "Enable CMI8330 soundcard.");
89#ifdef CONFIG_PNP

--- 12 unchanged lines hidden (view full) ---

102
103module_param_array(wssport, long, NULL, 0444);
104MODULE_PARM_DESC(wssport, "Port # for CMI8330 WSS driver.");
105module_param_array(wssirq, int, NULL, 0444);
106MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330 WSS driver.");
107module_param_array(wssdma, int, NULL, 0444);
108MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");
109
84
85module_param_array(index, int, NULL, 0444);
86MODULE_PARM_DESC(index, "Index value for CMI8330 soundcard.");
87module_param_array(id, charp, NULL, 0444);
88MODULE_PARM_DESC(id, "ID string for CMI8330 soundcard.");
89module_param_array(enable, bool, NULL, 0444);
90MODULE_PARM_DESC(enable, "Enable CMI8330 soundcard.");
91#ifdef CONFIG_PNP

--- 12 unchanged lines hidden (view full) ---

104
105module_param_array(wssport, long, NULL, 0444);
106MODULE_PARM_DESC(wssport, "Port # for CMI8330 WSS driver.");
107module_param_array(wssirq, int, NULL, 0444);
108MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330 WSS driver.");
109module_param_array(wssdma, int, NULL, 0444);
110MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");
111
112module_param_array(fmport, long, NULL, 0444);
113MODULE_PARM_DESC(fmport, "FM port # for CMI8330 driver.");
110#ifdef CONFIG_PNP
111static int isa_registered;
112static int pnp_registered;
113#endif
114
115#define CMI8330_RMUX3D 16
116#define CMI8330_MUTEMUX 17
117#define CMI8330_OUTPUTVOL 18

--- 96 unchanged lines hidden (view full) ---

214WSS_DOUBLE("Wavetable Capture Switch", 0,
215 CMI8330_RECMUX, CMI8330_RECMUX, 5, 4, 1, 0),
216WSS_DOUBLE("Wavetable Capture Volume", 0,
217 CMI8330_WAVGAIN, CMI8330_WAVGAIN, 4, 0, 15, 0),
218WSS_SINGLE("3D Control - Switch", 0,
219 CMI8330_RMUX3D, 5, 1, 1),
220WSS_SINGLE("PC Speaker Playback Volume", 0,
221 CMI8330_OUTPUTVOL, 3, 3, 0),
114#ifdef CONFIG_PNP
115static int isa_registered;
116static int pnp_registered;
117#endif
118
119#define CMI8330_RMUX3D 16
120#define CMI8330_MUTEMUX 17
121#define CMI8330_OUTPUTVOL 18

--- 96 unchanged lines hidden (view full) ---

218WSS_DOUBLE("Wavetable Capture Switch", 0,
219 CMI8330_RECMUX, CMI8330_RECMUX, 5, 4, 1, 0),
220WSS_DOUBLE("Wavetable Capture Volume", 0,
221 CMI8330_WAVGAIN, CMI8330_WAVGAIN, 4, 0, 15, 0),
222WSS_SINGLE("3D Control - Switch", 0,
223 CMI8330_RMUX3D, 5, 1, 1),
224WSS_SINGLE("PC Speaker Playback Volume", 0,
225 CMI8330_OUTPUTVOL, 3, 3, 0),
222WSS_SINGLE("FM Playback Switch", 0,
223 CMI8330_RECMUX, 3, 1, 1),
226WSS_DOUBLE("FM Playback Switch", 0,
227 CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 7, 7, 1, 1),
228WSS_DOUBLE("FM Playback Volume", 0,
229 CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 0, 0, 31, 1),
224WSS_SINGLE(SNDRV_CTL_NAME_IEC958("Input ", CAPTURE, SWITCH), 0,
225 CMI8330_RMUX3D, 7, 1, 1),
226WSS_SINGLE(SNDRV_CTL_NAME_IEC958("Input ", PLAYBACK, SWITCH), 0,
227 CMI8330_MUTEMUX, 7, 1, 1),
228};
229
230#ifdef ENABLE_SB_MIXER
231static struct sbmix_elem cmi8330_sb_mixers[] __devinitdata = {

--- 96 unchanged lines hidden (view full) ---

328 err = pnp_activate_dev(pdev);
329 if (err < 0) {
330 snd_printk(KERN_ERR "CMI8330/C3D (AD1848) PnP configure failure\n");
331 return -EBUSY;
332 }
333 wssport[dev] = pnp_port_start(pdev, 0);
334 wssdma[dev] = pnp_dma(pdev, 0);
335 wssirq[dev] = pnp_irq(pdev, 0);
230WSS_SINGLE(SNDRV_CTL_NAME_IEC958("Input ", CAPTURE, SWITCH), 0,
231 CMI8330_RMUX3D, 7, 1, 1),
232WSS_SINGLE(SNDRV_CTL_NAME_IEC958("Input ", PLAYBACK, SWITCH), 0,
233 CMI8330_MUTEMUX, 7, 1, 1),
234};
235
236#ifdef ENABLE_SB_MIXER
237static struct sbmix_elem cmi8330_sb_mixers[] __devinitdata = {

--- 96 unchanged lines hidden (view full) ---

334 err = pnp_activate_dev(pdev);
335 if (err < 0) {
336 snd_printk(KERN_ERR "CMI8330/C3D (AD1848) PnP configure failure\n");
337 return -EBUSY;
338 }
339 wssport[dev] = pnp_port_start(pdev, 0);
340 wssdma[dev] = pnp_dma(pdev, 0);
341 wssirq[dev] = pnp_irq(pdev, 0);
342 fmport[dev] = pnp_port_start(pdev, 1);
336
337 /* allocate SB16 resources */
338 pdev = acard->play;
339
340 err = pnp_activate_dev(pdev);
341 if (err < 0) {
342 snd_printk(KERN_ERR "CMI8330/C3D (SB16) PnP configure failure\n");
343 return -EBUSY;

--- 118 unchanged lines hidden (view full) ---

462#ifdef CONFIG_PNP
463#define is_isapnp_selected(dev) isapnp[dev]
464#else
465#define is_isapnp_selected(dev) 0
466#endif
467
468#define PFX "cmi8330: "
469
343
344 /* allocate SB16 resources */
345 pdev = acard->play;
346
347 err = pnp_activate_dev(pdev);
348 if (err < 0) {
349 snd_printk(KERN_ERR "CMI8330/C3D (SB16) PnP configure failure\n");
350 return -EBUSY;

--- 118 unchanged lines hidden (view full) ---

469#ifdef CONFIG_PNP
470#define is_isapnp_selected(dev) isapnp[dev]
471#else
472#define is_isapnp_selected(dev) 0
473#endif
474
475#define PFX "cmi8330: "
476
470static int snd_cmi8330_card_new(int dev, struct snd_card **cardp)
477static struct snd_card *snd_cmi8330_card_new(int dev)
471{
472 struct snd_card *card;
473 struct snd_cmi8330 *acard;
478{
479 struct snd_card *card;
480 struct snd_cmi8330 *acard;
474 int err;
475
481
476 err = snd_card_create(index[dev], id[dev], THIS_MODULE,
477 sizeof(struct snd_cmi8330), &card);
478 if (err < 0) {
482 card = snd_card_new(index[dev], id[dev], THIS_MODULE,
483 sizeof(struct snd_cmi8330));
484 if (card == NULL) {
479 snd_printk(KERN_ERR PFX "could not get a new card\n");
485 snd_printk(KERN_ERR PFX "could not get a new card\n");
480 return err;
486 return NULL;
481 }
482 acard = card->private_data;
483 acard->card = card;
487 }
488 acard = card->private_data;
489 acard->card = card;
484 *cardp = card;
485 return 0;
490 return card;
486}
487
488static int __devinit snd_cmi8330_probe(struct snd_card *card, int dev)
489{
490 struct snd_cmi8330 *acard;
491 int i, err;
491}
492
493static int __devinit snd_cmi8330_probe(struct snd_card *card, int dev)
494{
495 struct snd_cmi8330 *acard;
496 int i, err;
497 struct snd_opl3 *opl3;
492
493 acard = card->private_data;
494 err = snd_wss_create(card, wssport[dev] + 4, -1,
495 wssirq[dev],
496 wssdma[dev], -1,
497 WSS_HW_DETECT, 0, &acard->wss);
498 if (err < 0) {
499 snd_printk(KERN_ERR PFX "(AD1848) device busy??\n");

--- 27 unchanged lines hidden (view full) ---

527 snd_printk(KERN_ERR PFX "failed to create mixers\n");
528 return err;
529 }
530
531 if ((err = snd_cmi8330_pcm(card, acard)) < 0) {
532 snd_printk(KERN_ERR PFX "failed to create pcms\n");
533 return err;
534 }
498
499 acard = card->private_data;
500 err = snd_wss_create(card, wssport[dev] + 4, -1,
501 wssirq[dev],
502 wssdma[dev], -1,
503 WSS_HW_DETECT, 0, &acard->wss);
504 if (err < 0) {
505 snd_printk(KERN_ERR PFX "(AD1848) device busy??\n");

--- 27 unchanged lines hidden (view full) ---

533 snd_printk(KERN_ERR PFX "failed to create mixers\n");
534 return err;
535 }
536
537 if ((err = snd_cmi8330_pcm(card, acard)) < 0) {
538 snd_printk(KERN_ERR PFX "failed to create pcms\n");
539 return err;
540 }
541 if (fmport[dev] != SNDRV_AUTO_PORT) {
542 if (snd_opl3_create(card,
543 fmport[dev], fmport[dev] + 2,
544 OPL3_HW_AUTO, 0, &opl3) < 0) {
545 snd_printk(KERN_ERR PFX
546 "no OPL device at 0x%lx-0x%lx ?\n",
547 fmport[dev], fmport[dev] + 2);
548 } else {
549 err = snd_opl3_timer_new(opl3, 0, 1);
550 if (err < 0)
551 return err;
535
552
553 err = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
554 if (err < 0)
555 return err;
556 }
557 }
558
559
536 strcpy(card->driver, "CMI8330/C3D");
537 strcpy(card->shortname, "C-Media CMI8330/C3D");
538 sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
539 card->shortname,
540 acard->wss->port,
541 wssirq[dev],
542 wssdma[dev]);
543

--- 17 unchanged lines hidden (view full) ---

561}
562
563static int __devinit snd_cmi8330_isa_probe(struct device *pdev,
564 unsigned int dev)
565{
566 struct snd_card *card;
567 int err;
568
560 strcpy(card->driver, "CMI8330/C3D");
561 strcpy(card->shortname, "C-Media CMI8330/C3D");
562 sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
563 card->shortname,
564 acard->wss->port,
565 wssirq[dev],
566 wssdma[dev]);
567

--- 17 unchanged lines hidden (view full) ---

585}
586
587static int __devinit snd_cmi8330_isa_probe(struct device *pdev,
588 unsigned int dev)
589{
590 struct snd_card *card;
591 int err;
592
569 err = snd_cmi8330_card_new(dev, &card);
570 if (err < 0)
571 return err;
593 card = snd_cmi8330_card_new(dev);
594 if (! card)
595 return -ENOMEM;
572 snd_card_set_dev(card, pdev);
573 if ((err = snd_cmi8330_probe(card, dev)) < 0) {
574 snd_card_free(card);
575 return err;
576 }
577 dev_set_drvdata(pdev, card);
578 return 0;
579}

--- 45 unchanged lines hidden (view full) ---

625
626 for ( ; dev < SNDRV_CARDS; dev++) {
627 if (enable[dev] && isapnp[dev])
628 break;
629 }
630 if (dev >= SNDRV_CARDS)
631 return -ENODEV;
632
596 snd_card_set_dev(card, pdev);
597 if ((err = snd_cmi8330_probe(card, dev)) < 0) {
598 snd_card_free(card);
599 return err;
600 }
601 dev_set_drvdata(pdev, card);
602 return 0;
603}

--- 45 unchanged lines hidden (view full) ---

649
650 for ( ; dev < SNDRV_CARDS; dev++) {
651 if (enable[dev] && isapnp[dev])
652 break;
653 }
654 if (dev >= SNDRV_CARDS)
655 return -ENODEV;
656
633 res = snd_cmi8330_card_new(dev, &card);
634 if (res < 0)
635 return res;
657 card = snd_cmi8330_card_new(dev);
658 if (! card)
659 return -ENOMEM;
636 if ((res = snd_cmi8330_pnp(dev, card->private_data, pcard, pid)) < 0) {
637 snd_printk(KERN_ERR PFX "PnP detection failed\n");
638 snd_card_free(card);
639 return res;
640 }
641 snd_card_set_dev(card, &pcard->card->dev);
642 if ((res = snd_cmi8330_probe(card, dev)) < 0) {
643 snd_card_free(card);

--- 70 unchanged lines hidden ---
660 if ((res = snd_cmi8330_pnp(dev, card->private_data, pcard, pid)) < 0) {
661 snd_printk(KERN_ERR PFX "PnP detection failed\n");
662 snd_card_free(card);
663 return res;
664 }
665 snd_card_set_dev(card, &pcard->card->dev);
666 if ((res = snd_cmi8330_probe(card, dev)) < 0) {
667 snd_card_free(card);

--- 70 unchanged lines hidden ---