aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/isdn
diff options
context:
space:
mode:
authorDominik Brodowski <linux@dominikbrodowski.net>2010-03-07 06:21:16 -0500
committerDominik Brodowski <linux@dominikbrodowski.net>2010-05-10 04:23:13 -0400
commiteb14120f743d29744d9475bffec56ff4ad43a749 (patch)
tree56857094d2b0cfc0ecbd1685f18d6edbe78e140f /drivers/isdn
parenta7debe789dfcaee9c4d81e5738b0be8c5d93930b (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.c17
-rw-r--r--drivers/isdn/hisax/avma1_cs.c12
-rw-r--r--drivers/isdn/hisax/elsa_cs.c13
-rw-r--r--drivers/isdn/hisax/sedlbauer_cs.c23
-rw-r--r--drivers/isdn/hisax/teles_cs.c13
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,
172static int avmcs_config(struct pcmcia_device *link) 169static 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
271static void avmcs_release(struct pcmcia_device *link) 264static 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,
177static int __devinit avma1cs_config(struct pcmcia_device *link) 174static 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;