summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@flint.arm.linux.org.uk>2003-07-14 01:57:32 +0100
committerRussell King <rmk@flint.arm.linux.org.uk>2003-07-14 01:57:32 +0100
commit4e9470d653d7d4b3d482fadaecfd2909a1df2043 (patch)
treedf14614bee30bd7ab3a7b9e25158a1ca1c1ebeda
parentddf2599337b30e25c1acf03a92b168d4bbf9de40 (diff)
[PCMCIA] Fix hangs when PCMCIA modules loaded.
Switching the PCMCIA interrupts from serial PCI interrupts to parallel PCI interrupts causes machines to hang solid. If we leave such setups well alone, and only change the interrupt mode of parallel PCI systems between PCI+ISA and PCI only.
-rw-r--r--drivers/pcmcia/ti113x.h23
1 files changed, 14 insertions, 9 deletions
diff --git a/drivers/pcmcia/ti113x.h b/drivers/pcmcia/ti113x.h
index 3f6234bdd718..d43c9a2b1b65 100644
--- a/drivers/pcmcia/ti113x.h
+++ b/drivers/pcmcia/ti113x.h
@@ -179,21 +179,26 @@ static int ti_override(struct yenta_socket *socket)
/*
* If ISA interrupts don't work, then fall back to routing card
* interrupts to the PCI interrupt of the socket.
+ *
+ * Tweaking this when we are using serial PCI IRQs causes hangs
+ * --rmk
*/
if (!socket->socket.irq_mask) {
- int irqmux, devctl;
-
- printk (KERN_INFO "ti113x: Routing card interrupts to PCI\n");
+ u8 irqmux, devctl;
devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
- devctl &= ~TI113X_DCR_IMODE_MASK;
+ if (devctl & TI113X_DCR_IMODE_MASK != TI12XX_DCR_IMODE_ALL_SERIAL) {
+ printk (KERN_INFO "ti113x: Routing card interrupts to PCI\n");
+
+ devctl &= ~TI113X_DCR_IMODE_MASK;
- irqmux = config_readl(socket, TI122X_IRQMUX);
- irqmux = (irqmux & ~0x0f) | 0x02; /* route INTA */
- irqmux = (irqmux & ~0xf0) | 0x20; /* route INTB */
+ irqmux = config_readl(socket, TI122X_IRQMUX);
+ irqmux = (irqmux & ~0x0f) | 0x02; /* route INTA */
+ irqmux = (irqmux & ~0xf0) | 0x20; /* route INTB */
- config_writel(socket, TI122X_IRQMUX, irqmux);
- config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
+ config_writel(socket, TI122X_IRQMUX, irqmux);
+ config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
+ }
}
socket->socket.ops->init = ti_init;