diff options
| author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2006-10-09 21:47:31 -0400 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2006-10-09 23:56:13 -0400 |
| commit | 10270613fb4d5a44c335cfa13e9626bf5743c01d (patch) | |
| tree | 6852db04a76e5a13c295f906c6f9acc88837a372 | |
| parent | 9f2545c11869868fd3cde7098d99e690891e442c (diff) | |
[POWERPC] Fix windfarm platform device usage
The windfarm code uses a struct device_driver instead of
platform_driver, which can cause crashes if any of the callbacks are
called (like on module removal). This fixes it.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
| -rw-r--r-- | drivers/macintosh/windfarm_pm112.c | 18 | ||||
| -rw-r--r-- | drivers/macintosh/windfarm_pm81.c | 24 | ||||
| -rw-r--r-- | drivers/macintosh/windfarm_pm91.c | 24 |
3 files changed, 30 insertions, 36 deletions
diff --git a/drivers/macintosh/windfarm_pm112.c b/drivers/macintosh/windfarm_pm112.c index ef66bf2778ec..fa4b13f89369 100644 --- a/drivers/macintosh/windfarm_pm112.c +++ b/drivers/macintosh/windfarm_pm112.c | |||
| @@ -650,24 +650,26 @@ static struct notifier_block pm112_events = { | |||
| 650 | .notifier_call = pm112_wf_notify, | 650 | .notifier_call = pm112_wf_notify, |
| 651 | }; | 651 | }; |
| 652 | 652 | ||
| 653 | static int wf_pm112_probe(struct device *dev) | 653 | static int wf_pm112_probe(struct platform_device *dev) |
| 654 | { | 654 | { |
| 655 | wf_register_client(&pm112_events); | 655 | wf_register_client(&pm112_events); |
| 656 | return 0; | 656 | return 0; |
| 657 | } | 657 | } |
| 658 | 658 | ||
| 659 | static int wf_pm112_remove(struct device *dev) | 659 | static int __devexit wf_pm112_remove(struct platform_device *dev) |
| 660 | { | 660 | { |
| 661 | wf_unregister_client(&pm112_events); | 661 | wf_unregister_client(&pm112_events); |
| 662 | /* should release all sensors and controls */ | 662 | /* should release all sensors and controls */ |
| 663 | return 0; | 663 | return 0; |
| 664 | } | 664 | } |
| 665 | 665 | ||
| 666 | static struct device_driver wf_pm112_driver = { | 666 | static struct platform_driver wf_pm112_driver = { |
| 667 | .name = "windfarm", | ||
| 668 | .bus = &platform_bus_type, | ||
| 669 | .probe = wf_pm112_probe, | 667 | .probe = wf_pm112_probe, |
| 670 | .remove = wf_pm112_remove, | 668 | .remove = __devexit_p(wf_pm112_remove), |
| 669 | .driver = { | ||
| 670 | .name = "windfarm", | ||
| 671 | .bus = &platform_bus_type, | ||
| 672 | }, | ||
| 671 | }; | 673 | }; |
| 672 | 674 | ||
| 673 | static int __init wf_pm112_init(void) | 675 | static int __init wf_pm112_init(void) |
| @@ -683,13 +685,13 @@ static int __init wf_pm112_init(void) | |||
| 683 | ++nr_cores; | 685 | ++nr_cores; |
| 684 | 686 | ||
| 685 | printk(KERN_INFO "windfarm: initializing for dual-core desktop G5\n"); | 687 | printk(KERN_INFO "windfarm: initializing for dual-core desktop G5\n"); |
| 686 | driver_register(&wf_pm112_driver); | 688 | platform_driver_register(&wf_pm112_driver); |
| 687 | return 0; | 689 | return 0; |
| 688 | } | 690 | } |
| 689 | 691 | ||
| 690 | static void __exit wf_pm112_exit(void) | 692 | static void __exit wf_pm112_exit(void) |
| 691 | { | 693 | { |
| 692 | driver_unregister(&wf_pm112_driver); | 694 | platform_driver_unregister(&wf_pm112_driver); |
| 693 | } | 695 | } |
| 694 | 696 | ||
| 695 | module_init(wf_pm112_init); | 697 | module_init(wf_pm112_init); |
diff --git a/drivers/macintosh/windfarm_pm81.c b/drivers/macintosh/windfarm_pm81.c index 2ff546e4c92f..2a944851b8e1 100644 --- a/drivers/macintosh/windfarm_pm81.c +++ b/drivers/macintosh/windfarm_pm81.c | |||
| @@ -131,8 +131,6 @@ | |||
| 131 | 131 | ||
| 132 | static int wf_smu_mach_model; /* machine model id */ | 132 | static int wf_smu_mach_model; /* machine model id */ |
| 133 | 133 | ||
| 134 | static struct device *wf_smu_dev; | ||
| 135 | |||
| 136 | /* Controls & sensors */ | 134 | /* Controls & sensors */ |
| 137 | static struct wf_sensor *sensor_cpu_power; | 135 | static struct wf_sensor *sensor_cpu_power; |
| 138 | static struct wf_sensor *sensor_cpu_temp; | 136 | static struct wf_sensor *sensor_cpu_temp; |
| @@ -717,16 +715,14 @@ static int wf_init_pm(void) | |||
| 717 | return 0; | 715 | return 0; |
| 718 | } | 716 | } |
| 719 | 717 | ||
| 720 | static int wf_smu_probe(struct device *ddev) | 718 | static int wf_smu_probe(struct platform_device *ddev) |
| 721 | { | 719 | { |
| 722 | wf_smu_dev = ddev; | ||
| 723 | |||
| 724 | wf_register_client(&wf_smu_events); | 720 | wf_register_client(&wf_smu_events); |
| 725 | 721 | ||
| 726 | return 0; | 722 | return 0; |
| 727 | } | 723 | } |
| 728 | 724 | ||
| 729 | static int wf_smu_remove(struct device *ddev) | 725 | static int __devexit wf_smu_remove(struct platform_device *ddev) |
| 730 | { | 726 | { |
| 731 | wf_unregister_client(&wf_smu_events); | 727 | wf_unregister_client(&wf_smu_events); |
| 732 | 728 | ||
| @@ -766,16 +762,16 @@ static int wf_smu_remove(struct device *ddev) | |||
| 766 | if (wf_smu_cpu_fans) | 762 | if (wf_smu_cpu_fans) |
| 767 | kfree(wf_smu_cpu_fans); | 763 | kfree(wf_smu_cpu_fans); |
| 768 | 764 | ||
| 769 | wf_smu_dev = NULL; | ||
| 770 | |||
| 771 | return 0; | 765 | return 0; |
| 772 | } | 766 | } |
| 773 | 767 | ||
| 774 | static struct device_driver wf_smu_driver = { | 768 | static struct platform_driver wf_smu_driver = { |
| 775 | .name = "windfarm", | ||
| 776 | .bus = &platform_bus_type, | ||
| 777 | .probe = wf_smu_probe, | 769 | .probe = wf_smu_probe, |
| 778 | .remove = wf_smu_remove, | 770 | .remove = __devexit_p(wf_smu_remove), |
| 771 | .driver = { | ||
| 772 | .name = "windfarm", | ||
| 773 | .bus = &platform_bus_type, | ||
| 774 | }, | ||
| 779 | }; | 775 | }; |
| 780 | 776 | ||
| 781 | 777 | ||
| @@ -794,7 +790,7 @@ static int __init wf_smu_init(void) | |||
| 794 | request_module("windfarm_lm75_sensor"); | 790 | request_module("windfarm_lm75_sensor"); |
| 795 | 791 | ||
| 796 | #endif /* MODULE */ | 792 | #endif /* MODULE */ |
| 797 | driver_register(&wf_smu_driver); | 793 | platform_driver_register(&wf_smu_driver); |
| 798 | } | 794 | } |
| 799 | 795 | ||
| 800 | return rc; | 796 | return rc; |
| @@ -803,7 +799,7 @@ static int __init wf_smu_init(void) | |||
| 803 | static void __exit wf_smu_exit(void) | 799 | static void __exit wf_smu_exit(void) |
| 804 | { | 800 | { |
| 805 | 801 | ||
| 806 | driver_unregister(&wf_smu_driver); | 802 | platform_driver_unregister(&wf_smu_driver); |
| 807 | } | 803 | } |
| 808 | 804 | ||
| 809 | 805 | ||
diff --git a/drivers/macintosh/windfarm_pm91.c b/drivers/macintosh/windfarm_pm91.c index 59e9ffe37c39..9961a67b4f85 100644 --- a/drivers/macintosh/windfarm_pm91.c +++ b/drivers/macintosh/windfarm_pm91.c | |||
| @@ -63,8 +63,6 @@ | |||
| 63 | */ | 63 | */ |
| 64 | #undef HACKED_OVERTEMP | 64 | #undef HACKED_OVERTEMP |
| 65 | 65 | ||
| 66 | static struct device *wf_smu_dev; | ||
| 67 | |||
| 68 | /* Controls & sensors */ | 66 | /* Controls & sensors */ |
| 69 | static struct wf_sensor *sensor_cpu_power; | 67 | static struct wf_sensor *sensor_cpu_power; |
| 70 | static struct wf_sensor *sensor_cpu_temp; | 68 | static struct wf_sensor *sensor_cpu_temp; |
| @@ -641,16 +639,14 @@ static int wf_init_pm(void) | |||
| 641 | return 0; | 639 | return 0; |
| 642 | } | 640 | } |
| 643 | 641 | ||
| 644 | static int wf_smu_probe(struct device *ddev) | 642 | static int wf_smu_probe(struct platform_device *ddev) |
| 645 | { | 643 | { |
| 646 | wf_smu_dev = ddev; | ||
| 647 | |||
| 648 | wf_register_client(&wf_smu_events); | 644 | wf_register_client(&wf_smu_events); |
| 649 | 645 | ||
| 650 | return 0; | 646 | return 0; |
| 651 | } | 647 | } |
| 652 | 648 | ||
| 653 | static int wf_smu_remove(struct device *ddev) | 649 | static int __devexit wf_smu_remove(struct platform_device *ddev) |
| 654 | { | 650 | { |
| 655 | wf_unregister_client(&wf_smu_events); | 651 | wf_unregister_client(&wf_smu_events); |
| 656 | 652 | ||
| @@ -698,16 +694,16 @@ static int wf_smu_remove(struct device *ddev) | |||
| 698 | if (wf_smu_cpu_fans) | 694 | if (wf_smu_cpu_fans) |
| 699 | kfree(wf_smu_cpu_fans); | 695 | kfree(wf_smu_cpu_fans); |
| 700 | 696 | ||
| 701 | wf_smu_dev = NULL; | ||
| 702 | |||
| 703 | return 0; | 697 | return 0; |
| 704 | } | 698 | } |
| 705 | 699 | ||
| 706 | static struct device_driver wf_smu_driver = { | 700 | static struct platform_driver wf_smu_driver = { |
| 707 | .name = "windfarm", | ||
| 708 | .bus = &platform_bus_type, | ||
| 709 | .probe = wf_smu_probe, | 701 | .probe = wf_smu_probe, |
| 710 | .remove = wf_smu_remove, | 702 | .remove = __devexit_p(wf_smu_remove), |
| 703 | .driver = { | ||
| 704 | .name = "windfarm", | ||
| 705 | .bus = &platform_bus_type, | ||
| 706 | }, | ||
| 711 | }; | 707 | }; |
| 712 | 708 | ||
| 713 | 709 | ||
| @@ -725,7 +721,7 @@ static int __init wf_smu_init(void) | |||
| 725 | request_module("windfarm_lm75_sensor"); | 721 | request_module("windfarm_lm75_sensor"); |
| 726 | 722 | ||
| 727 | #endif /* MODULE */ | 723 | #endif /* MODULE */ |
| 728 | driver_register(&wf_smu_driver); | 724 | platform_driver_register(&wf_smu_driver); |
| 729 | } | 725 | } |
| 730 | 726 | ||
| 731 | return rc; | 727 | return rc; |
| @@ -734,7 +730,7 @@ static int __init wf_smu_init(void) | |||
| 734 | static void __exit wf_smu_exit(void) | 730 | static void __exit wf_smu_exit(void) |
| 735 | { | 731 | { |
| 736 | 732 | ||
| 737 | driver_unregister(&wf_smu_driver); | 733 | platform_driver_unregister(&wf_smu_driver); |
| 738 | } | 734 | } |
| 739 | 735 | ||
| 740 | 736 | ||
