aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/macintosh
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2006-10-09 21:47:31 -0400
committerPaul Mackerras <paulus@samba.org>2006-10-09 23:56:13 -0400
commit10270613fb4d5a44c335cfa13e9626bf5743c01d (patch)
tree6852db04a76e5a13c295f906c6f9acc88837a372 /drivers/macintosh
parent9f2545c11869868fd3cde7098d99e690891e442c (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>
Diffstat (limited to 'drivers/macintosh')
-rw-r--r--drivers/macintosh/windfarm_pm112.c18
-rw-r--r--drivers/macintosh/windfarm_pm81.c24
-rw-r--r--drivers/macintosh/windfarm_pm91.c24
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
653static int wf_pm112_probe(struct device *dev) 653static 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
659static int wf_pm112_remove(struct device *dev) 659static 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
666static struct device_driver wf_pm112_driver = { 666static 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
673static int __init wf_pm112_init(void) 675static 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
690static void __exit wf_pm112_exit(void) 692static 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
695module_init(wf_pm112_init); 697module_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
132static int wf_smu_mach_model; /* machine model id */ 132static int wf_smu_mach_model; /* machine model id */
133 133
134static struct device *wf_smu_dev;
135
136/* Controls & sensors */ 134/* Controls & sensors */
137static struct wf_sensor *sensor_cpu_power; 135static struct wf_sensor *sensor_cpu_power;
138static struct wf_sensor *sensor_cpu_temp; 136static 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
720static int wf_smu_probe(struct device *ddev) 718static 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
729static int wf_smu_remove(struct device *ddev) 725static 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
774static struct device_driver wf_smu_driver = { 768static 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)
803static void __exit wf_smu_exit(void) 799static 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
66static struct device *wf_smu_dev;
67
68/* Controls & sensors */ 66/* Controls & sensors */
69static struct wf_sensor *sensor_cpu_power; 67static struct wf_sensor *sensor_cpu_power;
70static struct wf_sensor *sensor_cpu_temp; 68static 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
644static int wf_smu_probe(struct device *ddev) 642static 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
653static int wf_smu_remove(struct device *ddev) 649static 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
706static struct device_driver wf_smu_driver = { 700static 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)
734static void __exit wf_smu_exit(void) 730static 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