diff options
Diffstat (limited to 'drivers/pcmcia/yenta_socket.c')
-rw-r--r-- | drivers/pcmcia/yenta_socket.c | 77 |
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; | |||
32 | module_param(disable_clkrun, bool, 0444); | 31 | module_param(disable_clkrun, bool, 0444); |
33 | MODULE_PARM_DESC(disable_clkrun, "If PC card doesn't function properly, please try this option"); | 32 | MODULE_PARM_DESC(disable_clkrun, "If PC card doesn't function properly, please try this option"); |
34 | 33 | ||
34 | static int isa_probe = 1; | ||
35 | module_param(isa_probe, bool, 0444); | ||
36 | MODULE_PARM_DESC(isa_probe, "If set ISA interrupts are probed (default). Set to N to disable probing"); | ||
37 | |||
38 | static int pwr_irqs_off; | ||
39 | module_param(pwr_irqs_off, bool, 0644); | ||
40 | MODULE_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 | ||
408 | static unsigned int yenta_events(struct yenta_socket *socket) | 416 | |
417 | static 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) | |
433 | static 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 */ | ||
477 | static 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 */ |
474 | static int yenta_sock_init(struct pcmcia_socket *sock) | 489 | static 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 | */ |
854 | static void yenta_get_socket_capabilities(struct yenta_socket *socket, u32 isa_irq_mask) | 869 | static 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 | ||