Update of /cvsroot/alsa/alsa-kernel/pci
In directory sc8-pr-cvs1:/tmp/cvs-serv3760
Modified Files:
maestro3.c
Log Message:
- clean up PM codes.
- send ack in interrupts after processing the streams.
- added mpu401 control codes experimentally, not working yet.
Index: maestro3.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/maestro3.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- maestro3.c 19 May 2003 15:19:36 -0000 1.37
+++ maestro3.c 18 Jun 2003 11:09:13 -0000 1.38
@@ -43,6 +43,7 @@
#include <sound/info.h>
#include <sound/control.h>
#include <sound/pcm.h>
+#include <sound/mpu401.h>
#include <sound/ac97_codec.h>
#define SNDRV_GET_ID
#include <sound/initval.h>
@@ -851,6 +852,9 @@
int external_amp;
int amp_gpio;
+ /* midi */
+ snd_rawmidi_t *rmidi;
+
/* pcm streams */
int num_substreams;
m3_dma_t *substreams;
@@ -971,6 +975,11 @@
* lowlevel functions
*/
+#define big_mdelay(msec) do {\
+ set_current_state(TASK_UNINTERRUPTIBLE);\
+ schedule_timeout(((msec) * HZ) / 1000);\
+} while (0)
+
inline static void snd_m3_outw(m3_t *chip, u16 value, unsigned long reg)
{
outw(value, chip->iobase + reg);
@@ -1012,7 +1021,7 @@
static void snd_m3_assp_halt(m3_t *chip)
{
chip->reset_state = snd_m3_inb(chip, DSP_PORT_CONTROL_REG_B) &
~REGB_STOP_CLOCK;
- mdelay(10);
+ big_mdelay(10);
snd_m3_outb(chip, chip->reset_state & ~REGB_ENABLE_RESET,
DSP_PORT_CONTROL_REG_B);
}
@@ -1562,17 +1571,11 @@
u8 status;
int i;
- status = inb(chip->iobase + 0x1A);
+ status = inb(chip->iobase + HOST_INT_STATUS);
if (status == 0xff)
return IRQ_NONE;
- /* presumably acking the ints? */
- outw(status, chip->iobase + 0x1A);
-
- /*if (in_suspend)
- return IRQ_NONE;*/
-
/*
* ack an assp int if its running
* and has an int pending
@@ -1595,9 +1598,13 @@
}
}
- /* XXX is this needed? */
- if (status & 0x40)
- outb(0x40, chip->iobase+0x1A);
+#if 0 /* TODO: not supported yet */
+ if ((status & MPU401_INT_PENDING) && chip->rmidi)
+ snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs);
+#endif
+
+ /* ack ints */
+ snd_m3_outw(chip, HOST_INT_STATUS, status);
return IRQ_HANDLED;
}
@@ -1898,7 +1905,7 @@
return (ret == 0) || (ret == 0xffff);
}
-static void snd_m3_ac97_reset(m3_t *chip, int busywait)
+static void snd_m3_ac97_reset(m3_t *chip)
{
u16 dir;
int delay1 = 0, delay2 = 0, i;
@@ -1933,12 +1940,8 @@
outw(0, io + GPIO_DATA);
outw(dir | GPO_PRIMARY_AC97, io + GPIO_DIRECTION);
- if (busywait) {
- mdelay(delay1);
- } else {
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout((delay1 * HZ) / 1000);
- }
+ set_current_state(TASK_UNINTERRUPTIBLE);
+ schedule_timeout((delay1 * HZ) / 1000);
outw(GPO_PRIMARY_AC97, io + GPIO_DATA);
udelay(5);
@@ -1946,12 +1949,9 @@
outw(IO_SRAM_ENABLE | SERIAL_AC_LINK_ENABLE, io + RING_BUS_CTRL_A);
outw(~0, io + GPIO_MASK);
- if (busywait) {
- mdelay(delay2);
- } else {
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout((delay2 * HZ) / 1000);
- }
+ set_current_state(TASK_UNINTERRUPTIBLE);
+ schedule_timeout((delay2 * HZ) / 1000);
+
if (! snd_m3_try_read_vendor(chip))
break;
@@ -1968,9 +1968,9 @@
*/
tmp = inw(io + RING_BUS_CTRL_A);
outw(RAC_SDFS_ENABLE|LAC_SDFS_ENABLE, io + RING_BUS_CTRL_A);
- mdelay(20);
+ big_mdelay(20);
outw(tmp, io + RING_BUS_CTRL_A);
- mdelay(50);
+ big_mdelay(50);
#endif
}
@@ -2298,8 +2298,15 @@
{
struct pci_dev *pcidev = chip->pci;
u32 n;
+ u16 w;
u8 t; /* makes as much sense as 'n', no? */
+ pci_read_config_word(pcidev, PCI_LEGACY_AUDIO_CTRL, &w);
+ w &= ~(SOUND_BLASTER_ENABLE|FM_SYNTHESIS_ENABLE|
+ MPU401_IO_ENABLE|MPU401_IRQ_ENABLE|ALIAS_10BIT_IO|
+ DISABLE_LEGACY);
+ pci_write_config_word(pcidev, PCI_LEGACY_AUDIO_CTRL, &w);
+
pci_read_config_dword(pcidev, PCI_ALLEGRO_CONFIG, &n);
n &= REDUCED_DEBOUNCE;
n |= PM_CTRL_ENABLE | CLK_DIV_BY_49 | USE_PCI_TIMING;
@@ -2337,7 +2344,7 @@
{
unsigned long io = chip->iobase;
- outw(ASSP_INT_ENABLE, io + HOST_INT_CTRL);
+ outw(ASSP_INT_ENABLE | MPU401_INT_ENABLE, io + HOST_INT_CTRL);
outb(inb(io + ASSP_CONTROL_C) | ASSP_HOST_INT_ENABLE,
io + ASSP_CONTROL_C);
}
@@ -2363,6 +2370,10 @@
spin_unlock_irqrestore(&chip->reg_lock, flags);
kfree(chip->substreams);
}
+ if (chip->iobase_res) {
+ snd_m3_outw(chip, HOST_INT_CTRL, 0); /* disable ints */
+ }
+
#ifdef CONFIG_PM
if (chip->suspend_mem)
vfree(chip->suspend_mem);
@@ -2400,7 +2411,7 @@
snd_pcm_suspend_all(chip->pcm);
- mdelay(10); /* give the assp a chance to idle.. */
+ big_mdelay(10); /* give the assp a chance to idle.. */
snd_m3_assp_halt(chip);
@@ -2435,7 +2446,7 @@
snd_m3_chip_init(chip);
snd_m3_assp_halt(chip);
- snd_m3_ac97_reset(chip, 1);
+ snd_m3_ac97_reset(chip);
/* restore dsp image */
index = 0;
@@ -2460,7 +2471,6 @@
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
}
-#ifndef PCI_OLD_SUSPEND
static int snd_m3_suspend(struct pci_dev *pci, u32 state)
{
m3_t *chip = snd_magic_cast(m3_t, pci_get_drvdata(pci), return -ENXIO);
@@ -2473,18 +2483,6 @@
m3_resume(chip);
return 0;
}
-#else
-static void snd_m3_suspend(struct pci_dev *pci)
-{
- m3_t *chip = snd_magic_cast(m3_t, pci_get_drvdata(pci), return);
- m3_suspend(chip);
-}
-static void snd_m3_resume(struct pci_dev *pci)
-{
- m3_t *chip = snd_magic_cast(m3_t, pci_get_drvdata(pci), return);
- m3_resume(chip);
-}
-#endif
/* callback */
static int snd_m3_set_power_state(snd_card_t *card, unsigned int power_state)
@@ -2606,7 +2604,7 @@
snd_m3_chip_init(chip);
snd_m3_assp_halt(chip);
- snd_m3_ac97_reset(chip, 0);
+ snd_m3_ac97_reset(chip);
snd_m3_assp_init(chip);
snd_m3_amp_enable(chip, 1);
@@ -2716,6 +2714,15 @@
snd_card_free(card);
return err;
}
+
+#if 0 /* TODO: not supported yet */
+ /* TODO enable midi irq and i/o */
+ err = snd_mpu401_uart_new(chip->card, 0, MPU401_HW_MPU401,
+ chip->iobase + MPU401_DATA_PORT, 1,
+ chip->irq, 0, &chip->rmidi);
+ if (err < 0)
+ printk(KERN_WARNING "maestro3: no midi support.\n");
+#endif
pci_set_drvdata(pci, chip);
dev++;
-------------------------------------------------------
This SF.Net email is sponsored by: INetU
Attention Web Developers & Consultants: Become An INetU Hosting Partner.
Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission!
INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog