diff options
-rw-r--r-- | drivers/pcmcia/bfin_cf_pcmcia.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/cardbus.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/cs.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/omap_cf.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/pcmcia_ioctl.c | 4 | ||||
-rw-r--r-- | drivers/pcmcia/pcmcia_resource.c | 31 | ||||
-rw-r--r-- | include/pcmcia/ss.h | 7 |
7 files changed, 17 insertions, 31 deletions
diff --git a/drivers/pcmcia/bfin_cf_pcmcia.c b/drivers/pcmcia/bfin_cf_pcmcia.c index 9e84d039de41..eae9cbe37a3e 100644 --- a/drivers/pcmcia/bfin_cf_pcmcia.c +++ b/drivers/pcmcia/bfin_cf_pcmcia.c | |||
@@ -113,7 +113,7 @@ static int bfin_cf_get_status(struct pcmcia_socket *s, u_int *sp) | |||
113 | 113 | ||
114 | if (bfin_cf_present(cf->cd_pfx)) { | 114 | if (bfin_cf_present(cf->cd_pfx)) { |
115 | *sp = SS_READY | SS_DETECT | SS_POWERON | SS_3VCARD; | 115 | *sp = SS_READY | SS_DETECT | SS_POWERON | SS_3VCARD; |
116 | s->irq.AssignedIRQ = 0; | 116 | s->pcmcia_irq = 0; |
117 | s->pci_irq = cf->irq; | 117 | s->pci_irq = cf->irq; |
118 | 118 | ||
119 | } else | 119 | } else |
diff --git a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c index e6ab2a47d8cb..9a58862f1401 100644 --- a/drivers/pcmcia/cardbus.c +++ b/drivers/pcmcia/cardbus.c | |||
@@ -94,7 +94,6 @@ int __ref cb_alloc(struct pcmcia_socket *s) | |||
94 | pci_enable_bridges(bus); | 94 | pci_enable_bridges(bus); |
95 | pci_bus_add_devices(bus); | 95 | pci_bus_add_devices(bus); |
96 | 96 | ||
97 | s->irq.AssignedIRQ = s->pci_irq; | ||
98 | return 0; | 97 | return 0; |
99 | } | 98 | } |
100 | 99 | ||
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index c3383750e333..976d80706eae 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
@@ -337,7 +337,6 @@ static void socket_shutdown(struct pcmcia_socket *s) | |||
337 | s->socket = dead_socket; | 337 | s->socket = dead_socket; |
338 | s->ops->init(s); | 338 | s->ops->init(s); |
339 | s->ops->set_socket(s, &s->socket); | 339 | s->ops->set_socket(s, &s->socket); |
340 | s->irq.AssignedIRQ = s->irq.Config = 0; | ||
341 | s->lock_count = 0; | 340 | s->lock_count = 0; |
342 | kfree(s->fake_cis); | 341 | kfree(s->fake_cis); |
343 | s->fake_cis = NULL; | 342 | s->fake_cis = NULL; |
diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c index a7cfc7964c7c..0ad06a3bd562 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c | |||
@@ -117,7 +117,7 @@ static int omap_cf_get_status(struct pcmcia_socket *s, u_int *sp) | |||
117 | 117 | ||
118 | *sp = SS_READY | SS_DETECT | SS_POWERON | SS_3VCARD; | 118 | *sp = SS_READY | SS_DETECT | SS_POWERON | SS_3VCARD; |
119 | cf = container_of(s, struct omap_cf_socket, socket); | 119 | cf = container_of(s, struct omap_cf_socket, socket); |
120 | s->irq.AssignedIRQ = 0; | 120 | s->pcmcia_irq = 0; |
121 | s->pci_irq = cf->irq; | 121 | s->pci_irq = cf->irq; |
122 | } else | 122 | } else |
123 | *sp = 0; | 123 | *sp = 0; |
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 7631faa0cadd..fe98aa9b1aef 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
@@ -351,7 +351,7 @@ static int pccard_get_configuration_info(struct pcmcia_socket *s, | |||
351 | if (s->state & SOCKET_CARDBUS_CONFIG) { | 351 | if (s->state & SOCKET_CARDBUS_CONFIG) { |
352 | config->Attributes = CONF_VALID_CLIENT; | 352 | config->Attributes = CONF_VALID_CLIENT; |
353 | config->IntType = INT_CARDBUS; | 353 | config->IntType = INT_CARDBUS; |
354 | config->AssignedIRQ = s->irq.AssignedIRQ; | 354 | config->AssignedIRQ = s->pcmcia_irq; |
355 | if (config->AssignedIRQ) | 355 | if (config->AssignedIRQ) |
356 | config->Attributes |= CONF_ENABLE_IRQ; | 356 | config->Attributes |= CONF_ENABLE_IRQ; |
357 | if (s->io[0].res) { | 357 | if (s->io[0].res) { |
@@ -391,7 +391,7 @@ static int pccard_get_configuration_info(struct pcmcia_socket *s, | |||
391 | config->ExtStatus = c->ExtStatus; | 391 | config->ExtStatus = c->ExtStatus; |
392 | config->Present = config->CardValues = c->CardValues; | 392 | config->Present = config->CardValues = c->CardValues; |
393 | config->IRQAttributes = c->irq.Attributes; | 393 | config->IRQAttributes = c->irq.Attributes; |
394 | config->AssignedIRQ = s->irq.AssignedIRQ; | 394 | config->AssignedIRQ = s->pcmcia_irq; |
395 | config->BasePort1 = c->io.BasePort1; | 395 | config->BasePort1 = c->io.BasePort1; |
396 | config->NumPorts1 = c->io.NumPorts1; | 396 | config->NumPorts1 = c->io.NumPorts1; |
397 | config->Attributes1 = c->io.Attributes1; | 397 | config->Attributes1 = c->io.Attributes1; |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index ff9c0bcb7e3a..cefc4cda9d3e 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
@@ -430,13 +430,10 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
430 | dev_dbg(&s->dev, "IRQ attributes must match assigned ones\n"); | 430 | dev_dbg(&s->dev, "IRQ attributes must match assigned ones\n"); |
431 | goto out; | 431 | goto out; |
432 | } | 432 | } |
433 | if (s->irq.AssignedIRQ != req->AssignedIRQ) { | 433 | if (s->pcmcia_irq != req->AssignedIRQ) { |
434 | dev_dbg(&s->dev, "IRQ must match assigned one\n"); | 434 | dev_dbg(&s->dev, "IRQ must match assigned one\n"); |
435 | goto out; | 435 | goto out; |
436 | } | 436 | } |
437 | if (--s->irq.Config == 0) { | ||
438 | c->state &= ~CONFIG_IRQ_REQ; | ||
439 | } | ||
440 | 437 | ||
441 | if (req->Handler) | 438 | if (req->Handler) |
442 | free_irq(req->AssignedIRQ, p_dev->priv); | 439 | free_irq(req->AssignedIRQ, p_dev->priv); |
@@ -533,7 +530,7 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev, | |||
533 | if (req->Attributes & CONF_ENABLE_SPKR) | 530 | if (req->Attributes & CONF_ENABLE_SPKR) |
534 | s->socket.flags |= SS_SPKR_ENA; | 531 | s->socket.flags |= SS_SPKR_ENA; |
535 | if (req->Attributes & CONF_ENABLE_IRQ) | 532 | if (req->Attributes & CONF_ENABLE_IRQ) |
536 | s->socket.io_irq = s->irq.AssignedIRQ; | 533 | s->socket.io_irq = s->pcmcia_irq; |
537 | else | 534 | else |
538 | s->socket.io_irq = 0; | 535 | s->socket.io_irq = 0; |
539 | s->ops->set_socket(s, &s->socket); | 536 | s->ops->set_socket(s, &s->socket); |
@@ -556,7 +553,7 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev, | |||
556 | if (req->Present & PRESENT_IOBASE_0) | 553 | if (req->Present & PRESENT_IOBASE_0) |
557 | c->Option |= COR_ADDR_DECODE; | 554 | c->Option |= COR_ADDR_DECODE; |
558 | } | 555 | } |
559 | if (c->state & CONFIG_IRQ_REQ) | 556 | if (req->Attributes & CONF_ENABLE_IRQ) |
560 | if (!(c->irq.Attributes & IRQ_FORCED_PULSE)) | 557 | if (!(c->irq.Attributes & IRQ_FORCED_PULSE)) |
561 | c->Option |= COR_LEVEL_REQ; | 558 | c->Option |= COR_LEVEL_REQ; |
562 | pcmcia_write_cis_mem(s, 1, (base + CISREG_COR)>>1, 1, &c->Option); | 559 | pcmcia_write_cis_mem(s, 1, (base + CISREG_COR)>>1, 1, &c->Option); |
@@ -711,10 +708,6 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
711 | dev_dbg(&s->dev, "Configuration is locked\n"); | 708 | dev_dbg(&s->dev, "Configuration is locked\n"); |
712 | goto out; | 709 | goto out; |
713 | } | 710 | } |
714 | if (c->state & CONFIG_IRQ_REQ) { | ||
715 | dev_dbg(&s->dev, "IRQ already configured\n"); | ||
716 | goto out; | ||
717 | } | ||
718 | 711 | ||
719 | if (!irq) { | 712 | if (!irq) { |
720 | dev_dbg(&s->dev, "no IRQ available\n"); | 713 | dev_dbg(&s->dev, "no IRQ available\n"); |
@@ -723,8 +716,6 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
723 | 716 | ||
724 | if (!(req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)) { | 717 | if (!(req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)) { |
725 | req->Attributes |= IRQ_TYPE_DYNAMIC_SHARING; | 718 | req->Attributes |= IRQ_TYPE_DYNAMIC_SHARING; |
726 | dev_printk(KERN_WARNING, &p_dev->dev, "pcmcia: " | ||
727 | "request for exclusive IRQ could not be fulfilled.\n"); | ||
728 | dev_printk(KERN_WARNING, &p_dev->dev, "pcmcia: the driver " | 719 | dev_printk(KERN_WARNING, &p_dev->dev, "pcmcia: the driver " |
729 | "needs updating to supported shared IRQ lines.\n"); | 720 | "needs updating to supported shared IRQ lines.\n"); |
730 | } | 721 | } |
@@ -741,9 +732,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
741 | 732 | ||
742 | c->irq.Attributes = req->Attributes; | 733 | c->irq.Attributes = req->Attributes; |
743 | req->AssignedIRQ = irq; | 734 | req->AssignedIRQ = irq; |
744 | s->irq.Config++; | ||
745 | 735 | ||
746 | c->state |= CONFIG_IRQ_REQ; | ||
747 | p_dev->_irq = 1; | 736 | p_dev->_irq = 1; |
748 | 737 | ||
749 | ret = 0; | 738 | ret = 0; |
@@ -795,7 +784,7 @@ static int pcmcia_setup_isa_irq(struct pcmcia_device *p_dev, int type) | |||
795 | p_dev); | 784 | p_dev); |
796 | if (!ret) { | 785 | if (!ret) { |
797 | free_irq(irq, p_dev); | 786 | free_irq(irq, p_dev); |
798 | p_dev->irq_v = s->irq.AssignedIRQ = irq; | 787 | p_dev->irq_v = s->pcmcia_irq = irq; |
799 | pcmcia_used_irq[irq]++; | 788 | pcmcia_used_irq[irq]++; |
800 | break; | 789 | break; |
801 | } | 790 | } |
@@ -806,8 +795,8 @@ static int pcmcia_setup_isa_irq(struct pcmcia_device *p_dev, int type) | |||
806 | 795 | ||
807 | void pcmcia_cleanup_irq(struct pcmcia_socket *s) | 796 | void pcmcia_cleanup_irq(struct pcmcia_socket *s) |
808 | { | 797 | { |
809 | pcmcia_used_irq[s->irq.AssignedIRQ]--; | 798 | pcmcia_used_irq[s->pcmcia_irq]--; |
810 | s->irq.AssignedIRQ = 0; | 799 | s->pcmcia_irq = 0; |
811 | } | 800 | } |
812 | 801 | ||
813 | #else /* CONFIG_PCMCIA_PROBE */ | 802 | #else /* CONFIG_PCMCIA_PROBE */ |
@@ -819,7 +808,7 @@ static int pcmcia_setup_isa_irq(struct pcmcia_device *p_dev, int type) | |||
819 | 808 | ||
820 | void pcmcia_cleanup_irq(struct pcmcia_socket *s) | 809 | void pcmcia_cleanup_irq(struct pcmcia_socket *s) |
821 | { | 810 | { |
822 | s->irq.AssignedIRQ = 0; | 811 | s->pcmcia_irq = 0; |
823 | return; | 812 | return; |
824 | } | 813 | } |
825 | 814 | ||
@@ -840,8 +829,8 @@ int pcmcia_setup_irq(struct pcmcia_device *p_dev) | |||
840 | return 0; | 829 | return 0; |
841 | 830 | ||
842 | /* already assigned? */ | 831 | /* already assigned? */ |
843 | if (s->irq.AssignedIRQ) { | 832 | if (s->pcmcia_irq) { |
844 | p_dev->irq_v = s->irq.AssignedIRQ; | 833 | p_dev->irq_v = s->pcmcia_irq; |
845 | return 0; | 834 | return 0; |
846 | } | 835 | } |
847 | 836 | ||
@@ -855,7 +844,7 @@ int pcmcia_setup_irq(struct pcmcia_device *p_dev) | |||
855 | 844 | ||
856 | /* but use the PCI irq otherwise */ | 845 | /* but use the PCI irq otherwise */ |
857 | if (s->pci_irq) { | 846 | if (s->pci_irq) { |
858 | p_dev->irq_v = s->irq.AssignedIRQ = s->pci_irq; | 847 | p_dev->irq_v = s->pcmcia_irq = s->pci_irq; |
859 | return 0; | 848 | return 0; |
860 | } | 849 | } |
861 | 850 | ||
diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h index 344705cb42f4..764281b29218 100644 --- a/include/pcmcia/ss.h +++ b/include/pcmcia/ss.h | |||
@@ -141,10 +141,6 @@ struct pcmcia_socket { | |||
141 | u_short lock_count; | 141 | u_short lock_count; |
142 | pccard_mem_map cis_mem; | 142 | pccard_mem_map cis_mem; |
143 | void __iomem *cis_virt; | 143 | void __iomem *cis_virt; |
144 | struct { | ||
145 | u_int AssignedIRQ; | ||
146 | u_int Config; | ||
147 | } irq; | ||
148 | io_window_t io[MAX_IO_WIN]; | 144 | io_window_t io[MAX_IO_WIN]; |
149 | pccard_mem_map win[MAX_WIN]; | 145 | pccard_mem_map win[MAX_WIN]; |
150 | struct list_head cis_cache; | 146 | struct list_head cis_cache; |
@@ -235,6 +231,9 @@ struct pcmcia_socket { | |||
235 | /* non-zero if PCMCIA card is present */ | 231 | /* non-zero if PCMCIA card is present */ |
236 | atomic_t present; | 232 | atomic_t present; |
237 | 233 | ||
234 | /* IRQ to be used by PCMCIA devices. May not be IRQ 0. */ | ||
235 | unsigned int pcmcia_irq; | ||
236 | |||
238 | #ifdef CONFIG_PCMCIA_IOCTL | 237 | #ifdef CONFIG_PCMCIA_IOCTL |
239 | struct user_info_t *user; | 238 | struct user_info_t *user; |
240 | wait_queue_head_t queue; | 239 | wait_queue_head_t queue; |