aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/sysdev
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-05-20 01:36:52 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-05-20 01:36:52 -0400
commit880102e78547c1db158a17e36cf0cdd98e7ad710 (patch)
tree3fff9cc54c44dafe275cfabefb96c589e08d971d /arch/powerpc/sysdev
parent3d07f0e83d4323d2cd45cc583f7cf1957aca3cac (diff)
parent39ab05c8e0b519ff0a04a869f065746e6e8c3d95 (diff)
Merge remote branch 'origin/master' into merge
Manual merge of arch/powerpc/kernel/smp.c and add missing scheduler_ipi() call to arch/powerpc/platforms/cell/interrupt.c Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/sysdev')
-rw-r--r--arch/powerpc/sysdev/ipic.c36
-rw-r--r--arch/powerpc/sysdev/mpic.c48
2 files changed, 35 insertions, 49 deletions
diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c
index f0ece79f9be5..7367d17364cb 100644
--- a/arch/powerpc/sysdev/ipic.c
+++ b/arch/powerpc/sysdev/ipic.c
@@ -18,7 +18,7 @@
18#include <linux/stddef.h> 18#include <linux/stddef.h>
19#include <linux/sched.h> 19#include <linux/sched.h>
20#include <linux/signal.h> 20#include <linux/signal.h>
21#include <linux/sysdev.h> 21#include <linux/syscore_ops.h>
22#include <linux/device.h> 22#include <linux/device.h>
23#include <linux/bootmem.h> 23#include <linux/bootmem.h>
24#include <linux/spinlock.h> 24#include <linux/spinlock.h>
@@ -900,7 +900,7 @@ static struct {
900 u32 sercr; 900 u32 sercr;
901} ipic_saved_state; 901} ipic_saved_state;
902 902
903static int ipic_suspend(struct sys_device *sdev, pm_message_t state) 903static int ipic_suspend(void)
904{ 904{
905 struct ipic *ipic = primary_ipic; 905 struct ipic *ipic = primary_ipic;
906 906
@@ -931,7 +931,7 @@ static int ipic_suspend(struct sys_device *sdev, pm_message_t state)
931 return 0; 931 return 0;
932} 932}
933 933
934static int ipic_resume(struct sys_device *sdev) 934static void ipic_resume(void)
935{ 935{
936 struct ipic *ipic = primary_ipic; 936 struct ipic *ipic = primary_ipic;
937 937
@@ -947,44 +947,26 @@ static int ipic_resume(struct sys_device *sdev)
947 ipic_write(ipic->regs, IPIC_SECNR, ipic_saved_state.secnr); 947 ipic_write(ipic->regs, IPIC_SECNR, ipic_saved_state.secnr);
948 ipic_write(ipic->regs, IPIC_SERMR, ipic_saved_state.sermr); 948 ipic_write(ipic->regs, IPIC_SERMR, ipic_saved_state.sermr);
949 ipic_write(ipic->regs, IPIC_SERCR, ipic_saved_state.sercr); 949 ipic_write(ipic->regs, IPIC_SERCR, ipic_saved_state.sercr);
950
951 return 0;
952} 950}
953#else 951#else
954#define ipic_suspend NULL 952#define ipic_suspend NULL
955#define ipic_resume NULL 953#define ipic_resume NULL
956#endif 954#endif
957 955
958static struct sysdev_class ipic_sysclass = { 956static struct syscore_ops ipic_syscore_ops = {
959 .name = "ipic",
960 .suspend = ipic_suspend, 957 .suspend = ipic_suspend,
961 .resume = ipic_resume, 958 .resume = ipic_resume,
962}; 959};
963 960
964static struct sys_device device_ipic = { 961static int __init init_ipic_syscore(void)
965 .id = 0,
966 .cls = &ipic_sysclass,
967};
968
969static int __init init_ipic_sysfs(void)
970{ 962{
971 int rc;
972
973 if (!primary_ipic || !primary_ipic->regs) 963 if (!primary_ipic || !primary_ipic->regs)
974 return -ENODEV; 964 return -ENODEV;
975 printk(KERN_DEBUG "Registering ipic with sysfs...\n");
976 965
977 rc = sysdev_class_register(&ipic_sysclass); 966 printk(KERN_DEBUG "Registering ipic system core operations\n");
978 if (rc) { 967 register_syscore_ops(&ipic_syscore_ops);
979 printk(KERN_ERR "Failed registering ipic sys class\n"); 968
980 return -ENODEV;
981 }
982 rc = sysdev_register(&device_ipic);
983 if (rc) {
984 printk(KERN_ERR "Failed registering ipic sys device\n");
985 return -ENODEV;
986 }
987 return 0; 969 return 0;
988} 970}
989 971
990subsys_initcall(init_ipic_sysfs); 972subsys_initcall(init_ipic_syscore);
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
index 57e954142c70..3a8de5bb628a 100644
--- a/arch/powerpc/sysdev/mpic.c
+++ b/arch/powerpc/sysdev/mpic.c
@@ -28,6 +28,7 @@
28#include <linux/spinlock.h> 28#include <linux/spinlock.h>
29#include <linux/pci.h> 29#include <linux/pci.h>
30#include <linux/slab.h> 30#include <linux/slab.h>
31#include <linux/syscore_ops.h>
31 32
32#include <asm/ptrace.h> 33#include <asm/ptrace.h>
33#include <asm/signal.h> 34#include <asm/signal.h>
@@ -1793,9 +1794,8 @@ void mpic_reset_core(int cpu)
1793#endif /* CONFIG_SMP */ 1794#endif /* CONFIG_SMP */
1794 1795
1795#ifdef CONFIG_PM 1796#ifdef CONFIG_PM
1796static int mpic_suspend(struct sys_device *dev, pm_message_t state) 1797static void mpic_suspend_one(struct mpic *mpic)
1797{ 1798{
1798 struct mpic *mpic = container_of(dev, struct mpic, sysdev);
1799 int i; 1799 int i;
1800 1800
1801 for (i = 0; i < mpic->num_sources; i++) { 1801 for (i = 0; i < mpic->num_sources; i++) {
@@ -1804,13 +1804,22 @@ static int mpic_suspend(struct sys_device *dev, pm_message_t state)
1804 mpic->save_data[i].dest = 1804 mpic->save_data[i].dest =
1805 mpic_irq_read(i, MPIC_INFO(IRQ_DESTINATION)); 1805 mpic_irq_read(i, MPIC_INFO(IRQ_DESTINATION));
1806 } 1806 }
1807}
1808
1809static int mpic_suspend(void)
1810{
1811 struct mpic *mpic = mpics;
1812
1813 while (mpic) {
1814 mpic_suspend_one(mpic);
1815 mpic = mpic->next;
1816 }
1807 1817
1808 return 0; 1818 return 0;
1809} 1819}
1810 1820
1811static int mpic_resume(struct sys_device *dev) 1821static void mpic_resume_one(struct mpic *mpic)
1812{ 1822{
1813 struct mpic *mpic = container_of(dev, struct mpic, sysdev);
1814 int i; 1823 int i;
1815 1824
1816 for (i = 0; i < mpic->num_sources; i++) { 1825 for (i = 0; i < mpic->num_sources; i++) {
@@ -1837,33 +1846,28 @@ static int mpic_resume(struct sys_device *dev)
1837 } 1846 }
1838#endif 1847#endif
1839 } /* end for loop */ 1848 } /* end for loop */
1849}
1840 1850
1841 return 0; 1851static void mpic_resume(void)
1852{
1853 struct mpic *mpic = mpics;
1854
1855 while (mpic) {
1856 mpic_resume_one(mpic);
1857 mpic = mpic->next;
1858 }
1842} 1859}
1843#endif
1844 1860
1845static struct sysdev_class mpic_sysclass = { 1861static struct syscore_ops mpic_syscore_ops = {
1846#ifdef CONFIG_PM
1847 .resume = mpic_resume, 1862 .resume = mpic_resume,
1848 .suspend = mpic_suspend, 1863 .suspend = mpic_suspend,
1849#endif
1850 .name = "mpic",
1851}; 1864};
1852 1865
1853static int mpic_init_sys(void) 1866static int mpic_init_sys(void)
1854{ 1867{
1855 struct mpic *mpic = mpics; 1868 register_syscore_ops(&mpic_syscore_ops);
1856 int error, id = 0; 1869 return 0;
1857
1858 error = sysdev_class_register(&mpic_sysclass);
1859
1860 while (mpic && !error) {
1861 mpic->sysdev.cls = &mpic_sysclass;
1862 mpic->sysdev.id = id++;
1863 error = sysdev_register(&mpic->sysdev);
1864 mpic = mpic->next;
1865 }
1866 return error;
1867} 1870}
1868 1871
1869device_initcall(mpic_init_sys); 1872device_initcall(mpic_init_sys);
1873#endif