--- linux-2.4.20-stock/drivers/pcmcia/yenta.c	2003-02-27 13:32:08.000000000 +0000
+++ linux-2.4.20-miniitx/drivers/pcmcia/yenta.c	2003-05-14 22:20:30.000000000 +0100
@@ -798,7 +798,8 @@
 	struct pci_socket_ops *op;
 } cardbus_override[] = {
 	{ PD(TI,1130),	&ti113x_ops },
-	{ PD(TI,1031),	&ti_ops },
+/*	{ PD(TI,1031),	&ti_ops }, */
+	{ PD(TI,1031),	&ti113x_ops },
 	{ PD(TI,1131),	&ti113x_ops },
 	{ PD(TI,1250),	&ti1250_ops },
 	{ PD(TI,1220),	&ti_ops },
--- linux-2.4.20-stock/drivers/pcmcia/ti113x.h	2003-02-27 13:56:00.000000000 +0000
+++ linux-2.4.20-miniitx/drivers/pcmcia/ti113x.h	2003-05-14 22:20:46.000000000 +0100
@@ -32,6 +32,12 @@
 
 #include <linux/config.h>
 
+/* Register definitions for TI 103X PCI-to-PCMCIA bridges */ 
+
+#define TI103X_BRIDGE_CONTROL		0x003e  /* 16 bit */
+#define  TI103X_BRC_WRITEPOST_ENA	0x0400
+#define  TI103X_BRC_PCI_IREQ_ENA	0x0080
+
 /* Register definitions for TI 113X PCI-to-CardBus bridges */
 
 /* System Control Register */
@@ -167,6 +173,46 @@
 		new |= I365_INTR_ENA;
 	if (new != reg)
 		exca_writeb(socket, I365_INTCTL, new);
+
+/*
+ * If ISA interrupts don't work, then fall back to routing card
+ * interrupts to the PCI interrupt of the socket.
+ */
+	if (!socket->cap.irq_mask) {
+		printk (KERN_INFO "PCI Device ID %x\n", socket->dev->device);
+		if (socket->dev->device == PCI_DEVICE_ID_TI_1031) {
+			/* The 1030 may have this interface as well. */
+			int devctl;
+			u16 bridgectl;
+			
+			printk (KERN_INFO "ti113x: TI103x Routing card interrupts to PCI\n");
+			devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
+			devctl &= ~TI113X_DCR_IMODE_SERIAL;
+
+			bridgectl = config_readw(socket, TI103X_BRIDGE_CONTROL);
+			printk (KERN_INFO "ti113x: Bridge register %x\n", bridgectl);
+			/* Route functional interrupts to PCI */
+			bridgectl &= ~TI103X_BRC_PCI_IREQ_ENA;
+
+			printk (KERN_INFO "ti113x: Bridge register %x\n", bridgectl);
+
+			config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
+			config_writew(socket, TI103X_BRIDGE_CONTROL, bridgectl);
+		} else {
+			int devctl, irqmux;
+			printk (KERN_INFO "ti113x: Routing card interrupts to PCI\n");
+			
+			devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
+			devctl &= ~TI113X_DCR_IMODE_MASK;
+			
+			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);
+		}
+	}		
 	return 0;
 }
 
@@ -281,9 +327,12 @@
 	ti_cardctl(socket) = config_readb(socket, TI113X_CARD_CONTROL);
 	ti_devctl(socket) = config_readb(socket, TI113X_DEVICE_CONTROL);
 
-	ti_cardctl(socket) &= ~(TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC);
-	if (socket->cb_irq)
+ 	ti_cardctl(socket) &= ~(TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC);
+	if (socket->cb_irq) { 
+/*	if (1) { */
+		printk(KERN_INFO "ti113x: In ti113x_open - configuring for PCI IRQs\n");
 		ti_cardctl(socket) |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC | TI113X_CCR_PCI_IREQ;
+	}
 	ti_open(socket);
 	return 0;
 }
