X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sound%2Fpci%2Fintel8x0m.c;h=6046ac13a6da7ee6981f342ee081df80e77935f6;hb=2c66a62d2d9e2315e6e748b96643f7f141c4d017;hp=feac6c64b1713ec2b27d435a49182ead6c74c75f;hpb=86090fcac5e27b630656fe3d963a6b80e26dac44;p=linux-2.6.git diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c index feac6c64b..6046ac13a 100644 --- a/sound/pci/intel8x0m.c +++ b/sound/pci/intel8x0m.c @@ -31,12 +31,12 @@ #include #include #include +#include #include #include #include #include #include -#define SNDRV_GET_ID #include MODULE_AUTHOR("Jaroslav Kysela "); @@ -56,17 +56,18 @@ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ static int ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int boot_devs; -MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(index, int, boot_devs, 0444); MODULE_PARM_DESC(index, "Index value for Intel i8x0 modemcard."); MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC); -MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s"); +module_param_array(id, charp, boot_devs, 0444); MODULE_PARM_DESC(id, "ID string for Intel i8x0 modemcard."); MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC); -MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(enable, bool, boot_devs, 0444); MODULE_PARM_DESC(enable, "Enable Intel i8x0 modemcard."); MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC); -MODULE_PARM(ac97_clock, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(ac97_clock, int, boot_devs, 0444); MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (0 = auto-detect)."); MODULE_PARM_SYNTAX(ac97_clock, SNDRV_ENABLED ",default:0"); @@ -266,10 +267,6 @@ struct _snd_intel8x0m { u32 int_sta_reg; /* interrupt status register */ u32 int_sta_mask; /* interrupt status mask */ unsigned int pcm_pos_shift; - -#ifdef CONFIG_PM - int in_suspend; -#endif }; static struct pci_device_id snd_intel8x0m_ids[] = { @@ -905,6 +902,7 @@ static int __devinit snd_intel8x0_mixer(intel8x0_t *chip, int ac97_clock) memset(&ac97, 0, sizeof(ac97)); ac97.private_data = chip; ac97.private_free = snd_intel8x0_mixer_free_ac97; + ac97.scaps = AC97_SCAP_SKIP_AUDIO; glob_sta = igetdword(chip, ICHREG(GLOB_STA)); bus.write = snd_intel8x0_codec_write; @@ -1081,72 +1079,31 @@ static int snd_intel8x0_free(intel8x0_t *chip) /* * power management */ -static void intel8x0_suspend(intel8x0_t *chip) +static int intel8x0m_suspend(snd_card_t *card, unsigned int state) { - snd_card_t *card = chip->card; + intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->pm_private_data, return -EINVAL); int i; - if (chip->in_suspend || - card->power_state == SNDRV_CTL_POWER_D3hot) - return; - - chip->in_suspend = 1; for (i = 0; i < chip->pcm_devs; i++) snd_pcm_suspend_all(chip->pcm[i]); + if (chip->ac97) + snd_ac97_suspend(chip->ac97); snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); + return 0; } -static void intel8x0_resume(intel8x0_t *chip) +static int intel8x0m_resume(snd_card_t *card, unsigned int state) { - snd_card_t *card = chip->card; - - if (! chip->in_suspend || - card->power_state == SNDRV_CTL_POWER_D0) - return; - + intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->pm_private_data, return -EINVAL); pci_enable_device(chip->pci); pci_set_master(chip->pci); snd_intel8x0_chip_init(chip, 0); if (chip->ac97) snd_ac97_resume(chip->ac97); - chip->in_suspend = 0; snd_power_change_state(card, SNDRV_CTL_POWER_D0); -} - -static int snd_intel8x0m_suspend(struct pci_dev *dev, u32 state) -{ - intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(dev), return -ENXIO); - intel8x0_suspend(chip); - return 0; -} -static int snd_intel8x0m_resume(struct pci_dev *dev) -{ - intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(dev), return -ENXIO); - intel8x0_resume(chip); return 0; } - -/* callback */ -static int snd_intel8x0_set_power_state(snd_card_t *card, unsigned int power_state) -{ - intel8x0_t *chip = snd_magic_cast(intel8x0_t, card->power_state_private_data, return -ENXIO); - switch (power_state) { - case SNDRV_CTL_POWER_D0: - case SNDRV_CTL_POWER_D1: - case SNDRV_CTL_POWER_D2: - intel8x0_resume(chip); - break; - case SNDRV_CTL_POWER_D3hot: - case SNDRV_CTL_POWER_D3cold: - intel8x0_suspend(chip); - break; - default: - return -EINVAL; - } - return 0; -} - #endif /* CONFIG_PM */ static void snd_intel8x0m_proc_read(snd_info_entry_t * entry, @@ -1338,10 +1295,7 @@ static int __devinit snd_intel8x0m_create(snd_card_t * card, return err; } -#ifdef CONFIG_PM - card->set_power_state = snd_intel8x0_set_power_state; - card->power_state_private_data = chip; -#endif + snd_card_set_pm_callback(card, intel8x0m_suspend, intel8x0m_resume, chip); if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { snd_intel8x0_free(chip); @@ -1436,16 +1390,14 @@ static int __devinit snd_intel8x0m_probe(struct pci_dev *pci, snd_card_free(card); return err; } - pci_set_drvdata(pci, chip); + pci_set_drvdata(pci, card); dev++; return 0; } static void __devexit snd_intel8x0m_remove(struct pci_dev *pci) { - intel8x0_t *chip = snd_magic_cast(intel8x0_t, pci_get_drvdata(pci), return); - if (chip) - snd_card_free(chip->card); + snd_card_free(pci_get_drvdata(pci)); pci_set_drvdata(pci, NULL); } @@ -1454,25 +1406,13 @@ static struct pci_driver driver = { .id_table = snd_intel8x0m_ids, .probe = snd_intel8x0m_probe, .remove = __devexit_p(snd_intel8x0m_remove), -#ifdef CONFIG_PM - .suspend = snd_intel8x0m_suspend, - .resume = snd_intel8x0m_resume, -#endif + SND_PCI_PM_CALLBACKS }; static int __init alsa_card_intel8x0m_init(void) { - int err; - - if ((err = pci_module_init(&driver)) < 0) { -#ifdef MODULE - printk(KERN_ERR "Intel ICH modemcard not found or device busy\n"); -#endif - return err; - } - - return 0; + return pci_module_init(&driver); } static void __exit alsa_card_intel8x0m_exit(void) @@ -1482,26 +1422,3 @@ static void __exit alsa_card_intel8x0m_exit(void) module_init(alsa_card_intel8x0m_init) module_exit(alsa_card_intel8x0m_exit) - -#ifndef MODULE - -/* format is: snd-intel8x0=enable,index,id,ac97_clock,mpu_port,joystick */ - -static int __init alsa_card_intel8x0m_setup(char *str) -{ - static unsigned __initdata nr_dev = 0; - - if (nr_dev >= SNDRV_CARDS) - return 0; - (void)(get_option(&str,&enable[nr_dev]) == 2 && - get_option(&str,&index[nr_dev]) == 2 && - get_id(&str,&id[nr_dev]) == 2 && - get_option(&str,&ac97_clock[nr_dev]) == 2 - ); - nr_dev++; - return 1; -} - -__setup("snd-intel8x0m=", alsa_card_intel8x0m_setup); - -#endif /* ifndef MODULE */