Ignore:
Timestamp:
Oct 8, 2009, 10:35:00 AM (16 years ago)
Author:
Paul Smedley
Message:

Update ALSA kernel to 1.0.21 level

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GPL/trunk/alsa-kernel/isa/cmi8330.c

    r426 r464  
    11/*
    2  *  Driver for C-Media's CMI8330 soundcards.
     2 *  Driver for C-Media's CMI8330 and CMI8329 soundcards.
    33 *  Copyright (c) by George Talusan <gstalusan@uwaterloo.ca>
    44 *    http://www.undergrad.math.uwaterloo.ca/~gstalusa
     
    3636 *  This card has two mixers and two PCM devices.  I've cheesed it such
    3737 *  that recording and playback can be done through the same device.
    38  *  The driver "magically" routes the capturing to the CMI8330 codec,
     38 *  The driver "magically" routes the capturing to the AD1848 codec,
    3939 *  and playback to the SB16 codec.  This allows for full-duplex mode
    4040 *  to some extent.
     
    6565 */
    6666MODULE_AUTHOR("George Talusan <gstalusan@uwaterloo.ca>");
    67 MODULE_DESCRIPTION("C-Media CMI8330");
     67MODULE_DESCRIPTION("C-Media CMI8330/CMI8329");
    6868MODULE_LICENSE("GPL");
    6969MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8330,isapnp:{CMI0001,@@@0001,@X@0001}}}");
     
    8787
    8888module_param_array(index, int, NULL, 0444);
    89 MODULE_PARM_DESC(index, "Index value for CMI8330 soundcard.");
     89MODULE_PARM_DESC(index, "Index value for CMI8330/CMI8329 soundcard.");
    9090module_param_array(id, charp, NULL, 0444);
    91 MODULE_PARM_DESC(id, "ID string  for CMI8330 soundcard.");
     91MODULE_PARM_DESC(id, "ID string  for CMI8330/CMI8329 soundcard.");
    9292module_param_array(enable, bool, NULL, 0444);
    93 MODULE_PARM_DESC(enable, "Enable CMI8330 soundcard.");
     93MODULE_PARM_DESC(enable, "Enable CMI8330/CMI8329 soundcard.");
    9494#ifdef CONFIG_PNP
    9595module_param_array(isapnp, bool, NULL, 0444);
     
    9898
    9999module_param_array(sbport, long, NULL, 0444);
    100 MODULE_PARM_DESC(sbport, "Port # for CMI8330 SB driver.");
     100MODULE_PARM_DESC(sbport, "Port # for CMI8330/CMI8329 SB driver.");
    101101module_param_array(sbirq, int, NULL, 0444);
    102 MODULE_PARM_DESC(sbirq, "IRQ # for CMI8330 SB driver.");
     102MODULE_PARM_DESC(sbirq, "IRQ # for CMI8330/CMI8329 SB driver.");
    103103module_param_array(sbdma8, int, NULL, 0444);
    104 MODULE_PARM_DESC(sbdma8, "DMA8 for CMI8330 SB driver.");
     104MODULE_PARM_DESC(sbdma8, "DMA8 for CMI8330/CMI8329 SB driver.");
    105105module_param_array(sbdma16, int, NULL, 0444);
    106 MODULE_PARM_DESC(sbdma16, "DMA16 for CMI8330 SB driver.");
     106MODULE_PARM_DESC(sbdma16, "DMA16 for CMI8330/CMI8329 SB driver.");
    107107
    108108module_param_array(wssport, long, NULL, 0444);
    109 MODULE_PARM_DESC(wssport, "Port # for CMI8330 WSS driver.");
     109MODULE_PARM_DESC(wssport, "Port # for CMI8330/CMI8329 WSS driver.");
    110110module_param_array(wssirq, int, NULL, 0444);
    111 MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330 WSS driver.");
     111MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330/CMI8329 WSS driver.");
    112112module_param_array(wssdma, int, NULL, 0444);
    113 MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");
     113MODULE_PARM_DESC(wssdma, "DMA for CMI8330/CMI8329 WSS driver.");
    114114
    115115module_param_array(fmport, long, NULL, 0444);
    116 MODULE_PARM_DESC(fmport, "FM port # for CMI8330 driver.");
     116MODULE_PARM_DESC(fmport, "FM port # for CMI8330/CMI8329 driver.");
    117117module_param_array(mpuport, long, NULL, 0444);
    118 MODULE_PARM_DESC(mpuport, "MPU-401 port # for CMI8330 driver.");
     118MODULE_PARM_DESC(mpuport, "MPU-401 port # for CMI8330/CMI8329 driver.");
    119119module_param_array(mpuirq, int, NULL, 0444);
    120 MODULE_PARM_DESC(mpuirq, "IRQ # for CMI8330 MPU-401 port.");
     120MODULE_PARM_DESC(mpuirq, "IRQ # for CMI8330/CMI8329 MPU-401 port.");
    121121#ifdef CONFIG_PNP
    122122static int isa_registered;
     
    157157typedef int (*snd_pcm_open_callback_t)(struct snd_pcm_substream *);
    158158
     159enum card_type {
     160        CMI8330,
     161        CMI8329
     162};
     163
    159164struct snd_cmi8330 {
    160165#ifdef CONFIG_PNP
     
    173178                void *private_data; /* sb or wss */
    174179        } streams[2];
     180
     181        enum card_type type;
    175182};
    176183
     
    178185
    179186static struct pnp_card_device_id snd_cmi8330_pnpids[] = {
     187        { .id = "CMI0001", .devs = { { "@X@0001" }, { "@@@0001" }, { "@H@0001" }, { "A@@0001" } } },
    180188        { .id = "CMI0001", .devs = { { "@@@0001" }, { "@X@0001" }, { "@H@0001" } } },
    181189        { .id = "" }
     
    305313        int err;
    306314
    307         strcpy(card->mixername, "CMI8330/C3D");
     315        strcpy(card->mixername, (acard->type == CMI8329) ? "CMI8329" : "CMI8330/C3D");
    308316
    309317        for (idx = 0; idx < ARRAY_SIZE(snd_cmi8330_controls); idx++) {
     
    330338        int err;
    331339
     340        /* CMI8329 has a device with ID A@@0001, CMI8330 does not */
     341        acard->type = (id->devs[3].id[0]) ? CMI8329 : CMI8330;
     342
    332343        acard->cap = pnp_request_card_device(card, id->devs[0].id, NULL);
    333344        if (acard->cap == NULL)
     
    339350
    340351        acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL);
    341         if (acard->play == NULL)
     352        if (acard->mpu == NULL)
    342353                return -EBUSY;
    343354
     
    346357        err = pnp_activate_dev(pdev);
    347358        if (err < 0) {
    348                 snd_printk(KERN_ERR "CMI8330/C3D PnP configure failure\n");
     359                snd_printk(KERN_ERR "AD1848 PnP configure failure\n");
    349360                return -EBUSY;
    350361        }
     
    352363        wssdma[dev] = pnp_dma(pdev, 0);
    353364        wssirq[dev] = pnp_irq(pdev, 0);
    354         fmport[dev] = pnp_port_start(pdev, 1);
     365        if (pnp_port_start(pdev, 1))
     366                fmport[dev] = pnp_port_start(pdev, 1);
    355367
    356368        /* allocate SB16 resources */
     
    359371        err = pnp_activate_dev(pdev);
    360372        if (err < 0) {
    361                 snd_printk(KERN_ERR "CMI8330/C3D (SB16) PnP configure failure\n");
     373                snd_printk(KERN_ERR "SB16 PnP configure failure\n");
    362374                return -EBUSY;
    363375        }
     
    366378        sbdma16[dev] = pnp_dma(pdev, 1);
    367379        sbirq[dev] = pnp_irq(pdev, 0);
     380        /* On CMI8239, the OPL3 port might be present in SB16 PnP resources */
     381        if (fmport[dev] == SNDRV_AUTO_PORT) {
     382                if (pnp_port_start(pdev, 1))
     383                        fmport[dev] = pnp_port_start(pdev, 1);
     384                else
     385                        fmport[dev] = 0x388;    /* Or hardwired */
     386        }
    368387
    369388        /* allocate MPU-401 resources */
     
    371390
    372391        err = pnp_activate_dev(pdev);
    373         if (err < 0) {
    374                 snd_printk(KERN_ERR
    375                            "CMI8330/C3D (MPU-401) PnP configure failure\n");
    376                 return -EBUSY;
    377         }
    378         mpuport[dev] = pnp_port_start(pdev, 0);
    379         mpuirq[dev] = pnp_irq(pdev, 0);
     392        if (err < 0)
     393                snd_printk(KERN_ERR "MPU-401 PnP configure failure: will be disabled\n");
     394        else {
     395                mpuport[dev] = pnp_port_start(pdev, 0);
     396                mpuirq[dev] = pnp_irq(pdev, 0);
     397        }
    380398        return 0;
    381399}
     
    431449        };
    432450
    433         if ((err = snd_pcm_new(card, "CMI8330", 0, 1, 1, &pcm)) < 0)
    434                 return err;
    435         strcpy(pcm->name, "CMI8330");
     451        if ((err = snd_pcm_new(card, (chip->type == CMI8329) ? "CMI8329" : "CMI8330", 0, 1, 1, &pcm)) < 0)
     452                return err;
     453        strcpy(pcm->name, (chip->type == CMI8329) ? "CMI8329" : "CMI8330");
    436454        pcm->private_data = chip;
    437455       
     
    528546                             WSS_HW_DETECT, 0, &acard->wss);
    529547        if (err < 0) {
    530                 snd_printk(KERN_ERR PFX "(CMI8330) device busy??\n");
     548                snd_printk(KERN_ERR PFX "AD1848 device busy??\n");
    531549                return err;
    532550        }
    533551        if (acard->wss->hardware != WSS_HW_CMI8330) {
    534                 snd_printk(KERN_ERR PFX "(CMI8330) not found during probe\n");
     552                snd_printk(KERN_ERR PFX "AD1848 not found during probe\n");
    535553                return -ENODEV;
    536554        }
     
    542560                                    sbdma16[dev],
    543561                                    SB_HW_AUTO, &acard->sb)) < 0) {
    544                 snd_printk(KERN_ERR PFX "(SB16) device busy??\n");
     562                snd_printk(KERN_ERR PFX "SB16 device busy??\n");
    545563                return err;
    546564        }
    547565        if (acard->sb->hardware != SB_HW_16) {
    548                 snd_printk(KERN_ERR PFX "(SB16) not found during probe\n");
     566                snd_printk(KERN_ERR PFX "SB16 not found during probe\n");
    549567                return err;
    550568        }
     
    586604        }
    587605
    588         strcpy(card->driver, "CMI8330/C3D");
    589         strcpy(card->shortname, "C-Media CMI8330/C3D");
     606        strcpy(card->driver, (acard->type == CMI8329) ? "CMI8329" : "CMI8330/C3D");
     607        strcpy(card->shortname, (acard->type == CMI8329) ? "C-Media CMI8329" : "C-Media CMI8330/C3D");
    590608        sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
    591609                card->shortname,
Note: See TracChangeset for help on using the changeset viewer.