Commit 75c71254 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] fix for 16-bit PCMCIA interrupt selection

From: David Hinds <dhinds@sonic.net>

This fixes interrupt allocation for 16-bit PCMCIA cards, so that on systems
supporting ISA bus interrupts, if all ISA interrupts are unavailable, we'll
fall back on sharing the bridge PCI interrupt.
parent 9a639403
...@@ -1916,7 +1916,7 @@ int pcmcia_request_irq(client_handle_t handle, irq_req_t *req) ...@@ -1916,7 +1916,7 @@ int pcmcia_request_irq(client_handle_t handle, irq_req_t *req)
{ {
struct pcmcia_socket *s; struct pcmcia_socket *s;
config_t *c; config_t *c;
int ret = 0, irq = 0; int ret = CS_IN_USE, irq = 0;
if (CHECK_HANDLE(handle)) if (CHECK_HANDLE(handle))
return CS_BAD_HANDLE; return CS_BAD_HANDLE;
...@@ -1928,13 +1928,9 @@ int pcmcia_request_irq(client_handle_t handle, irq_req_t *req) ...@@ -1928,13 +1928,9 @@ int pcmcia_request_irq(client_handle_t handle, irq_req_t *req)
return CS_CONFIGURATION_LOCKED; return CS_CONFIGURATION_LOCKED;
if (c->state & CONFIG_IRQ_REQ) if (c->state & CONFIG_IRQ_REQ)
return CS_IN_USE; return CS_IN_USE;
/* Short cut: if there are no ISA interrupts, then it is PCI */
if (!s->irq_mask) {
irq = s->pci_irq;
ret = (irq) ? 0 : CS_IN_USE;
#ifdef CONFIG_PCMCIA_PROBE #ifdef CONFIG_PCMCIA_PROBE
} else if (s->irq.AssignedIRQ != 0) { if (s->irq.AssignedIRQ != 0) {
/* If the interrupt is already assigned, it must match */ /* If the interrupt is already assigned, it must match */
irq = s->irq.AssignedIRQ; irq = s->irq.AssignedIRQ;
if (req->IRQInfo1 & IRQ_INFO2_VALID) { if (req->IRQInfo1 & IRQ_INFO2_VALID) {
...@@ -1943,7 +1939,6 @@ int pcmcia_request_irq(client_handle_t handle, irq_req_t *req) ...@@ -1943,7 +1939,6 @@ int pcmcia_request_irq(client_handle_t handle, irq_req_t *req)
} else } else
ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS; ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS;
} else { } else {
ret = CS_IN_USE;
if (req->IRQInfo1 & IRQ_INFO2_VALID) { if (req->IRQInfo1 & IRQ_INFO2_VALID) {
u_int try, mask = req->IRQInfo2 & s->irq_mask; u_int try, mask = req->IRQInfo2 & s->irq_mask;
for (try = 0; try < 2; try++) { for (try = 0; try < 2; try++) {
...@@ -1958,12 +1953,13 @@ int pcmcia_request_irq(client_handle_t handle, irq_req_t *req) ...@@ -1958,12 +1953,13 @@ int pcmcia_request_irq(client_handle_t handle, irq_req_t *req)
irq = req->IRQInfo1 & IRQ_MASK; irq = req->IRQInfo1 & IRQ_MASK;
ret = try_irq(req->Attributes, irq, 1); ret = try_irq(req->Attributes, irq, 1);
} }
#else }
} else {
ret = CS_UNSUPPORTED_MODE;
#endif #endif
if (ret != 0) {
if (!s->pci_irq)
return ret;
irq = s->pci_irq;
} }
if (ret != 0) return ret;
if (req->Attributes & IRQ_HANDLE_PRESENT) { if (req->Attributes & IRQ_HANDLE_PRESENT) {
if (request_irq(irq, req->Handler, if (request_irq(irq, req->Handler,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment