Ignore:
Timestamp:
Oct 23, 2006, 11:07:11 PM (19 years ago)
Author:
vladest
Message:

SB code update
HDA code update
Some other updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GPL/trunk/alsa-kernel/pci/emu10k1/emu10k1.c

    r34 r84  
    22 *  The driver for the EMU10K1 (SB Live!) based soundcards
    33 *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
     4 *
     5 *  Copyright (c) by James Courtier-Dutton <James@superbug.demon.co.uk>
     6 *      Added support for Audigy 2 Value.
    47 *
    58 *
     
    1720 *   along with this program; if not, write to the Free Software
    1821 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
     22 *
    1923 *
    2024 */
     
    121125        static int dev;
    122126#endif
    123         snd_card_t *card;
     127        struct snd_card *card;
    124128        struct snd_emu10k1 *emu;
    125129#ifdef ENABLE_SYNTH
    126         snd_seq_device_t *wave = NULL;
     130        struct snd_seq_device *wave = NULL;
    127131#endif
    128132        int err;
     
    145149                                      (long)max_buffer_size[dev] * 1024 * 1024,
    146150                                      enable_ir[dev], subsystem[dev],
    147                                       &emu)) < 0) {
    148                 snd_card_free(card);
    149                 return err;
    150         }
    151         if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0) {
    152                 snd_card_free(card);
    153                 return err;
    154         }
    155         if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0) {
    156                 snd_card_free(card);
    157                 return err;
    158         }
    159         if ((err = snd_emu10k1_pcm_efx(emu, 2, NULL)) < 0) {
    160                 snd_card_free(card);
    161                 return err;
    162         }
     151                                      &emu)) < 0)
     152            goto error;
     153        card->private_data = emu;
     154        if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0)
     155                goto error;
     156        if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0)
     157                goto error;
     158        if ((err = snd_emu10k1_pcm_efx(emu, 2, NULL)) < 0)
     159                goto error;
    163160        /* This stores the periods table. */
    164161        if (emu->card_capabilities->ca0151_chip) { /* P16V */
    165             if(snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci), 1024, &emu->p16v_buffer) < 0) {
    166                 snd_p16v_free(emu);
    167                 return -ENOMEM;
    168             }
     162            if ((err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
     163                                           1024, &emu->p16v_buffer)) < 0)
     164                goto error;
    169165        }
    170         if ((err = snd_emu10k1_mixer(emu, 0, 3)) < 0) {
    171             snd_card_free(card);
    172             return err;
     166
     167        if ((err = snd_emu10k1_mixer(emu, 0, 3)) < 0)
     168                goto error;
     169
     170        if ((err = snd_emu10k1_timer(emu, 0)) < 0)
     171                goto error;
     172
     173        if ((err = snd_emu10k1_pcm_multi(emu, 3, NULL)) < 0)
     174                goto error;
     175        if (emu->card_capabilities->ca0151_chip) { /* P16V */
     176            if ((err = snd_p16v_pcm(emu, 4, NULL)) < 0)
     177                goto error;
    173178        }
    174 
    175         if ((err = snd_emu10k1_timer(emu, 0)) < 0) {
    176             snd_card_free(card);
    177             return err;
     179        if (emu->audigy) {
     180            if ((err = snd_emu10k1_audigy_midi(emu)) < 0)
     181                goto error;
     182        } else {
     183            if ((err = snd_emu10k1_midi(emu)) < 0)
     184                goto error;
    178185        }
    179 
    180         if ((err = snd_emu10k1_pcm_multi(emu, 3, NULL)) < 0) {
    181             snd_card_free(card);
    182             return err;
    183         }
    184 
    185         if (emu->card_capabilities->ca0151_chip) { /* P16V */
    186             if ((err = snd_p16v_pcm(emu, 4, NULL)) < 0) {
    187                 snd_card_free(card);
    188                 return err;
    189             }
    190         }
    191 #ifdef TARGET_OS2
    192         if (emu->audigy) {
    193                 if ((err = snd_emu10k1_audigy_midi(emu)) < 0) {
    194                         snd_card_free(card);
    195                         return err;
    196                 }
    197         } else {
    198                 if ((err = snd_emu10k1_midi(emu)) < 0) {
    199                         snd_card_free(card);
    200                         return err;
    201                 }
    202         }
    203 #endif
    204         if ((err = snd_emu10k1_fx8010_new(emu, 0, NULL)) < 0) {
    205                 snd_card_free(card);
    206                 return err;
    207         }
     186        if ((err = snd_emu10k1_fx8010_new(emu, 0, NULL)) < 0)
     187                goto error;
    208188#ifdef ENABLE_SYNTH
    209189        if (snd_seq_device_new(card, 1, SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH,
     
    224204        strcpy(card->driver, emu->card_capabilities->driver);
    225205        strcpy(card->shortname, emu->card_capabilities->name);
    226         sprintf(card->longname, "%s (rev.%d) at 0x%lx, irq %i", card->shortname, emu->revision, emu->port, emu->irq);
    227 
    228 //        DebugInt3();
    229 
    230         if ((err = snd_card_register(card)) < 0) {
    231                 snd_card_free(card);
    232                 return err;
    233         }
     206        sprintf(card->longname,
     207                "%s (rev.%d, serial:0x%x) at 0x%lx, irq %i",
     208                card->shortname, emu->revision, emu->serial, emu->port, emu->irq);
     209
     210        if ((err = snd_card_register(card)) < 0)
     211                goto error;
     212
    234213        pci_set_drvdata(pci, card);
    235214        dev++;
    236         return 0;
     215        return 0;
     216
     217 error:
     218        snd_card_free(card);
     219        return err;
    237220}
    238221
     
    243226}
    244227
    245 #ifdef TARGET_OS2
     228#ifdef CONFIG_PM
     229static int snd_emu10k1_suspend(struct pci_dev *pci, pm_message_t state)
     230{
     231    struct snd_card *card = pci_get_drvdata(pci);
     232    struct snd_emu10k1 *emu = card->private_data;
     233    snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
     234
     235    snd_pcm_suspend_all(emu->pcm);
     236    snd_pcm_suspend_all(emu->pcm_mic);
     237    snd_pcm_suspend_all(emu->pcm_efx);
     238    snd_pcm_suspend_all(emu->pcm_multi);
     239    snd_pcm_suspend_all(emu->pcm_p16v);
     240
     241    snd_ac97_suspend(emu->ac97);
     242
     243    snd_emu10k1_efx_suspend(emu);
     244    snd_emu10k1_suspend_regs(emu);
     245    if (emu->card_capabilities->ca0151_chip)
     246        snd_p16v_suspend(emu);
     247
     248    snd_emu10k1_done(emu);
     249
     250    pci_disable_device(pci);
     251    pci_save_state(pci);
     252    pci_set_power_state(pci, PCI_D3hot);
     253    return 0;
     254}
     255
     256static int snd_emu10k1_resume(struct pci_dev *pci)
     257{
     258    struct snd_card *card = pci_get_drvdata(pci);
     259    struct snd_emu10k1 *emu = card->private_data;
     260
     261    pci_set_power_state(pci, PCI_D0);
     262    pci_restore_state(pci);
     263    if (pci_enable_device(pci) < 0) {
     264        printk(KERN_ERR "emu10k1: pci_enable_device failed, "
     265               "disabling device\n");
     266        snd_card_disconnect(card);
     267        return -EIO;
     268    }
     269
     270    pci_set_master(pci);
     271
     272    snd_emu10k1_resume_init(emu);
     273    snd_emu10k1_efx_resume(emu);
     274    snd_ac97_resume(emu->ac97);
     275    snd_emu10k1_resume_regs(emu);
     276
     277    if (emu->card_capabilities->ca0151_chip)
     278        snd_p16v_resume(emu);
     279    snd_power_change_state(card, SNDRV_CTL_POWER_D0);
     280    return 0;
     281}
     282#endif
     283
    246284static struct pci_driver driver = {
    247         0, 0, 0,
    248 /*      name:    */ "EMU10K1/Audigy",
    249 /*      id_table:*/ snd_emu10k1_ids,
    250 /*      probe:   */ snd_card_emu10k1_probe,
    251 /*      remove:  */ snd_card_emu10k1_remove,
    252         0, 0
     285        .name = "EMU10K1_Audigy",
     286        .id_table = snd_emu10k1_ids,
     287        .probe = snd_card_emu10k1_probe,
     288        .remove = snd_card_emu10k1_remove,
     289#ifdef CONFIG_PM
     290        .suspend = snd_emu10k1_suspend,
     291        .resume = snd_emu10k1_resume,
     292#endif
    253293};
    254 #else
    255 static struct pci_driver driver = {
    256         name: "EMU10K1/Audigy",
    257         id_table: snd_emu10k1_ids,
    258         probe: snd_card_emu10k1_probe,
    259         remove: __devexit_p(snd_card_emu10k1_remove),
    260 };
    261 #endif
    262294
    263295static int __init alsa_card_emu10k1_init(void)
    264296{
    265         int err;
    266 
    267         if ((err = pci_module_init(&driver)) < 0) {
    268 #ifdef MODULE
    269 //              printk(KERN_ERR "EMU10K1/Audigy soundcard not found or device busy\n");
    270 #endif
    271                 return err;
    272         }
    273         return 0;
     297    return pci_register_driver(&driver);
    274298}
    275299
    276300static void __exit alsa_card_emu10k1_exit(void)
    277301{
    278         pci_unregister_driver(&driver);
     302    pci_unregister_driver(&driver);
    279303}
    280304
    281305module_init(alsa_card_emu10k1_init)
    282306module_exit(alsa_card_emu10k1_exit)
    283 
    284 #ifndef MODULE
    285 
    286 /* format is: snd-emu10k1=enable,index,id,
    287                           seq_ports,max_synth_voices */
    288 
    289 static int __init alsa_card_emu10k1_setup(char *str)
    290 {
    291         static unsigned __initdata nr_dev = 0;
    292 
    293         if (nr_dev >= SNDRV_CARDS)
    294                 return 0;
    295         (void)(get_option(&str,&enable[nr_dev]) == 2 &&
    296                get_option(&str,&index[nr_dev]) == 2 &&
    297                get_id(&str,&id[nr_dev]) == 2 &&
    298                get_option(&str,&seq_ports[nr_dev]) == 2 &&
    299                get_option(&str,&max_synth_voices[nr_dev]) == 2);
    300         nr_dev++;
    301         return 1;
    302 }
    303 
    304 __setup("snd-emu10k1=", alsa_card_emu10k1_setup);
    305 
    306 #endif /* ifndef MODULE */
Note: See TracChangeset for help on using the changeset viewer.