summaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-03-23 02:25:38 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-03-23 02:25:38 +0000
commit16b5d462f73eb29d1f67fa01cc1ea66afdc72569 (patch)
tree5407bd573f4840e473ea27cbe61e5c7a07131fcd /drivers/pcmcia
parentce8a076e11e7e5ee36007f9a3eee5bb3744cb8f6 (diff)
Merge with Linux 2.3.99-pre2.
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r--drivers/pcmcia/ti113x.h45
-rw-r--r--drivers/pcmcia/yenta.c11
2 files changed, 55 insertions, 1 deletions
diff --git a/drivers/pcmcia/ti113x.h b/drivers/pcmcia/ti113x.h
index b8664c6b5..16c881f7d 100644
--- a/drivers/pcmcia/ti113x.h
+++ b/drivers/pcmcia/ti113x.h
@@ -136,6 +136,46 @@
#ifdef CONFIG_CARDBUS
+/*
+ * Generic TI open - TI has an extension for the
+ * INTCTL register that sets the PCI CSC interrupt.
+ * Make sure we set it correctly at open and init
+ * time.
+ */
+static int ti_open(pci_socket_t *socket)
+{
+ u8 new, reg = exca_readb(socket, I365_INTCTL);
+
+ new = reg & ~I365_INTR_ENA;
+ if (socket->cb_irq)
+ new |= I365_INTR_ENA;
+ if (new != reg)
+ exca_writeb(socket, I365_INTCTL, new);
+ return 0;
+}
+
+static int ti_init(pci_socket_t *socket)
+{
+ yenta_init(socket);
+ ti_open(socket);
+ return 0;
+}
+
+static struct pci_socket_ops ti_ops = {
+ ti_open,
+ yenta_close,
+ ti_init,
+ yenta_suspend,
+ yenta_get_status,
+ yenta_get_socket,
+ yenta_set_socket,
+ yenta_get_io_map,
+ yenta_set_io_map,
+ yenta_get_mem_map,
+ yenta_set_mem_map,
+ yenta_proc_setup
+};
+
#define ti_sysctl(socket) ((socket)->private[0])
#define ti_cardctl(socket) ((socket)->private[1])
#define ti_devctl(socket) ((socket)->private[2])
@@ -149,6 +189,7 @@ static int ti113x_open(pci_socket_t *socket)
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_CSC | TI113X_CCR_PCI_IREQ;
+ ti_open(socket);
return 0;
}
@@ -159,7 +200,7 @@ static int ti113x_init(pci_socket_t *socket)
config_writel(socket, TI113X_SYSTEM_CONTROL, ti_sysctl(socket));
config_writeb(socket, TI113X_CARD_CONTROL, ti_cardctl(socket));
config_writeb(socket, TI113X_DEVICE_CONTROL, ti_devctl(socket));
-
+ ti_open(socket);
return 0;
}
@@ -187,6 +228,7 @@ static int ti1250_open(pci_socket_t *socket)
ti_diag(socket) &= ~(TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ);
if (socket->cb_irq)
ti_diag(socket) |= TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ;
+ ti_open(socket);
return 0;
}
@@ -195,6 +237,7 @@ static int ti1250_init(pci_socket_t *socket)
yenta_init(socket);
config_writeb(socket, TI1250_DIAGNOSTIC, ti_diag(socket));
+ ti_open(socket);
return 0;
}
diff --git a/drivers/pcmcia/yenta.c b/drivers/pcmcia/yenta.c
index c57fdfcc6..a8b311780 100644
--- a/drivers/pcmcia/yenta.c
+++ b/drivers/pcmcia/yenta.c
@@ -528,6 +528,7 @@ static unsigned int yenta_probe_irq(pci_socket_t *socket, u32 isa_irq_mask)
cb_writel(socket, CB_SOCKET_EVENT, -1);
}
cb_writel(socket, CB_SOCKET_MASK, 0);
+ exca_writeb(socket, I365_CSCINT, 0);
mask = probe_irq_mask(val) & 0xffff;
@@ -739,8 +740,18 @@ static struct cardbus_override_struct {
struct pci_socket_ops *op;
} cardbus_override[] = {
{ PD(TI,1130), &ti113x_ops },
+ { PD(TI,1031), &ti_ops },
{ PD(TI,1131), &ti113x_ops },
{ PD(TI,1250), &ti1250_ops },
+ { PD(TI,1220), &ti_ops },
+ { PD(TI,1221), &ti_ops },
+ { PD(TI,1210), &ti_ops },
+ { PD(TI,1450), &ti_ops },
+ { PD(TI,1225), &ti_ops },
+ { PD(TI,1251A), &ti_ops },
+ { PD(TI,1211), &ti_ops },
+ { PD(TI,1251B), &ti_ops },
+ { PD(TI,1420), &ti_ops },
{ PD(RICOH,RL5C465), &ricoh_ops },
{ PD(RICOH,RL5C466), &ricoh_ops },