diff options
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r-- | drivers/pcmcia/at91_cf.c | 79 | ||||
-rw-r--r-- | drivers/pcmcia/au1000_db1x00.c | 3 | ||||
-rw-r--r-- | drivers/pcmcia/au1000_generic.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/au1000_generic.h | 1 | ||||
-rw-r--r-- | drivers/pcmcia/au1000_pb1x00.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/cs.c | 29 | ||||
-rw-r--r-- | drivers/pcmcia/hd64465_ss.c | 8 | ||||
-rw-r--r-- | drivers/pcmcia/i82092.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/i82365.c | 11 | ||||
-rw-r--r-- | drivers/pcmcia/m32r_cfc.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/m32r_pcc.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/omap_cf.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/pcmcia_resource.c | 27 | ||||
-rw-r--r-- | drivers/pcmcia/pd6729.c | 5 | ||||
-rw-r--r-- | drivers/pcmcia/pxa2xx_base.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/rsrc_nonstatic.c | 26 | ||||
-rw-r--r-- | drivers/pcmcia/sa1100_generic.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/sa1111_generic.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/sa11xx_base.c | 1 | ||||
-rw-r--r-- | drivers/pcmcia/soc_common.c | 5 | ||||
-rw-r--r-- | drivers/pcmcia/tcic.c | 5 | ||||
-rw-r--r-- | drivers/pcmcia/ti113x.h | 1 | ||||
-rw-r--r-- | drivers/pcmcia/vrc4171_card.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/vrc4173_cardu.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/yenta_socket.c | 87 |
25 files changed, 218 insertions, 85 deletions
diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c index a4d50940ebeb..40569f40e90e 100644 --- a/drivers/pcmcia/at91_cf.c +++ b/drivers/pcmcia/at91_cf.c | |||
@@ -214,11 +214,10 @@ static struct pccard_operations at91_cf_ops = { | |||
214 | 214 | ||
215 | /*--------------------------------------------------------------------------*/ | 215 | /*--------------------------------------------------------------------------*/ |
216 | 216 | ||
217 | static int __init at91_cf_probe(struct device *dev) | 217 | static int __init at91_cf_probe(struct platform_device *pdev) |
218 | { | 218 | { |
219 | struct at91_cf_socket *cf; | 219 | struct at91_cf_socket *cf; |
220 | struct at91_cf_data *board = dev->platform_data; | 220 | struct at91_cf_data *board = pdev->dev.platform_data; |
221 | struct platform_device *pdev = to_platform_device(dev); | ||
222 | struct resource *io; | 221 | struct resource *io; |
223 | unsigned int csa; | 222 | unsigned int csa; |
224 | int status; | 223 | int status; |
@@ -236,7 +235,7 @@ static int __init at91_cf_probe(struct device *dev) | |||
236 | 235 | ||
237 | cf->board = board; | 236 | cf->board = board; |
238 | cf->pdev = pdev; | 237 | cf->pdev = pdev; |
239 | dev_set_drvdata(dev, cf); | 238 | platform_set_drvdata(pdev, cf); |
240 | 239 | ||
241 | /* CF takes over CS4, CS5, CS6 */ | 240 | /* CF takes over CS4, CS5, CS6 */ |
242 | csa = at91_sys_read(AT91_EBI_CSA); | 241 | csa = at91_sys_read(AT91_EBI_CSA); |
@@ -268,9 +267,10 @@ static int __init at91_cf_probe(struct device *dev) | |||
268 | 267 | ||
269 | /* must be a GPIO; ergo must trigger on both edges */ | 268 | /* must be a GPIO; ergo must trigger on both edges */ |
270 | status = request_irq(board->det_pin, at91_cf_irq, | 269 | status = request_irq(board->det_pin, at91_cf_irq, |
271 | SA_SAMPLE_RANDOM, driver_name, cf); | 270 | IRQF_SAMPLE_RANDOM, driver_name, cf); |
272 | if (status < 0) | 271 | if (status < 0) |
273 | goto fail0; | 272 | goto fail0; |
273 | device_init_wakeup(&pdev->dev, 1); | ||
274 | 274 | ||
275 | /* | 275 | /* |
276 | * The card driver will request this irq later as needed. | 276 | * The card driver will request this irq later as needed. |
@@ -280,7 +280,7 @@ static int __init at91_cf_probe(struct device *dev) | |||
280 | */ | 280 | */ |
281 | if (board->irq_pin) { | 281 | if (board->irq_pin) { |
282 | status = request_irq(board->irq_pin, at91_cf_irq, | 282 | status = request_irq(board->irq_pin, at91_cf_irq, |
283 | SA_SHIRQ, driver_name, cf); | 283 | IRQF_SHARED, driver_name, cf); |
284 | if (status < 0) | 284 | if (status < 0) |
285 | goto fail0a; | 285 | goto fail0a; |
286 | cf->socket.pci_irq = board->irq_pin; | 286 | cf->socket.pci_irq = board->irq_pin; |
@@ -301,7 +301,7 @@ static int __init at91_cf_probe(struct device *dev) | |||
301 | board->det_pin, board->irq_pin); | 301 | board->det_pin, board->irq_pin); |
302 | 302 | ||
303 | cf->socket.owner = THIS_MODULE; | 303 | cf->socket.owner = THIS_MODULE; |
304 | cf->socket.dev.dev = dev; | 304 | cf->socket.dev.dev = &pdev->dev; |
305 | cf->socket.ops = &at91_cf_ops; | 305 | cf->socket.ops = &at91_cf_ops; |
306 | cf->socket.resource_ops = &pccard_static_ops; | 306 | cf->socket.resource_ops = &pccard_static_ops; |
307 | cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP | 307 | cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP |
@@ -323,21 +323,25 @@ fail1: | |||
323 | free_irq(board->irq_pin, cf); | 323 | free_irq(board->irq_pin, cf); |
324 | fail0a: | 324 | fail0a: |
325 | free_irq(board->det_pin, cf); | 325 | free_irq(board->det_pin, cf); |
326 | device_init_wakeup(&pdev->dev, 0); | ||
326 | fail0: | 327 | fail0: |
327 | at91_sys_write(AT91_EBI_CSA, csa); | 328 | at91_sys_write(AT91_EBI_CSA, csa); |
328 | kfree(cf); | 329 | kfree(cf); |
329 | return status; | 330 | return status; |
330 | } | 331 | } |
331 | 332 | ||
332 | static int __exit at91_cf_remove(struct device *dev) | 333 | static int __exit at91_cf_remove(struct platform_device *pdev) |
333 | { | 334 | { |
334 | struct at91_cf_socket *cf = dev_get_drvdata(dev); | 335 | struct at91_cf_socket *cf = platform_get_drvdata(pdev); |
336 | struct at91_cf_data *board = cf->board; | ||
335 | struct resource *io = cf->socket.io[0].res; | 337 | struct resource *io = cf->socket.io[0].res; |
336 | unsigned int csa; | 338 | unsigned int csa; |
337 | 339 | ||
338 | pcmcia_unregister_socket(&cf->socket); | 340 | pcmcia_unregister_socket(&cf->socket); |
339 | free_irq(cf->board->irq_pin, cf); | 341 | if (board->irq_pin) |
340 | free_irq(cf->board->det_pin, cf); | 342 | free_irq(board->irq_pin, cf); |
343 | free_irq(board->det_pin, cf); | ||
344 | device_init_wakeup(&pdev->dev, 0); | ||
341 | iounmap((void __iomem *) cf->socket.io_offset); | 345 | iounmap((void __iomem *) cf->socket.io_offset); |
342 | release_mem_region(io->start, io->end + 1 - io->start); | 346 | release_mem_region(io->start, io->end + 1 - io->start); |
343 | 347 | ||
@@ -348,26 +352,65 @@ static int __exit at91_cf_remove(struct device *dev) | |||
348 | return 0; | 352 | return 0; |
349 | } | 353 | } |
350 | 354 | ||
351 | static struct device_driver at91_cf_driver = { | 355 | #ifdef CONFIG_PM |
352 | .name = (char *) driver_name, | 356 | |
353 | .bus = &platform_bus_type, | 357 | static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg) |
358 | { | ||
359 | struct at91_cf_socket *cf = platform_get_drvdata(pdev); | ||
360 | struct at91_cf_data *board = cf->board; | ||
361 | |||
362 | pcmcia_socket_dev_suspend(&pdev->dev, mesg); | ||
363 | if (device_may_wakeup(&pdev->dev)) | ||
364 | enable_irq_wake(board->det_pin); | ||
365 | else { | ||
366 | disable_irq_wake(board->det_pin); | ||
367 | disable_irq(board->det_pin); | ||
368 | } | ||
369 | if (board->irq_pin) | ||
370 | disable_irq(board->irq_pin); | ||
371 | return 0; | ||
372 | } | ||
373 | |||
374 | static int at91_cf_resume(struct platform_device *pdev) | ||
375 | { | ||
376 | struct at91_cf_socket *cf = platform_get_drvdata(pdev); | ||
377 | struct at91_cf_data *board = cf->board; | ||
378 | |||
379 | if (board->irq_pin) | ||
380 | enable_irq(board->irq_pin); | ||
381 | if (!device_may_wakeup(&pdev->dev)) | ||
382 | enable_irq(board->det_pin); | ||
383 | pcmcia_socket_dev_resume(&pdev->dev); | ||
384 | return 0; | ||
385 | } | ||
386 | |||
387 | #else | ||
388 | #define at91_cf_suspend NULL | ||
389 | #define at91_cf_resume NULL | ||
390 | #endif | ||
391 | |||
392 | static struct platform_driver at91_cf_driver = { | ||
393 | .driver = { | ||
394 | .name = (char *) driver_name, | ||
395 | .owner = THIS_MODULE, | ||
396 | }, | ||
354 | .probe = at91_cf_probe, | 397 | .probe = at91_cf_probe, |
355 | .remove = __exit_p(at91_cf_remove), | 398 | .remove = __exit_p(at91_cf_remove), |
356 | .suspend = pcmcia_socket_dev_suspend, | 399 | .suspend = at91_cf_suspend, |
357 | .resume = pcmcia_socket_dev_resume, | 400 | .resume = at91_cf_resume, |
358 | }; | 401 | }; |
359 | 402 | ||
360 | /*--------------------------------------------------------------------------*/ | 403 | /*--------------------------------------------------------------------------*/ |
361 | 404 | ||
362 | static int __init at91_cf_init(void) | 405 | static int __init at91_cf_init(void) |
363 | { | 406 | { |
364 | return driver_register(&at91_cf_driver); | 407 | return platform_driver_register(&at91_cf_driver); |
365 | } | 408 | } |
366 | module_init(at91_cf_init); | 409 | module_init(at91_cf_init); |
367 | 410 | ||
368 | static void __exit at91_cf_exit(void) | 411 | static void __exit at91_cf_exit(void) |
369 | { | 412 | { |
370 | driver_unregister(&at91_cf_driver); | 413 | platform_driver_unregister(&at91_cf_driver); |
371 | } | 414 | } |
372 | module_exit(at91_cf_exit); | 415 | module_exit(at91_cf_exit); |
373 | 416 | ||
diff --git a/drivers/pcmcia/au1000_db1x00.c b/drivers/pcmcia/au1000_db1x00.c index abc13f28ba3f..74e051535d6c 100644 --- a/drivers/pcmcia/au1000_db1x00.c +++ b/drivers/pcmcia/au1000_db1x00.c | |||
@@ -30,7 +30,6 @@ | |||
30 | * | 30 | * |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #include <linux/config.h> | ||
34 | #include <linux/module.h> | 33 | #include <linux/module.h> |
35 | #include <linux/kernel.h> | 34 | #include <linux/kernel.h> |
36 | #include <linux/errno.h> | 35 | #include <linux/errno.h> |
@@ -296,7 +295,7 @@ struct pcmcia_low_level db1x00_pcmcia_ops = { | |||
296 | .socket_suspend = db1x00_socket_suspend | 295 | .socket_suspend = db1x00_socket_suspend |
297 | }; | 296 | }; |
298 | 297 | ||
299 | int __init au1x_board_init(struct device *dev) | 298 | int au1x_board_init(struct device *dev) |
300 | { | 299 | { |
301 | int ret = -ENODEV; | 300 | int ret = -ENODEV; |
302 | bcsr->pcmcia = 0; /* turn off power, if it's not already off */ | 301 | bcsr->pcmcia = 0; /* turn off power, if it's not already off */ |
diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c index 971a35281649..d5dd0ce65536 100644 --- a/drivers/pcmcia/au1000_generic.c +++ b/drivers/pcmcia/au1000_generic.c | |||
@@ -33,7 +33,6 @@ | |||
33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
34 | #include <linux/moduleparam.h> | 34 | #include <linux/moduleparam.h> |
35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
36 | #include <linux/config.h> | ||
37 | #include <linux/cpufreq.h> | 36 | #include <linux/cpufreq.h> |
38 | #include <linux/ioport.h> | 37 | #include <linux/ioport.h> |
39 | #include <linux/kernel.h> | 38 | #include <linux/kernel.h> |
diff --git a/drivers/pcmcia/au1000_generic.h b/drivers/pcmcia/au1000_generic.h index f2c970b5f4ff..1e467bb54077 100644 --- a/drivers/pcmcia/au1000_generic.h +++ b/drivers/pcmcia/au1000_generic.h | |||
@@ -22,7 +22,6 @@ | |||
22 | #define __ASM_AU1000_PCMCIA_H | 22 | #define __ASM_AU1000_PCMCIA_H |
23 | 23 | ||
24 | /* include the world */ | 24 | /* include the world */ |
25 | #include <linux/config.h> | ||
26 | 25 | ||
27 | #include <pcmcia/cs_types.h> | 26 | #include <pcmcia/cs_types.h> |
28 | #include <pcmcia/cs.h> | 27 | #include <pcmcia/cs.h> |
diff --git a/drivers/pcmcia/au1000_pb1x00.c b/drivers/pcmcia/au1000_pb1x00.c index fd5522ede867..86c0808d6a05 100644 --- a/drivers/pcmcia/au1000_pb1x00.c +++ b/drivers/pcmcia/au1000_pb1x00.c | |||
@@ -21,7 +21,6 @@ | |||
21 | * with this program; if not, write to the Free Software Foundation, Inc., | 21 | * with this program; if not, write to the Free Software Foundation, Inc., |
22 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | 22 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. |
23 | */ | 23 | */ |
24 | #include <linux/config.h> | ||
25 | #include <linux/module.h> | 24 | #include <linux/module.h> |
26 | #include <linux/init.h> | 25 | #include <linux/init.h> |
27 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index 3162998579c1..f9cd831a3f31 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/pm.h> | 28 | #include <linux/pm.h> |
29 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
30 | #include <linux/device.h> | 30 | #include <linux/device.h> |
31 | #include <linux/kthread.h> | ||
31 | #include <asm/system.h> | 32 | #include <asm/system.h> |
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
33 | 34 | ||
@@ -176,6 +177,7 @@ static int pccardd(void *__skt); | |||
176 | */ | 177 | */ |
177 | int pcmcia_register_socket(struct pcmcia_socket *socket) | 178 | int pcmcia_register_socket(struct pcmcia_socket *socket) |
178 | { | 179 | { |
180 | struct task_struct *tsk; | ||
179 | int ret; | 181 | int ret; |
180 | 182 | ||
181 | if (!socket || !socket->ops || !socket->dev.dev || !socket->resource_ops) | 183 | if (!socket || !socket->ops || !socket->dev.dev || !socket->resource_ops) |
@@ -239,15 +241,18 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) | |||
239 | mutex_init(&socket->skt_mutex); | 241 | mutex_init(&socket->skt_mutex); |
240 | spin_lock_init(&socket->thread_lock); | 242 | spin_lock_init(&socket->thread_lock); |
241 | 243 | ||
242 | ret = kernel_thread(pccardd, socket, CLONE_KERNEL); | 244 | tsk = kthread_run(pccardd, socket, "pccardd"); |
243 | if (ret < 0) | 245 | if (IS_ERR(tsk)) { |
246 | ret = PTR_ERR(tsk); | ||
244 | goto err; | 247 | goto err; |
248 | } | ||
245 | 249 | ||
246 | wait_for_completion(&socket->thread_done); | 250 | wait_for_completion(&socket->thread_done); |
247 | if(!socket->thread) { | 251 | if (!socket->thread) { |
248 | printk(KERN_WARNING "PCMCIA: warning: socket thread for socket %p did not start\n", socket); | 252 | printk(KERN_WARNING "PCMCIA: warning: socket thread for socket %p did not start\n", socket); |
249 | return -EIO; | 253 | return -EIO; |
250 | } | 254 | } |
255 | |||
251 | pcmcia_parse_events(socket, SS_DETECT); | 256 | pcmcia_parse_events(socket, SS_DETECT); |
252 | 257 | ||
253 | return 0; | 258 | return 0; |
@@ -272,10 +277,8 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket) | |||
272 | cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops); | 277 | cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops); |
273 | 278 | ||
274 | if (socket->thread) { | 279 | if (socket->thread) { |
275 | init_completion(&socket->thread_done); | ||
276 | socket->thread = NULL; | ||
277 | wake_up(&socket->thread_wait); | 280 | wake_up(&socket->thread_wait); |
278 | wait_for_completion(&socket->thread_done); | 281 | kthread_stop(socket->thread); |
279 | } | 282 | } |
280 | release_cis_mem(socket); | 283 | release_cis_mem(socket); |
281 | 284 | ||
@@ -630,8 +633,6 @@ static int pccardd(void *__skt) | |||
630 | DECLARE_WAITQUEUE(wait, current); | 633 | DECLARE_WAITQUEUE(wait, current); |
631 | int ret; | 634 | int ret; |
632 | 635 | ||
633 | daemonize("pccardd"); | ||
634 | |||
635 | skt->thread = current; | 636 | skt->thread = current; |
636 | skt->socket = dead_socket; | 637 | skt->socket = dead_socket; |
637 | skt->ops->init(skt); | 638 | skt->ops->init(skt); |
@@ -643,7 +644,8 @@ static int pccardd(void *__skt) | |||
643 | printk(KERN_WARNING "PCMCIA: unable to register socket 0x%p\n", | 644 | printk(KERN_WARNING "PCMCIA: unable to register socket 0x%p\n", |
644 | skt); | 645 | skt); |
645 | skt->thread = NULL; | 646 | skt->thread = NULL; |
646 | complete_and_exit(&skt->thread_done, 0); | 647 | complete(&skt->thread_done); |
648 | return 0; | ||
647 | } | 649 | } |
648 | 650 | ||
649 | add_wait_queue(&skt->thread_wait, &wait); | 651 | add_wait_queue(&skt->thread_wait, &wait); |
@@ -674,7 +676,7 @@ static int pccardd(void *__skt) | |||
674 | continue; | 676 | continue; |
675 | } | 677 | } |
676 | 678 | ||
677 | if (!skt->thread) | 679 | if (kthread_should_stop()) |
678 | break; | 680 | break; |
679 | 681 | ||
680 | schedule(); | 682 | schedule(); |
@@ -688,7 +690,7 @@ static int pccardd(void *__skt) | |||
688 | /* remove from the device core */ | 690 | /* remove from the device core */ |
689 | class_device_unregister(&skt->dev); | 691 | class_device_unregister(&skt->dev); |
690 | 692 | ||
691 | complete_and_exit(&skt->thread_done, 0); | 693 | return 0; |
692 | } | 694 | } |
693 | 695 | ||
694 | /* | 696 | /* |
@@ -697,11 +699,12 @@ static int pccardd(void *__skt) | |||
697 | */ | 699 | */ |
698 | void pcmcia_parse_events(struct pcmcia_socket *s, u_int events) | 700 | void pcmcia_parse_events(struct pcmcia_socket *s, u_int events) |
699 | { | 701 | { |
702 | unsigned long flags; | ||
700 | cs_dbg(s, 4, "parse_events: events %08x\n", events); | 703 | cs_dbg(s, 4, "parse_events: events %08x\n", events); |
701 | if (s->thread) { | 704 | if (s->thread) { |
702 | spin_lock(&s->thread_lock); | 705 | spin_lock_irqsave(&s->thread_lock, flags); |
703 | s->thread_events |= events; | 706 | s->thread_events |= events; |
704 | spin_unlock(&s->thread_lock); | 707 | spin_unlock_irqrestore(&s->thread_lock, flags); |
705 | 708 | ||
706 | wake_up(&s->thread_wait); | 709 | wake_up(&s->thread_wait); |
707 | } | 710 | } |
diff --git a/drivers/pcmcia/hd64465_ss.c b/drivers/pcmcia/hd64465_ss.c index b39435bbfaeb..ad02629c8be2 100644 --- a/drivers/pcmcia/hd64465_ss.c +++ b/drivers/pcmcia/hd64465_ss.c | |||
@@ -244,8 +244,8 @@ static void hs_map_irq(hs_socket_t *sp, unsigned int irq) | |||
244 | 244 | ||
245 | hs_mapped_irq[irq].sock = sp; | 245 | hs_mapped_irq[irq].sock = sp; |
246 | /* insert ourselves as the irq controller */ | 246 | /* insert ourselves as the irq controller */ |
247 | hs_mapped_irq[irq].old_handler = irq_desc[irq].handler; | 247 | hs_mapped_irq[irq].old_handler = irq_desc[irq].chip; |
248 | irq_desc[irq].handler = &hd64465_ss_irq_type; | 248 | irq_desc[irq].chip = &hd64465_ss_irq_type; |
249 | } | 249 | } |
250 | 250 | ||
251 | 251 | ||
@@ -260,7 +260,7 @@ static void hs_unmap_irq(hs_socket_t *sp, unsigned int irq) | |||
260 | return; | 260 | return; |
261 | 261 | ||
262 | /* restore the original irq controller */ | 262 | /* restore the original irq controller */ |
263 | irq_desc[irq].handler = hs_mapped_irq[irq].old_handler; | 263 | irq_desc[irq].chip = hs_mapped_irq[irq].old_handler; |
264 | } | 264 | } |
265 | 265 | ||
266 | /*============================================================*/ | 266 | /*============================================================*/ |
@@ -761,7 +761,7 @@ static int hs_init_socket(hs_socket_t *sp, int irq, unsigned long mem_base, | |||
761 | 761 | ||
762 | hd64465_register_irq_demux(sp->irq, hs_irq_demux, sp); | 762 | hd64465_register_irq_demux(sp->irq, hs_irq_demux, sp); |
763 | 763 | ||
764 | if ((err = request_irq(sp->irq, hs_interrupt, SA_INTERRUPT, MODNAME, sp)) < 0) | 764 | if ((err = request_irq(sp->irq, hs_interrupt, IRQF_DISABLED, MODNAME, sp)) < 0) |
765 | return err; | 765 | return err; |
766 | if (request_mem_region(sp->mem_base, sp->mem_length, MODNAME) == 0) { | 766 | if (request_mem_region(sp->mem_base, sp->mem_length, MODNAME) == 0) { |
767 | sp->mem_base = 0; | 767 | sp->mem_base = 0; |
diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c index d5f03a338c6c..2163aa75a257 100644 --- a/drivers/pcmcia/i82092.c +++ b/drivers/pcmcia/i82092.c | |||
@@ -149,7 +149,7 @@ static int __devinit i82092aa_pci_probe(struct pci_dev *dev, const struct pci_de | |||
149 | 149 | ||
150 | /* Register the interrupt handler */ | 150 | /* Register the interrupt handler */ |
151 | dprintk(KERN_DEBUG "Requesting interrupt %i \n",dev->irq); | 151 | dprintk(KERN_DEBUG "Requesting interrupt %i \n",dev->irq); |
152 | if ((ret = request_irq(dev->irq, i82092aa_interrupt, SA_SHIRQ, "i82092aa", i82092aa_interrupt))) { | 152 | if ((ret = request_irq(dev->irq, i82092aa_interrupt, IRQF_SHARED, "i82092aa", i82092aa_interrupt))) { |
153 | printk(KERN_ERR "i82092aa: Failed to register IRQ %d, aborting\n", dev->irq); | 153 | printk(KERN_ERR "i82092aa: Failed to register IRQ %d, aborting\n", dev->irq); |
154 | goto err_out_free_res; | 154 | goto err_out_free_res; |
155 | } | 155 | } |
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index a2f05f485156..1cc2682394b1 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c | |||
@@ -509,7 +509,7 @@ static irqreturn_t i365_count_irq(int irq, void *dev, struct pt_regs *regs) | |||
509 | static u_int __init test_irq(u_short sock, int irq) | 509 | static u_int __init test_irq(u_short sock, int irq) |
510 | { | 510 | { |
511 | debug(2, " testing ISA irq %d\n", irq); | 511 | debug(2, " testing ISA irq %d\n", irq); |
512 | if (request_irq(irq, i365_count_irq, SA_PROBEIRQ, "scan", | 512 | if (request_irq(irq, i365_count_irq, IRQF_PROBE_SHARED, "scan", |
513 | i365_count_irq) != 0) | 513 | i365_count_irq) != 0) |
514 | return 1; | 514 | return 1; |
515 | irq_hits = 0; irq_sock = sock; | 515 | irq_hits = 0; irq_sock = sock; |
@@ -562,7 +562,7 @@ static u_int __init isa_scan(u_short sock, u_int mask0) | |||
562 | } else { | 562 | } else { |
563 | /* Fallback: just find interrupts that aren't in use */ | 563 | /* Fallback: just find interrupts that aren't in use */ |
564 | for (i = 0; i < 16; i++) | 564 | for (i = 0; i < 16; i++) |
565 | if ((mask0 & (1 << i)) && (_check_irq(i, SA_PROBEIRQ) == 0)) | 565 | if ((mask0 & (1 << i)) && (_check_irq(i, IRQF_PROBE_SHARED) == 0)) |
566 | mask1 |= (1 << i); | 566 | mask1 |= (1 << i); |
567 | printk("default"); | 567 | printk("default"); |
568 | /* If scan failed, default to polled status */ | 568 | /* If scan failed, default to polled status */ |
@@ -726,7 +726,7 @@ static void __init add_pcic(int ns, int type) | |||
726 | u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12)); | 726 | u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12)); |
727 | for (cs_irq = 15; cs_irq > 0; cs_irq--) | 727 | for (cs_irq = 15; cs_irq > 0; cs_irq--) |
728 | if ((cs_mask & (1 << cs_irq)) && | 728 | if ((cs_mask & (1 << cs_irq)) && |
729 | (_check_irq(cs_irq, SA_PROBEIRQ) == 0)) | 729 | (_check_irq(cs_irq, IRQF_PROBE_SHARED) == 0)) |
730 | break; | 730 | break; |
731 | if (cs_irq) { | 731 | if (cs_irq) { |
732 | grab_irq = 1; | 732 | grab_irq = 1; |
@@ -1084,9 +1084,10 @@ static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem) | |||
1084 | u_short base, i; | 1084 | u_short base, i; |
1085 | u_char map; | 1085 | u_char map; |
1086 | 1086 | ||
1087 | debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#lx-%#lx, " | 1087 | debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#llx-%#llx, " |
1088 | "%#x)\n", sock, mem->map, mem->flags, mem->speed, | 1088 | "%#x)\n", sock, mem->map, mem->flags, mem->speed, |
1089 | mem->res->start, mem->res->end, mem->card_start); | 1089 | (unsigned long long)mem->res->start, |
1090 | (unsigned long long)mem->res->end, mem->card_start); | ||
1090 | 1091 | ||
1091 | map = mem->map; | 1092 | map = mem->map; |
1092 | if ((map > 4) || (mem->card_start > 0x3ffffff) || | 1093 | if ((map > 4) || (mem->card_start > 0x3ffffff) || |
diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c index 071cf485e1a3..9e768eaef17a 100644 --- a/drivers/pcmcia/m32r_cfc.c +++ b/drivers/pcmcia/m32r_cfc.c | |||
@@ -10,7 +10,6 @@ | |||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/moduleparam.h> | 11 | #include <linux/moduleparam.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/config.h> | ||
14 | #include <linux/types.h> | 13 | #include <linux/types.h> |
15 | #include <linux/fcntl.h> | 14 | #include <linux/fcntl.h> |
16 | #include <linux/string.h> | 15 | #include <linux/string.h> |
diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c index 70d5f0748d55..61d50b5620dd 100644 --- a/drivers/pcmcia/m32r_pcc.c +++ b/drivers/pcmcia/m32r_pcc.c | |||
@@ -10,7 +10,6 @@ | |||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/moduleparam.h> | 11 | #include <linux/moduleparam.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/config.h> | ||
14 | #include <linux/types.h> | 13 | #include <linux/types.h> |
15 | #include <linux/fcntl.h> | 14 | #include <linux/fcntl.h> |
16 | #include <linux/string.h> | 15 | #include <linux/string.h> |
diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c index 2c23d7584399..420e10aec0ae 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c | |||
@@ -232,7 +232,7 @@ static int __init omap_cf_probe(struct device *dev) | |||
232 | dev_set_drvdata(dev, cf); | 232 | dev_set_drvdata(dev, cf); |
233 | 233 | ||
234 | /* this primarily just shuts up irq handling noise */ | 234 | /* this primarily just shuts up irq handling noise */ |
235 | status = request_irq(irq, omap_cf_irq, SA_SHIRQ, | 235 | status = request_irq(irq, omap_cf_irq, IRQF_SHARED, |
236 | driver_name, cf); | 236 | driver_name, cf); |
237 | if (status < 0) | 237 | if (status < 0) |
238 | goto fail0; | 238 | goto fail0; |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index 3131bb0a0095..7bf25b88ea31 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
@@ -788,6 +788,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
788 | struct pcmcia_socket *s = p_dev->socket; | 788 | struct pcmcia_socket *s = p_dev->socket; |
789 | config_t *c; | 789 | config_t *c; |
790 | int ret = CS_IN_USE, irq = 0; | 790 | int ret = CS_IN_USE, irq = 0; |
791 | int type; | ||
791 | 792 | ||
792 | if (!(s->state & SOCKET_PRESENT)) | 793 | if (!(s->state & SOCKET_PRESENT)) |
793 | return CS_NO_CARD; | 794 | return CS_NO_CARD; |
@@ -797,6 +798,13 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
797 | if (c->state & CONFIG_IRQ_REQ) | 798 | if (c->state & CONFIG_IRQ_REQ) |
798 | return CS_IN_USE; | 799 | return CS_IN_USE; |
799 | 800 | ||
801 | /* Decide what type of interrupt we are registering */ | ||
802 | type = 0; | ||
803 | if (s->functions > 1) /* All of this ought to be handled higher up */ | ||
804 | type = IRQF_SHARED; | ||
805 | if (req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) | ||
806 | type = IRQF_SHARED; | ||
807 | |||
800 | #ifdef CONFIG_PCMCIA_PROBE | 808 | #ifdef CONFIG_PCMCIA_PROBE |
801 | if (s->irq.AssignedIRQ != 0) { | 809 | if (s->irq.AssignedIRQ != 0) { |
802 | /* If the interrupt is already assigned, it must be the same */ | 810 | /* If the interrupt is already assigned, it must be the same */ |
@@ -822,9 +830,7 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
822 | * marked as used by the kernel resource management core */ | 830 | * marked as used by the kernel resource management core */ |
823 | ret = request_irq(irq, | 831 | ret = request_irq(irq, |
824 | (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Handler : test_action, | 832 | (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Handler : test_action, |
825 | ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) || | 833 | type, |
826 | (s->functions > 1) || | ||
827 | (irq == s->pci_irq)) ? SA_SHIRQ : 0, | ||
828 | p_dev->devname, | 834 | p_dev->devname, |
829 | (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Instance : data); | 835 | (req->Attributes & IRQ_HANDLE_PRESENT) ? req->Instance : data); |
830 | if (!ret) { | 836 | if (!ret) { |
@@ -839,18 +845,21 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
839 | if (ret && !s->irq.AssignedIRQ) { | 845 | if (ret && !s->irq.AssignedIRQ) { |
840 | if (!s->pci_irq) | 846 | if (!s->pci_irq) |
841 | return ret; | 847 | return ret; |
848 | type = IRQF_SHARED; | ||
842 | irq = s->pci_irq; | 849 | irq = s->pci_irq; |
843 | } | 850 | } |
844 | 851 | ||
845 | if (ret && req->Attributes & IRQ_HANDLE_PRESENT) { | 852 | if (ret && (req->Attributes & IRQ_HANDLE_PRESENT)) { |
846 | if (request_irq(irq, req->Handler, | 853 | if (request_irq(irq, req->Handler, type, p_dev->devname, req->Instance)) |
847 | ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) || | ||
848 | (s->functions > 1) || | ||
849 | (irq == s->pci_irq)) ? SA_SHIRQ : 0, | ||
850 | p_dev->devname, req->Instance)) | ||
851 | return CS_IN_USE; | 854 | return CS_IN_USE; |
852 | } | 855 | } |
853 | 856 | ||
857 | /* Make sure the fact the request type was overridden is passed back */ | ||
858 | if (type == IRQF_SHARED && !(req->Attributes & IRQ_TYPE_DYNAMIC_SHARING)) { | ||
859 | req->Attributes |= IRQ_TYPE_DYNAMIC_SHARING; | ||
860 | printk(KERN_WARNING "pcmcia: request for exclusive IRQ could not be fulfilled.\n"); | ||
861 | printk(KERN_WARNING "pcmcia: the driver needs updating to supported shared IRQ lines.\n"); | ||
862 | } | ||
854 | c->irq.Attributes = req->Attributes; | 863 | c->irq.Attributes = req->Attributes; |
855 | s->irq.AssignedIRQ = req->AssignedIRQ = irq; | 864 | s->irq.AssignedIRQ = req->AssignedIRQ = irq; |
856 | s->irq.Config++; | 865 | s->irq.Config++; |
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index 247ab837f841..22c5e7427ddd 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c | |||
@@ -642,7 +642,8 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, | |||
642 | goto err_out_free_mem; | 642 | goto err_out_free_mem; |
643 | 643 | ||
644 | printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " | 644 | printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " |
645 | "at 0x%lx on irq %d\n", pci_resource_start(dev, 0), dev->irq); | 645 | "at 0x%llx on irq %d\n", |
646 | (unsigned long long)pci_resource_start(dev, 0), dev->irq); | ||
646 | /* | 647 | /* |
647 | * Since we have no memory BARs some firmware may not | 648 | * Since we have no memory BARs some firmware may not |
648 | * have had PCI_COMMAND_MEMORY enabled, yet the device needs it. | 649 | * have had PCI_COMMAND_MEMORY enabled, yet the device needs it. |
@@ -688,7 +689,7 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, | |||
688 | pci_set_drvdata(dev, socket); | 689 | pci_set_drvdata(dev, socket); |
689 | if (irq_mode == 1) { | 690 | if (irq_mode == 1) { |
690 | /* Register the interrupt handler */ | 691 | /* Register the interrupt handler */ |
691 | if ((ret = request_irq(dev->irq, pd6729_interrupt, SA_SHIRQ, | 692 | if ((ret = request_irq(dev->irq, pd6729_interrupt, IRQF_SHARED, |
692 | "pd6729", socket))) { | 693 | "pd6729", socket))) { |
693 | printk(KERN_ERR "pd6729: Failed to register irq %d, " | 694 | printk(KERN_ERR "pd6729: Failed to register irq %d, " |
694 | "aborting\n", dev->irq); | 695 | "aborting\n", dev->irq); |
diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c index 7fa18fb814bc..b3518131ea0d 100644 --- a/drivers/pcmcia/pxa2xx_base.c +++ b/drivers/pcmcia/pxa2xx_base.c | |||
@@ -18,7 +18,6 @@ | |||
18 | 18 | ||
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/config.h> | ||
22 | #include <linux/cpufreq.h> | 21 | #include <linux/cpufreq.h> |
23 | #include <linux/ioport.h> | 22 | #include <linux/ioport.h> |
24 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index 0f8b157c9717..c3176b16b7be 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c | |||
@@ -72,7 +72,7 @@ static DEFINE_MUTEX(rsrc_mutex); | |||
72 | ======================================================================*/ | 72 | ======================================================================*/ |
73 | 73 | ||
74 | static struct resource * | 74 | static struct resource * |
75 | make_resource(unsigned long b, unsigned long n, int flags, char *name) | 75 | make_resource(resource_size_t b, resource_size_t n, int flags, char *name) |
76 | { | 76 | { |
77 | struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); | 77 | struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL); |
78 | 78 | ||
@@ -86,8 +86,8 @@ make_resource(unsigned long b, unsigned long n, int flags, char *name) | |||
86 | } | 86 | } |
87 | 87 | ||
88 | static struct resource * | 88 | static struct resource * |
89 | claim_region(struct pcmcia_socket *s, unsigned long base, unsigned long size, | 89 | claim_region(struct pcmcia_socket *s, resource_size_t base, |
90 | int type, char *name) | 90 | resource_size_t size, int type, char *name) |
91 | { | 91 | { |
92 | struct resource *res, *parent; | 92 | struct resource *res, *parent; |
93 | 93 | ||
@@ -519,10 +519,10 @@ struct pcmcia_align_data { | |||
519 | 519 | ||
520 | static void | 520 | static void |
521 | pcmcia_common_align(void *align_data, struct resource *res, | 521 | pcmcia_common_align(void *align_data, struct resource *res, |
522 | unsigned long size, unsigned long align) | 522 | resource_size_t size, resource_size_t align) |
523 | { | 523 | { |
524 | struct pcmcia_align_data *data = align_data; | 524 | struct pcmcia_align_data *data = align_data; |
525 | unsigned long start; | 525 | resource_size_t start; |
526 | /* | 526 | /* |
527 | * Ensure that we have the correct start address | 527 | * Ensure that we have the correct start address |
528 | */ | 528 | */ |
@@ -533,8 +533,8 @@ pcmcia_common_align(void *align_data, struct resource *res, | |||
533 | } | 533 | } |
534 | 534 | ||
535 | static void | 535 | static void |
536 | pcmcia_align(void *align_data, struct resource *res, | 536 | pcmcia_align(void *align_data, struct resource *res, resource_size_t size, |
537 | unsigned long size, unsigned long align) | 537 | resource_size_t align) |
538 | { | 538 | { |
539 | struct pcmcia_align_data *data = align_data; | 539 | struct pcmcia_align_data *data = align_data; |
540 | struct resource_map *m; | 540 | struct resource_map *m; |
@@ -808,8 +808,10 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s) | |||
808 | if (res->flags & IORESOURCE_IO) { | 808 | if (res->flags & IORESOURCE_IO) { |
809 | if (res == &ioport_resource) | 809 | if (res == &ioport_resource) |
810 | continue; | 810 | continue; |
811 | printk(KERN_INFO "pcmcia: parent PCI bridge I/O window: 0x%lx - 0x%lx\n", | 811 | printk(KERN_INFO "pcmcia: parent PCI bridge I/O " |
812 | res->start, res->end); | 812 | "window: 0x%llx - 0x%llx\n", |
813 | (unsigned long long)res->start, | ||
814 | (unsigned long long)res->end); | ||
813 | if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end)) | 815 | if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end)) |
814 | done |= IORESOURCE_IO; | 816 | done |= IORESOURCE_IO; |
815 | 817 | ||
@@ -818,8 +820,10 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s) | |||
818 | if (res->flags & IORESOURCE_MEM) { | 820 | if (res->flags & IORESOURCE_MEM) { |
819 | if (res == &iomem_resource) | 821 | if (res == &iomem_resource) |
820 | continue; | 822 | continue; |
821 | printk(KERN_INFO "pcmcia: parent PCI bridge Memory window: 0x%lx - 0x%lx\n", | 823 | printk(KERN_INFO "pcmcia: parent PCI bridge Memory " |
822 | res->start, res->end); | 824 | "window: 0x%llx - 0x%llx\n", |
825 | (unsigned long long)res->start, | ||
826 | (unsigned long long)res->end); | ||
823 | if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end)) | 827 | if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end)) |
824 | done |= IORESOURCE_MEM; | 828 | done |= IORESOURCE_MEM; |
825 | } | 829 | } |
diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c index 6d441ec75c6a..c5b2a44b4c37 100644 --- a/drivers/pcmcia/sa1100_generic.c +++ b/drivers/pcmcia/sa1100_generic.c | |||
@@ -32,7 +32,6 @@ | |||
32 | 32 | ||
33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
35 | #include <linux/config.h> | ||
36 | #include <linux/platform_device.h> | 35 | #include <linux/platform_device.h> |
37 | 36 | ||
38 | #include <pcmcia/cs_types.h> | 37 | #include <pcmcia/cs_types.h> |
diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c index 81ded52c8959..658cddfbcf29 100644 --- a/drivers/pcmcia/sa1111_generic.c +++ b/drivers/pcmcia/sa1111_generic.c | |||
@@ -5,7 +5,6 @@ | |||
5 | * basically means we handle everything except controlling the | 5 | * basically means we handle everything except controlling the |
6 | * power. Power is machine specific... | 6 | * power. Power is machine specific... |
7 | */ | 7 | */ |
8 | #include <linux/config.h> | ||
9 | #include <linux/module.h> | 8 | #include <linux/module.h> |
10 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
11 | #include <linux/ioport.h> | 10 | #include <linux/ioport.h> |
diff --git a/drivers/pcmcia/sa11xx_base.c b/drivers/pcmcia/sa11xx_base.c index 59c5d968e9f6..31a7abc55b23 100644 --- a/drivers/pcmcia/sa11xx_base.c +++ b/drivers/pcmcia/sa11xx_base.c | |||
@@ -32,7 +32,6 @@ | |||
32 | 32 | ||
33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
35 | #include <linux/config.h> | ||
36 | #include <linux/cpufreq.h> | 35 | #include <linux/cpufreq.h> |
37 | #include <linux/ioport.h> | 36 | #include <linux/ioport.h> |
38 | #include <linux/kernel.h> | 37 | #include <linux/kernel.h> |
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c index ea7d9ca160b2..ecaa132fa592 100644 --- a/drivers/pcmcia/soc_common.c +++ b/drivers/pcmcia/soc_common.c | |||
@@ -31,7 +31,6 @@ | |||
31 | ======================================================================*/ | 31 | ======================================================================*/ |
32 | 32 | ||
33 | 33 | ||
34 | #include <linux/config.h> | ||
35 | #include <linux/module.h> | 34 | #include <linux/module.h> |
36 | #include <linux/moduleparam.h> | 35 | #include <linux/moduleparam.h> |
37 | #include <linux/init.h> | 36 | #include <linux/init.h> |
@@ -39,12 +38,12 @@ | |||
39 | #include <linux/timer.h> | 38 | #include <linux/timer.h> |
40 | #include <linux/mm.h> | 39 | #include <linux/mm.h> |
41 | #include <linux/interrupt.h> | 40 | #include <linux/interrupt.h> |
41 | #include <linux/irq.h> | ||
42 | #include <linux/spinlock.h> | 42 | #include <linux/spinlock.h> |
43 | #include <linux/cpufreq.h> | 43 | #include <linux/cpufreq.h> |
44 | 44 | ||
45 | #include <asm/hardware.h> | 45 | #include <asm/hardware.h> |
46 | #include <asm/io.h> | 46 | #include <asm/io.h> |
47 | #include <asm/irq.h> | ||
48 | #include <asm/system.h> | 47 | #include <asm/system.h> |
49 | 48 | ||
50 | #include "soc_common.h" | 49 | #include "soc_common.h" |
@@ -524,7 +523,7 @@ int soc_pcmcia_request_irqs(struct soc_pcmcia_socket *skt, | |||
524 | if (irqs[i].sock != skt->nr) | 523 | if (irqs[i].sock != skt->nr) |
525 | continue; | 524 | continue; |
526 | res = request_irq(irqs[i].irq, soc_common_pcmcia_interrupt, | 525 | res = request_irq(irqs[i].irq, soc_common_pcmcia_interrupt, |
527 | SA_INTERRUPT, irqs[i].str, skt); | 526 | IRQF_DISABLED, irqs[i].str, skt); |
528 | if (res) | 527 | if (res) |
529 | break; | 528 | break; |
530 | set_irq_type(irqs[i].irq, IRQT_NOEDGE); | 529 | set_irq_type(irqs[i].irq, IRQT_NOEDGE); |
diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c index 73bad1d5cb23..65a60671659f 100644 --- a/drivers/pcmcia/tcic.c +++ b/drivers/pcmcia/tcic.c | |||
@@ -756,8 +756,9 @@ static int tcic_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *m | |||
756 | u_long base, len, mmap; | 756 | u_long base, len, mmap; |
757 | 757 | ||
758 | debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, " | 758 | debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, " |
759 | "%#lx-%#lx, %#x)\n", psock, mem->map, mem->flags, | 759 | "%#llx-%#llx, %#x)\n", psock, mem->map, mem->flags, |
760 | mem->speed, mem->res->start, mem->res->end, mem->card_start); | 760 | mem->speed, (unsigned long long)mem->res->start, |
761 | (unsigned long long)mem->res->end, mem->card_start); | ||
761 | if ((mem->map > 3) || (mem->card_start > 0x3ffffff) || | 762 | if ((mem->map > 3) || (mem->card_start > 0x3ffffff) || |
762 | (mem->res->start > 0xffffff) || (mem->res->end > 0xffffff) || | 763 | (mem->res->start > 0xffffff) || (mem->res->end > 0xffffff) || |
763 | (mem->res->start > mem->res->end) || (mem->speed > 1000)) | 764 | (mem->res->start > mem->res->end) || (mem->speed > 1000)) |
diff --git a/drivers/pcmcia/ti113x.h b/drivers/pcmcia/ti113x.h index 7a3d1b8e16b9..62e9ebf967f9 100644 --- a/drivers/pcmcia/ti113x.h +++ b/drivers/pcmcia/ti113x.h | |||
@@ -647,6 +647,7 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
647 | */ | 647 | */ |
648 | break; | 648 | break; |
649 | 649 | ||
650 | case PCI_DEVICE_ID_TI_XX12: | ||
650 | case PCI_DEVICE_ID_TI_X515: | 651 | case PCI_DEVICE_ID_TI_X515: |
651 | case PCI_DEVICE_ID_TI_X420: | 652 | case PCI_DEVICE_ID_TI_X420: |
652 | case PCI_DEVICE_ID_TI_X620: | 653 | case PCI_DEVICE_ID_TI_X620: |
diff --git a/drivers/pcmcia/vrc4171_card.c b/drivers/pcmcia/vrc4171_card.c index 459e6e1946fd..e076a13db555 100644 --- a/drivers/pcmcia/vrc4171_card.c +++ b/drivers/pcmcia/vrc4171_card.c | |||
@@ -730,7 +730,7 @@ static int __devinit vrc4171_card_init(void) | |||
730 | 730 | ||
731 | retval = vrc4171_add_sockets(); | 731 | retval = vrc4171_add_sockets(); |
732 | if (retval == 0) | 732 | if (retval == 0) |
733 | retval = request_irq(vrc4171_irq, pccard_interrupt, SA_SHIRQ, | 733 | retval = request_irq(vrc4171_irq, pccard_interrupt, IRQF_SHARED, |
734 | vrc4171_card_name, vrc4171_sockets); | 734 | vrc4171_card_name, vrc4171_sockets); |
735 | 735 | ||
736 | if (retval < 0) { | 736 | if (retval < 0) { |
diff --git a/drivers/pcmcia/vrc4173_cardu.c b/drivers/pcmcia/vrc4173_cardu.c index 6004196f7cc1..d19a9138135f 100644 --- a/drivers/pcmcia/vrc4173_cardu.c +++ b/drivers/pcmcia/vrc4173_cardu.c | |||
@@ -500,7 +500,7 @@ static int __devinit vrc4173_cardu_probe(struct pci_dev *dev, | |||
500 | return -ENOMEM; | 500 | return -ENOMEM; |
501 | } | 501 | } |
502 | 502 | ||
503 | if (request_irq(dev->irq, cardu_interrupt, SA_SHIRQ, socket->name, socket) < 0) { | 503 | if (request_irq(dev->irq, cardu_interrupt, IRQF_SHARED, socket->name, socket) < 0) { |
504 | pcmcia_unregister_socket(socket->pcmcia_socket); | 504 | pcmcia_unregister_socket(socket->pcmcia_socket); |
505 | socket->pcmcia_socket = NULL; | 505 | socket->pcmcia_socket = NULL; |
506 | iounmap(socket->base); | 506 | iounmap(socket->base); |
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 4145eb83b9b6..1344746381e8 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
@@ -287,7 +287,10 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) | |||
287 | struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); | 287 | struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); |
288 | u16 bridge; | 288 | u16 bridge; |
289 | 289 | ||
290 | yenta_set_power(socket, state); | 290 | /* if powering down: do it immediately */ |
291 | if (state->Vcc == 0) | ||
292 | yenta_set_power(socket, state); | ||
293 | |||
291 | socket->io_irq = state->io_irq; | 294 | socket->io_irq = state->io_irq; |
292 | bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~(CB_BRIDGE_CRST | CB_BRIDGE_INTR); | 295 | bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~(CB_BRIDGE_CRST | CB_BRIDGE_INTR); |
293 | if (cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) { | 296 | if (cb_readl(socket, CB_SOCKET_STATE) & CB_CBCARD) { |
@@ -339,6 +342,10 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) | |||
339 | /* Socket event mask: get card insert/remove events.. */ | 342 | /* Socket event mask: get card insert/remove events.. */ |
340 | cb_writel(socket, CB_SOCKET_EVENT, -1); | 343 | cb_writel(socket, CB_SOCKET_EVENT, -1); |
341 | cb_writel(socket, CB_SOCKET_MASK, CB_CDMASK); | 344 | cb_writel(socket, CB_SOCKET_MASK, CB_CDMASK); |
345 | |||
346 | /* if powering up: do it as the last step when the socket is configured */ | ||
347 | if (state->Vcc != 0) | ||
348 | yenta_set_power(socket, state); | ||
342 | return 0; | 349 | return 0; |
343 | } | 350 | } |
344 | 351 | ||
@@ -916,7 +923,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) | |||
916 | 923 | ||
917 | socket->probe_status = 0; | 924 | socket->probe_status = 0; |
918 | 925 | ||
919 | if (request_irq(socket->cb_irq, yenta_probe_handler, SA_SHIRQ, "yenta", socket)) { | 926 | if (request_irq(socket->cb_irq, yenta_probe_handler, IRQF_SHARED, "yenta", socket)) { |
920 | printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n"); | 927 | printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n"); |
921 | return -1; | 928 | return -1; |
922 | } | 929 | } |
@@ -998,6 +1005,77 @@ static void yenta_config_init(struct yenta_socket *socket) | |||
998 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); | 1005 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); |
999 | } | 1006 | } |
1000 | 1007 | ||
1008 | /** | ||
1009 | * yenta_fixup_parent_bridge - Fix subordinate bus# of the parent bridge | ||
1010 | * @cardbus_bridge: The PCI bus which the CardBus bridge bridges to | ||
1011 | * | ||
1012 | * Checks if devices on the bus which the CardBus bridge bridges to would be | ||
1013 | * invisible during PCI scans because of a misconfigured subordinate number | ||
1014 | * of the parent brige - some BIOSes seem to be too lazy to set it right. | ||
1015 | * Does the fixup carefully by checking how far it can go without conflicts. | ||
1016 | * See http://bugzilla.kernel.org/show_bug.cgi?id=2944 for more information. | ||
1017 | */ | ||
1018 | static void yenta_fixup_parent_bridge(struct pci_bus *cardbus_bridge) | ||
1019 | { | ||
1020 | struct list_head *tmp; | ||
1021 | unsigned char upper_limit; | ||
1022 | /* | ||
1023 | * We only check and fix the parent bridge: All systems which need | ||
1024 | * this fixup that have been reviewed are laptops and the only bridge | ||
1025 | * which needed fixing was the parent bridge of the CardBus bridge: | ||
1026 | */ | ||
1027 | struct pci_bus *bridge_to_fix = cardbus_bridge->parent; | ||
1028 | |||
1029 | /* Check bus numbers are already set up correctly: */ | ||
1030 | if (bridge_to_fix->subordinate >= cardbus_bridge->subordinate) | ||
1031 | return; /* The subordinate number is ok, nothing to do */ | ||
1032 | |||
1033 | if (!bridge_to_fix->parent) | ||
1034 | return; /* Root bridges are ok */ | ||
1035 | |||
1036 | /* stay within the limits of the bus range of the parent: */ | ||
1037 | upper_limit = bridge_to_fix->parent->subordinate; | ||
1038 | |||
1039 | /* check the bus ranges of all silbling bridges to prevent overlap */ | ||
1040 | list_for_each(tmp, &bridge_to_fix->parent->children) { | ||
1041 | struct pci_bus * silbling = pci_bus_b(tmp); | ||
1042 | /* | ||
1043 | * If the silbling has a higher secondary bus number | ||
1044 | * and it's secondary is equal or smaller than our | ||
1045 | * current upper limit, set the new upper limit to | ||
1046 | * the bus number below the silbling's range: | ||
1047 | */ | ||
1048 | if (silbling->secondary > bridge_to_fix->subordinate | ||
1049 | && silbling->secondary <= upper_limit) | ||
1050 | upper_limit = silbling->secondary - 1; | ||
1051 | } | ||
1052 | |||
1053 | /* Show that the wanted subordinate number is not possible: */ | ||
1054 | if (cardbus_bridge->subordinate > upper_limit) | ||
1055 | printk(KERN_WARNING "Yenta: Upper limit for fixing this " | ||
1056 | "bridge's parent bridge: #%02x\n", upper_limit); | ||
1057 | |||
1058 | /* If we have room to increase the bridge's subordinate number, */ | ||
1059 | if (bridge_to_fix->subordinate < upper_limit) { | ||
1060 | |||
1061 | /* use the highest number of the hidden bus, within limits */ | ||
1062 | unsigned char subordinate_to_assign = | ||
1063 | min(cardbus_bridge->subordinate, upper_limit); | ||
1064 | |||
1065 | printk(KERN_INFO "Yenta: Raising subordinate bus# of parent " | ||
1066 | "bus (#%02x) from #%02x to #%02x\n", | ||
1067 | bridge_to_fix->number, | ||
1068 | bridge_to_fix->subordinate, subordinate_to_assign); | ||
1069 | |||
1070 | /* Save the new subordinate in the bus struct of the bridge */ | ||
1071 | bridge_to_fix->subordinate = subordinate_to_assign; | ||
1072 | |||
1073 | /* and update the PCI config space with the new subordinate */ | ||
1074 | pci_write_config_byte(bridge_to_fix->self, | ||
1075 | PCI_SUBORDINATE_BUS, bridge_to_fix->subordinate); | ||
1076 | } | ||
1077 | } | ||
1078 | |||
1001 | /* | 1079 | /* |
1002 | * Initialize a cardbus controller. Make sure we have a usable | 1080 | * Initialize a cardbus controller. Make sure we have a usable |
1003 | * interrupt, and that we can map the cardbus area. Fill in the | 1081 | * interrupt, and that we can map the cardbus area. Fill in the |
@@ -1094,7 +1172,7 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i | |||
1094 | 1172 | ||
1095 | /* We must finish initialization here */ | 1173 | /* We must finish initialization here */ |
1096 | 1174 | ||
1097 | if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, SA_SHIRQ, "yenta", socket)) { | 1175 | if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, IRQF_SHARED, "yenta", socket)) { |
1098 | /* No IRQ or request_irq failed. Poll */ | 1176 | /* No IRQ or request_irq failed. Poll */ |
1099 | socket->cb_irq = 0; /* But zero is a valid IRQ number. */ | 1177 | socket->cb_irq = 0; /* But zero is a valid IRQ number. */ |
1100 | init_timer(&socket->poll_timer); | 1178 | init_timer(&socket->poll_timer); |
@@ -1113,6 +1191,8 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i | |||
1113 | yenta_get_socket_capabilities(socket, isa_interrupts); | 1191 | yenta_get_socket_capabilities(socket, isa_interrupts); |
1114 | printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); | 1192 | printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); |
1115 | 1193 | ||
1194 | yenta_fixup_parent_bridge(dev->subordinate); | ||
1195 | |||
1116 | /* Register it with the pcmcia layer.. */ | 1196 | /* Register it with the pcmcia layer.. */ |
1117 | ret = pcmcia_register_socket(&socket->socket); | 1197 | ret = pcmcia_register_socket(&socket->socket); |
1118 | if (ret == 0) { | 1198 | if (ret == 0) { |
@@ -1232,6 +1312,7 @@ static struct pci_device_id yenta_table [] = { | |||
1232 | 1312 | ||
1233 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX21_XX11, TI12XX), | 1313 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX21_XX11, TI12XX), |
1234 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X515, TI12XX), | 1314 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X515, TI12XX), |
1315 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX12, TI12XX), | ||
1235 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X420, TI12XX), | 1316 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X420, TI12XX), |
1236 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X620, TI12XX), | 1317 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X620, TI12XX), |
1237 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7410, TI12XX), | 1318 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7410, TI12XX), |