[RFC PATCH 05/19] pcmcia: replace struct irq with uint pcmcia_irq in struct pcmcia_socket
Dominik Brodowski
linux at dominikbrodowski.net
Sun Mar 21 19:07:23 EDT 2010
As we don't need the "Config" counter any more, we can simplify
struct pcmcia_socket.
Signed-off-by: Dominik Brodowski <linux at dominikbrodowski.net>
---
drivers/pcmcia/bfin_cf_pcmcia.c | 2 +-
drivers/pcmcia/cardbus.c | 1 -
drivers/pcmcia/cs.c | 1 -
drivers/pcmcia/omap_cf.c | 2 +-
drivers/pcmcia/pcmcia_ioctl.c | 4 ++--
drivers/pcmcia/pcmcia_resource.c | 31 ++++++++++---------------------
include/pcmcia/ss.h | 6 ++----
7 files changed, 16 insertions(+), 31 deletions(-)
diff --git a/drivers/pcmcia/bfin_cf_pcmcia.c b/drivers/pcmcia/bfin_cf_pcmcia.c
index 2482ce7..1744f38 100644
--- a/drivers/pcmcia/bfin_cf_pcmcia.c
+++ b/drivers/pcmcia/bfin_cf_pcmcia.c
@@ -112,7 +112,7 @@ static int bfin_cf_get_status(struct pcmcia_socket *s, u_int *sp)
if (bfin_cf_present(cf->cd_pfx)) {
*sp = SS_READY | SS_DETECT | SS_POWERON | SS_3VCARD;
- s->irq.AssignedIRQ = 0;
+ s->pcmcia_irq = 0;
s->pci_irq = cf->irq;
} else
diff --git a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c
index e6ab2a4..9a58862 100644
--- a/drivers/pcmcia/cardbus.c
+++ b/drivers/pcmcia/cardbus.c
@@ -94,7 +94,6 @@ int __ref cb_alloc(struct pcmcia_socket *s)
pci_enable_bridges(bus);
pci_bus_add_devices(bus);
- s->irq.AssignedIRQ = s->pci_irq;
return 0;
}
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c
index e679e70..2295837 100644
--- a/drivers/pcmcia/cs.c
+++ b/drivers/pcmcia/cs.c
@@ -396,7 +396,6 @@ static void socket_shutdown(struct pcmcia_socket *s)
s->socket = dead_socket;
s->ops->init(s);
s->ops->set_socket(s, &s->socket);
- s->irq.AssignedIRQ = s->irq.Config = 0;
s->lock_count = 0;
kfree(s->fake_cis);
s->fake_cis = NULL;
diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c
index 3ef9915..7d49ba0 100644
--- a/drivers/pcmcia/omap_cf.c
+++ b/drivers/pcmcia/omap_cf.c
@@ -116,7 +116,7 @@ static int omap_cf_get_status(struct pcmcia_socket *s, u_int *sp)
*sp = SS_READY | SS_DETECT | SS_POWERON | SS_3VCARD;
cf = container_of(s, struct omap_cf_socket, socket);
- s->irq.AssignedIRQ = 0;
+ s->pcmcia_irq = 0;
s->pci_irq = cf->irq;
} else
*sp = 0;
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c
index 13a7132..5abbad5 100644
--- a/drivers/pcmcia/pcmcia_ioctl.c
+++ b/drivers/pcmcia/pcmcia_ioctl.c
@@ -350,7 +350,7 @@ static int pccard_get_configuration_info(struct pcmcia_socket *s,
if (s->state & SOCKET_CARDBUS_CONFIG) {
config->Attributes = CONF_VALID_CLIENT;
config->IntType = INT_CARDBUS;
- config->AssignedIRQ = s->irq.AssignedIRQ;
+ config->AssignedIRQ = s->pcmcia_irq;
if (config->AssignedIRQ)
config->Attributes |= CONF_ENABLE_IRQ;
if (s->io[0].res) {
@@ -390,7 +390,7 @@ static int pccard_get_configuration_info(struct pcmcia_socket *s,
config->ExtStatus = c->ExtStatus;
config->Present = config->CardValues = c->CardValues;
config->IRQAttributes = c->irq.Attributes;
- config->AssignedIRQ = s->irq.AssignedIRQ;
+ config->AssignedIRQ = s->pcmcia_irq;
config->BasePort1 = c->io.BasePort1;
config->NumPorts1 = c->io.NumPorts1;
config->Attributes1 = c->io.Attributes1;
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c
index e4b8fa0..fb08e80 100644
--- a/drivers/pcmcia/pcmcia_resource.c
+++ b/drivers/pcmcia/pcmcia_resource.c
@@ -429,13 +429,10 @@ static int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
dev_dbg(&s->dev, "IRQ attributes must match assigned ones\n");
goto out;
}
- if (s->irq.AssignedIRQ != req->AssignedIRQ) {
+ if (s->pcmcia_irq != req->AssignedIRQ) {
dev_dbg(&s->dev, "IRQ must match assigned one\n");
goto out;
}
- if (--s->irq.Config == 0) {
- c->state &= ~CONFIG_IRQ_REQ;
- }
if (req->Handler)
free_irq(req->AssignedIRQ, p_dev->priv);
@@ -532,7 +529,7 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev,
if (req->Attributes & CONF_ENABLE_SPKR)
s->socket.flags |= SS_SPKR_ENA;
if (req->Attributes & CONF_ENABLE_IRQ)
- s->socket.io_irq = s->irq.AssignedIRQ;
+ s->socket.io_irq = s->pcmcia_irq;
else
s->socket.io_irq = 0;
s->ops->set_socket(s, &s->socket);
@@ -555,7 +552,7 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev,
if (req->Present & PRESENT_IOBASE_0)
c->Option |= COR_ADDR_DECODE;
}
- if (c->state & CONFIG_IRQ_REQ)
+ if (req->Attributes & CONF_ENABLE_IRQ)
if (!(c->irq.Attributes & IRQ_FORCED_PULSE))
c->Option |= COR_LEVEL_REQ;
pcmcia_write_cis_mem(s, 1, (base + CISREG_COR)>>1, 1, &c->Option);
@@ -710,10 +707,6 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
dev_dbg(&s->dev, "Configuration is locked\n");
goto out;
}
- if (c->state & CONFIG_IRQ_REQ) {
- dev_dbg(&s->dev, "IRQ already configured\n");
- goto out;
- }
if (!irq) {
dev_dbg(&s->dev, "no IRQ available\n");
@@ -722,8 +715,6 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
if (!(req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)) {
req->Attributes |= IRQ_TYPE_DYNAMIC_SHARING;
- dev_printk(KERN_WARNING, &p_dev->dev, "pcmcia: "
- "request for exclusive IRQ could not be fulfilled.\n");
dev_printk(KERN_WARNING, &p_dev->dev, "pcmcia: the driver "
"needs updating to supported shared IRQ lines.\n");
}
@@ -740,9 +731,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req)
c->irq.Attributes = req->Attributes;
req->AssignedIRQ = irq;
- s->irq.Config++;
- c->state |= CONFIG_IRQ_REQ;
p_dev->_irq = 1;
ret = 0;
@@ -794,7 +783,7 @@ static int pcmcia_setup_isa_irq(struct pcmcia_device *p_dev, int type)
p_dev);
if (!ret) {
free_irq(irq, p_dev);
- p_dev->irq_v = s->irq.AssignedIRQ = irq;
+ p_dev->irq_v = s->pcmcia_irq = irq;
pcmcia_used_irq[irq]++;
break;
}
@@ -805,8 +794,8 @@ static int pcmcia_setup_isa_irq(struct pcmcia_device *p_dev, int type)
void pcmcia_cleanup_irq(struct pcmcia_socket *s)
{
- pcmcia_used_irq[s->irq.AssignedIRQ]--;
- s->irq.AssignedIRQ = 0;
+ pcmcia_used_irq[s->pcmcia_irq]--;
+ s->pcmcia_irq = 0;
}
#else /* CONFIG_PCMCIA_PROBE */
@@ -818,7 +807,7 @@ static int pcmcia_setup_isa_irq(struct pcmcia_device *p_dev, int type)
void pcmcia_cleanup_irq(struct pcmcia_socket *s)
{
- s->irq.AssignedIRQ = 0;
+ s->pcmcia_irq = 0;
return;
}
@@ -839,8 +828,8 @@ int pcmcia_setup_irq(struct pcmcia_device *p_dev)
return 0;
/* already assigned? */
- if (s->irq.AssignedIRQ) {
- p_dev->irq_v = s->irq.AssignedIRQ;
+ if (s->pcmcia_irq) {
+ p_dev->irq_v = s->pcmcia_irq;
return 0;
}
@@ -854,7 +843,7 @@ int pcmcia_setup_irq(struct pcmcia_device *p_dev)
/* but use the PCI irq otherwise */
if (s->pci_irq) {
- p_dev->irq_v = s->irq.AssignedIRQ = s->pci_irq;
+ p_dev->irq_v = s->pcmcia_irq = s->pci_irq;
return 0;
}
diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h
index 32896a7..313c912 100644
--- a/include/pcmcia/ss.h
+++ b/include/pcmcia/ss.h
@@ -141,10 +141,6 @@ struct pcmcia_socket {
u_short lock_count;
pccard_mem_map cis_mem;
void __iomem *cis_virt;
- struct {
- u_int AssignedIRQ;
- u_int Config;
- } irq;
io_window_t io[MAX_IO_WIN];
pccard_mem_map win[MAX_WIN];
struct list_head cis_cache;
@@ -236,6 +232,8 @@ struct pcmcia_socket {
u8 reserved:4;
} pcmcia_state;
+ /* IRQ to be used by PCMCIA devices. May not be IRQ 0. */
+ unsigned int pcmcia_irq;
#ifdef CONFIG_PCMCIA_IOCTL
struct user_info_t *user;
--
1.6.3.3
More information about the linux-pcmcia
mailing list