aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia/yenta_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pcmcia/yenta_socket.c')
-rw-r--r--drivers/pcmcia/yenta_socket.c77
1 files changed, 50 insertions, 27 deletions
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
index caf7159a54be..15f716a7968a 100644
--- a/drivers/pcmcia/yenta_socket.c
+++ b/drivers/pcmcia/yenta_socket.c
@@ -18,7 +18,6 @@
18#include <linux/delay.h> 18#include <linux/delay.h>
19#include <linux/module.h> 19#include <linux/module.h>
20 20
21#include <pcmcia/version.h>
22#include <pcmcia/cs_types.h> 21#include <pcmcia/cs_types.h>
23#include <pcmcia/ss.h> 22#include <pcmcia/ss.h>
24#include <pcmcia/cs.h> 23#include <pcmcia/cs.h>
@@ -32,6 +31,14 @@ static int disable_clkrun;
32module_param(disable_clkrun, bool, 0444); 31module_param(disable_clkrun, bool, 0444);
33MODULE_PARM_DESC(disable_clkrun, "If PC card doesn't function properly, please try this option"); 32MODULE_PARM_DESC(disable_clkrun, "If PC card doesn't function properly, please try this option");
34 33
34static int isa_probe = 1;
35module_param(isa_probe, bool, 0444);
36MODULE_PARM_DESC(isa_probe, "If set ISA interrupts are probed (default). Set to N to disable probing");
37
38static int pwr_irqs_off;
39module_param(pwr_irqs_off, bool, 0644);
40MODULE_PARM_DESC(pwr_irqs_off, "Force IRQs off during power-on of slot. Use only when seeing IRQ storms!");
41
35#if 0 42#if 0
36#define debug(x,args...) printk(KERN_DEBUG "%s: " x, __func__ , ##args) 43#define debug(x,args...) printk(KERN_DEBUG "%s: " x, __func__ , ##args)
37#else 44#else
@@ -150,15 +157,16 @@ static int yenta_get_status(struct pcmcia_socket *sock, unsigned int *value)
150 157
151 val = (state & CB_3VCARD) ? SS_3VCARD : 0; 158 val = (state & CB_3VCARD) ? SS_3VCARD : 0;
152 val |= (state & CB_XVCARD) ? SS_XVCARD : 0; 159 val |= (state & CB_XVCARD) ? SS_XVCARD : 0;
153 val |= (state & (CB_CDETECT1 | CB_CDETECT2 | CB_5VCARD | CB_3VCARD 160 val |= (state & (CB_5VCARD | CB_3VCARD | CB_XVCARD | CB_YVCARD)) ? 0 : SS_PENDING;
154 | CB_XVCARD | CB_YVCARD)) ? 0 : SS_PENDING; 161 val |= (state & (CB_CDETECT1 | CB_CDETECT2)) ? SS_PENDING : 0;
162
155 163
156 if (state & CB_CBCARD) { 164 if (state & CB_CBCARD) {
157 val |= SS_CARDBUS; 165 val |= SS_CARDBUS;
158 val |= (state & CB_CARDSTS) ? SS_STSCHG : 0; 166 val |= (state & CB_CARDSTS) ? SS_STSCHG : 0;
159 val |= (state & (CB_CDETECT1 | CB_CDETECT2)) ? 0 : SS_DETECT; 167 val |= (state & (CB_CDETECT1 | CB_CDETECT2)) ? 0 : SS_DETECT;
160 val |= (state & CB_PWRCYCLE) ? SS_POWERON | SS_READY : 0; 168 val |= (state & CB_PWRCYCLE) ? SS_POWERON | SS_READY : 0;
161 } else { 169 } else if (state & CB_16BITCARD) {
162 u8 status = exca_readb(socket, I365_STATUS); 170 u8 status = exca_readb(socket, I365_STATUS);
163 val |= ((status & I365_CS_DETECT) == I365_CS_DETECT) ? SS_DETECT : 0; 171 val |= ((status & I365_CS_DETECT) == I365_CS_DETECT) ? SS_DETECT : 0;
164 if (exca_readb(socket, I365_INTCTL) & I365_PC_IOCARD) { 172 if (exca_readb(socket, I365_INTCTL) & I365_PC_IOCARD) {
@@ -405,11 +413,13 @@ static int yenta_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *
405} 413}
406 414
407 415
408static unsigned int yenta_events(struct yenta_socket *socket) 416
417static irqreturn_t yenta_interrupt(int irq, void *dev_id, struct pt_regs *regs)
409{ 418{
419 unsigned int events;
420 struct yenta_socket *socket = (struct yenta_socket *) dev_id;
410 u8 csc; 421 u8 csc;
411 u32 cb_event; 422 u32 cb_event;
412 unsigned int events;
413 423
414 /* Clear interrupt status for the event */ 424 /* Clear interrupt status for the event */
415 cb_event = cb_readl(socket, CB_SOCKET_EVENT); 425 cb_event = cb_readl(socket, CB_SOCKET_EVENT);
@@ -426,20 +436,13 @@ static unsigned int yenta_events(struct yenta_socket *socket)
426 events |= (csc & I365_CSC_BVD2) ? SS_BATWARN : 0; 436 events |= (csc & I365_CSC_BVD2) ? SS_BATWARN : 0;
427 events |= (csc & I365_CSC_READY) ? SS_READY : 0; 437 events |= (csc & I365_CSC_READY) ? SS_READY : 0;
428 } 438 }
429 return events;
430}
431 439
432 440 if (events)
433static irqreturn_t yenta_interrupt(int irq, void *dev_id, struct pt_regs *regs)
434{
435 unsigned int events;
436 struct yenta_socket *socket = (struct yenta_socket *) dev_id;
437
438 events = yenta_events(socket);
439 if (events) {
440 pcmcia_parse_events(&socket->socket, events); 441 pcmcia_parse_events(&socket->socket, events);
442
443 if (cb_event || csc)
441 return IRQ_HANDLED; 444 return IRQ_HANDLED;
442 } 445
443 return IRQ_NONE; 446 return IRQ_NONE;
444} 447}
445 448
@@ -470,11 +473,22 @@ static void yenta_clear_maps(struct yenta_socket *socket)
470 } 473 }
471} 474}
472 475
476/* redoes voltage interrogation if required */
477static void yenta_interrogate(struct yenta_socket *socket)
478{
479 u32 state;
480
481 state = cb_readl(socket, CB_SOCKET_STATE);
482 if (!(state & (CB_5VCARD | CB_3VCARD | CB_XVCARD | CB_YVCARD)) ||
483 (state & (CB_CDETECT1 | CB_CDETECT2 | CB_NOTACARD | CB_BADVCCREQ)) ||
484 ((state & (CB_16BITCARD | CB_CBCARD)) == (CB_16BITCARD | CB_CBCARD)))
485 cb_writel(socket, CB_SOCKET_FORCE, CB_CVSTEST);
486}
487
473/* Called at resume and initialization events */ 488/* Called at resume and initialization events */
474static int yenta_sock_init(struct pcmcia_socket *sock) 489static int yenta_sock_init(struct pcmcia_socket *sock)
475{ 490{
476 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); 491 struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
477 u32 state;
478 u16 bridge; 492 u16 bridge;
479 493
480 bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~CB_BRIDGE_INTR; 494 bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~CB_BRIDGE_INTR;
@@ -486,10 +500,7 @@ static int yenta_sock_init(struct pcmcia_socket *sock)
486 exca_writeb(socket, I365_GENCTL, 0x00); 500 exca_writeb(socket, I365_GENCTL, 0x00);
487 501
488 /* Redo card voltage interrogation */ 502 /* Redo card voltage interrogation */
489 state = cb_readl(socket, CB_SOCKET_STATE); 503 yenta_interrogate(socket);
490 if (!(state & (CB_CDETECT1 | CB_CDETECT2 | CB_5VCARD |
491 CB_3VCARD | CB_XVCARD | CB_YVCARD)))
492 cb_writel(socket, CB_SOCKET_FORCE, CB_CVSTEST);
493 504
494 yenta_clear_maps(socket); 505 yenta_clear_maps(socket);
495 506
@@ -537,6 +548,11 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
537 unsigned offset; 548 unsigned offset;
538 unsigned mask; 549 unsigned mask;
539 550
551 res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr;
552 /* Already allocated? */
553 if (res->parent)
554 return 0;
555
540 /* The granularity of the memory limit is 4kB, on IO it's 4 bytes */ 556 /* The granularity of the memory limit is 4kB, on IO it's 4 bytes */
541 mask = ~0xfff; 557 mask = ~0xfff;
542 if (type & IORESOURCE_IO) 558 if (type & IORESOURCE_IO)
@@ -544,7 +560,6 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
544 560
545 offset = 0x1c + 8*nr; 561 offset = 0x1c + 8*nr;
546 bus = socket->dev->subordinate; 562 bus = socket->dev->subordinate;
547 res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr;
548 res->name = bus->name; 563 res->name = bus->name;
549 res->flags = type; 564 res->flags = type;
550 res->start = 0; 565 res->start = 0;
@@ -853,11 +868,11 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket)
853 */ 868 */
854static void yenta_get_socket_capabilities(struct yenta_socket *socket, u32 isa_irq_mask) 869static void yenta_get_socket_capabilities(struct yenta_socket *socket, u32 isa_irq_mask)
855{ 870{
856 socket->socket.features |= SS_CAP_PAGE_REGS | SS_CAP_PCCARD | SS_CAP_CARDBUS;
857 socket->socket.map_size = 0x1000;
858 socket->socket.pci_irq = socket->cb_irq; 871 socket->socket.pci_irq = socket->cb_irq;
859 socket->socket.irq_mask = yenta_probe_irq(socket, isa_irq_mask); 872 if (isa_probe)
860 socket->socket.cb_dev = socket->dev; 873 socket->socket.irq_mask = yenta_probe_irq(socket, isa_irq_mask);
874 else
875 socket->socket.irq_mask = 0;
861 876
862 printk(KERN_INFO "Yenta: ISA IRQ mask 0x%04x, PCI irq %d\n", 877 printk(KERN_INFO "Yenta: ISA IRQ mask 0x%04x, PCI irq %d\n",
863 socket->socket.irq_mask, socket->cb_irq); 878 socket->socket.irq_mask, socket->cb_irq);
@@ -923,6 +938,9 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
923 socket->socket.dev.dev = &dev->dev; 938 socket->socket.dev.dev = &dev->dev;
924 socket->socket.driver_data = socket; 939 socket->socket.driver_data = socket;
925 socket->socket.owner = THIS_MODULE; 940 socket->socket.owner = THIS_MODULE;
941 socket->socket.features = SS_CAP_PAGE_REGS | SS_CAP_PCCARD;
942 socket->socket.map_size = 0x1000;
943 socket->socket.cb_dev = dev;
926 944
927 /* prepare struct yenta_socket */ 945 /* prepare struct yenta_socket */
928 socket->dev = dev; 946 socket->dev = dev;
@@ -993,9 +1011,14 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
993 socket->poll_timer.data = (unsigned long)socket; 1011 socket->poll_timer.data = (unsigned long)socket;
994 socket->poll_timer.expires = jiffies + HZ; 1012 socket->poll_timer.expires = jiffies + HZ;
995 add_timer(&socket->poll_timer); 1013 add_timer(&socket->poll_timer);
1014 printk(KERN_INFO "Yenta: no PCI IRQ, CardBus support disabled for this socket.\n"
1015 KERN_INFO "Yenta: check your BIOS CardBus, BIOS IRQ or ACPI settings.\n");
1016 } else {
1017 socket->socket.features |= SS_CAP_CARDBUS;
996 } 1018 }
997 1019
998 /* Figure out what the dang thing can do for the PCMCIA layer... */ 1020 /* Figure out what the dang thing can do for the PCMCIA layer... */
1021 yenta_interrogate(socket);
999 yenta_get_socket_capabilities(socket, isa_interrupts); 1022 yenta_get_socket_capabilities(socket, isa_interrupts);
1000 printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); 1023 printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
1001 1024