Changeset 464 for GPL/trunk/alsa-kernel/isa/cmi8330.c
- Timestamp:
- Oct 8, 2009, 10:35:00 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/trunk/alsa-kernel/isa/cmi8330.c
r426 r464 1 1 /* 2 * Driver for C-Media's CMI8330 soundcards.2 * Driver for C-Media's CMI8330 and CMI8329 soundcards. 3 3 * Copyright (c) by George Talusan <gstalusan@uwaterloo.ca> 4 4 * http://www.undergrad.math.uwaterloo.ca/~gstalusa … … 36 36 * This card has two mixers and two PCM devices. I've cheesed it such 37 37 * that recording and playback can be done through the same device. 38 * The driver "magically" routes the capturing to the CMI8330codec,38 * The driver "magically" routes the capturing to the AD1848 codec, 39 39 * and playback to the SB16 codec. This allows for full-duplex mode 40 40 * to some extent. … … 65 65 */ 66 66 MODULE_AUTHOR("George Talusan <gstalusan@uwaterloo.ca>"); 67 MODULE_DESCRIPTION("C-Media CMI8330 ");67 MODULE_DESCRIPTION("C-Media CMI8330/CMI8329"); 68 68 MODULE_LICENSE("GPL"); 69 69 MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8330,isapnp:{CMI0001,@@@0001,@X@0001}}}"); … … 87 87 88 88 module_param_array(index, int, NULL, 0444); 89 MODULE_PARM_DESC(index, "Index value for CMI8330 soundcard.");89 MODULE_PARM_DESC(index, "Index value for CMI8330/CMI8329 soundcard."); 90 90 module_param_array(id, charp, NULL, 0444); 91 MODULE_PARM_DESC(id, "ID string for CMI8330 soundcard.");91 MODULE_PARM_DESC(id, "ID string for CMI8330/CMI8329 soundcard."); 92 92 module_param_array(enable, bool, NULL, 0444); 93 MODULE_PARM_DESC(enable, "Enable CMI8330 soundcard.");93 MODULE_PARM_DESC(enable, "Enable CMI8330/CMI8329 soundcard."); 94 94 #ifdef CONFIG_PNP 95 95 module_param_array(isapnp, bool, NULL, 0444); … … 98 98 99 99 module_param_array(sbport, long, NULL, 0444); 100 MODULE_PARM_DESC(sbport, "Port # for CMI8330 SB driver.");100 MODULE_PARM_DESC(sbport, "Port # for CMI8330/CMI8329 SB driver."); 101 101 module_param_array(sbirq, int, NULL, 0444); 102 MODULE_PARM_DESC(sbirq, "IRQ # for CMI8330 SB driver.");102 MODULE_PARM_DESC(sbirq, "IRQ # for CMI8330/CMI8329 SB driver."); 103 103 module_param_array(sbdma8, int, NULL, 0444); 104 MODULE_PARM_DESC(sbdma8, "DMA8 for CMI8330 SB driver.");104 MODULE_PARM_DESC(sbdma8, "DMA8 for CMI8330/CMI8329 SB driver."); 105 105 module_param_array(sbdma16, int, NULL, 0444); 106 MODULE_PARM_DESC(sbdma16, "DMA16 for CMI8330 SB driver.");106 MODULE_PARM_DESC(sbdma16, "DMA16 for CMI8330/CMI8329 SB driver."); 107 107 108 108 module_param_array(wssport, long, NULL, 0444); 109 MODULE_PARM_DESC(wssport, "Port # for CMI8330 WSS driver.");109 MODULE_PARM_DESC(wssport, "Port # for CMI8330/CMI8329 WSS driver."); 110 110 module_param_array(wssirq, int, NULL, 0444); 111 MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330 WSS driver.");111 MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330/CMI8329 WSS driver."); 112 112 module_param_array(wssdma, int, NULL, 0444); 113 MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");113 MODULE_PARM_DESC(wssdma, "DMA for CMI8330/CMI8329 WSS driver."); 114 114 115 115 module_param_array(fmport, long, NULL, 0444); 116 MODULE_PARM_DESC(fmport, "FM port # for CMI8330 driver.");116 MODULE_PARM_DESC(fmport, "FM port # for CMI8330/CMI8329 driver."); 117 117 module_param_array(mpuport, long, NULL, 0444); 118 MODULE_PARM_DESC(mpuport, "MPU-401 port # for CMI8330 driver.");118 MODULE_PARM_DESC(mpuport, "MPU-401 port # for CMI8330/CMI8329 driver."); 119 119 module_param_array(mpuirq, int, NULL, 0444); 120 MODULE_PARM_DESC(mpuirq, "IRQ # for CMI8330 MPU-401 port.");120 MODULE_PARM_DESC(mpuirq, "IRQ # for CMI8330/CMI8329 MPU-401 port."); 121 121 #ifdef CONFIG_PNP 122 122 static int isa_registered; … … 157 157 typedef int (*snd_pcm_open_callback_t)(struct snd_pcm_substream *); 158 158 159 enum card_type { 160 CMI8330, 161 CMI8329 162 }; 163 159 164 struct snd_cmi8330 { 160 165 #ifdef CONFIG_PNP … … 173 178 void *private_data; /* sb or wss */ 174 179 } streams[2]; 180 181 enum card_type type; 175 182 }; 176 183 … … 178 185 179 186 static struct pnp_card_device_id snd_cmi8330_pnpids[] = { 187 { .id = "CMI0001", .devs = { { "@X@0001" }, { "@@@0001" }, { "@H@0001" }, { "A@@0001" } } }, 180 188 { .id = "CMI0001", .devs = { { "@@@0001" }, { "@X@0001" }, { "@H@0001" } } }, 181 189 { .id = "" } … … 305 313 int err; 306 314 307 strcpy(card->mixername, "CMI8330/C3D");315 strcpy(card->mixername, (acard->type == CMI8329) ? "CMI8329" : "CMI8330/C3D"); 308 316 309 317 for (idx = 0; idx < ARRAY_SIZE(snd_cmi8330_controls); idx++) { … … 330 338 int err; 331 339 340 /* CMI8329 has a device with ID A@@0001, CMI8330 does not */ 341 acard->type = (id->devs[3].id[0]) ? CMI8329 : CMI8330; 342 332 343 acard->cap = pnp_request_card_device(card, id->devs[0].id, NULL); 333 344 if (acard->cap == NULL) … … 339 350 340 351 acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL); 341 if (acard-> play== NULL)352 if (acard->mpu == NULL) 342 353 return -EBUSY; 343 354 … … 346 357 err = pnp_activate_dev(pdev); 347 358 if (err < 0) { 348 snd_printk(KERN_ERR " CMI8330/C3DPnP configure failure\n");359 snd_printk(KERN_ERR "AD1848 PnP configure failure\n"); 349 360 return -EBUSY; 350 361 } … … 352 363 wssdma[dev] = pnp_dma(pdev, 0); 353 364 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); 355 367 356 368 /* allocate SB16 resources */ … … 359 371 err = pnp_activate_dev(pdev); 360 372 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"); 362 374 return -EBUSY; 363 375 } … … 366 378 sbdma16[dev] = pnp_dma(pdev, 1); 367 379 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 } 368 387 369 388 /* allocate MPU-401 resources */ … … 371 390 372 391 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 } 380 398 return 0; 381 399 } … … 431 449 }; 432 450 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"); 436 454 pcm->private_data = chip; 437 455 … … 528 546 WSS_HW_DETECT, 0, &acard->wss); 529 547 if (err < 0) { 530 snd_printk(KERN_ERR PFX " (CMI8330)device busy??\n");548 snd_printk(KERN_ERR PFX "AD1848 device busy??\n"); 531 549 return err; 532 550 } 533 551 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"); 535 553 return -ENODEV; 536 554 } … … 542 560 sbdma16[dev], 543 561 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"); 545 563 return err; 546 564 } 547 565 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"); 549 567 return err; 550 568 } … … 586 604 } 587 605 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"); 590 608 sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d", 591 609 card->shortname,
Note:
See TracChangeset
for help on using the changeset viewer.