Patch to suspend the board in addition to what the current code does
(reset sequencer & FIFO etc...).
Tested and working on my testbox with addon PCI card.
Regards,
Zwane Mwaikambo
On Sat, 12 Jan 2002, Thomas Sailer wrote:
> Zwane Mwaikambo wrote:
> >
> > Patch to suspend the board in addition to what the current code does
> > (reset sequencer & FIFO etc...).
>
> There is no patch attached 8-)
>
> Tom
Wow don't i feel smart :)
--- linux-2.4.18-pre2/drivers/sound/esssolo1.c.orig Sun Sep 30 21:26:08 2001
+++ linux-2.4.18-pre2/drivers/sound/esssolo1.c Sat Jan 12 11:05:26 2002
@@ -82,6 +82,8 @@
* 22.05.2001 0.19 more cleanups, changed PM to PCI 2.4 style, got rid
* of global list of devices, using pci device data.
* Marcus Meissner <[email protected]>
+ * 11.01.2002 0.20 Added full power management support (power down board)
+ * Zwane Mwaikambo <[email protected]>
*/
/*****************************************************************************/
@@ -188,6 +190,7 @@
struct semaphore open_sem;
mode_t open_mode;
wait_queue_head_t open_wait;
+ int in_suspend;
struct dmabuf {
void *rawbuf;
@@ -1698,6 +1701,10 @@
intsrc = inb(s->iobase+7); /* get interrupt source(s) */
if (!intsrc)
return;
+
+ if (unlikely(s->in_suspend))
+ return;
+
(void)inb(s->sbbase+0xe); /* clear interrupt */
spin_lock(&s->lock);
/* clear audio interrupts first */
@@ -2261,24 +2268,35 @@
static int
solo1_suspend(struct pci_dev *pci_dev, u32 state) {
struct solo1_state *s = (struct solo1_state*)pci_get_drvdata(pci_dev);
+
if (!s)
return 1;
+
+ s->in_suspend = 1;
outb(0, s->iobase+6);
/* DMA master clear */
outb(0, s->ddmabase+0xd);
/* reset sequencer and FIFO */
- outb(3, s->sbbase+6);
+ outb(3, s->sbbase+6);
+ /* Pulse to request a suspend, hold the FM synth as well */
+ outb(0xe0, s->sbbase+7); /* high */
+ outb(0x30, s->sbbase+7); /* low */
/* turn off DDMA controller address space */
- pci_write_config_word(s->dev, 0x60, 0);
+ pci_write_config_word(s->dev, 0x60, 0);
+
return 0;
}
static int
solo1_resume(struct pci_dev *pci_dev) {
struct solo1_state *s = (struct solo1_state*)pci_get_drvdata(pci_dev);
+
if (!s)
return 1;
+
+ s->in_suspend = 0;
setup_solo1(s);
+
return 0;
}
@@ -2318,6 +2336,7 @@
init_waitqueue_head(&s->midi.owait);
init_MUTEX(&s->open_sem);
spin_lock_init(&s->lock);
+ s->in_suspend = 0;
s->magic = SOLO1_MAGIC;
s->dev = pcidev;
s->iobase = pci_resource_start(pcidev, 0);
@@ -2456,7 +2475,7 @@
{
if (!pci_present()) /* No PCI bus in this machine! */
return -ENODEV;
- printk(KERN_INFO "solo1: version v0.19 time " __TIME__ " " __DATE__ "\n");
+ printk(KERN_INFO "solo1: version v0.20 time " __TIME__ " " __DATE__ "\n");
if (!pci_register_driver(&solo1_driver)) {
pci_unregister_driver(&solo1_driver);
return -ENODEV;