diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-03-07 06:21:16 -0500 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-05-10 04:23:13 -0400 |
commit | eb14120f743d29744d9475bffec56ff4ad43a749 (patch) | |
tree | 56857094d2b0cfc0ecbd1685f18d6edbe78e140f /drivers/isdn | |
parent | a7debe789dfcaee9c4d81e5738b0be8c5d93930b (diff) |
pcmcia: re-work pcmcia_request_irq()
Instead of the old pcmcia_request_irq() interface, drivers may now
choose between:
- calling request_irq/free_irq directly. Use the IRQ from *p_dev->irq.
- use pcmcia_request_irq(p_dev, handler_t); the PCMCIA core will
clean up automatically on calls to pcmcia_disable_device() or
device ejection.
- drivers still not capable of IRQF_SHARED (or not telling us so) may
use the deprecated pcmcia_request_exclusive_irq() for the time
being; they might receive a shared IRQ nonetheless.
CC: linux-bluetooth@vger.kernel.org
CC: netdev@vger.kernel.org
CC: linux-wireless@vger.kernel.org
CC: linux-serial@vger.kernel.org
CC: alsa-devel@alsa-project.org
CC: linux-usb@vger.kernel.org
CC: linux-ide@vger.kernel.org
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Diffstat (limited to 'drivers/isdn')
-rw-r--r-- | drivers/isdn/hardware/avm/avm_cs.c | 17 | ||||
-rw-r--r-- | drivers/isdn/hisax/avma1_cs.c | 12 | ||||
-rw-r--r-- | drivers/isdn/hisax/elsa_cs.c | 13 | ||||
-rw-r--r-- | drivers/isdn/hisax/sedlbauer_cs.c | 23 | ||||
-rw-r--r-- | drivers/isdn/hisax/teles_cs.c | 13 |
5 files changed, 18 insertions, 60 deletions
diff --git a/drivers/isdn/hardware/avm/avm_cs.c b/drivers/isdn/hardware/avm/avm_cs.c index 94b796d84053..0d485f6c2194 100644 --- a/drivers/isdn/hardware/avm/avm_cs.c +++ b/drivers/isdn/hardware/avm/avm_cs.c | |||
@@ -107,9 +107,6 @@ static int avmcs_probe(struct pcmcia_device *p_dev) | |||
107 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 107 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
108 | p_dev->io.NumPorts2 = 0; | 108 | p_dev->io.NumPorts2 = 0; |
109 | 109 | ||
110 | /* Interrupt setup */ | ||
111 | p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; | ||
112 | |||
113 | /* General socket configuration */ | 110 | /* General socket configuration */ |
114 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; | 111 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; |
115 | p_dev->conf.IntType = INT_MEMORY_AND_IO; | 112 | p_dev->conf.IntType = INT_MEMORY_AND_IO; |
@@ -172,7 +169,7 @@ static int avmcs_configcheck(struct pcmcia_device *p_dev, | |||
172 | static int avmcs_config(struct pcmcia_device *link) | 169 | static int avmcs_config(struct pcmcia_device *link) |
173 | { | 170 | { |
174 | local_info_t *dev; | 171 | local_info_t *dev; |
175 | int i; | 172 | int i = -1; |
176 | char devname[128]; | 173 | char devname[128]; |
177 | int cardtype; | 174 | int cardtype; |
178 | int (*addcard)(unsigned int port, unsigned irq); | 175 | int (*addcard)(unsigned int port, unsigned irq); |
@@ -190,11 +187,7 @@ static int avmcs_config(struct pcmcia_device *link) | |||
190 | return -ENODEV; | 187 | return -ENODEV; |
191 | 188 | ||
192 | do { | 189 | do { |
193 | /* | 190 | if (!link->irq) { |
194 | * allocate an interrupt line | ||
195 | */ | ||
196 | i = pcmcia_request_irq(link, &link->irq); | ||
197 | if (i != 0) { | ||
198 | /* undo */ | 191 | /* undo */ |
199 | pcmcia_disable_device(link); | 192 | pcmcia_disable_device(link); |
200 | break; | 193 | break; |
@@ -249,9 +242,9 @@ static int avmcs_config(struct pcmcia_device *link) | |||
249 | default: | 242 | default: |
250 | case AVM_CARDTYPE_B1: addcard = b1pcmcia_addcard_b1; break; | 243 | case AVM_CARDTYPE_B1: addcard = b1pcmcia_addcard_b1; break; |
251 | } | 244 | } |
252 | if ((i = (*addcard)(link->io.BasePort1, link->irq.AssignedIRQ)) < 0) { | 245 | if ((i = (*addcard)(link->io.BasePort1, link->irq)) < 0) { |
253 | printk(KERN_ERR "avm_cs: failed to add AVM-%s-Controller at i/o %#x, irq %d\n", | 246 | printk(KERN_ERR "avm_cs: failed to add AVM-%s-Controller at i/o %#x, irq %d\n", |
254 | dev->node.dev_name, link->io.BasePort1, link->irq.AssignedIRQ); | 247 | dev->node.dev_name, link->io.BasePort1, link->irq); |
255 | avmcs_release(link); | 248 | avmcs_release(link); |
256 | return -ENODEV; | 249 | return -ENODEV; |
257 | } | 250 | } |
@@ -270,7 +263,7 @@ static int avmcs_config(struct pcmcia_device *link) | |||
270 | 263 | ||
271 | static void avmcs_release(struct pcmcia_device *link) | 264 | static void avmcs_release(struct pcmcia_device *link) |
272 | { | 265 | { |
273 | b1pcmcia_delcard(link->io.BasePort1, link->irq.AssignedIRQ); | 266 | b1pcmcia_delcard(link->io.BasePort1, link->irq); |
274 | pcmcia_disable_device(link); | 267 | pcmcia_disable_device(link); |
275 | } /* avmcs_release */ | 268 | } /* avmcs_release */ |
276 | 269 | ||
diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c index 8d1d63a02b34..3ae2176c6f75 100644 --- a/drivers/isdn/hisax/avma1_cs.c +++ b/drivers/isdn/hisax/avma1_cs.c | |||
@@ -119,9 +119,6 @@ static int __devinit avma1cs_probe(struct pcmcia_device *p_dev) | |||
119 | p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_16; | 119 | p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_16; |
120 | p_dev->io.IOAddrLines = 5; | 120 | p_dev->io.IOAddrLines = 5; |
121 | 121 | ||
122 | /* Interrupt setup */ | ||
123 | p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; | ||
124 | |||
125 | /* General socket configuration */ | 122 | /* General socket configuration */ |
126 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; | 123 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; |
127 | p_dev->conf.IntType = INT_MEMORY_AND_IO; | 124 | p_dev->conf.IntType = INT_MEMORY_AND_IO; |
@@ -177,7 +174,7 @@ static int avma1cs_configcheck(struct pcmcia_device *p_dev, | |||
177 | static int __devinit avma1cs_config(struct pcmcia_device *link) | 174 | static int __devinit avma1cs_config(struct pcmcia_device *link) |
178 | { | 175 | { |
179 | local_info_t *dev; | 176 | local_info_t *dev; |
180 | int i; | 177 | int i = -1; |
181 | char devname[128]; | 178 | char devname[128]; |
182 | IsdnCard_t icard; | 179 | IsdnCard_t icard; |
183 | int busy = 0; | 180 | int busy = 0; |
@@ -197,8 +194,7 @@ static int __devinit avma1cs_config(struct pcmcia_device *link) | |||
197 | /* | 194 | /* |
198 | * allocate an interrupt line | 195 | * allocate an interrupt line |
199 | */ | 196 | */ |
200 | i = pcmcia_request_irq(link, &link->irq); | 197 | if (!link->irq) { |
201 | if (i != 0) { | ||
202 | /* undo */ | 198 | /* undo */ |
203 | pcmcia_disable_device(link); | 199 | pcmcia_disable_device(link); |
204 | break; | 200 | break; |
@@ -230,9 +226,9 @@ static int __devinit avma1cs_config(struct pcmcia_device *link) | |||
230 | } | 226 | } |
231 | 227 | ||
232 | printk(KERN_NOTICE "avma1_cs: checking at i/o %#x, irq %d\n", | 228 | printk(KERN_NOTICE "avma1_cs: checking at i/o %#x, irq %d\n", |
233 | link->io.BasePort1, link->irq.AssignedIRQ); | 229 | link->io.BasePort1, link->irq); |
234 | 230 | ||
235 | icard.para[0] = link->irq.AssignedIRQ; | 231 | icard.para[0] = link->irq; |
236 | icard.para[1] = link->io.BasePort1; | 232 | icard.para[1] = link->io.BasePort1; |
237 | icard.protocol = isdnprot; | 233 | icard.protocol = isdnprot; |
238 | icard.typ = ISDN_CTYPE_A1_PCMCIA; | 234 | icard.typ = ISDN_CTYPE_A1_PCMCIA; |
diff --git a/drivers/isdn/hisax/elsa_cs.c b/drivers/isdn/hisax/elsa_cs.c index c9f2279e21f5..8e170e4b7cf2 100644 --- a/drivers/isdn/hisax/elsa_cs.c +++ b/drivers/isdn/hisax/elsa_cs.c | |||
@@ -136,10 +136,6 @@ static int __devinit elsa_cs_probe(struct pcmcia_device *link) | |||
136 | 136 | ||
137 | local->cardnr = -1; | 137 | local->cardnr = -1; |
138 | 138 | ||
139 | /* Interrupt setup */ | ||
140 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; | ||
141 | link->irq.Handler = NULL; | ||
142 | |||
143 | /* | 139 | /* |
144 | General socket configuration defaults can go here. In this | 140 | General socket configuration defaults can go here. In this |
145 | client, we assume very little, and rely on the CIS for almost | 141 | client, we assume very little, and rely on the CIS for almost |
@@ -223,11 +219,8 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link) | |||
223 | if (i != 0) | 219 | if (i != 0) |
224 | goto failed; | 220 | goto failed; |
225 | 221 | ||
226 | i = pcmcia_request_irq(link, &link->irq); | 222 | if (!link->irq) |
227 | if (i != 0) { | ||
228 | link->irq.AssignedIRQ = 0; | ||
229 | goto failed; | 223 | goto failed; |
230 | } | ||
231 | 224 | ||
232 | i = pcmcia_request_configuration(link, &link->conf); | 225 | i = pcmcia_request_configuration(link, &link->conf); |
233 | if (i != 0) | 226 | if (i != 0) |
@@ -244,7 +237,7 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link) | |||
244 | printk(KERN_INFO "%s: index 0x%02x: ", | 237 | printk(KERN_INFO "%s: index 0x%02x: ", |
245 | dev->node.dev_name, link->conf.ConfigIndex); | 238 | dev->node.dev_name, link->conf.ConfigIndex); |
246 | if (link->conf.Attributes & CONF_ENABLE_IRQ) | 239 | if (link->conf.Attributes & CONF_ENABLE_IRQ) |
247 | printk(", irq %d", link->irq.AssignedIRQ); | 240 | printk(", irq %d", link->irq); |
248 | if (link->io.NumPorts1) | 241 | if (link->io.NumPorts1) |
249 | printk(", io 0x%04x-0x%04x", link->io.BasePort1, | 242 | printk(", io 0x%04x-0x%04x", link->io.BasePort1, |
250 | link->io.BasePort1+link->io.NumPorts1-1); | 243 | link->io.BasePort1+link->io.NumPorts1-1); |
@@ -253,7 +246,7 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link) | |||
253 | link->io.BasePort2+link->io.NumPorts2-1); | 246 | link->io.BasePort2+link->io.NumPorts2-1); |
254 | printk("\n"); | 247 | printk("\n"); |
255 | 248 | ||
256 | icard.para[0] = link->irq.AssignedIRQ; | 249 | icard.para[0] = link->irq; |
257 | icard.para[1] = link->io.BasePort1; | 250 | icard.para[1] = link->io.BasePort1; |
258 | icard.protocol = protocol; | 251 | icard.protocol = protocol; |
259 | icard.typ = ISDN_CTYPE_ELSA_PCMCIA; | 252 | icard.typ = ISDN_CTYPE_ELSA_PCMCIA; |
diff --git a/drivers/isdn/hisax/sedlbauer_cs.c b/drivers/isdn/hisax/sedlbauer_cs.c index 71b3ddef03bb..7778385b05b2 100644 --- a/drivers/isdn/hisax/sedlbauer_cs.c +++ b/drivers/isdn/hisax/sedlbauer_cs.c | |||
@@ -143,10 +143,6 @@ static int __devinit sedlbauer_probe(struct pcmcia_device *link) | |||
143 | local->p_dev = link; | 143 | local->p_dev = link; |
144 | link->priv = local; | 144 | link->priv = local; |
145 | 145 | ||
146 | /* Interrupt setup */ | ||
147 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; | ||
148 | link->irq.Handler = NULL; | ||
149 | |||
150 | /* | 146 | /* |
151 | General socket configuration defaults can go here. In this | 147 | General socket configuration defaults can go here. In this |
152 | client, we assume very little, and rely on the CIS for almost | 148 | client, we assume very little, and rely on the CIS for almost |
@@ -227,9 +223,7 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev, | |||
227 | else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM)) | 223 | else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM)) |
228 | p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000; | 224 | p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000; |
229 | 225 | ||
230 | /* Do we need to allocate an interrupt? */ | 226 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
231 | if (cfg->irq.IRQInfo1 || dflt->irq.IRQInfo1) | ||
232 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | ||
233 | 227 | ||
234 | /* IO window settings */ | 228 | /* IO window settings */ |
235 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 229 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; |
@@ -313,17 +307,6 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link) | |||
313 | goto failed; | 307 | goto failed; |
314 | 308 | ||
315 | /* | 309 | /* |
316 | Allocate an interrupt line. Note that this does not assign a | ||
317 | handler to the interrupt, unless the 'Handler' member of the | ||
318 | irq structure is initialized. | ||
319 | */ | ||
320 | if (link->conf.Attributes & CONF_ENABLE_IRQ) { | ||
321 | ret = pcmcia_request_irq(link, &link->irq); | ||
322 | if (ret) | ||
323 | goto failed; | ||
324 | } | ||
325 | |||
326 | /* | ||
327 | This actually configures the PCMCIA socket -- setting up | 310 | This actually configures the PCMCIA socket -- setting up |
328 | the I/O windows and the interrupt mapping, and putting the | 311 | the I/O windows and the interrupt mapping, and putting the |
329 | card and host interface into "Memory and IO" mode. | 312 | card and host interface into "Memory and IO" mode. |
@@ -346,7 +329,7 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link) | |||
346 | if (link->conf.Vpp) | 329 | if (link->conf.Vpp) |
347 | printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10); | 330 | printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10); |
348 | if (link->conf.Attributes & CONF_ENABLE_IRQ) | 331 | if (link->conf.Attributes & CONF_ENABLE_IRQ) |
349 | printk(", irq %d", link->irq.AssignedIRQ); | 332 | printk(", irq %d", link->irq); |
350 | if (link->io.NumPorts1) | 333 | if (link->io.NumPorts1) |
351 | printk(", io 0x%04x-0x%04x", link->io.BasePort1, | 334 | printk(", io 0x%04x-0x%04x", link->io.BasePort1, |
352 | link->io.BasePort1+link->io.NumPorts1-1); | 335 | link->io.BasePort1+link->io.NumPorts1-1); |
@@ -358,7 +341,7 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link) | |||
358 | req->Base+req->Size-1); | 341 | req->Base+req->Size-1); |
359 | printk("\n"); | 342 | printk("\n"); |
360 | 343 | ||
361 | icard.para[0] = link->irq.AssignedIRQ; | 344 | icard.para[0] = link->irq; |
362 | icard.para[1] = link->io.BasePort1; | 345 | icard.para[1] = link->io.BasePort1; |
363 | icard.protocol = protocol; | 346 | icard.protocol = protocol; |
364 | icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA; | 347 | icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA; |
diff --git a/drivers/isdn/hisax/teles_cs.c b/drivers/isdn/hisax/teles_cs.c index d010a0da8e19..02dec13f25e5 100644 --- a/drivers/isdn/hisax/teles_cs.c +++ b/drivers/isdn/hisax/teles_cs.c | |||
@@ -126,10 +126,6 @@ static int __devinit teles_probe(struct pcmcia_device *link) | |||
126 | local->p_dev = link; | 126 | local->p_dev = link; |
127 | link->priv = local; | 127 | link->priv = local; |
128 | 128 | ||
129 | /* Interrupt setup */ | ||
130 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; | ||
131 | link->irq.Handler = NULL; | ||
132 | |||
133 | /* | 129 | /* |
134 | General socket configuration defaults can go here. In this | 130 | General socket configuration defaults can go here. In this |
135 | client, we assume very little, and rely on the CIS for almost | 131 | client, we assume very little, and rely on the CIS for almost |
@@ -213,11 +209,8 @@ static int __devinit teles_cs_config(struct pcmcia_device *link) | |||
213 | if (i != 0) | 209 | if (i != 0) |
214 | goto cs_failed; | 210 | goto cs_failed; |
215 | 211 | ||
216 | i = pcmcia_request_irq(link, &link->irq); | 212 | if (!link->irq) |
217 | if (i != 0) { | ||
218 | link->irq.AssignedIRQ = 0; | ||
219 | goto cs_failed; | 213 | goto cs_failed; |
220 | } | ||
221 | 214 | ||
222 | i = pcmcia_request_configuration(link, &link->conf); | 215 | i = pcmcia_request_configuration(link, &link->conf); |
223 | if (i != 0) | 216 | if (i != 0) |
@@ -234,7 +227,7 @@ static int __devinit teles_cs_config(struct pcmcia_device *link) | |||
234 | printk(KERN_INFO "%s: index 0x%02x:", | 227 | printk(KERN_INFO "%s: index 0x%02x:", |
235 | dev->node.dev_name, link->conf.ConfigIndex); | 228 | dev->node.dev_name, link->conf.ConfigIndex); |
236 | if (link->conf.Attributes & CONF_ENABLE_IRQ) | 229 | if (link->conf.Attributes & CONF_ENABLE_IRQ) |
237 | printk(", irq %d", link->irq.AssignedIRQ); | 230 | printk(", irq %d", link->irq); |
238 | if (link->io.NumPorts1) | 231 | if (link->io.NumPorts1) |
239 | printk(", io 0x%04x-0x%04x", link->io.BasePort1, | 232 | printk(", io 0x%04x-0x%04x", link->io.BasePort1, |
240 | link->io.BasePort1+link->io.NumPorts1-1); | 233 | link->io.BasePort1+link->io.NumPorts1-1); |
@@ -243,7 +236,7 @@ static int __devinit teles_cs_config(struct pcmcia_device *link) | |||
243 | link->io.BasePort2+link->io.NumPorts2-1); | 236 | link->io.BasePort2+link->io.NumPorts2-1); |
244 | printk("\n"); | 237 | printk("\n"); |
245 | 238 | ||
246 | icard.para[0] = link->irq.AssignedIRQ; | 239 | icard.para[0] = link->irq; |
247 | icard.para[1] = link->io.BasePort1; | 240 | icard.para[1] = link->io.BasePort1; |
248 | icard.protocol = protocol; | 241 | icard.protocol = protocol; |
249 | icard.typ = ISDN_CTYPE_TELESPCMCIA; | 242 | icard.typ = ISDN_CTYPE_TELESPCMCIA; |