diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-03-23 02:25:38 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-03-23 02:25:38 +0000 |
commit | 16b5d462f73eb29d1f67fa01cc1ea66afdc72569 (patch) | |
tree | 5407bd573f4840e473ea27cbe61e5c7a07131fcd /drivers/pcmcia | |
parent | ce8a076e11e7e5ee36007f9a3eee5bb3744cb8f6 (diff) |
Merge with Linux 2.3.99-pre2.
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/ti113x.h | 45 | ||||
-rw-r--r-- | drivers/pcmcia/yenta.c | 11 |
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 }, |