diff options
Diffstat (limited to 'arch/arm/mach-pxa/ssp.c')
-rw-r--r-- | arch/arm/mach-pxa/ssp.c | 78 |
1 files changed, 20 insertions, 58 deletions
diff --git a/arch/arm/mach-pxa/ssp.c b/arch/arm/mach-pxa/ssp.c index 965e38c6bafe..a81d6dbf662d 100644 --- a/arch/arm/mach-pxa/ssp.c +++ b/arch/arm/mach-pxa/ssp.c | |||
@@ -35,6 +35,8 @@ | |||
35 | #include <mach/ssp.h> | 35 | #include <mach/ssp.h> |
36 | #include <mach/regs-ssp.h> | 36 | #include <mach/regs-ssp.h> |
37 | 37 | ||
38 | #ifdef CONFIG_PXA_SSP_LEGACY | ||
39 | |||
38 | #define TIMEOUT 100000 | 40 | #define TIMEOUT 100000 |
39 | 41 | ||
40 | static irqreturn_t ssp_interrupt(int irq, void *dev_id) | 42 | static irqreturn_t ssp_interrupt(int irq, void *dev_id) |
@@ -303,6 +305,7 @@ void ssp_exit(struct ssp_dev *dev) | |||
303 | clk_disable(ssp->clk); | 305 | clk_disable(ssp->clk); |
304 | ssp_free(ssp); | 306 | ssp_free(ssp); |
305 | } | 307 | } |
308 | #endif /* CONFIG_PXA_SSP_LEGACY */ | ||
306 | 309 | ||
307 | static DEFINE_MUTEX(ssp_lock); | 310 | static DEFINE_MUTEX(ssp_lock); |
308 | static LIST_HEAD(ssp_list); | 311 | static LIST_HEAD(ssp_list); |
@@ -342,8 +345,9 @@ void ssp_free(struct ssp_device *ssp) | |||
342 | } | 345 | } |
343 | EXPORT_SYMBOL(ssp_free); | 346 | EXPORT_SYMBOL(ssp_free); |
344 | 347 | ||
345 | static int __devinit ssp_probe(struct platform_device *pdev, int type) | 348 | static int __devinit ssp_probe(struct platform_device *pdev) |
346 | { | 349 | { |
350 | const struct platform_device_id *id = platform_get_device_id(pdev); | ||
347 | struct resource *res; | 351 | struct resource *res; |
348 | struct ssp_device *ssp; | 352 | struct ssp_device *ssp; |
349 | int ret = 0; | 353 | int ret = 0; |
@@ -413,7 +417,7 @@ static int __devinit ssp_probe(struct platform_device *pdev, int type) | |||
413 | */ | 417 | */ |
414 | ssp->port_id = pdev->id + 1; | 418 | ssp->port_id = pdev->id + 1; |
415 | ssp->use_count = 0; | 419 | ssp->use_count = 0; |
416 | ssp->type = type; | 420 | ssp->type = (int)id->driver_data; |
417 | 421 | ||
418 | mutex_lock(&ssp_lock); | 422 | mutex_lock(&ssp_lock); |
419 | list_add(&ssp->node, &ssp_list); | 423 | list_add(&ssp->node, &ssp_list); |
@@ -457,80 +461,37 @@ static int __devexit ssp_remove(struct platform_device *pdev) | |||
457 | return 0; | 461 | return 0; |
458 | } | 462 | } |
459 | 463 | ||
460 | static int __devinit pxa25x_ssp_probe(struct platform_device *pdev) | 464 | static const struct platform_device_id ssp_id_table[] = { |
461 | { | 465 | { "pxa25x-ssp", PXA25x_SSP }, |
462 | return ssp_probe(pdev, PXA25x_SSP); | 466 | { "pxa25x-nssp", PXA25x_NSSP }, |
463 | } | 467 | { "pxa27x-ssp", PXA27x_SSP }, |
464 | 468 | { }, | |
465 | static int __devinit pxa25x_nssp_probe(struct platform_device *pdev) | ||
466 | { | ||
467 | return ssp_probe(pdev, PXA25x_NSSP); | ||
468 | } | ||
469 | |||
470 | static int __devinit pxa27x_ssp_probe(struct platform_device *pdev) | ||
471 | { | ||
472 | return ssp_probe(pdev, PXA27x_SSP); | ||
473 | } | ||
474 | |||
475 | static struct platform_driver pxa25x_ssp_driver = { | ||
476 | .driver = { | ||
477 | .name = "pxa25x-ssp", | ||
478 | }, | ||
479 | .probe = pxa25x_ssp_probe, | ||
480 | .remove = __devexit_p(ssp_remove), | ||
481 | }; | 469 | }; |
482 | 470 | ||
483 | static struct platform_driver pxa25x_nssp_driver = { | 471 | static struct platform_driver ssp_driver = { |
484 | .driver = { | 472 | .probe = ssp_probe, |
485 | .name = "pxa25x-nssp", | ||
486 | }, | ||
487 | .probe = pxa25x_nssp_probe, | ||
488 | .remove = __devexit_p(ssp_remove), | 473 | .remove = __devexit_p(ssp_remove), |
489 | }; | ||
490 | |||
491 | static struct platform_driver pxa27x_ssp_driver = { | ||
492 | .driver = { | 474 | .driver = { |
493 | .name = "pxa27x-ssp", | 475 | .owner = THIS_MODULE, |
476 | .name = "pxa2xx-ssp", | ||
494 | }, | 477 | }, |
495 | .probe = pxa27x_ssp_probe, | 478 | .id_table = ssp_id_table, |
496 | .remove = __devexit_p(ssp_remove), | ||
497 | }; | 479 | }; |
498 | 480 | ||
499 | static int __init pxa_ssp_init(void) | 481 | static int __init pxa_ssp_init(void) |
500 | { | 482 | { |
501 | int ret = 0; | 483 | return platform_driver_register(&ssp_driver); |
502 | |||
503 | ret = platform_driver_register(&pxa25x_ssp_driver); | ||
504 | if (ret) { | ||
505 | printk(KERN_ERR "failed to register pxa25x_ssp_driver"); | ||
506 | return ret; | ||
507 | } | ||
508 | |||
509 | ret = platform_driver_register(&pxa25x_nssp_driver); | ||
510 | if (ret) { | ||
511 | printk(KERN_ERR "failed to register pxa25x_nssp_driver"); | ||
512 | return ret; | ||
513 | } | ||
514 | |||
515 | ret = platform_driver_register(&pxa27x_ssp_driver); | ||
516 | if (ret) { | ||
517 | printk(KERN_ERR "failed to register pxa27x_ssp_driver"); | ||
518 | return ret; | ||
519 | } | ||
520 | |||
521 | return ret; | ||
522 | } | 484 | } |
523 | 485 | ||
524 | static void __exit pxa_ssp_exit(void) | 486 | static void __exit pxa_ssp_exit(void) |
525 | { | 487 | { |
526 | platform_driver_unregister(&pxa25x_ssp_driver); | 488 | platform_driver_unregister(&ssp_driver); |
527 | platform_driver_unregister(&pxa25x_nssp_driver); | ||
528 | platform_driver_unregister(&pxa27x_ssp_driver); | ||
529 | } | 489 | } |
530 | 490 | ||
531 | arch_initcall(pxa_ssp_init); | 491 | arch_initcall(pxa_ssp_init); |
532 | module_exit(pxa_ssp_exit); | 492 | module_exit(pxa_ssp_exit); |
533 | 493 | ||
494 | #ifdef CONFIG_PXA_SSP_LEGACY | ||
534 | EXPORT_SYMBOL(ssp_write_word); | 495 | EXPORT_SYMBOL(ssp_write_word); |
535 | EXPORT_SYMBOL(ssp_read_word); | 496 | EXPORT_SYMBOL(ssp_read_word); |
536 | EXPORT_SYMBOL(ssp_flush); | 497 | EXPORT_SYMBOL(ssp_flush); |
@@ -541,6 +502,7 @@ EXPORT_SYMBOL(ssp_restore_state); | |||
541 | EXPORT_SYMBOL(ssp_init); | 502 | EXPORT_SYMBOL(ssp_init); |
542 | EXPORT_SYMBOL(ssp_exit); | 503 | EXPORT_SYMBOL(ssp_exit); |
543 | EXPORT_SYMBOL(ssp_config); | 504 | EXPORT_SYMBOL(ssp_config); |
505 | #endif | ||
544 | 506 | ||
545 | MODULE_DESCRIPTION("PXA SSP driver"); | 507 | MODULE_DESCRIPTION("PXA SSP driver"); |
546 | MODULE_AUTHOR("Liam Girdwood"); | 508 | MODULE_AUTHOR("Liam Girdwood"); |