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 --- |