Update of /cvsroot/alsa/alsa-kernel/pci
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28575/pci
Modified Files:
Kconfig atiixp.c
Log Message:
- added IXP 300 to descriptions and comments.
- fixed the codec probing without the proper interrupts.
- added the experimental PM support.
Index: Kconfig
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/Kconfig,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- Kconfig 13 Apr 2004 15:26:27 -0000 1.26
+++ Kconfig 23 Apr 2004 15:07:54 -0000 1.27
@@ -16,11 +16,11 @@
Say 'Y' or 'M' to include support for ALI PCI Audio M5451 sound core.
config SND_ATIIXP
- tristate "ATI IXP 150/200/250"
+ tristate "ATI IXP 150/200/250/300"
depends on SND
select SND_AC97_CODEC
help
- Say 'Y' or 'M' to include support for ATI IXP 150/200/250 AC97 controller.
+ Say 'Y' or 'M' to include support for ATI IXP 150/200/250/300 AC97
controller.
config SND_AU8810
tristate "Aureal Advantage"
Index: atiixp.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/atiixp.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- atiixp.c 16 Apr 2004 14:48:14 -0000 1.6
+++ atiixp.c 23 Apr 2004 15:07:54 -0000 1.7
@@ -38,7 +38,7 @@
MODULE_DESCRIPTION("ATI IXP AC97 controller");
MODULE_LICENSE("GPL");
MODULE_CLASSES("{sound}");
-MODULE_DEVICES("{{ATI,IXP150/200/250}}");
+MODULE_DEVICES("{{ATI,IXP150/200/250/300}}");
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
@@ -273,6 +273,7 @@
atiixp_dma_t dmas[3]; /* playback, capture, spdif */
struct ac97_pcm *pcms[3]; /* playback, capture, spdif */
+ snd_pcm_t *pcmdevs[2]; /* PCM devices: analog i/o, spdif */
int max_channels; /* max. channels for PCM out */
@@ -280,6 +281,10 @@
int spdif_over_aclink; /* passed from the module option */
struct semaphore open_mutex; /* playback open mutex */
+
+#ifdef CONFIG_PM
+ u32 pci_state[16];
+#endif
};
@@ -535,12 +540,10 @@
return 0;
}
-#if 0 /* for P/M */
+#ifdef CONFIG_PM
static int snd_atiixp_aclink_down(atiixp_t *chip)
{
- unsigned long flags;
-
- if (atiixp_read(chip, MODEM_MIRROR) & ATI_REG_MODEM_MIRROR_RUNNING)
+ if (atiixp_read(chip, MODEM_MIRROR) & 0x1) /* modem running, too? */
return -EBUSY;
atiixp_update(chip, CMD,
ATI_REG_CMD_POWERDOWN | ATI_REG_CMD_AC_RESET,
@@ -1255,6 +1258,7 @@
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_atiixp_capture_ops);
pcm->private_data = chip;
strcpy(pcm->name, "ATI IXP AC97");
+ chip->pcmdevs[0] = pcm;
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
snd_dma_pci_data(chip->pci), 64*1024,
128*1024);
@@ -1274,6 +1278,7 @@
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_atiixp_spdif_ops);
pcm->private_data = chip;
strcpy(pcm->name, "ATI IXP IEC958");
+ chip->pcmdevs[1] = pcm;
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
snd_dma_pci_data(chip->pci), 64*1024,
128*1024);
@@ -1344,6 +1349,7 @@
ac97_bus_t bus, *pbus;
ac97_t ac97;
int i, err;
+ int codec_count;
static unsigned int codec_skip[3] = {
ATI_REG_ISR_CODEC0_NOT_READY,
ATI_REG_ISR_CODEC1_NOT_READY,
@@ -1362,6 +1368,7 @@
return err;
chip->ac97_bus = pbus;
+ codec_count = 0;
for (i = 0; i < 3; i++) {
if (chip->codec_not_ready_bits & codec_skip[i])
continue;
@@ -1369,8 +1376,25 @@
ac97.private_data = chip;
ac97.pci = chip->pci;
ac97.num = i;
- if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i])) < 0)
- return err;
+ if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i])) < 0) {
+ if (chip->codec_not_ready_bits)
+ /* codec(s) was detected but not available.
+ * return the error
+ */
+ return err;
+ else {
+ /* codec(s) was NOT detected, so just ignore here */
+ chip->ac97[i] = NULL; /* to be sure */
+ snd_printd("atiixp: codec %d not found\n", i);
+ continue;
+ }
+ }
+ codec_count++;
+ }
+
+ if (! codec_count) {
+ snd_printk(KERN_ERR "atiixp: no codec available\n");
+ return -ENODEV;
}
/* snd_ac97_tune_hardware(chip->ac97, ac97_quirks); */
@@ -1379,6 +1403,53 @@
}
+#ifdef CONFIG_PM
+/*
+ * power management
+ */
+static int snd_atiixp_suspend(snd_card_t *card, unsigned int state)
+{
+ atiixp_t *chip = snd_magic_cast(atiixp_t, card->pm_private_data, return
-EINVAL);
+ int i;
+
+ for (i = 0; i < 2; i++)
+ if (chip->pcmdevs[i])
+ snd_pcm_suspend_all(chip->pcmdevs[i]);
+ for (i = 0; i < 3; i++)
+ if (chip->ac97[i])
+ snd_ac97_suspend(chip->ac97[i]);
+ snd_atiixp_aclink_down(chip);
+ snd_atiixp_chip_stop(chip);
+
+ pci_save_state(chip->pci, chip->pci_state);
+ pci_set_power_state(chip->pci, 3);
+ pci_disable_device(chip->pci);
+ snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+ return 0;
+}
+
+static int snd_atiixp_resume(snd_card_t *card, unsigned int state)
+{
+ atiixp_t *chip = snd_magic_cast(atiixp_t, card->pm_private_data, return
-EINVAL);
+ int i;
+
+ pci_enable_device(chip->pci);
+ pci_restore_state(chip->pci, chip->pci_state);
+ pci_set_power_state(chip->pci, 0);
+
+ snd_atiixp_aclink_reset(chip);
+ snd_atiixp_chip_start(chip);
+
+ for (i = 0; i < 3; i++)
+ if (chip->ac97[i])
+ snd_ac97_resume(chip->ac97[i]);
+
+ snd_power_change_state(card, SNDRV_CTL_POWER_D0);
+ return 0;
+}
+#endif /* CONFIG_PM */
+
+
/*
* proc interface for register dump
*/
@@ -1536,6 +1607,8 @@
sprintf(card->longname, "%s rev %x at 0x%lx, irq %i",
card->shortname, revision, chip->addr, chip->irq);
+ snd_card_set_pm_callback(card, snd_atiixp_suspend, snd_atiixp_resume, chip);
+
if ((err = snd_card_register(card)) < 0)
goto __error;
@@ -1559,6 +1632,7 @@
.id_table = snd_atiixp_ids,
.probe = snd_atiixp_probe,
.remove = __devexit_p(snd_atiixp_remove),
+ SND_PCI_PM_CALLBACKS
};
-------------------------------------------------------
This SF.net email is sponsored by: The Robotic Monkeys at ThinkGeek
For a limited time only, get FREE Ground shipping on all orders of $35
or more. Hurry up and shop folks, this offer expires April 30th!
http://www.thinkgeek.com/freeshipping/?cpg=12297
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog