/* * snd_pdacf_attach - attach callback for cs */ static int snd_pdacf_probe(struct pcmcia_device *link) { int i, err; struct snd_pdacf *pdacf; struct snd_card *card; static struct snd_device_ops ops = { .dev_free = snd_pdacf_dev_free, }; snd_printdd(KERN_DEBUG "pdacf_attach called\n"); /* find an empty slot from the card list */ for (i = 0; i < SNDRV_CARDS; i++) { if (! card_list[i]) break; } if (i >= SNDRV_CARDS) { snd_printk(KERN_ERR "pdacf: too many cards found\n"); return -EINVAL; } if (! enable[i]) return -ENODEV; /* disabled explicitly */ /* ok, create a card instance */ err = snd_card_create(index[i], id[i], THIS_MODULE, 0, &card); if (err < 0) { snd_printk(KERN_ERR "pdacf: cannot create a card instance\n"); return err; } pdacf = snd_pdacf_create(card); if (!pdacf) { snd_card_free(card); return -ENOMEM; } err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, pdacf, &ops); if (err < 0) { kfree(pdacf); snd_card_free(card); return err; } snd_card_set_dev(card, &link->dev); pdacf->index = i; card_list[i] = card; pdacf->p_dev = link; link->priv = pdacf; link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; link->resource[0]->end = 16; link->conf.Attributes = CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.ConfigIndex = 1; link->conf.Present = PRESENT_OPTION; return pdacf_config(link); }
/* * event callback */ static int pdacf_event(event_t event, int priority, event_callback_args_t *args) { dev_link_t *link = args->client_data; pdacf_t *chip = link->priv; switch (event) { case CS_EVENT_CARD_REMOVAL: snd_printdd(KERN_DEBUG "CARD_REMOVAL..\n"); link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) { chip->chip_status |= PDAUDIOCF_STAT_IS_STALE; } break; case CS_EVENT_CARD_INSERTION: snd_printdd(KERN_DEBUG "CARD_INSERTION..\n"); link->state |= DEV_PRESENT; pdacf_config(link); break; #ifdef CONFIG_PM case CS_EVENT_PM_SUSPEND: snd_printdd(KERN_DEBUG "SUSPEND\n"); link->state |= DEV_SUSPEND; if (chip) { snd_printdd(KERN_DEBUG "snd_pdacf_suspend calling\n"); snd_pdacf_suspend(chip->card, PMSG_SUSPEND); } /* Fall through... */ case CS_EVENT_RESET_PHYSICAL: snd_printdd(KERN_DEBUG "RESET_PHYSICAL\n"); if (link->state & DEV_CONFIG) pcmcia_release_configuration(link->handle); break; case CS_EVENT_PM_RESUME: snd_printdd(KERN_DEBUG "RESUME\n"); link->state &= ~DEV_SUSPEND; /* Fall through... */ case CS_EVENT_CARD_RESET: snd_printdd(KERN_DEBUG "CARD_RESET\n"); if (DEV_OK(link)) { snd_printdd(KERN_DEBUG "requestconfig...\n"); pcmcia_request_configuration(link->handle, &link->conf); if (chip) { snd_printdd(KERN_DEBUG "calling snd_pdacf_resume\n"); snd_pdacf_resume(chip->card); } } snd_printdd(KERN_DEBUG "resume done!\n"); break; #endif } return 0; }
/* * snd_pdacf_attach - attach callback for cs */ static int snd_pdacf_probe(struct pcmcia_device *link) { int i; struct snd_pdacf *pdacf; struct snd_card *card; static struct snd_device_ops ops = { .dev_free = snd_pdacf_dev_free, }; snd_printdd(KERN_DEBUG "pdacf_attach called\n"); /* find an empty slot from the card list */ for (i = 0; i < SNDRV_CARDS; i++) { if (! card_list[i]) break; } if (i >= SNDRV_CARDS) { snd_printk(KERN_ERR "pdacf: too many cards found\n"); return -EINVAL; } if (! enable[i]) return -ENODEV; /* disabled explicitly */ /* ok, create a card instance */ card = snd_card_new(index[i], id[i], THIS_MODULE, 0); if (card == NULL) { snd_printk(KERN_ERR "pdacf: cannot create a card instance\n"); return -ENOMEM; } pdacf = snd_pdacf_create(card); if (! pdacf) return -EIO; if (snd_device_new(card, SNDRV_DEV_LOWLEVEL, pdacf, &ops) < 0) { kfree(pdacf); snd_card_free(card); return -ENODEV; } pdacf->index = i; card_list[i] = card; pdacf->p_dev = link; link->priv = pdacf; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; link->io.NumPorts1 = 16; link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT | IRQ_FORCED_PULSE; // link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; link->irq.IRQInfo1 = 0 /* | IRQ_LEVEL_ID */; link->irq.Handler = pdacf_interrupt; link->irq.Instance = pdacf; link->conf.Attributes = CONF_ENABLE_IRQ; link->conf.IntType = INT_MEMORY_AND_IO; link->conf.ConfigIndex = 1; link->conf.Present = PRESENT_OPTION; return pdacf_config(link); }