2011-03-27 23:32:53

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 0/7] ARM: Use syscore_ops for "core" power management

Hi,

There are multiple problems with sysdevs, or struct sys_device objects to
be precise, that are so annoying that some people have started to think
of removind them entirely from the kernel. To me, personally, the most
obvious issue is the way sysdevs are used for defining suspend/resume
callbacks to be executed with one CPU on-line and interrupts disabled.
Apart from this, sysdevs do not follow general rules related to the
representation of things in /sys/devices/, so user space that uses
/sys/devices/ to retrieve information on device hierarchy layout and
device configuration, such as udev, cannot really handle them correctly.

Some subsystems need to carry out certain operations during suspend after
we've disabled non-boot CPUs and interrupts have been switched off on the
only on-line one. Currently, the only way to achieve that is to define
sysdev suspend/resume callbacks, but this is cumbersome and inefficient.
Namely, to do that, one has to define a sysdev class providing the callbacks
and a sysdev actually using them, which is excessively complicated. Moreover,
the sysdev suspend/resume callbacks take arguments that are not really used
by the majority of subsystems defining sysdev suspend/resume callbacks
(or even if they are used, they don't really need to be used, so they
are simply unnecessary). Of course, if a sysdev is only defined to provide
suspend/resume (and maybe shutdown) callbacks, there's no real reason why
it should show up in sysfs.

For this reason, I thought it would be a good idea to provide a simpler
interface for subsystems to define "very late" suspend callbacks and
"very early" resume callbacks (and "very late" shutdown callbacks as well)
without the entire bloat related to sysdevs. Such an interface has been
merged recently in the form of struct syscore_ops framework that can be used
to replace sysdevs in the "core" power management area.

The x86 architecture and subsystems it depends on have already been converted
to using the new framework instead of sysdevs for "core" power management and
the following series of patches does the analogous thing for the ARM
architecture. I have done my best to build the kernel for every affected
platform, but unfortunately some of them don't build even without my changes,
so some minor issues might have slept through my fingers. Hopefully, though,
there won't be too many of them.

[1/7] - Use syscore_ops for "core" PM in some common ARM code.
[2/7] - Use syscore_ops for "core" PM on OMAP.
[3/7] - Use syscore_ops for "core" PM on Integrator.
[4/7] - Use syscore_ops for "core" PM on SA1100.
[5/7] - Use syscore_ops for "core" PM on PXA-based platforms.
[6/7] - Use syscore_ops for "core" PM on Samsung platforms.
[7/7] - Mark ARM select CONFIG_ARCH_NO_SYSDEV_OPS.

Thanks,
Rafael


2011-03-27 23:32:43

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 3/7] ARM / Integrator: Use struct syscore_ops for "core" power management

From: Rafael J. Wysocki <[email protected]>

Replace the sysdev class and struct sys_device used for power
management by the Integrator interrupt-handling code with a
struct syscore_ops object which is simpler.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/mach-integrator/integrator_ap.c | 26 +++++++++-----------------
1 file changed, 9 insertions(+), 17 deletions(-)

Index: linux-2.6/arch/arm/mach-integrator/integrator_ap.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-integrator/integrator_ap.c
+++ linux-2.6/arch/arm/mach-integrator/integrator_ap.c
@@ -24,7 +24,7 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/string.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/amba/bus.h>
#include <linux/amba/kmi.h>
#include <linux/clocksource.h>
@@ -180,13 +180,13 @@ static void __init ap_init_irq(void)
#ifdef CONFIG_PM
static unsigned long ic_irq_enable;

-static int irq_suspend(struct sys_device *dev, pm_message_t state)
+static int irq_suspend(void)
{
ic_irq_enable = readl(VA_IC_BASE + IRQ_ENABLE);
return 0;
}

-static int irq_resume(struct sys_device *dev)
+static void irq_resume(void)
{
/* disable all irq sources */
writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
@@ -194,33 +194,25 @@ static int irq_resume(struct sys_device
writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);

writel(ic_irq_enable, VA_IC_BASE + IRQ_ENABLE_SET);
- return 0;
}
#else
#define irq_suspend NULL
#define irq_resume NULL
#endif

-static struct sysdev_class irq_class = {
- .name = "irq",
+static struct syscore_ops irq_syscore_ops = {
.suspend = irq_suspend,
.resume = irq_resume,
};

-static struct sys_device irq_device = {
- .id = 0,
- .cls = &irq_class,
-};
-
-static int __init irq_init_sysfs(void)
+static int __init irq_syscore_init(void)
{
- int ret = sysdev_class_register(&irq_class);
- if (ret == 0)
- ret = sysdev_register(&irq_device);
- return ret;
+ register_syscore_ops(&irq_syscore_ops);
+
+ return 0;
}

-device_initcall(irq_init_sysfs);
+device_initcall(irq_syscore_init);

/*
* Flash handling.

2011-03-27 23:32:45

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 2/7] ARM / OMAP: Use struct syscore_ops for "core" power management

From: Rafael J. Wysocki <[email protected]>

Replace the sysdev class and struct sys_device used for power
management in the OMAP's GPIO code with a struct syscore_ops object
which is simpler.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/plat-omap/gpio.c | 35 +++++++++--------------------------
1 file changed, 9 insertions(+), 26 deletions(-)

Index: linux-2.6/arch/arm/plat-omap/gpio.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-omap/gpio.c
+++ linux-2.6/arch/arm/plat-omap/gpio.c
@@ -17,7 +17,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/io.h>
@@ -1379,9 +1379,7 @@ static const struct dev_pm_ops omap_mpui
.resume_noirq = omap_mpuio_resume_noirq,
};

-/* use platform_driver for this, now that there's no longer any
- * point to sys_device (other than not disturbing old code).
- */
+/* use platform_driver for this. */
static struct platform_driver omap_mpuio_driver = {
.driver = {
.name = "mpuio",
@@ -1754,7 +1752,7 @@ static int __devinit omap_gpio_probe(str
}

#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
-static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
+static int omap_gpio_suspend(void)
{
int i;

@@ -1804,12 +1802,12 @@ static int omap_gpio_suspend(struct sys_
return 0;
}

-static int omap_gpio_resume(struct sys_device *dev)
+static void omap_gpio_resume(void)
{
int i;

if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
- return 0;
+ return;

for (i = 0; i < gpio_bank_count; i++) {
struct gpio_bank *bank = &gpio_bank[i];
@@ -1845,21 +1843,13 @@ static int omap_gpio_resume(struct sys_d
__raw_writel(bank->saved_wakeup, wake_set);
spin_unlock_irqrestore(&bank->lock, flags);
}
-
- return 0;
}

-static struct sysdev_class omap_gpio_sysclass = {
- .name = "gpio",
+static struct syscore_ops omap_gpio_syscore_ops = {
.suspend = omap_gpio_suspend,
.resume = omap_gpio_resume,
};

-static struct sys_device omap_gpio_device = {
- .id = 0,
- .cls = &omap_gpio_sysclass,
-};
-
#endif

#ifdef CONFIG_ARCH_OMAP2PLUS
@@ -2117,21 +2107,14 @@ postcore_initcall(omap_gpio_drv_reg);

static int __init omap_gpio_sysinit(void)
{
- int ret = 0;
-
mpuio_init();

#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
- if (cpu_is_omap16xx() || cpu_class_is_omap2()) {
- if (ret == 0) {
- ret = sysdev_class_register(&omap_gpio_sysclass);
- if (ret == 0)
- ret = sysdev_register(&omap_gpio_device);
- }
- }
+ if (cpu_is_omap16xx() || cpu_class_is_omap2())
+ register_syscore_ops(&omap_gpio_syscore_ops);
#endif

- return ret;
+ return 0;
}

arch_initcall(omap_gpio_sysinit);

2011-03-27 23:33:01

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 7/7] ARM: Select CONFIG_ARCH_NO_SYSDEV_OPS

From: Rafael J. Wysocki <[email protected]>

Make the ARM architecture select CONFIG_ARCH_NO_SYSDEV_OPS to
indicate that sysdevs are not used for power management any more on
this architecture.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/Kconfig | 1 +
1 file changed, 1 insertion(+)

Index: linux-2.6/arch/arm/Kconfig
===================================================================
--- linux-2.6.orig/arch/arm/Kconfig
+++ linux-2.6/arch/arm/Kconfig
@@ -28,6 +28,7 @@ config ARM
select HAVE_C_RECORDMCOUNT
select HAVE_GENERIC_HARDIRQS
select HAVE_SPARSE_IRQ
+ select ARCH_NO_SYSDEV_OPS
help
The ARM series is a line of low-power-consumption RISC chip designs
licensed by ARM Ltd and targeted at embedded applications and

2011-03-27 23:33:00

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 5/7] ARM / PXA: Use struct syscore_ops for "core" power management

From: Rafael J. Wysocki <[email protected]>

Replace sysdev classes and struct sys_device objects used for "core"
power management by the PXA platform code with struct syscore_ops
objects that are simpler.

This reduces the code size and the kernel memory footprint. It also
is necessary for removing sysdevs entirely from the kernel in the
future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/mach-pxa/balloon3.c | 1
arch/arm/mach-pxa/clock-pxa2xx.c | 18 ++----------
arch/arm/mach-pxa/clock-pxa3xx.c | 17 ++---------
arch/arm/mach-pxa/clock.h | 7 ++--
arch/arm/mach-pxa/cm-x270.c | 1
arch/arm/mach-pxa/cm-x2xx.c | 23 ++++------------
arch/arm/mach-pxa/colibri-evalboard.c | 1
arch/arm/mach-pxa/colibri-pxa270-income.c | 1
arch/arm/mach-pxa/colibri-pxa270.c | 1
arch/arm/mach-pxa/generic.h | 8 ++---
arch/arm/mach-pxa/irq.c | 17 ++---------
arch/arm/mach-pxa/lpd270.c | 20 ++++---------
arch/arm/mach-pxa/lubbock.c | 21 ++++----------
arch/arm/mach-pxa/mainstone.c | 22 ++++-----------
arch/arm/mach-pxa/mfp-pxa2xx.c | 12 +++-----
arch/arm/mach-pxa/mfp-pxa3xx.c | 21 +++-----------
arch/arm/mach-pxa/mioa701.c | 43 +++++-------------------------
arch/arm/mach-pxa/palmld.c | 1
arch/arm/mach-pxa/palmtreo.c | 1
arch/arm/mach-pxa/palmz72.c | 24 +++++-----------
arch/arm/mach-pxa/pxa25x.c | 25 ++++-------------
arch/arm/mach-pxa/pxa27x.c | 25 ++++-------------
arch/arm/mach-pxa/pxa3xx.c | 25 ++++-------------
arch/arm/mach-pxa/pxa95x.c | 20 ++-----------
arch/arm/mach-pxa/raumfeld.c | 1
arch/arm/mach-pxa/smemc.c | 29 ++++----------------
arch/arm/mach-pxa/trizeps4.c | 1
arch/arm/mach-pxa/viper.c | 12 ++++----
arch/arm/mach-pxa/vpac270.c | 1
arch/arm/plat-pxa/gpio.c | 17 ++---------
arch/arm/plat-pxa/mfp.c | 1
31 files changed, 110 insertions(+), 307 deletions(-)

Index: linux-2.6/arch/arm/plat-pxa/gpio.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-pxa/gpio.c
+++ linux-2.6/arch/arm/plat-pxa/gpio.c
@@ -15,7 +15,7 @@
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/slab.h>

#include <mach/gpio.h>
@@ -295,7 +295,7 @@ void __init pxa_init_gpio(int mux_irq, i
}

#ifdef CONFIG_PM
-static int pxa_gpio_suspend(struct sys_device *dev, pm_message_t state)
+static int pxa_gpio_suspend(void)
{
struct pxa_gpio_chip *c;
int gpio;
@@ -312,7 +312,7 @@ static int pxa_gpio_suspend(struct sys_d
return 0;
}

-static int pxa_gpio_resume(struct sys_device *dev)
+static void pxa_gpio_resume(void)
{
struct pxa_gpio_chip *c;
int gpio;
@@ -326,22 +326,13 @@ static int pxa_gpio_resume(struct sys_de
__raw_writel(c->saved_gfer, c->regbase + GFER_OFFSET);
__raw_writel(c->saved_gpdr, c->regbase + GPDR_OFFSET);
}
- return 0;
}
#else
#define pxa_gpio_suspend NULL
#define pxa_gpio_resume NULL
#endif

-struct sysdev_class pxa_gpio_sysclass = {
- .name = "gpio",
+struct syscore_ops pxa_gpio_syscore_ops = {
.suspend = pxa_gpio_suspend,
.resume = pxa_gpio_resume,
};
-
-static int __init pxa_gpio_init(void)
-{
- return sysdev_class_register(&pxa_gpio_sysclass);
-}
-
-core_initcall(pxa_gpio_init);
Index: linux-2.6/arch/arm/mach-pxa/generic.h
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/generic.h
+++ linux-2.6/arch/arm/mach-pxa/generic.h
@@ -61,10 +61,10 @@ extern unsigned pxa3xx_get_clk_frequency
#define pxa3xx_get_clk_frequency_khz(x) (0)
#endif

-extern struct sysdev_class pxa_irq_sysclass;
-extern struct sysdev_class pxa_gpio_sysclass;
-extern struct sysdev_class pxa2xx_mfp_sysclass;
-extern struct sysdev_class pxa3xx_mfp_sysclass;
+extern struct syscore_ops pxa_irq_syscore_ops;
+extern struct syscore_ops pxa_gpio_syscore_ops;
+extern struct syscore_ops pxa2xx_mfp_syscore_ops;
+extern struct syscore_ops pxa3xx_mfp_syscore_ops;

void __init pxa_set_ffuart_info(void *info);
void __init pxa_set_btuart_info(void *info);
Index: linux-2.6/arch/arm/mach-pxa/pxa95x.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/pxa95x.c
+++ linux-2.6/arch/arm/mach-pxa/pxa95x.c
@@ -18,7 +18,7 @@
#include <linux/i2c/pxa-i2c.h>
#include <linux/irq.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/hardware.h>
#include <mach/gpio.h>
@@ -260,16 +260,6 @@ static struct platform_device *devices[]
&pxa27x_device_pwm1,
};

-static struct sys_device pxa95x_sysdev[] = {
- {
- .cls = &pxa_irq_sysclass,
- }, {
- .cls = &pxa_gpio_sysclass,
- }, {
- .cls = &pxa3xx_clock_sysclass,
- }
-};
-
static int __init pxa95x_init(void)
{
int ret = 0, i;
@@ -293,11 +283,9 @@ static int __init pxa95x_init(void)
if ((ret = pxa_init_dma(IRQ_DMA, 32)))
return ret;

- for (i = 0; i < ARRAY_SIZE(pxa95x_sysdev); i++) {
- ret = sysdev_register(&pxa95x_sysdev[i]);
- if (ret)
- pr_err("failed to register sysdev[%d]\n", i);
- }
+ register_syscore_ops(&pxa_irq_syscore_ops);
+ register_syscore_ops(&pxa_gpio_syscore_ops);
+ register_syscore_ops(&pxa3xx_clock_syscore_ops);

ret = platform_add_devices(devices, ARRAY_SIZE(devices));
}
Index: linux-2.6/arch/arm/mach-pxa/clock-pxa3xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/clock-pxa3xx.c
+++ linux-2.6/arch/arm/mach-pxa/clock-pxa3xx.c
@@ -10,6 +10,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/syscore_ops.h>

#include <mach/smemc.h>
#include <mach/pxa3xx-regs.h>
@@ -182,7 +183,7 @@ const struct clkops clk_pxa3xx_pout_ops
static uint32_t cken[2];
static uint32_t accr;

-static int pxa3xx_clock_suspend(struct sys_device *d, pm_message_t state)
+static int pxa3xx_clock_suspend(void)
{
cken[0] = CKENA;
cken[1] = CKENB;
@@ -190,28 +191,18 @@ static int pxa3xx_clock_suspend(struct s
return 0;
}

-static int pxa3xx_clock_resume(struct sys_device *d)
+static void pxa3xx_clock_resume(void)
{
ACCR = accr;
CKENA = cken[0];
CKENB = cken[1];
- return 0;
}
#else
#define pxa3xx_clock_suspend NULL
#define pxa3xx_clock_resume NULL
#endif

-struct sysdev_class pxa3xx_clock_sysclass = {
- .name = "pxa3xx-clock",
+struct syscore_ops pxa3xx_clock_syscore_ops = {
.suspend = pxa3xx_clock_suspend,
.resume = pxa3xx_clock_resume,
};
-
-static int __init pxa3xx_clock_init(void)
-{
- if (cpu_is_pxa3xx() || cpu_is_pxa95x())
- return sysdev_class_register(&pxa3xx_clock_sysclass);
- return 0;
-}
-postcore_initcall(pxa3xx_clock_init);
Index: linux-2.6/arch/arm/mach-pxa/clock.h
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/clock.h
+++ linux-2.6/arch/arm/mach-pxa/clock.h
@@ -1,5 +1,5 @@
#include <linux/clkdev.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

struct clkops {
void (*enable)(struct clk *);
@@ -54,7 +54,7 @@ extern const struct clkops clk_pxa2xx_ck
void clk_pxa2xx_cken_enable(struct clk *clk);
void clk_pxa2xx_cken_disable(struct clk *clk);

-extern struct sysdev_class pxa2xx_clock_sysclass;
+extern struct syscore_ops pxa2xx_clock_syscore_ops;

#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA95x)
#define DEFINE_PXA3_CKEN(_name, _cken, _rate, _delay) \
@@ -74,5 +74,6 @@ extern const struct clkops clk_pxa3xx_sm
extern void clk_pxa3xx_cken_enable(struct clk *);
extern void clk_pxa3xx_cken_disable(struct clk *);

-extern struct sysdev_class pxa3xx_clock_sysclass;
+extern struct syscore_ops pxa3xx_clock_syscore_ops;
+
#endif
Index: linux-2.6/arch/arm/mach-pxa/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/irq.c
+++ linux-2.6/arch/arm/mach-pxa/irq.c
@@ -15,7 +15,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>
#include <linux/irq.h>

@@ -183,7 +183,7 @@ void __init pxa_init_irq(int irq_nr, set
static unsigned long saved_icmr[MAX_INTERNAL_IRQS/32];
static unsigned long saved_ipr[MAX_INTERNAL_IRQS];

-static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)
+static int pxa_irq_suspend(void)
{
int i;

@@ -202,7 +202,7 @@ static int pxa_irq_suspend(struct sys_de
return 0;
}

-static int pxa_irq_resume(struct sys_device *dev)
+static void pxa_irq_resume(void)
{
int i;

@@ -218,22 +218,13 @@ static int pxa_irq_resume(struct sys_dev
__raw_writel(saved_ipr[i], IRQ_BASE + IPR(i));

__raw_writel(1, IRQ_BASE + ICCR);
- return 0;
}
#else
#define pxa_irq_suspend NULL
#define pxa_irq_resume NULL
#endif

-struct sysdev_class pxa_irq_sysclass = {
- .name = "irq",
+struct syscore_ops pxa_irq_syscore_ops = {
.suspend = pxa_irq_suspend,
.resume = pxa_irq_resume,
};
-
-static int __init pxa_irq_init(void)
-{
- return sysdev_class_register(&pxa_irq_sysclass);
-}
-
-core_initcall(pxa_irq_init);
Index: linux-2.6/arch/arm/mach-pxa/clock-pxa2xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/clock-pxa2xx.c
+++ linux-2.6/arch/arm/mach-pxa/clock-pxa2xx.c
@@ -9,7 +9,7 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/pxa2xx-regs.h>

@@ -33,32 +33,22 @@ const struct clkops clk_pxa2xx_cken_ops
#ifdef CONFIG_PM
static uint32_t saved_cken;

-static int pxa2xx_clock_suspend(struct sys_device *d, pm_message_t state)
+static int pxa2xx_clock_suspend(void)
{
saved_cken = CKEN;
return 0;
}

-static int pxa2xx_clock_resume(struct sys_device *d)
+static void pxa2xx_clock_resume(void)
{
CKEN = saved_cken;
- return 0;
}
#else
#define pxa2xx_clock_suspend NULL
#define pxa2xx_clock_resume NULL
#endif

-struct sysdev_class pxa2xx_clock_sysclass = {
- .name = "pxa2xx-clock",
+struct syscore_ops pxa2xx_clock_syscore_ops = {
.suspend = pxa2xx_clock_suspend,
.resume = pxa2xx_clock_resume,
};
-
-static int __init pxa2xx_clock_init(void)
-{
- if (cpu_is_pxa2xx())
- return sysdev_class_register(&pxa2xx_clock_sysclass);
- return 0;
-}
-postcore_initcall(pxa2xx_clock_init);
Index: linux-2.6/arch/arm/mach-pxa/mfp-pxa3xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/mfp-pxa3xx.c
+++ linux-2.6/arch/arm/mach-pxa/mfp-pxa3xx.c
@@ -17,7 +17,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/hardware.h>
#include <mach/mfp-pxa3xx.h>
@@ -31,13 +31,13 @@
* a pull-down mode if they're an active low chip select, and we're
* just entering standby.
*/
-static int pxa3xx_mfp_suspend(struct sys_device *d, pm_message_t state)
+static int pxa3xx_mfp_suspend(void)
{
mfp_config_lpm();
return 0;
}

-static int pxa3xx_mfp_resume(struct sys_device *d)
+static void pxa3xx_mfp_resume(void)
{
mfp_config_run();

@@ -47,24 +47,13 @@ static int pxa3xx_mfp_resume(struct sys_
* preserve them here in case they will be referenced later
*/
ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S);
- return 0;
}
#else
#define pxa3xx_mfp_suspend NULL
#define pxa3xx_mfp_resume NULL
#endif

-struct sysdev_class pxa3xx_mfp_sysclass = {
- .name = "mfp",
+struct syscore_ops pxa3xx_mfp_syscore_ops = {
.suspend = pxa3xx_mfp_suspend,
- .resume = pxa3xx_mfp_resume,
+ .resume = pxa3xx_mfp_resume,
};
-
-static int __init mfp_init_devicefs(void)
-{
- if (cpu_is_pxa3xx())
- return sysdev_class_register(&pxa3xx_mfp_sysclass);
-
- return 0;
-}
-postcore_initcall(mfp_init_devicefs);
Index: linux-2.6/arch/arm/mach-pxa/pxa3xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/pxa3xx.c
+++ linux-2.6/arch/arm/mach-pxa/pxa3xx.c
@@ -20,7 +20,7 @@
#include <linux/platform_device.h>
#include <linux/irq.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/i2c/pxa-i2c.h>

#include <asm/mach/map.h>
@@ -427,21 +427,9 @@ static struct platform_device *devices[]
&pxa27x_device_pwm1,
};

-static struct sys_device pxa3xx_sysdev[] = {
- {
- .cls = &pxa_irq_sysclass,
- }, {
- .cls = &pxa3xx_mfp_sysclass,
- }, {
- .cls = &pxa_gpio_sysclass,
- }, {
- .cls = &pxa3xx_clock_sysclass,
- }
-};
-
static int __init pxa3xx_init(void)
{
- int i, ret = 0;
+ int ret = 0;

if (cpu_is_pxa3xx()) {

@@ -462,11 +450,10 @@ static int __init pxa3xx_init(void)

pxa3xx_init_pm();

- for (i = 0; i < ARRAY_SIZE(pxa3xx_sysdev); i++) {
- ret = sysdev_register(&pxa3xx_sysdev[i]);
- if (ret)
- pr_err("failed to register sysdev[%d]\n", i);
- }
+ register_syscore_ops(&pxa_irq_syscore_ops);
+ register_syscore_ops(&pxa3xx_mfp_syscore_ops);
+ register_syscore_ops(&pxa_gpio_syscore_ops);
+ register_syscore_ops(&pxa3xx_clock_syscore_ops);

ret = platform_add_devices(devices, ARRAY_SIZE(devices));
}
Index: linux-2.6/arch/arm/mach-pxa/mfp-pxa2xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/mfp-pxa2xx.c
+++ linux-2.6/arch/arm/mach-pxa/mfp-pxa2xx.c
@@ -16,7 +16,7 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/gpio.h>
#include <mach/pxa2xx-regs.h>
@@ -338,7 +338,7 @@ static unsigned long saved_gafr[2][4];
static unsigned long saved_gpdr[4];
static unsigned long saved_pgsr[4];

-static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state)
+static int pxa2xx_mfp_suspend(void)
{
int i;

@@ -365,7 +365,7 @@ static int pxa2xx_mfp_suspend(struct sys
return 0;
}

-static int pxa2xx_mfp_resume(struct sys_device *d)
+static void pxa2xx_mfp_resume(void)
{
int i;

@@ -376,15 +376,13 @@ static int pxa2xx_mfp_resume(struct sys_
PGSR(i) = saved_pgsr[i];
}
PSSR = PSSR_RDH | PSSR_PH;
- return 0;
}
#else
#define pxa2xx_mfp_suspend NULL
#define pxa2xx_mfp_resume NULL
#endif

-struct sysdev_class pxa2xx_mfp_sysclass = {
- .name = "mfp",
+struct syscore_ops pxa2xx_mfp_syscore_ops = {
.suspend = pxa2xx_mfp_suspend,
.resume = pxa2xx_mfp_resume,
};
@@ -409,6 +407,6 @@ static int __init pxa2xx_mfp_init(void)
for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++)
gpdr_lpm[i] = GPDR(i * 32);

- return sysdev_class_register(&pxa2xx_mfp_sysclass);
+ return 0;
}
postcore_initcall(pxa2xx_mfp_init);
Index: linux-2.6/arch/arm/mach-pxa/pxa25x.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/pxa25x.c
+++ linux-2.6/arch/arm/mach-pxa/pxa25x.c
@@ -21,7 +21,7 @@
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/suspend.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/irq.h>

#include <asm/mach/map.h>
@@ -350,21 +350,9 @@ static struct platform_device *pxa25x_de
&pxa_device_asoc_platform,
};

-static struct sys_device pxa25x_sysdev[] = {
- {
- .cls = &pxa_irq_sysclass,
- }, {
- .cls = &pxa2xx_mfp_sysclass,
- }, {
- .cls = &pxa_gpio_sysclass,
- }, {
- .cls = &pxa2xx_clock_sysclass,
- }
-};
-
static int __init pxa25x_init(void)
{
- int i, ret = 0;
+ int ret = 0;

if (cpu_is_pxa25x()) {

@@ -377,11 +365,10 @@ static int __init pxa25x_init(void)

pxa25x_init_pm();

- for (i = 0; i < ARRAY_SIZE(pxa25x_sysdev); i++) {
- ret = sysdev_register(&pxa25x_sysdev[i]);
- if (ret)
- pr_err("failed to register sysdev[%d]\n", i);
- }
+ register_syscore_ops(&pxa_irq_syscore_ops);
+ register_syscore_ops(&pxa2xx_mfp_syscore_ops);
+ register_syscore_ops(&pxa_gpio_syscore_ops);
+ register_syscore_ops(&pxa2xx_clock_syscore_ops);

ret = platform_add_devices(pxa25x_devices,
ARRAY_SIZE(pxa25x_devices));
Index: linux-2.6/arch/arm/mach-pxa/pxa27x.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/pxa27x.c
+++ linux-2.6/arch/arm/mach-pxa/pxa27x.c
@@ -16,7 +16,7 @@
#include <linux/init.h>
#include <linux/suspend.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/i2c/pxa-i2c.h>
@@ -428,21 +428,9 @@ static struct platform_device *devices[]
&pxa27x_device_pwm1,
};

-static struct sys_device pxa27x_sysdev[] = {
- {
- .cls = &pxa_irq_sysclass,
- }, {
- .cls = &pxa2xx_mfp_sysclass,
- }, {
- .cls = &pxa_gpio_sysclass,
- }, {
- .cls = &pxa2xx_clock_sysclass,
- }
-};
-
static int __init pxa27x_init(void)
{
- int i, ret = 0;
+ int ret = 0;

if (cpu_is_pxa27x()) {

@@ -455,11 +443,10 @@ static int __init pxa27x_init(void)

pxa27x_init_pm();

- for (i = 0; i < ARRAY_SIZE(pxa27x_sysdev); i++) {
- ret = sysdev_register(&pxa27x_sysdev[i]);
- if (ret)
- pr_err("failed to register sysdev[%d]\n", i);
- }
+ register_syscore_ops(&pxa_irq_syscore_ops);
+ register_syscore_ops(&pxa2xx_mfp_syscore_ops);
+ register_syscore_ops(&pxa_gpio_syscore_ops);
+ register_syscore_ops(&pxa2xx_clock_syscore_ops);

ret = platform_add_devices(devices, ARRAY_SIZE(devices));
}
Index: linux-2.6/arch/arm/mach-pxa/mioa701.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/mioa701.c
+++ linux-2.6/arch/arm/mach-pxa/mioa701.c
@@ -22,7 +22,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/input.h>
#include <linux/delay.h>
#include <linux/gpio_keys.h>
@@ -488,7 +488,7 @@ static void install_bootstrap(void)
}


-static int mioa701_sys_suspend(struct sys_device *sysdev, pm_message_t state)
+static int mioa701_sys_suspend(void)
{
int i = 0, is_bt_on;
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
@@ -514,7 +514,7 @@ static int mioa701_sys_suspend(struct sy
return 0;
}

-static int mioa701_sys_resume(struct sys_device *sysdev)
+static void mioa701_sys_resume(void)
{
int i = 0;
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
@@ -527,43 +527,18 @@ static int mioa701_sys_resume(struct sys
*mem_resume_enabler = save_buffer[i++];
*mem_resume_bt = save_buffer[i++];
*mem_resume_unknown = save_buffer[i++];
-
- return 0;
}

-static struct sysdev_class mioa701_sysclass = {
- .name = "mioa701",
-};
-
-static struct sys_device sysdev_bootstrap = {
- .cls = &mioa701_sysclass,
-};
-
-static struct sysdev_driver driver_bootstrap = {
- .suspend = &mioa701_sys_suspend,
- .resume = &mioa701_sys_resume,
+static struct syscore_ops mioa701_syscore_ops = {
+ .suspend = mioa701_sys_suspend,
+ .resume = mioa701_sys_resume,
};

static int __init bootstrap_init(void)
{
- int rc;
int save_size = mioa701_bootstrap_lg + (sizeof(u32) * 3);

- rc = sysdev_class_register(&mioa701_sysclass);
- if (rc) {
- printk(KERN_ERR "Failed registering mioa701 sys class\n");
- return -ENODEV;
- }
- rc = sysdev_register(&sysdev_bootstrap);
- if (rc) {
- printk(KERN_ERR "Failed registering mioa701 sys device\n");
- return -ENODEV;
- }
- rc = sysdev_driver_register(&mioa701_sysclass, &driver_bootstrap);
- if (rc) {
- printk(KERN_ERR "Failed registering PMU sys driver\n");
- return -ENODEV;
- }
+ register_syscore_ops(&mioa701_syscore_ops);

save_buffer = kmalloc(save_size, GFP_KERNEL);
if (!save_buffer)
@@ -576,9 +551,7 @@ static int __init bootstrap_init(void)
static void bootstrap_exit(void)
{
kfree(save_buffer);
- sysdev_driver_unregister(&mioa701_sysclass, &driver_bootstrap);
- sysdev_unregister(&sysdev_bootstrap);
- sysdev_class_unregister(&mioa701_sysclass);
+ unregister_syscore_ops(&mioa701_syscore_ops);

printk(KERN_CRIT "Unregistering mioa701 suspend will hang next"
"resume !!!\n");
Index: linux-2.6/arch/arm/mach-pxa/mainstone.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/mainstone.c
+++ linux-2.6/arch/arm/mach-pxa/mainstone.c
@@ -15,7 +15,7 @@

#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/bitops.h>
@@ -185,31 +185,21 @@ static void __init mainstone_init_irq(vo

#ifdef CONFIG_PM

-static int mainstone_irq_resume(struct sys_device *dev)
+static void mainstone_irq_resume(void)
{
MST_INTMSKENA = mainstone_irq_enabled;
- return 0;
}

-static struct sysdev_class mainstone_irq_sysclass = {
- .name = "cpld_irq",
+static struct syscore_ops mainstone_irq_syscore_ops = {
.resume = mainstone_irq_resume,
};

-static struct sys_device mainstone_irq_device = {
- .cls = &mainstone_irq_sysclass,
-};
-
static int __init mainstone_irq_device_init(void)
{
- int ret = -ENODEV;
+ if (machine_is_mainstone())
+ register_syscore_ops(&mainstone_irq_syscore_ops);

- if (machine_is_mainstone()) {
- ret = sysdev_class_register(&mainstone_irq_sysclass);
- if (ret == 0)
- ret = sysdev_register(&mainstone_irq_device);
- }
- return ret;
+ return 0;
}

device_initcall(mainstone_irq_device_init);
Index: linux-2.6/arch/arm/mach-pxa/cm-x2xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/cm-x2xx.c
+++ linux-2.6/arch/arm/mach-pxa/cm-x2xx.c
@@ -10,7 +10,7 @@
*/

#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/irq.h>
#include <linux/gpio.h>

@@ -388,7 +388,7 @@ static inline void cmx2xx_init_display(v
#ifdef CONFIG_PM
static unsigned long sleep_save_msc[10];

-static int cmx2xx_suspend(struct sys_device *dev, pm_message_t state)
+static int cmx2xx_suspend(void)
{
cmx2xx_pci_suspend();

@@ -412,7 +412,7 @@ static int cmx2xx_suspend(struct sys_dev
return 0;
}

-static int cmx2xx_resume(struct sys_device *dev)
+static void cmx2xx_resume(void)
{
cmx2xx_pci_resume();

@@ -420,27 +420,18 @@ static int cmx2xx_resume(struct sys_devi
__raw_writel(sleep_save_msc[0], MSC0);
__raw_writel(sleep_save_msc[1], MSC1);
__raw_writel(sleep_save_msc[2], MSC2);
-
- return 0;
}

-static struct sysdev_class cmx2xx_pm_sysclass = {
- .name = "pm",
+static struct syscore_ops cmx2xx_pm_syscore_ops = {
.resume = cmx2xx_resume,
.suspend = cmx2xx_suspend,
};

-static struct sys_device cmx2xx_pm_device = {
- .cls = &cmx2xx_pm_sysclass,
-};
-
static int __init cmx2xx_pm_init(void)
{
- int error;
- error = sysdev_class_register(&cmx2xx_pm_sysclass);
- if (error == 0)
- error = sysdev_register(&cmx2xx_pm_device);
- return error;
+ register_syscore_ops(&cmx2xx_pm_syscore_ops);
+
+ return 0;
}
#else
static int __init cmx2xx_pm_init(void) { return 0; }
Index: linux-2.6/arch/arm/mach-pxa/lpd270.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/lpd270.c
+++ linux-2.6/arch/arm/mach-pxa/lpd270.c
@@ -15,7 +15,7 @@

#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/bitops.h>
@@ -159,30 +159,22 @@ static void __init lpd270_init_irq(void)


#ifdef CONFIG_PM
-static int lpd270_irq_resume(struct sys_device *dev)
+static void lpd270_irq_resume(void)
{
__raw_writew(lpd270_irq_enabled, LPD270_INT_MASK);
- return 0;
}

-static struct sysdev_class lpd270_irq_sysclass = {
- .name = "cpld_irq",
+static struct syscore_ops lpd270_irq_syscore_ops = {
.resume = lpd270_irq_resume,
};

-static struct sys_device lpd270_irq_device = {
- .cls = &lpd270_irq_sysclass,
-};
-
static int __init lpd270_irq_device_init(void)
{
- int ret = -ENODEV;
if (machine_is_logicpd_pxa270()) {
- ret = sysdev_class_register(&lpd270_irq_sysclass);
- if (ret == 0)
- ret = sysdev_register(&lpd270_irq_device);
+ register_syscore_ops(&lpd270_irq_syscore_ops);
+ return 0;
}
- return ret;
+ return -ENODEV;
}

device_initcall(lpd270_irq_device_init);
Index: linux-2.6/arch/arm/mach-pxa/lubbock.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/lubbock.c
+++ linux-2.6/arch/arm/mach-pxa/lubbock.c
@@ -15,7 +15,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/major.h>
#include <linux/fb.h>
#include <linux/interrupt.h>
@@ -176,31 +176,22 @@ static void __init lubbock_init_irq(void

#ifdef CONFIG_PM

-static int lubbock_irq_resume(struct sys_device *dev)
+static void lubbock_irq_resume(void)
{
LUB_IRQ_MASK_EN = lubbock_irq_enabled;
- return 0;
}

-static struct sysdev_class lubbock_irq_sysclass = {
- .name = "cpld_irq",
+static struct syscore_ops lubbock_irq_syscore_ops = {
.resume = lubbock_irq_resume,
};

-static struct sys_device lubbock_irq_device = {
- .cls = &lubbock_irq_sysclass,
-};
-
static int __init lubbock_irq_device_init(void)
{
- int ret = -ENODEV;
-
if (machine_is_lubbock()) {
- ret = sysdev_class_register(&lubbock_irq_sysclass);
- if (ret == 0)
- ret = sysdev_register(&lubbock_irq_device);
+ register_syscore_ops(&lubbock_irq_syscore_ops);
+ return 0;
}
- return ret;
+ return -ENODEV;
}

device_initcall(lubbock_irq_device_init);
Index: linux-2.6/arch/arm/mach-pxa/viper.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/viper.c
+++ linux-2.6/arch/arm/mach-pxa/viper.c
@@ -44,6 +44,7 @@
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
+#include <linux/syscore_ops.h>

#include <mach/pxa25x.h>
#include <mach/audio.h>
@@ -130,20 +131,19 @@ static u8 viper_hw_version(void)
return v1;
}

-/* CPU sysdev */
-static int viper_cpu_suspend(struct sys_device *sysdev, pm_message_t state)
+/* CPU system core operations. */
+static int viper_cpu_suspend(void)
{
viper_icr_set_bit(VIPER_ICR_R_DIS);
return 0;
}

-static int viper_cpu_resume(struct sys_device *sysdev)
+static void viper_cpu_resume(void)
{
viper_icr_clear_bit(VIPER_ICR_R_DIS);
- return 0;
}

-static struct sysdev_driver viper_cpu_sysdev_driver = {
+static struct syscore_ops viper_cpu_syscore_ops = {
.suspend = viper_cpu_suspend,
.resume = viper_cpu_resume,
};
@@ -945,7 +945,7 @@ static void __init viper_init(void)
viper_init_vcore_gpios();
viper_init_cpufreq();

- sysdev_driver_register(&cpu_sysdev_class, &viper_cpu_sysdev_driver);
+ register_syscore_ops(&viper_cpu_syscore_ops);

if (version) {
pr_info("viper: hardware v%di%d detected. "
Index: linux-2.6/arch/arm/mach-pxa/palmz72.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/palmz72.c
+++ linux-2.6/arch/arm/mach-pxa/palmz72.c
@@ -19,7 +19,7 @@
*/

#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/gpio_keys.h>
@@ -207,9 +207,9 @@ static struct palmz72_resume_info palmz7

static unsigned long store_ptr;

-/* sys_device for Palm Zire 72 PM */
+/* syscore_ops for Palm Zire 72 PM */

-static int palmz72_pm_suspend(struct sys_device *dev, pm_message_t msg)
+static int palmz72_pm_suspend(void)
{
/* setup the resume_info struct for the original bootloader */
palmz72_resume_info.resume_addr = (u32) cpu_resume;
@@ -223,31 +223,23 @@ static int palmz72_pm_suspend(struct sys
return 0;
}

-static int palmz72_pm_resume(struct sys_device *dev)
+static void palmz72_pm_resume(void)
{
*PALMZ72_SAVE_DWORD = store_ptr;
- return 0;
}

-static struct sysdev_class palmz72_pm_sysclass = {
- .name = "palmz72_pm",
+static struct syscore_ops palmz72_pm_syscore_ops = {
.suspend = palmz72_pm_suspend,
.resume = palmz72_pm_resume,
};

-static struct sys_device palmz72_pm_device = {
- .cls = &palmz72_pm_sysclass,
-};
-
static int __init palmz72_pm_init(void)
{
- int ret = -ENODEV;
if (machine_is_palmz72()) {
- ret = sysdev_class_register(&palmz72_pm_sysclass);
- if (ret == 0)
- ret = sysdev_register(&palmz72_pm_device);
+ register_syscore_ops(&palmz72_pm_syscore_ops);
+ return 0;
}
- return ret;
+ return -ENODEV;
}

device_initcall(palmz72_pm_init);
Index: linux-2.6/arch/arm/mach-pxa/smemc.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/smemc.c
+++ linux-2.6/arch/arm/mach-pxa/smemc.c
@@ -6,7 +6,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/hardware.h>
#include <mach/smemc.h>
@@ -16,7 +16,7 @@ static unsigned long msc[2];
static unsigned long sxcnfg, memclkcfg;
static unsigned long csadrcfg[4];

-static int pxa3xx_smemc_suspend(struct sys_device *dev, pm_message_t state)
+static int pxa3xx_smemc_suspend(void)
{
msc[0] = __raw_readl(MSC0);
msc[1] = __raw_readl(MSC1);
@@ -30,7 +30,7 @@ static int pxa3xx_smemc_suspend(struct s
return 0;
}

-static int pxa3xx_smemc_resume(struct sys_device *dev)
+static void pxa3xx_smemc_resume(void)
{
__raw_writel(msc[0], MSC0);
__raw_writel(msc[1], MSC1);
@@ -40,34 +40,19 @@ static int pxa3xx_smemc_resume(struct sy
__raw_writel(csadrcfg[1], CSADRCFG1);
__raw_writel(csadrcfg[2], CSADRCFG2);
__raw_writel(csadrcfg[3], CSADRCFG3);
-
- return 0;
}

-static struct sysdev_class smemc_sysclass = {
- .name = "smemc",
+static struct syscore_ops smemc_syscore_ops = {
.suspend = pxa3xx_smemc_suspend,
.resume = pxa3xx_smemc_resume,
};

-static struct sys_device smemc_sysdev = {
- .id = 0,
- .cls = &smemc_sysclass,
-};
-
static int __init smemc_init(void)
{
- int ret = 0;
+ if (cpu_is_pxa3xx())
+ register_syscore_ops(&smemc_syscore_ops);

- if (cpu_is_pxa3xx()) {
- ret = sysdev_class_register(&smemc_sysclass);
- if (ret)
- return ret;
-
- ret = sysdev_register(&smemc_sysdev);
- }
-
- return ret;
+ return 0;
}
subsys_initcall(smemc_init);
#endif
Index: linux-2.6/arch/arm/mach-pxa/palmtreo.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/palmtreo.c
+++ linux-2.6/arch/arm/mach-pxa/palmtreo.c
@@ -25,7 +25,6 @@
#include <linux/pwm_backlight.h>
#include <linux/gpio.h>
#include <linux/power_supply.h>
-#include <linux/sysdev.h>
#include <linux/w1-gpio.h>

#include <asm/mach-types.h>
Index: linux-2.6/arch/arm/mach-pxa/palmld.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/palmld.c
+++ linux-2.6/arch/arm/mach-pxa/palmld.c
@@ -24,7 +24,6 @@
#include <linux/gpio.h>
#include <linux/wm97xx.h>
#include <linux/power_supply.h>
-#include <linux/sysdev.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
Index: linux-2.6/arch/arm/mach-pxa/colibri-pxa270.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/colibri-pxa270.c
+++ linux-2.6/arch/arm/mach-pxa/colibri-pxa270.c
@@ -17,7 +17,6 @@
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/ucb1400.h>

#include <asm/mach/arch.h>
Index: linux-2.6/arch/arm/mach-pxa/raumfeld.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/raumfeld.c
+++ linux-2.6/arch/arm/mach-pxa/raumfeld.c
@@ -18,7 +18,6 @@

#include <linux/init.h>
#include <linux/kernel.h>
-#include <linux/sysdev.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
Index: linux-2.6/arch/arm/mach-pxa/cm-x270.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/cm-x270.c
+++ linux-2.6/arch/arm/mach-pxa/cm-x270.c
@@ -10,7 +10,6 @@
*/

#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include <linux/delay.h>
Index: linux-2.6/arch/arm/mach-pxa/trizeps4.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/trizeps4.c
+++ linux-2.6/arch/arm/mach-pxa/trizeps4.c
@@ -15,7 +15,6 @@
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/bitops.h>
Index: linux-2.6/arch/arm/mach-pxa/colibri-evalboard.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/colibri-evalboard.c
+++ linux-2.6/arch/arm/mach-pxa/colibri-evalboard.c
@@ -13,7 +13,6 @@
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <asm/mach-types.h>
Index: linux-2.6/arch/arm/mach-pxa/vpac270.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/vpac270.c
+++ linux-2.6/arch/arm/mach-pxa/vpac270.c
@@ -16,7 +16,6 @@
#include <linux/gpio_keys.h>
#include <linux/input.h>
#include <linux/gpio.h>
-#include <linux/sysdev.h>
#include <linux/usb/gpio_vbus.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
Index: linux-2.6/arch/arm/mach-pxa/colibri-pxa270-income.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/colibri-pxa270-income.c
+++ linux-2.6/arch/arm/mach-pxa/colibri-pxa270-income.c
@@ -22,7 +22,6 @@
#include <linux/platform_device.h>
#include <linux/pwm_backlight.h>
#include <linux/i2c/pxa-i2c.h>
-#include <linux/sysdev.h>

#include <asm/irq.h>
#include <asm/mach-types.h>
Index: linux-2.6/arch/arm/mach-pxa/balloon3.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/balloon3.c
+++ linux-2.6/arch/arm/mach-pxa/balloon3.c
@@ -15,7 +15,6 @@

#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/bitops.h>
Index: linux-2.6/arch/arm/plat-pxa/mfp.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-pxa/mfp.c
+++ linux-2.6/arch/arm/plat-pxa/mfp.c
@@ -17,7 +17,6 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
-#include <linux/sysdev.h>

#include <plat/mfp.h>

2011-03-27 23:33:30

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 6/7] ARM / Samsung: Use struct syscore_ops for "core" power management

From: Rafael J. Wysocki <[email protected]>

Replace sysdev classes and struct sys_device objects used for "core"
power management by Samsung platforms with struct syscore_ops objects
that are simpler.

This generally reduces the code size and the kernel memory footprint.
It also is necessary for removing sysdevs entirely from the kernel in
the future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/mach-exynos4/pm.c | 45 ++++++++++++--------
arch/arm/mach-s3c2410/irq.c | 30 -------------
arch/arm/mach-s3c2410/mach-bast.c | 17 ++-----
arch/arm/mach-s3c2410/pm.c | 13 ++---
arch/arm/mach-s3c2410/s3c2410.c | 5 ++
arch/arm/mach-s3c2412/irq.c | 2
arch/arm/mach-s3c2412/mach-jive.c | 19 ++------
arch/arm/mach-s3c2412/pm.c | 27 ++++++------
arch/arm/mach-s3c2412/s3c2412.c | 4 +
arch/arm/mach-s3c2416/irq.c | 2
arch/arm/mach-s3c2416/pm.c | 27 +++++-------
arch/arm/mach-s3c2416/s3c2416.c | 5 ++
arch/arm/mach-s3c2440/mach-osiris.c | 18 ++------
arch/arm/mach-s3c2440/s3c2440.c | 8 +++
arch/arm/mach-s3c2440/s3c2442.c | 6 ++
arch/arm/mach-s3c2440/s3c244x-irq.c | 4 -
arch/arm/mach-s3c2440/s3c244x.c | 62 ++++++++++++++--------------
arch/arm/mach-s3c64xx/irq-pm.c | 18 ++++----
arch/arm/mach-s5pv210/pm.c | 25 +++++++----
arch/arm/plat-s3c24xx/dma.c | 68 +++++++++++--------------------
arch/arm/plat-s3c24xx/irq-pm.c | 7 ---
arch/arm/plat-s5p/irq-pm.c | 7 ---
arch/arm/plat-samsung/include/plat/cpu.h | 6 ++
arch/arm/plat-samsung/include/plat/pm.h | 6 +-
24 files changed, 203 insertions(+), 228 deletions(-)

Index: linux-2.6/arch/arm/plat-samsung/include/plat/pm.h
===================================================================
--- linux-2.6.orig/arch/arm/plat-samsung/include/plat/pm.h
+++ linux-2.6/arch/arm/plat-samsung/include/plat/pm.h
@@ -103,14 +103,16 @@ extern void s3c_pm_do_restore_core(struc

#ifdef CONFIG_PM
extern int s3c_irqext_wake(struct irq_data *data, unsigned int state);
-extern int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state);
-extern int s3c24xx_irq_resume(struct sys_device *dev);
+extern int s3c24xx_irq_suspend(void);
+extern void s3c24xx_irq_resume(void);
#else
#define s3c_irqext_wake NULL
#define s3c24xx_irq_suspend NULL
#define s3c24xx_irq_resume NULL
#endif

+extern struct syscore_ops s3c24xx_irq_syscore_ops;
+
/* PM debug functions */

#ifdef CONFIG_SAMSUNG_PM_DEBUG
Index: linux-2.6/arch/arm/plat-s5p/irq-pm.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-s5p/irq-pm.c
+++ linux-2.6/arch/arm/plat-s5p/irq-pm.c
@@ -16,7 +16,6 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>

#include <plat/cpu.h>
#include <plat/irqs.h>
@@ -77,17 +76,15 @@ static struct sleep_save eint_save[] = {
SAVE_ITEM(S5P_EINT_MASK(3)),
};

-int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
+int s3c24xx_irq_suspend(void)
{
s3c_pm_do_save(eint_save, ARRAY_SIZE(eint_save));

return 0;
}

-int s3c24xx_irq_resume(struct sys_device *dev)
+void s3c24xx_irq_resume(void)
{
s3c_pm_do_restore(eint_save, ARRAY_SIZE(eint_save));
-
- return 0;
}

Index: linux-2.6/arch/arm/plat-s3c24xx/irq-pm.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-s3c24xx/irq-pm.c
+++ linux-2.6/arch/arm/plat-s3c24xx/irq-pm.c
@@ -14,7 +14,6 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>
#include <linux/irq.h>

#include <plat/cpu.h>
@@ -65,7 +64,7 @@ static unsigned long save_extint[3];
static unsigned long save_eintflt[4];
static unsigned long save_eintmask;

-int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
+int s3c24xx_irq_suspend(void)
{
unsigned int i;

@@ -81,7 +80,7 @@ int s3c24xx_irq_suspend(struct sys_devic
return 0;
}

-int s3c24xx_irq_resume(struct sys_device *dev)
+void s3c24xx_irq_resume(void)
{
unsigned int i;

@@ -93,6 +92,4 @@ int s3c24xx_irq_resume(struct sys_device

s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
__raw_writel(save_eintmask, S3C24XX_EINTMASK);
-
- return 0;
}
Index: linux-2.6/arch/arm/mach-s3c2410/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2410/irq.c
+++ linux-2.6/arch/arm/mach-s3c2410/irq.c
@@ -23,38 +23,12 @@
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <plat/cpu.h>
#include <plat/pm.h>

-static int s3c2410_irq_add(struct sys_device *sysdev)
-{
- return 0;
-}
-
-static struct sysdev_driver s3c2410_irq_driver = {
- .add = s3c2410_irq_add,
+struct syscore_ops s3c24xx_irq_syscore_ops = {
.suspend = s3c24xx_irq_suspend,
.resume = s3c24xx_irq_resume,
};
-
-static int __init s3c2410_irq_init(void)
-{
- return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_irq_driver);
-}
-
-arch_initcall(s3c2410_irq_init);
-
-static struct sysdev_driver s3c2410a_irq_driver = {
- .add = s3c2410_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
-};
-
-static int __init s3c2410a_irq_init(void)
-{
- return sysdev_driver_register(&s3c2410a_sysclass, &s3c2410a_irq_driver);
-}
-
-arch_initcall(s3c2410a_irq_init);
Index: linux-2.6/arch/arm/mach-s3c2410/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2410/pm.c
+++ linux-2.6/arch/arm/mach-s3c2410/pm.c
@@ -25,6 +25,7 @@
#include <linux/errno.h>
#include <linux/time.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/gpio.h>
#include <linux/io.h>

@@ -92,7 +93,7 @@ static void s3c2410_pm_prepare(void)
}
}

-static int s3c2410_pm_resume(struct sys_device *dev)
+static void s3c2410_pm_resume(void)
{
unsigned long tmp;

@@ -104,10 +105,12 @@ static int s3c2410_pm_resume(struct sys_

if ( machine_is_aml_m5900() )
s3c2410_gpio_setpin(S3C2410_GPF(2), 0);
-
- return 0;
}

+struct syscore_ops s3c2410_pm_syscore_ops = {
+ .resume = s3c2410_pm_resume,
+};
+
static int s3c2410_pm_add(struct sys_device *dev)
{
pm_cpu_prep = s3c2410_pm_prepare;
@@ -119,7 +122,6 @@ static int s3c2410_pm_add(struct sys_dev
#if defined(CONFIG_CPU_S3C2410)
static struct sysdev_driver s3c2410_pm_driver = {
.add = s3c2410_pm_add,
- .resume = s3c2410_pm_resume,
};

/* register ourselves */
@@ -133,7 +135,6 @@ arch_initcall(s3c2410_pm_drvinit);

static struct sysdev_driver s3c2410a_pm_driver = {
.add = s3c2410_pm_add,
- .resume = s3c2410_pm_resume,
};

static int __init s3c2410a_pm_drvinit(void)
@@ -147,7 +148,6 @@ arch_initcall(s3c2410a_pm_drvinit);
#if defined(CONFIG_CPU_S3C2440)
static struct sysdev_driver s3c2440_pm_driver = {
.add = s3c2410_pm_add,
- .resume = s3c2410_pm_resume,
};

static int __init s3c2440_pm_drvinit(void)
@@ -161,7 +161,6 @@ arch_initcall(s3c2440_pm_drvinit);
#if defined(CONFIG_CPU_S3C2442)
static struct sysdev_driver s3c2442_pm_driver = {
.add = s3c2410_pm_add,
- .resume = s3c2410_pm_resume,
};

static int __init s3c2442_pm_drvinit(void)
Index: linux-2.6/arch/arm/plat-samsung/include/plat/cpu.h
===================================================================
--- linux-2.6.orig/arch/arm/plat-samsung/include/plat/cpu.h
+++ linux-2.6/arch/arm/plat-samsung/include/plat/cpu.h
@@ -68,6 +68,12 @@ extern void s3c24xx_init_uartdevs(char *
struct sys_timer;
extern struct sys_timer s3c24xx_timer;

+extern struct syscore_ops s3c2410_pm_syscore_ops;
+extern struct syscore_ops s3c2412_pm_syscore_ops;
+extern struct syscore_ops s3c2416_pm_syscore_ops;
+extern struct syscore_ops s3c244x_pm_syscore_ops;
+extern struct syscore_ops s3c64xx_irq_syscore_ops;
+
/* system device classes */

extern struct sysdev_class s3c2410_sysclass;
Index: linux-2.6/arch/arm/mach-s3c2410/s3c2410.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2410/s3c2410.c
+++ linux-2.6/arch/arm/mach-s3c2410/s3c2410.c
@@ -19,6 +19,7 @@
#include <linux/gpio.h>
#include <linux/clk.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/io.h>
@@ -40,6 +41,7 @@
#include <plat/devs.h>
#include <plat/clock.h>
#include <plat/pll.h>
+#include <plat/pm.h>

#include <plat/gpio-core.h>
#include <plat/gpio-cfg.h>
@@ -168,6 +170,9 @@ int __init s3c2410_init(void)
{
printk("S3C2410: Initialising architecture\n");

+ register_syscore_ops(&s3c2410_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
return sysdev_register(&s3c2410_sysdev);
}

Index: linux-2.6/arch/arm/mach-s3c2412/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2412/irq.c
+++ linux-2.6/arch/arm/mach-s3c2412/irq.c
@@ -202,8 +202,6 @@ static int s3c2412_irq_add(struct sys_de

static struct sysdev_driver s3c2412_irq_driver = {
.add = s3c2412_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
};

static int s3c2412_irq_init(void)
Index: linux-2.6/arch/arm/mach-s3c2412/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2412/pm.c
+++ linux-2.6/arch/arm/mach-s3c2412/pm.c
@@ -17,6 +17,7 @@
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/platform_device.h>
#include <linux/io.h>

@@ -86,13 +87,24 @@ static struct sleep_save s3c2412_sleep[]
SAVE_ITEM(S3C2413_GPJSLPCON),
};

-static int s3c2412_pm_suspend(struct sys_device *dev, pm_message_t state)
+static struct sysdev_driver s3c2412_pm_driver = {
+ .add = s3c2412_pm_add,
+};
+
+static __init int s3c2412_pm_init(void)
+{
+ return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver);
+}
+
+arch_initcall(s3c2412_pm_init);
+
+static int s3c2412_pm_suspend(void)
{
s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
return 0;
}

-static int s3c2412_pm_resume(struct sys_device *dev)
+static void s3c2412_pm_resume(void)
{
unsigned long tmp;

@@ -102,18 +114,9 @@ static int s3c2412_pm_resume(struct sys_
__raw_writel(tmp, S3C2412_PWRCFG);

s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
- return 0;
}

-static struct sysdev_driver s3c2412_pm_driver = {
- .add = s3c2412_pm_add,
+struct syscore_ops s3c2412_pm_syscore_ops = {
.suspend = s3c2412_pm_suspend,
.resume = s3c2412_pm_resume,
};
-
-static __init int s3c2412_pm_init(void)
-{
- return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver);
-}
-
-arch_initcall(s3c2412_pm_init);
Index: linux-2.6/arch/arm/mach-s3c2412/s3c2412.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2412/s3c2412.c
+++ linux-2.6/arch/arm/mach-s3c2412/s3c2412.c
@@ -19,6 +19,7 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/io.h>
@@ -244,5 +245,8 @@ int __init s3c2412_init(void)
{
printk("S3C2412: Initialising architecture\n");

+ register_syscore_ops(&s3c2412_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
return sysdev_register(&s3c2412_sysdev);
}
Index: linux-2.6/arch/arm/mach-s3c2416/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2416/irq.c
+++ linux-2.6/arch/arm/mach-s3c2416/irq.c
@@ -238,8 +238,6 @@ static int __init s3c2416_irq_add(struct

static struct sysdev_driver s3c2416_irq_driver = {
.add = s3c2416_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
};

static int __init s3c2416_irq_init(void)
Index: linux-2.6/arch/arm/mach-s3c2416/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2416/pm.c
+++ linux-2.6/arch/arm/mach-s3c2416/pm.c
@@ -11,6 +11,7 @@
*/

#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>

#include <asm/cacheflush.h>
@@ -55,30 +56,26 @@ static int s3c2416_pm_add(struct sys_dev
return 0;
}

-static int s3c2416_pm_suspend(struct sys_device *dev, pm_message_t state)
+static struct sysdev_driver s3c2416_pm_driver = {
+ .add = s3c2416_pm_add,
+};
+
+static __init int s3c2416_pm_init(void)
{
- return 0;
+ return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_pm_driver);
}

-static int s3c2416_pm_resume(struct sys_device *dev)
+arch_initcall(s3c2416_pm_init);
+
+
+static void s3c2416_pm_resume(void)
{
/* unset the return-from-sleep amd inform flags */
__raw_writel(0x0, S3C2443_PWRMODE);
__raw_writel(0x0, S3C2412_INFORM0);
__raw_writel(0x0, S3C2412_INFORM1);
-
- return 0;
}

-static struct sysdev_driver s3c2416_pm_driver = {
- .add = s3c2416_pm_add,
- .suspend = s3c2416_pm_suspend,
+struct syscore_ops s3c2416_pm_syscore_ops = {
.resume = s3c2416_pm_resume,
};
-
-static __init int s3c2416_pm_init(void)
-{
- return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_pm_driver);
-}
-
-arch_initcall(s3c2416_pm_init);
Index: linux-2.6/arch/arm/mach-s3c2416/s3c2416.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2416/s3c2416.c
+++ linux-2.6/arch/arm/mach-s3c2416/s3c2416.c
@@ -32,6 +32,7 @@
#include <linux/platform_device.h>
#include <linux/serial_core.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/clk.h>
#include <linux/io.h>

@@ -54,6 +55,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <plat/sdhci.h>
+#include <plat/pm.h>

#include <plat/iic-core.h>
#include <plat/fb-core.h>
@@ -95,6 +97,9 @@ int __init s3c2416_init(void)

s3c_fb_setname("s3c2443-fb");

+ register_syscore_ops(&s3c2416_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
return sysdev_register(&s3c2416_sysdev);
}

Index: linux-2.6/arch/arm/mach-s3c2440/s3c244x-irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/s3c244x-irq.c
+++ linux-2.6/arch/arm/mach-s3c2440/s3c244x-irq.c
@@ -116,8 +116,6 @@ static int s3c244x_irq_add(struct sys_de

static struct sysdev_driver s3c2440_irq_driver = {
.add = s3c244x_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
};

static int s3c2440_irq_init(void)
@@ -129,8 +127,6 @@ arch_initcall(s3c2440_irq_init);

static struct sysdev_driver s3c2442_irq_driver = {
.add = s3c244x_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
};


Index: linux-2.6/arch/arm/mach-s3c2440/s3c244x.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/s3c244x.c
+++ linux-2.6/arch/arm/mach-s3c2440/s3c244x.c
@@ -19,6 +19,7 @@
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/clk.h>
#include <linux/io.h>

@@ -134,45 +135,14 @@ void __init s3c244x_init_clocks(int xtal
s3c2410_baseclk_add();
}

-#ifdef CONFIG_PM
-
-static struct sleep_save s3c244x_sleep[] = {
- SAVE_ITEM(S3C2440_DSC0),
- SAVE_ITEM(S3C2440_DSC1),
- SAVE_ITEM(S3C2440_GPJDAT),
- SAVE_ITEM(S3C2440_GPJCON),
- SAVE_ITEM(S3C2440_GPJUP)
-};
-
-static int s3c244x_suspend(struct sys_device *dev, pm_message_t state)
-{
- s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
- return 0;
-}
-
-static int s3c244x_resume(struct sys_device *dev)
-{
- s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
- return 0;
-}
-
-#else
-#define s3c244x_suspend NULL
-#define s3c244x_resume NULL
-#endif
-
/* Since the S3C2442 and S3C2440 share items, put both sysclasses here */

struct sysdev_class s3c2440_sysclass = {
.name = "s3c2440-core",
- .suspend = s3c244x_suspend,
- .resume = s3c244x_resume
};

struct sysdev_class s3c2442_sysclass = {
.name = "s3c2442-core",
- .suspend = s3c244x_suspend,
- .resume = s3c244x_resume
};

/* need to register class before we actually register the device, and
@@ -194,3 +164,33 @@ static int __init s3c2442_core_init(void
}

core_initcall(s3c2442_core_init);
+
+
+#ifdef CONFIG_PM
+static struct sleep_save s3c244x_sleep[] = {
+ SAVE_ITEM(S3C2440_DSC0),
+ SAVE_ITEM(S3C2440_DSC1),
+ SAVE_ITEM(S3C2440_GPJDAT),
+ SAVE_ITEM(S3C2440_GPJCON),
+ SAVE_ITEM(S3C2440_GPJUP)
+};
+
+static int s3c244x_suspend(void)
+{
+ s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
+ return 0;
+}
+
+static void s3c244x_resume(void)
+{
+ s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
+}
+#else
+#define s3c244x_suspend NULL
+#define s3c244x_resume NULL
+#endif
+
+struct syscore_ops s3c244x_pm_syscore_ops = {
+ .suspend = s3c244x_suspend,
+ .resume = s3c244x_resume,
+};
Index: linux-2.6/arch/arm/mach-s3c2440/s3c2440.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/s3c2440.c
+++ linux-2.6/arch/arm/mach-s3c2440/s3c2440.c
@@ -19,6 +19,7 @@
#include <linux/platform_device.h>
#include <linux/serial_core.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/gpio.h>
#include <linux/clk.h>
#include <linux/io.h>
@@ -33,6 +34,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <plat/s3c244x.h>
+#include <plat/pm.h>

#include <plat/gpio-core.h>
#include <plat/gpio-cfg.h>
@@ -51,6 +53,12 @@ int __init s3c2440_init(void)
s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
s3c_device_wdt.resource[1].end = IRQ_S3C2440_WDT;

+ /* register suspend/resume handlers */
+
+ register_syscore_ops(&s3c2410_pm_syscore_ops);
+ register_syscore_ops(&s3c244x_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
/* register our system device for everything else */

return sysdev_register(&s3c2440_sysdev);
Index: linux-2.6/arch/arm/mach-s3c2440/s3c2442.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/s3c2442.c
+++ linux-2.6/arch/arm/mach-s3c2440/s3c2442.c
@@ -29,6 +29,7 @@
#include <linux/err.h>
#include <linux/device.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/mutex.h>
@@ -45,6 +46,7 @@
#include <plat/clock.h>
#include <plat/cpu.h>
#include <plat/s3c244x.h>
+#include <plat/pm.h>

#include <plat/gpio-core.h>
#include <plat/gpio-cfg.h>
@@ -167,6 +169,10 @@ int __init s3c2442_init(void)
{
printk("S3C2442: Initialising architecture\n");

+ register_syscore_ops(&s3c2410_pm_syscore_ops);
+ register_syscore_ops(&s3c244x_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
return sysdev_register(&s3c2442_sysdev);
}

Index: linux-2.6/arch/arm/mach-s3c64xx/irq-pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c64xx/irq-pm.c
+++ linux-2.6/arch/arm/mach-s3c64xx/irq-pm.c
@@ -13,7 +13,7 @@
*/

#include <linux/kernel.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/interrupt.h>
#include <linux/serial_core.h>
#include <linux/irq.h>
@@ -54,7 +54,7 @@ static struct irq_grp_save {

static u32 irq_uart_mask[CONFIG_SERIAL_SAMSUNG_UARTS];

-static int s3c64xx_irq_pm_suspend(struct sys_device *dev, pm_message_t state)
+static int s3c64xx_irq_pm_suspend(void)
{
struct irq_grp_save *grp = eint_grp_save;
int i;
@@ -75,7 +75,7 @@ static int s3c64xx_irq_pm_suspend(struct
return 0;
}

-static int s3c64xx_irq_pm_resume(struct sys_device *dev)
+static void s3c64xx_irq_pm_resume(void)
{
struct irq_grp_save *grp = eint_grp_save;
int i;
@@ -94,18 +94,18 @@ static int s3c64xx_irq_pm_resume(struct
}

S3C_PMDBG("%s: IRQ configuration restored\n", __func__);
- return 0;
}

-static struct sysdev_driver s3c64xx_irq_driver = {
+struct syscore_ops s3c64xx_irq_syscore_ops = {
.suspend = s3c64xx_irq_pm_suspend,
.resume = s3c64xx_irq_pm_resume,
};

-static int __init s3c64xx_irq_pm_init(void)
+static __init int s3c64xx_syscore_init(void)
{
- return sysdev_driver_register(&s3c64xx_sysclass, &s3c64xx_irq_driver);
-}
+ register_syscore_ops(&s3c64xx_irq_syscore_ops);

-arch_initcall(s3c64xx_irq_pm_init);
+ return 0;
+}

+core_initcall(s3c64xx_syscore_init);
Index: linux-2.6/arch/arm/mach-s5pv210/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s5pv210/pm.c
+++ linux-2.6/arch/arm/mach-s5pv210/pm.c
@@ -16,6 +16,7 @@

#include <linux/init.h>
#include <linux/suspend.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>

#include <plat/cpu.h>
@@ -140,7 +141,17 @@ static int s5pv210_pm_add(struct sys_dev
return 0;
}

-static int s5pv210_pm_resume(struct sys_device *dev)
+static struct sysdev_driver s5pv210_pm_driver = {
+ .add = s5pv210_pm_add,
+};
+
+static __init int s5pv210_pm_drvinit(void)
+{
+ return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver);
+}
+arch_initcall(s5pv210_pm_drvinit);
+
+static void s5pv210_pm_resume(void)
{
u32 tmp;

@@ -150,17 +161,15 @@ static int s5pv210_pm_resume(struct sys_
__raw_writel(tmp , S5P_OTHERS);

s3c_pm_do_restore_core(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));
-
- return 0;
}

-static struct sysdev_driver s5pv210_pm_driver = {
- .add = s5pv210_pm_add,
+static struct syscore_ops s5pv210_pm_syscore_ops = {
.resume = s5pv210_pm_resume,
};

-static __init int s5pv210_pm_drvinit(void)
+static __init int s5pv210_pm_syscore_init(void)
{
- return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver);
+ register_syscore_ops(&s5pv210_pm_syscore_ops);
+ return 0;
}
-arch_initcall(s5pv210_pm_drvinit);
+arch_initcall(s5pv210_pm_syscore_init);
Index: linux-2.6/arch/arm/mach-exynos4/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-exynos4/pm.c
+++ linux-2.6/arch/arm/mach-exynos4/pm.c
@@ -16,6 +16,7 @@

#include <linux/init.h>
#include <linux/suspend.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>

#include <asm/cacheflush.h>
@@ -372,7 +373,27 @@ void exynos4_scu_enable(void __iomem *sc
flush_cache_all();
}

-static int exynos4_pm_resume(struct sys_device *dev)
+static struct sysdev_driver exynos4_pm_driver = {
+ .add = exynos4_pm_add,
+};
+
+static __init int exynos4_pm_drvinit(void)
+{
+ unsigned int tmp;
+
+ s3c_pm_init();
+
+ /* All wakeup disable */
+
+ tmp = __raw_readl(S5P_WAKEUP_MASK);
+ tmp |= ((0xFF << 8) | (0x1F << 1));
+ __raw_writel(tmp, S5P_WAKEUP_MASK);
+
+ return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
+}
+arch_initcall(exynos4_pm_drvinit);
+
+static void exynos4_pm_resume(void)
{
/* For release retention */

@@ -394,27 +415,15 @@ static int exynos4_pm_resume(struct sys_
/* enable L2X0*/
writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
#endif
-
- return 0;
}

-static struct sysdev_driver exynos4_pm_driver = {
- .add = exynos4_pm_add,
+static struct syscore_ops exynos4_pm_syscore_ops = {
.resume = exynos4_pm_resume,
};

-static __init int exynos4_pm_drvinit(void)
+static __init int exynos4_pm_syscore_init(void)
{
- unsigned int tmp;
-
- s3c_pm_init();
-
- /* All wakeup disable */
-
- tmp = __raw_readl(S5P_WAKEUP_MASK);
- tmp |= ((0xFF << 8) | (0x1F << 1));
- __raw_writel(tmp, S5P_WAKEUP_MASK);
-
- return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
+ register_syscore_ops(&exynos4_pm_syscore_ops);
+ return 0;
}
-arch_initcall(exynos4_pm_drvinit);
+arch_initcall(exynos4_pm_syscore_init);
Index: linux-2.6/arch/arm/mach-s3c2410/mach-bast.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2410/mach-bast.c
+++ linux-2.6/arch/arm/mach-s3c2410/mach-bast.c
@@ -17,7 +17,7 @@
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/gpio.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/dm9000.h>
@@ -214,17 +214,16 @@ static struct s3c2410_uartcfg bast_uartc
/* NAND Flash on BAST board */

#ifdef CONFIG_PM
-static int bast_pm_suspend(struct sys_device *sd, pm_message_t state)
+static int bast_pm_suspend(void)
{
/* ensure that an nRESET is not generated on resume. */
gpio_direction_output(S3C2410_GPA(21), 1);
return 0;
}

-static int bast_pm_resume(struct sys_device *sd)
+static void bast_pm_resume(void)
{
s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
- return 0;
}

#else
@@ -232,16 +231,11 @@ static int bast_pm_resume(struct sys_dev
#define bast_pm_resume NULL
#endif

-static struct sysdev_class bast_pm_sysclass = {
- .name = "mach-bast",
+static struct syscore_ops bast_pm_syscore_ops = {
.suspend = bast_pm_suspend,
.resume = bast_pm_resume,
};

-static struct sys_device bast_pm_sysdev = {
- .cls = &bast_pm_sysclass,
-};
-
static int smartmedia_map[] = { 0 };
static int chip0_map[] = { 1 };
static int chip1_map[] = { 2 };
@@ -642,8 +636,7 @@ static void __init bast_map_io(void)

static void __init bast_init(void)
{
- sysdev_class_register(&bast_pm_sysclass);
- sysdev_register(&bast_pm_sysdev);
+ register_syscore_ops(&bast_pm_syscore_ops);

s3c_i2c0_set_platdata(&bast_i2c_info);
s3c_nand_set_platdata(&bast_nand_info);
Index: linux-2.6/arch/arm/plat-s3c24xx/dma.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-s3c24xx/dma.c
+++ linux-2.6/arch/arm/plat-s3c24xx/dma.c
@@ -22,7 +22,7 @@
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/io.h>
@@ -1195,19 +1195,12 @@ int s3c2410_dma_getposition(unsigned int

EXPORT_SYMBOL(s3c2410_dma_getposition);

-static inline struct s3c2410_dma_chan *to_dma_chan(struct sys_device *dev)
-{
- return container_of(dev, struct s3c2410_dma_chan, dev);
-}
-
-/* system device class */
+/* system core operations */

#ifdef CONFIG_PM

-static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state)
+static void s3c2410_dma_suspend_chan(s3c2410_dma_chan *cp)
{
- struct s3c2410_dma_chan *cp = to_dma_chan(dev);
-
printk(KERN_DEBUG "suspending dma channel %d\n", cp->number);

if (dma_rdreg(cp, S3C2410_DMA_DMASKTRIG) & S3C2410_DMASKTRIG_ON) {
@@ -1222,13 +1215,21 @@ static int s3c2410_dma_suspend(struct sy

s3c2410_dma_dostop(cp);
}
+}
+
+static int s3c2410_dma_suspend(void)
+{
+ struct s3c2410_dma_chan *cp = s3c2410_chans;
+ int channel;
+
+ for (channel = 0; channel < dma_channels; cp++, channel++)
+ s3c2410_dma_suspend_chan(cp);

return 0;
}

-static int s3c2410_dma_resume(struct sys_device *dev)
+static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)
{
- struct s3c2410_dma_chan *cp = to_dma_chan(dev);
unsigned int no = cp->number | DMACH_LOW_LEVEL;

/* restore channel's hardware configuration */
@@ -1249,13 +1250,21 @@ static int s3c2410_dma_resume(struct sys
return 0;
}

+static void s3c2410_dma_resume(void)
+{
+ struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1;
+ int channel;
+
+ for (channel = dma_channels - 1; channel >= 0; cp++, channel--)
+ s3c2410_dma_resume_chan(cp);
+}
+
#else
#define s3c2410_dma_suspend NULL
#define s3c2410_dma_resume NULL
#endif /* CONFIG_PM */

-struct sysdev_class dma_sysclass = {
- .name = "s3c24xx-dma",
+struct syscore_ops dma_syscore_ops = {
.suspend = s3c2410_dma_suspend,
.resume = s3c2410_dma_resume,
};
@@ -1269,39 +1278,14 @@ static void s3c2410_dma_cache_ctor(void

/* initialisation code */

-static int __init s3c24xx_dma_sysclass_init(void)
+static int __init s3c24xx_dma_syscore_init(void)
{
- int ret = sysdev_class_register(&dma_sysclass);
-
- if (ret != 0)
- printk(KERN_ERR "dma sysclass registration failed\n");
-
- return ret;
-}
-
-core_initcall(s3c24xx_dma_sysclass_init);
-
-static int __init s3c24xx_dma_sysdev_register(void)
-{
- struct s3c2410_dma_chan *cp = s3c2410_chans;
- int channel, ret;
-
- for (channel = 0; channel < dma_channels; cp++, channel++) {
- cp->dev.cls = &dma_sysclass;
- cp->dev.id = channel;
- ret = sysdev_register(&cp->dev);
-
- if (ret) {
- printk(KERN_ERR "error registering dev for dma %d\n",
- channel);
- return ret;
- }
- }
+ register_syscore_ops(&dma_syscore_ops);

return 0;
}

-late_initcall(s3c24xx_dma_sysdev_register);
+late_initcall(s3c24xx_dma_syscore_init);

int __init s3c24xx_dma_init(unsigned int channels, unsigned int irq,
unsigned int stride)
Index: linux-2.6/arch/arm/mach-s3c2440/mach-osiris.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/mach-osiris.c
+++ linux-2.6/arch/arm/mach-s3c2440/mach-osiris.c
@@ -17,7 +17,7 @@
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/clk.h>
#include <linux/i2c.h>
@@ -284,7 +284,7 @@ static struct platform_device osiris_pcm
#ifdef CONFIG_PM
static unsigned char pm_osiris_ctrl0;

-static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state)
+static int osiris_pm_suspend(void)
{
unsigned int tmp;

@@ -304,7 +304,7 @@ static int osiris_pm_suspend(struct sys_
return 0;
}

-static int osiris_pm_resume(struct sys_device *sd)
+static void osiris_pm_resume(void)
{
if (pm_osiris_ctrl0 & OSIRIS_CTRL0_FIX8)
__raw_writeb(OSIRIS_CTRL1_FIX8, OSIRIS_VA_CTRL1);
@@ -312,8 +312,6 @@ static int osiris_pm_resume(struct sys_d
__raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0);

s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
-
- return 0;
}

#else
@@ -321,16 +319,11 @@ static int osiris_pm_resume(struct sys_d
#define osiris_pm_resume NULL
#endif

-static struct sysdev_class osiris_pm_sysclass = {
- .name = "mach-osiris",
+static struct syscore_ops osiris_pm_syscore_ops = {
.suspend = osiris_pm_suspend,
.resume = osiris_pm_resume,
};

-static struct sys_device osiris_pm_sysdev = {
- .cls = &osiris_pm_sysclass,
-};
-
/* Link for DVS driver to TPS65011 */

static void osiris_tps_release(struct device *dev)
@@ -439,8 +432,7 @@ static void __init osiris_map_io(void)

static void __init osiris_init(void)
{
- sysdev_class_register(&osiris_pm_sysclass);
- sysdev_register(&osiris_pm_sysdev);
+ register_syscore_ops(&osiris_pm_syscore_ops);

s3c_i2c0_set_platdata(NULL);
s3c_nand_set_platdata(&osiris_nand_info);
Index: linux-2.6/arch/arm/mach-s3c2412/mach-jive.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2412/mach-jive.c
+++ linux-2.6/arch/arm/mach-s3c2412/mach-jive.c
@@ -17,7 +17,7 @@
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/gpio.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
@@ -486,7 +486,7 @@ static struct s3c2410_udc_mach_info jive
/* Jive power management device */

#ifdef CONFIG_PM
-static int jive_pm_suspend(struct sys_device *sd, pm_message_t state)
+static int jive_pm_suspend(void)
{
/* Write the magic value u-boot uses to check for resume into
* the INFORM0 register, and ensure INFORM1 is set to the
@@ -498,10 +498,9 @@ static int jive_pm_suspend(struct sys_de
return 0;
}

-static int jive_pm_resume(struct sys_device *sd)
+static void jive_pm_resume(void)
{
__raw_writel(0x0, S3C2412_INFORM0);
- return 0;
}

#else
@@ -509,16 +508,11 @@ static int jive_pm_resume(struct sys_dev
#define jive_pm_resume NULL
#endif

-static struct sysdev_class jive_pm_sysclass = {
- .name = "jive-pm",
+static struct syscore_ops jive_pm_syscore_ops = {
.suspend = jive_pm_suspend,
.resume = jive_pm_resume,
};

-static struct sys_device jive_pm_sysdev = {
- .cls = &jive_pm_sysclass,
-};
-
static void __init jive_map_io(void)
{
s3c24xx_init_io(jive_iodesc, ARRAY_SIZE(jive_iodesc));
@@ -536,10 +530,9 @@ static void jive_power_off(void)

static void __init jive_machine_init(void)
{
- /* register system devices for managing low level suspend */
+ /* register system core operations for managing low level suspend */

- sysdev_class_register(&jive_pm_sysclass);
- sysdev_register(&jive_pm_sysdev);
+ register_syscore_ops(&jive_pm_syscore_ops);

/* write our sleep configurations for the IO. Pull down all unused
* IO, ensure that we have turned off all peripherals we do not

2011-03-27 23:34:00

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 1/7] ARM: Use struct syscore_ops instead of sysdevs for PM in common code

From: Rafael J. Wysocki <[email protected]>

Convert some ARM architecture's common code to using
struct syscore_ops objects for power management instead of sysdev
classes and sysdevs.

This simplifies the code and reduces the kernel's memory footprint.
It also is necessary for removing sysdevs from the kernel entirely in
the future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/common/vic.c | 69 ++++++++++++++-------------------------
arch/arm/include/asm/mach/time.h | 1
arch/arm/kernel/leds.c | 28 +++++++++------
arch/arm/kernel/time.c | 35 ++++++-------------
arch/arm/vfp/vfpmodule.c | 19 ++--------
5 files changed, 58 insertions(+), 94 deletions(-)

Index: linux-2.6/arch/arm/kernel/time.c
===================================================================
--- linux-2.6.orig/arch/arm/kernel/time.c
+++ linux-2.6/arch/arm/kernel/time.c
@@ -21,7 +21,7 @@
#include <linux/timex.h>
#include <linux/errno.h>
#include <linux/profile.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/timer.h>
#include <linux/irq.h>

@@ -115,48 +115,37 @@ void timer_tick(void)
#endif

#if defined(CONFIG_PM) && !defined(CONFIG_GENERIC_CLOCKEVENTS)
-static int timer_suspend(struct sys_device *dev, pm_message_t state)
+static int timer_suspend(void)
{
- struct sys_timer *timer = container_of(dev, struct sys_timer, dev);
-
- if (timer->suspend != NULL)
- timer->suspend();
+ if (system_timer->suspend)
+ system_timer->suspend();

return 0;
}

-static int timer_resume(struct sys_device *dev)
+static void timer_resume(void)
{
- struct sys_timer *timer = container_of(dev, struct sys_timer, dev);
-
- if (timer->resume != NULL)
- timer->resume();
-
- return 0;
+ if (system_timer->resume)
+ system_timer->resume();
}
#else
#define timer_suspend NULL
#define timer_resume NULL
#endif

-static struct sysdev_class timer_sysclass = {
- .name = "timer",
+static struct syscore_ops timer_syscore_ops = {
.suspend = timer_suspend,
.resume = timer_resume,
};

-static int __init timer_init_sysfs(void)
+static int __init timer_init_syscore_ops(void)
{
- int ret = sysdev_class_register(&timer_sysclass);
- if (ret == 0) {
- system_timer->dev.cls = &timer_sysclass;
- ret = sysdev_register(&system_timer->dev);
- }
+ register_syscore_ops(&timer_syscore_ops);

- return ret;
+ return 0;
}

-device_initcall(timer_init_sysfs);
+device_initcall(timer_init_syscore_ops);

void __init time_init(void)
{
Index: linux-2.6/arch/arm/include/asm/mach/time.h
===================================================================
--- linux-2.6.orig/arch/arm/include/asm/mach/time.h
+++ linux-2.6/arch/arm/include/asm/mach/time.h
@@ -34,7 +34,6 @@
* timer interrupt which may be pending.
*/
struct sys_timer {
- struct sys_device dev;
void (*init)(void);
void (*suspend)(void);
void (*resume)(void);
Index: linux-2.6/arch/arm/kernel/leds.c
===================================================================
--- linux-2.6.orig/arch/arm/kernel/leds.c
+++ linux-2.6/arch/arm/kernel/leds.c
@@ -10,6 +10,7 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <asm/leds.h>

@@ -69,36 +70,37 @@ static ssize_t leds_store(struct sys_dev

static SYSDEV_ATTR(event, 0200, NULL, leds_store);

-static int leds_suspend(struct sys_device *dev, pm_message_t state)
+static struct sysdev_class leds_sysclass = {
+ .name = "leds",
+};
+
+static struct sys_device leds_device = {
+ .id = 0,
+ .cls = &leds_sysclass,
+};
+
+static int leds_suspend(void)
{
leds_event(led_stop);
return 0;
}

-static int leds_resume(struct sys_device *dev)
+static void leds_resume(void)
{
leds_event(led_start);
- return 0;
}

-static int leds_shutdown(struct sys_device *dev)
+static void leds_shutdown(void)
{
leds_event(led_halted);
- return 0;
}

-static struct sysdev_class leds_sysclass = {
- .name = "leds",
+static struct syscore_ops leds_syscore_ops = {
.shutdown = leds_shutdown,
.suspend = leds_suspend,
.resume = leds_resume,
};

-static struct sys_device leds_device = {
- .id = 0,
- .cls = &leds_sysclass,
-};
-
static int __init leds_init(void)
{
int ret;
@@ -107,6 +109,8 @@ static int __init leds_init(void)
ret = sysdev_register(&leds_device);
if (ret == 0)
ret = sysdev_create_file(&leds_device, &attr_event);
+ if (ret == 0)
+ register_syscore_ops(&leds_syscore_ops);
return ret;
}

Index: linux-2.6/arch/arm/common/vic.c
===================================================================
--- linux-2.6.orig/arch/arm/common/vic.c
+++ linux-2.6/arch/arm/common/vic.c
@@ -22,17 +22,16 @@
#include <linux/init.h>
#include <linux/list.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/device.h>
#include <linux/amba/bus.h>

#include <asm/mach/irq.h>
#include <asm/hardware/vic.h>

-#if defined(CONFIG_PM)
+#ifdef CONFIG_PM
/**
* struct vic_device - VIC PM device
- * @sysdev: The system device which is registered.
* @irq: The IRQ number for the base of the VIC.
* @base: The register base for the VIC.
* @resume_sources: A bitmask of interrupts for resume.
@@ -43,8 +42,6 @@
* @protect: Save for VIC_PROTECT.
*/
struct vic_device {
- struct sys_device sysdev;
-
void __iomem *base;
int irq;
u32 resume_sources;
@@ -59,11 +56,6 @@ struct vic_device {
static struct vic_device vic_devices[CONFIG_ARM_VIC_NR];

static int vic_id;
-
-static inline struct vic_device *to_vic(struct sys_device *sys)
-{
- return container_of(sys, struct vic_device, sysdev);
-}
#endif /* CONFIG_PM */

/**
@@ -85,10 +77,9 @@ static void vic_init2(void __iomem *base
writel(32, base + VIC_PL190_DEF_VECT_ADDR);
}

-#if defined(CONFIG_PM)
-static int vic_class_resume(struct sys_device *dev)
+#ifdef CONFIG_PM
+static void resume_one_vic(struct vic_device *vic)
{
- struct vic_device *vic = to_vic(dev);
void __iomem *base = vic->base;

printk(KERN_DEBUG "%s: resuming vic at %p\n", __func__, base);
@@ -107,13 +98,18 @@ static int vic_class_resume(struct sys_d

writel(vic->soft_int, base + VIC_INT_SOFT);
writel(~vic->soft_int, base + VIC_INT_SOFT_CLEAR);
+}

- return 0;
+static void vic_resume(void)
+{
+ int id;
+
+ for (id = vic_id - 1; id >= 0; id--)
+ resume_one_vic(vic_devices + id);
}

-static int vic_class_suspend(struct sys_device *dev, pm_message_t state)
+static void suspend_one_vic(struct vic_device *vic)
{
- struct vic_device *vic = to_vic(dev);
void __iomem *base = vic->base;

printk(KERN_DEBUG "%s: suspending vic at %p\n", __func__, base);
@@ -128,14 +124,21 @@ static int vic_class_suspend(struct sys_

writel(vic->resume_irqs, base + VIC_INT_ENABLE);
writel(~vic->resume_irqs, base + VIC_INT_ENABLE_CLEAR);
+}
+
+static int vic_suspend(void)
+{
+ int id;
+
+ for (id = 0; id < vic_id; id++)
+ suspend_one_vic(vic_devices + id);

return 0;
}

-struct sysdev_class vic_class = {
- .name = "vic",
- .suspend = vic_class_suspend,
- .resume = vic_class_resume,
+struct syscore_ops vic_syscore_ops = {
+ .suspend = vic_suspend,
+ .resume = vic_resume,
};

/**
@@ -147,30 +150,8 @@ struct sysdev_class vic_class = {
*/
static int __init vic_pm_init(void)
{
- struct vic_device *dev = vic_devices;
- int err;
- int id;
-
- if (vic_id == 0)
- return 0;
-
- err = sysdev_class_register(&vic_class);
- if (err) {
- printk(KERN_ERR "%s: cannot register class\n", __func__);
- return err;
- }
-
- for (id = 0; id < vic_id; id++, dev++) {
- dev->sysdev.id = id;
- dev->sysdev.cls = &vic_class;
-
- err = sysdev_register(&dev->sysdev);
- if (err) {
- printk(KERN_ERR "%s: failed to register device\n",
- __func__);
- return err;
- }
- }
+ if (vic_id > 0)
+ register_syscore_ops(&vic_syscore_ops);

return 0;
}
Index: linux-2.6/arch/arm/vfp/vfpmodule.c
===================================================================
--- linux-2.6.orig/arch/arm/vfp/vfpmodule.c
+++ linux-2.6/arch/arm/vfp/vfpmodule.c
@@ -378,9 +378,9 @@ static void vfp_enable(void *unused)
}

#ifdef CONFIG_PM
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

-static int vfp_pm_suspend(struct sys_device *dev, pm_message_t state)
+static int vfp_pm_suspend(void)
{
struct thread_info *ti = current_thread_info();
u32 fpexc = fmrx(FPEXC);
@@ -400,34 +400,25 @@ static int vfp_pm_suspend(struct sys_dev
return 0;
}

-static int vfp_pm_resume(struct sys_device *dev)
+static void vfp_pm_resume(void)
{
/* ensure we have access to the vfp */
vfp_enable(NULL);

/* and disable it to ensure the next usage restores the state */
fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
-
- return 0;
}

-static struct sysdev_class vfp_pm_sysclass = {
- .name = "vfp",
+static struct syscore_ops vfp_pm_syscore_ops = {
.suspend = vfp_pm_suspend,
.resume = vfp_pm_resume,
};

-static struct sys_device vfp_pm_sysdev = {
- .cls = &vfp_pm_sysclass,
-};
-
static void vfp_pm_init(void)
{
- sysdev_class_register(&vfp_pm_sysclass);
- sysdev_register(&vfp_pm_sysdev);
+ register_syscore_ops(&vfp_pm_syscore_ops);
}

-
#else
static inline void vfp_pm_init(void) { }
#endif /* CONFIG_PM */

2011-03-27 23:33:59

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 4/7] ARM / SA1100: Use struct syscore_ops for "core" power management

From: Rafael J. Wysocki <[email protected]>

Replace the sysdev class and struct sys_device used for power
management by the SA1100 interrupt-handling code with a
struct syscore_ops object which is simpler.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/mach-sa1100/irq.c | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)

Index: linux-2.6/arch/arm/mach-sa1100/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-sa1100/irq.c
+++ linux-2.6/arch/arm/mach-sa1100/irq.c
@@ -14,7 +14,7 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/ioport.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/hardware.h>
#include <asm/mach/irq.h>
@@ -234,7 +234,7 @@ static struct sa1100irq_state {
unsigned int iccr;
} sa1100irq_state;

-static int sa1100irq_suspend(struct sys_device *dev, pm_message_t state)
+static int sa1100irq_suspend(void)
{
struct sa1100irq_state *st = &sa1100irq_state;

@@ -264,7 +264,7 @@ static int sa1100irq_suspend(struct sys_
return 0;
}

-static int sa1100irq_resume(struct sys_device *dev)
+static void sa1100irq_resume(void)
{
struct sa1100irq_state *st = &sa1100irq_state;

@@ -277,24 +277,17 @@ static int sa1100irq_resume(struct sys_d

ICMR = st->icmr;
}
- return 0;
}

-static struct sysdev_class sa1100irq_sysclass = {
- .name = "sa11x0-irq",
+static struct syscore_ops sa1100irq_syscore_ops = {
.suspend = sa1100irq_suspend,
.resume = sa1100irq_resume,
};

-static struct sys_device sa1100irq_device = {
- .id = 0,
- .cls = &sa1100irq_sysclass,
-};
-
static int __init sa1100irq_init_devicefs(void)
{
- sysdev_class_register(&sa1100irq_sysclass);
- return sysdev_register(&sa1100irq_device);
+ register_syscore_ops(&sa1100irq_syscore_ops);
+ return 0;
}

device_initcall(sa1100irq_init_devicefs);

2011-03-27 23:45:34

by Ben Dooks

[permalink] [raw]
Subject: Re: [PATCH 6/7] ARM / Samsung: Use struct syscore_ops for "core" power management

On Mon, Mar 28, 2011 at 01:29:49AM +0200, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <[email protected]>
>
> Replace sysdev classes and struct sys_device objects used for "core"
> power management by Samsung platforms with struct syscore_ops objects
> that are simpler.
>
> This generally reduces the code size and the kernel memory footprint.
> It also is necessary for removing sysdevs entirely from the kernel in
> the future.

Hmm, does it still allow the system to choose which bits are bound
depending on the cpu being registered, as for the s3c stuff it isn't
just about the suspend/resume, it's binding items that get registered
early in the startup sequence?

> Signed-off-by: Rafael J. Wysocki <[email protected]>
> ---
> arch/arm/mach-exynos4/pm.c | 45 ++++++++++++--------
> arch/arm/mach-s3c2410/irq.c | 30 -------------
> arch/arm/mach-s3c2410/mach-bast.c | 17 ++-----
> arch/arm/mach-s3c2410/pm.c | 13 ++---
> arch/arm/mach-s3c2410/s3c2410.c | 5 ++
> arch/arm/mach-s3c2412/irq.c | 2
> arch/arm/mach-s3c2412/mach-jive.c | 19 ++------
> arch/arm/mach-s3c2412/pm.c | 27 ++++++------
> arch/arm/mach-s3c2412/s3c2412.c | 4 +
> arch/arm/mach-s3c2416/irq.c | 2
> arch/arm/mach-s3c2416/pm.c | 27 +++++-------
> arch/arm/mach-s3c2416/s3c2416.c | 5 ++
> arch/arm/mach-s3c2440/mach-osiris.c | 18 ++------
> arch/arm/mach-s3c2440/s3c2440.c | 8 +++
> arch/arm/mach-s3c2440/s3c2442.c | 6 ++
> arch/arm/mach-s3c2440/s3c244x-irq.c | 4 -
> arch/arm/mach-s3c2440/s3c244x.c | 62 ++++++++++++++--------------
> arch/arm/mach-s3c64xx/irq-pm.c | 18 ++++----
> arch/arm/mach-s5pv210/pm.c | 25 +++++++----
> arch/arm/plat-s3c24xx/dma.c | 68 +++++++++++--------------------
> arch/arm/plat-s3c24xx/irq-pm.c | 7 ---
> arch/arm/plat-s5p/irq-pm.c | 7 ---
> arch/arm/plat-samsung/include/plat/cpu.h | 6 ++
> arch/arm/plat-samsung/include/plat/pm.h | 6 +-
> 24 files changed, 203 insertions(+), 228 deletions(-)
>
> Index: linux-2.6/arch/arm/plat-samsung/include/plat/pm.h
> ===================================================================
> --- linux-2.6.orig/arch/arm/plat-samsung/include/plat/pm.h
> +++ linux-2.6/arch/arm/plat-samsung/include/plat/pm.h
> @@ -103,14 +103,16 @@ extern void s3c_pm_do_restore_core(struc
>
> #ifdef CONFIG_PM
> extern int s3c_irqext_wake(struct irq_data *data, unsigned int state);
> -extern int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state);
> -extern int s3c24xx_irq_resume(struct sys_device *dev);
> +extern int s3c24xx_irq_suspend(void);
> +extern void s3c24xx_irq_resume(void);
> #else
> #define s3c_irqext_wake NULL
> #define s3c24xx_irq_suspend NULL
> #define s3c24xx_irq_resume NULL
> #endif
>
> +extern struct syscore_ops s3c24xx_irq_syscore_ops;
> +
> /* PM debug functions */
>
> #ifdef CONFIG_SAMSUNG_PM_DEBUG
> Index: linux-2.6/arch/arm/plat-s5p/irq-pm.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/plat-s5p/irq-pm.c
> +++ linux-2.6/arch/arm/plat-s5p/irq-pm.c
> @@ -16,7 +16,6 @@
> #include <linux/init.h>
> #include <linux/module.h>
> #include <linux/interrupt.h>
> -#include <linux/sysdev.h>
>
> #include <plat/cpu.h>
> #include <plat/irqs.h>
> @@ -77,17 +76,15 @@ static struct sleep_save eint_save[] = {
> SAVE_ITEM(S5P_EINT_MASK(3)),
> };
>
> -int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
> +int s3c24xx_irq_suspend(void)
> {
> s3c_pm_do_save(eint_save, ARRAY_SIZE(eint_save));
>
> return 0;
> }
>
> -int s3c24xx_irq_resume(struct sys_device *dev)
> +void s3c24xx_irq_resume(void)
> {
> s3c_pm_do_restore(eint_save, ARRAY_SIZE(eint_save));
> -
> - return 0;
> }
>
> Index: linux-2.6/arch/arm/plat-s3c24xx/irq-pm.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/plat-s3c24xx/irq-pm.c
> +++ linux-2.6/arch/arm/plat-s3c24xx/irq-pm.c
> @@ -14,7 +14,6 @@
> #include <linux/init.h>
> #include <linux/module.h>
> #include <linux/interrupt.h>
> -#include <linux/sysdev.h>
> #include <linux/irq.h>
>
> #include <plat/cpu.h>
> @@ -65,7 +64,7 @@ static unsigned long save_extint[3];
> static unsigned long save_eintflt[4];
> static unsigned long save_eintmask;
>
> -int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
> +int s3c24xx_irq_suspend(void)
> {
> unsigned int i;
>
> @@ -81,7 +80,7 @@ int s3c24xx_irq_suspend(struct sys_devic
> return 0;
> }
>
> -int s3c24xx_irq_resume(struct sys_device *dev)
> +void s3c24xx_irq_resume(void)
> {
> unsigned int i;
>
> @@ -93,6 +92,4 @@ int s3c24xx_irq_resume(struct sys_device
>
> s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
> __raw_writel(save_eintmask, S3C24XX_EINTMASK);
> -
> - return 0;
> }
> Index: linux-2.6/arch/arm/mach-s3c2410/irq.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2410/irq.c
> +++ linux-2.6/arch/arm/mach-s3c2410/irq.c
> @@ -23,38 +23,12 @@
> #include <linux/module.h>
> #include <linux/interrupt.h>
> #include <linux/ioport.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
>
> #include <plat/cpu.h>
> #include <plat/pm.h>
>
> -static int s3c2410_irq_add(struct sys_device *sysdev)
> -{
> - return 0;
> -}
> -
> -static struct sysdev_driver s3c2410_irq_driver = {
> - .add = s3c2410_irq_add,
> +struct syscore_ops s3c24xx_irq_syscore_ops = {
> .suspend = s3c24xx_irq_suspend,
> .resume = s3c24xx_irq_resume,
> };
> -
> -static int __init s3c2410_irq_init(void)
> -{
> - return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_irq_driver);
> -}
> -
> -arch_initcall(s3c2410_irq_init);
> -
> -static struct sysdev_driver s3c2410a_irq_driver = {
> - .add = s3c2410_irq_add,
> - .suspend = s3c24xx_irq_suspend,
> - .resume = s3c24xx_irq_resume,
> -};
> -
> -static int __init s3c2410a_irq_init(void)
> -{
> - return sysdev_driver_register(&s3c2410a_sysclass, &s3c2410a_irq_driver);
> -}
> -
> -arch_initcall(s3c2410a_irq_init);
> Index: linux-2.6/arch/arm/mach-s3c2410/pm.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2410/pm.c
> +++ linux-2.6/arch/arm/mach-s3c2410/pm.c
> @@ -25,6 +25,7 @@
> #include <linux/errno.h>
> #include <linux/time.h>
> #include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/gpio.h>
> #include <linux/io.h>
>
> @@ -92,7 +93,7 @@ static void s3c2410_pm_prepare(void)
> }
> }
>
> -static int s3c2410_pm_resume(struct sys_device *dev)
> +static void s3c2410_pm_resume(void)
> {
> unsigned long tmp;
>
> @@ -104,10 +105,12 @@ static int s3c2410_pm_resume(struct sys_
>
> if ( machine_is_aml_m5900() )
> s3c2410_gpio_setpin(S3C2410_GPF(2), 0);
> -
> - return 0;
> }
>
> +struct syscore_ops s3c2410_pm_syscore_ops = {
> + .resume = s3c2410_pm_resume,
> +};
> +
> static int s3c2410_pm_add(struct sys_device *dev)
> {
> pm_cpu_prep = s3c2410_pm_prepare;
> @@ -119,7 +122,6 @@ static int s3c2410_pm_add(struct sys_dev
> #if defined(CONFIG_CPU_S3C2410)
> static struct sysdev_driver s3c2410_pm_driver = {
> .add = s3c2410_pm_add,
> - .resume = s3c2410_pm_resume,
> };
>
> /* register ourselves */
> @@ -133,7 +135,6 @@ arch_initcall(s3c2410_pm_drvinit);
>
> static struct sysdev_driver s3c2410a_pm_driver = {
> .add = s3c2410_pm_add,
> - .resume = s3c2410_pm_resume,
> };
>
> static int __init s3c2410a_pm_drvinit(void)
> @@ -147,7 +148,6 @@ arch_initcall(s3c2410a_pm_drvinit);
> #if defined(CONFIG_CPU_S3C2440)
> static struct sysdev_driver s3c2440_pm_driver = {
> .add = s3c2410_pm_add,
> - .resume = s3c2410_pm_resume,
> };
>
> static int __init s3c2440_pm_drvinit(void)
> @@ -161,7 +161,6 @@ arch_initcall(s3c2440_pm_drvinit);
> #if defined(CONFIG_CPU_S3C2442)
> static struct sysdev_driver s3c2442_pm_driver = {
> .add = s3c2410_pm_add,
> - .resume = s3c2410_pm_resume,
> };
>
> static int __init s3c2442_pm_drvinit(void)
> Index: linux-2.6/arch/arm/plat-samsung/include/plat/cpu.h
> ===================================================================
> --- linux-2.6.orig/arch/arm/plat-samsung/include/plat/cpu.h
> +++ linux-2.6/arch/arm/plat-samsung/include/plat/cpu.h
> @@ -68,6 +68,12 @@ extern void s3c24xx_init_uartdevs(char *
> struct sys_timer;
> extern struct sys_timer s3c24xx_timer;
>
> +extern struct syscore_ops s3c2410_pm_syscore_ops;
> +extern struct syscore_ops s3c2412_pm_syscore_ops;
> +extern struct syscore_ops s3c2416_pm_syscore_ops;
> +extern struct syscore_ops s3c244x_pm_syscore_ops;
> +extern struct syscore_ops s3c64xx_irq_syscore_ops;
> +
> /* system device classes */
>
> extern struct sysdev_class s3c2410_sysclass;
> Index: linux-2.6/arch/arm/mach-s3c2410/s3c2410.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2410/s3c2410.c
> +++ linux-2.6/arch/arm/mach-s3c2410/s3c2410.c
> @@ -19,6 +19,7 @@
> #include <linux/gpio.h>
> #include <linux/clk.h>
> #include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/serial_core.h>
> #include <linux/platform_device.h>
> #include <linux/io.h>
> @@ -40,6 +41,7 @@
> #include <plat/devs.h>
> #include <plat/clock.h>
> #include <plat/pll.h>
> +#include <plat/pm.h>
>
> #include <plat/gpio-core.h>
> #include <plat/gpio-cfg.h>
> @@ -168,6 +170,9 @@ int __init s3c2410_init(void)
> {
> printk("S3C2410: Initialising architecture\n");
>
> + register_syscore_ops(&s3c2410_pm_syscore_ops);
> + register_syscore_ops(&s3c24xx_irq_syscore_ops);
> +
> return sysdev_register(&s3c2410_sysdev);
> }
>
> Index: linux-2.6/arch/arm/mach-s3c2412/irq.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2412/irq.c
> +++ linux-2.6/arch/arm/mach-s3c2412/irq.c
> @@ -202,8 +202,6 @@ static int s3c2412_irq_add(struct sys_de
>
> static struct sysdev_driver s3c2412_irq_driver = {
> .add = s3c2412_irq_add,
> - .suspend = s3c24xx_irq_suspend,
> - .resume = s3c24xx_irq_resume,
> };
>
> static int s3c2412_irq_init(void)
> Index: linux-2.6/arch/arm/mach-s3c2412/pm.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2412/pm.c
> +++ linux-2.6/arch/arm/mach-s3c2412/pm.c
> @@ -17,6 +17,7 @@
> #include <linux/timer.h>
> #include <linux/init.h>
> #include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/platform_device.h>
> #include <linux/io.h>
>
> @@ -86,13 +87,24 @@ static struct sleep_save s3c2412_sleep[]
> SAVE_ITEM(S3C2413_GPJSLPCON),
> };
>
> -static int s3c2412_pm_suspend(struct sys_device *dev, pm_message_t state)
> +static struct sysdev_driver s3c2412_pm_driver = {
> + .add = s3c2412_pm_add,
> +};
> +
> +static __init int s3c2412_pm_init(void)
> +{
> + return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver);
> +}
> +
> +arch_initcall(s3c2412_pm_init);
> +
> +static int s3c2412_pm_suspend(void)
> {
> s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
> return 0;
> }
>
> -static int s3c2412_pm_resume(struct sys_device *dev)
> +static void s3c2412_pm_resume(void)
> {
> unsigned long tmp;
>
> @@ -102,18 +114,9 @@ static int s3c2412_pm_resume(struct sys_
> __raw_writel(tmp, S3C2412_PWRCFG);
>
> s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
> - return 0;
> }
>
> -static struct sysdev_driver s3c2412_pm_driver = {
> - .add = s3c2412_pm_add,
> +struct syscore_ops s3c2412_pm_syscore_ops = {
> .suspend = s3c2412_pm_suspend,
> .resume = s3c2412_pm_resume,
> };
> -
> -static __init int s3c2412_pm_init(void)
> -{
> - return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver);
> -}
> -
> -arch_initcall(s3c2412_pm_init);
> Index: linux-2.6/arch/arm/mach-s3c2412/s3c2412.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2412/s3c2412.c
> +++ linux-2.6/arch/arm/mach-s3c2412/s3c2412.c
> @@ -19,6 +19,7 @@
> #include <linux/clk.h>
> #include <linux/delay.h>
> #include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/serial_core.h>
> #include <linux/platform_device.h>
> #include <linux/io.h>
> @@ -244,5 +245,8 @@ int __init s3c2412_init(void)
> {
> printk("S3C2412: Initialising architecture\n");
>
> + register_syscore_ops(&s3c2412_pm_syscore_ops);
> + register_syscore_ops(&s3c24xx_irq_syscore_ops);
> +
> return sysdev_register(&s3c2412_sysdev);
> }
> Index: linux-2.6/arch/arm/mach-s3c2416/irq.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2416/irq.c
> +++ linux-2.6/arch/arm/mach-s3c2416/irq.c
> @@ -238,8 +238,6 @@ static int __init s3c2416_irq_add(struct
>
> static struct sysdev_driver s3c2416_irq_driver = {
> .add = s3c2416_irq_add,
> - .suspend = s3c24xx_irq_suspend,
> - .resume = s3c24xx_irq_resume,
> };
>
> static int __init s3c2416_irq_init(void)
> Index: linux-2.6/arch/arm/mach-s3c2416/pm.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2416/pm.c
> +++ linux-2.6/arch/arm/mach-s3c2416/pm.c
> @@ -11,6 +11,7 @@
> */
>
> #include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/io.h>
>
> #include <asm/cacheflush.h>
> @@ -55,30 +56,26 @@ static int s3c2416_pm_add(struct sys_dev
> return 0;
> }
>
> -static int s3c2416_pm_suspend(struct sys_device *dev, pm_message_t state)
> +static struct sysdev_driver s3c2416_pm_driver = {
> + .add = s3c2416_pm_add,
> +};
> +
> +static __init int s3c2416_pm_init(void)
> {
> - return 0;
> + return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_pm_driver);
> }
>
> -static int s3c2416_pm_resume(struct sys_device *dev)
> +arch_initcall(s3c2416_pm_init);
> +
> +
> +static void s3c2416_pm_resume(void)
> {
> /* unset the return-from-sleep amd inform flags */
> __raw_writel(0x0, S3C2443_PWRMODE);
> __raw_writel(0x0, S3C2412_INFORM0);
> __raw_writel(0x0, S3C2412_INFORM1);
> -
> - return 0;
> }
>
> -static struct sysdev_driver s3c2416_pm_driver = {
> - .add = s3c2416_pm_add,
> - .suspend = s3c2416_pm_suspend,
> +struct syscore_ops s3c2416_pm_syscore_ops = {
> .resume = s3c2416_pm_resume,
> };
> -
> -static __init int s3c2416_pm_init(void)
> -{
> - return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_pm_driver);
> -}
> -
> -arch_initcall(s3c2416_pm_init);
> Index: linux-2.6/arch/arm/mach-s3c2416/s3c2416.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2416/s3c2416.c
> +++ linux-2.6/arch/arm/mach-s3c2416/s3c2416.c
> @@ -32,6 +32,7 @@
> #include <linux/platform_device.h>
> #include <linux/serial_core.h>
> #include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/clk.h>
> #include <linux/io.h>
>
> @@ -54,6 +55,7 @@
> #include <plat/devs.h>
> #include <plat/cpu.h>
> #include <plat/sdhci.h>
> +#include <plat/pm.h>
>
> #include <plat/iic-core.h>
> #include <plat/fb-core.h>
> @@ -95,6 +97,9 @@ int __init s3c2416_init(void)
>
> s3c_fb_setname("s3c2443-fb");
>
> + register_syscore_ops(&s3c2416_pm_syscore_ops);
> + register_syscore_ops(&s3c24xx_irq_syscore_ops);
> +
> return sysdev_register(&s3c2416_sysdev);
> }
>
> Index: linux-2.6/arch/arm/mach-s3c2440/s3c244x-irq.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2440/s3c244x-irq.c
> +++ linux-2.6/arch/arm/mach-s3c2440/s3c244x-irq.c
> @@ -116,8 +116,6 @@ static int s3c244x_irq_add(struct sys_de
>
> static struct sysdev_driver s3c2440_irq_driver = {
> .add = s3c244x_irq_add,
> - .suspend = s3c24xx_irq_suspend,
> - .resume = s3c24xx_irq_resume,
> };
>
> static int s3c2440_irq_init(void)
> @@ -129,8 +127,6 @@ arch_initcall(s3c2440_irq_init);
>
> static struct sysdev_driver s3c2442_irq_driver = {
> .add = s3c244x_irq_add,
> - .suspend = s3c24xx_irq_suspend,
> - .resume = s3c24xx_irq_resume,
> };
>
>
> Index: linux-2.6/arch/arm/mach-s3c2440/s3c244x.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2440/s3c244x.c
> +++ linux-2.6/arch/arm/mach-s3c2440/s3c244x.c
> @@ -19,6 +19,7 @@
> #include <linux/serial_core.h>
> #include <linux/platform_device.h>
> #include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/clk.h>
> #include <linux/io.h>
>
> @@ -134,45 +135,14 @@ void __init s3c244x_init_clocks(int xtal
> s3c2410_baseclk_add();
> }
>
> -#ifdef CONFIG_PM
> -
> -static struct sleep_save s3c244x_sleep[] = {
> - SAVE_ITEM(S3C2440_DSC0),
> - SAVE_ITEM(S3C2440_DSC1),
> - SAVE_ITEM(S3C2440_GPJDAT),
> - SAVE_ITEM(S3C2440_GPJCON),
> - SAVE_ITEM(S3C2440_GPJUP)
> -};
> -
> -static int s3c244x_suspend(struct sys_device *dev, pm_message_t state)
> -{
> - s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
> - return 0;
> -}
> -
> -static int s3c244x_resume(struct sys_device *dev)
> -{
> - s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
> - return 0;
> -}
> -
> -#else
> -#define s3c244x_suspend NULL
> -#define s3c244x_resume NULL
> -#endif
> -
> /* Since the S3C2442 and S3C2440 share items, put both sysclasses here */
>
> struct sysdev_class s3c2440_sysclass = {
> .name = "s3c2440-core",
> - .suspend = s3c244x_suspend,
> - .resume = s3c244x_resume
> };
>
> struct sysdev_class s3c2442_sysclass = {
> .name = "s3c2442-core",
> - .suspend = s3c244x_suspend,
> - .resume = s3c244x_resume
> };
>
> /* need to register class before we actually register the device, and
> @@ -194,3 +164,33 @@ static int __init s3c2442_core_init(void
> }
>
> core_initcall(s3c2442_core_init);
> +
> +
> +#ifdef CONFIG_PM
> +static struct sleep_save s3c244x_sleep[] = {
> + SAVE_ITEM(S3C2440_DSC0),
> + SAVE_ITEM(S3C2440_DSC1),
> + SAVE_ITEM(S3C2440_GPJDAT),
> + SAVE_ITEM(S3C2440_GPJCON),
> + SAVE_ITEM(S3C2440_GPJUP)
> +};
> +
> +static int s3c244x_suspend(void)
> +{
> + s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
> + return 0;
> +}
> +
> +static void s3c244x_resume(void)
> +{
> + s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
> +}
> +#else
> +#define s3c244x_suspend NULL
> +#define s3c244x_resume NULL
> +#endif
> +
> +struct syscore_ops s3c244x_pm_syscore_ops = {
> + .suspend = s3c244x_suspend,
> + .resume = s3c244x_resume,
> +};
> Index: linux-2.6/arch/arm/mach-s3c2440/s3c2440.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2440/s3c2440.c
> +++ linux-2.6/arch/arm/mach-s3c2440/s3c2440.c
> @@ -19,6 +19,7 @@
> #include <linux/platform_device.h>
> #include <linux/serial_core.h>
> #include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/gpio.h>
> #include <linux/clk.h>
> #include <linux/io.h>
> @@ -33,6 +34,7 @@
> #include <plat/devs.h>
> #include <plat/cpu.h>
> #include <plat/s3c244x.h>
> +#include <plat/pm.h>
>
> #include <plat/gpio-core.h>
> #include <plat/gpio-cfg.h>
> @@ -51,6 +53,12 @@ int __init s3c2440_init(void)
> s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
> s3c_device_wdt.resource[1].end = IRQ_S3C2440_WDT;
>
> + /* register suspend/resume handlers */
> +
> + register_syscore_ops(&s3c2410_pm_syscore_ops);
> + register_syscore_ops(&s3c244x_pm_syscore_ops);
> + register_syscore_ops(&s3c24xx_irq_syscore_ops);
> +
> /* register our system device for everything else */
>
> return sysdev_register(&s3c2440_sysdev);
> Index: linux-2.6/arch/arm/mach-s3c2440/s3c2442.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2440/s3c2442.c
> +++ linux-2.6/arch/arm/mach-s3c2440/s3c2442.c
> @@ -29,6 +29,7 @@
> #include <linux/err.h>
> #include <linux/device.h>
> #include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/interrupt.h>
> #include <linux/ioport.h>
> #include <linux/mutex.h>
> @@ -45,6 +46,7 @@
> #include <plat/clock.h>
> #include <plat/cpu.h>
> #include <plat/s3c244x.h>
> +#include <plat/pm.h>
>
> #include <plat/gpio-core.h>
> #include <plat/gpio-cfg.h>
> @@ -167,6 +169,10 @@ int __init s3c2442_init(void)
> {
> printk("S3C2442: Initialising architecture\n");
>
> + register_syscore_ops(&s3c2410_pm_syscore_ops);
> + register_syscore_ops(&s3c244x_pm_syscore_ops);
> + register_syscore_ops(&s3c24xx_irq_syscore_ops);
> +
> return sysdev_register(&s3c2442_sysdev);
> }
>
> Index: linux-2.6/arch/arm/mach-s3c64xx/irq-pm.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c64xx/irq-pm.c
> +++ linux-2.6/arch/arm/mach-s3c64xx/irq-pm.c
> @@ -13,7 +13,7 @@
> */
>
> #include <linux/kernel.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/interrupt.h>
> #include <linux/serial_core.h>
> #include <linux/irq.h>
> @@ -54,7 +54,7 @@ static struct irq_grp_save {
>
> static u32 irq_uart_mask[CONFIG_SERIAL_SAMSUNG_UARTS];
>
> -static int s3c64xx_irq_pm_suspend(struct sys_device *dev, pm_message_t state)
> +static int s3c64xx_irq_pm_suspend(void)
> {
> struct irq_grp_save *grp = eint_grp_save;
> int i;
> @@ -75,7 +75,7 @@ static int s3c64xx_irq_pm_suspend(struct
> return 0;
> }
>
> -static int s3c64xx_irq_pm_resume(struct sys_device *dev)
> +static void s3c64xx_irq_pm_resume(void)
> {
> struct irq_grp_save *grp = eint_grp_save;
> int i;
> @@ -94,18 +94,18 @@ static int s3c64xx_irq_pm_resume(struct
> }
>
> S3C_PMDBG("%s: IRQ configuration restored\n", __func__);
> - return 0;
> }
>
> -static struct sysdev_driver s3c64xx_irq_driver = {
> +struct syscore_ops s3c64xx_irq_syscore_ops = {
> .suspend = s3c64xx_irq_pm_suspend,
> .resume = s3c64xx_irq_pm_resume,
> };
>
> -static int __init s3c64xx_irq_pm_init(void)
> +static __init int s3c64xx_syscore_init(void)
> {
> - return sysdev_driver_register(&s3c64xx_sysclass, &s3c64xx_irq_driver);
> -}
> + register_syscore_ops(&s3c64xx_irq_syscore_ops);
>
> -arch_initcall(s3c64xx_irq_pm_init);
> + return 0;
> +}
>
> +core_initcall(s3c64xx_syscore_init);
> Index: linux-2.6/arch/arm/mach-s5pv210/pm.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s5pv210/pm.c
> +++ linux-2.6/arch/arm/mach-s5pv210/pm.c
> @@ -16,6 +16,7 @@
>
> #include <linux/init.h>
> #include <linux/suspend.h>
> +#include <linux/syscore_ops.h>
> #include <linux/io.h>
>
> #include <plat/cpu.h>
> @@ -140,7 +141,17 @@ static int s5pv210_pm_add(struct sys_dev
> return 0;
> }
>
> -static int s5pv210_pm_resume(struct sys_device *dev)
> +static struct sysdev_driver s5pv210_pm_driver = {
> + .add = s5pv210_pm_add,
> +};
> +
> +static __init int s5pv210_pm_drvinit(void)
> +{
> + return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver);
> +}
> +arch_initcall(s5pv210_pm_drvinit);
> +
> +static void s5pv210_pm_resume(void)
> {
> u32 tmp;
>
> @@ -150,17 +161,15 @@ static int s5pv210_pm_resume(struct sys_
> __raw_writel(tmp , S5P_OTHERS);
>
> s3c_pm_do_restore_core(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));
> -
> - return 0;
> }
>
> -static struct sysdev_driver s5pv210_pm_driver = {
> - .add = s5pv210_pm_add,
> +static struct syscore_ops s5pv210_pm_syscore_ops = {
> .resume = s5pv210_pm_resume,
> };
>
> -static __init int s5pv210_pm_drvinit(void)
> +static __init int s5pv210_pm_syscore_init(void)
> {
> - return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver);
> + register_syscore_ops(&s5pv210_pm_syscore_ops);
> + return 0;
> }
> -arch_initcall(s5pv210_pm_drvinit);
> +arch_initcall(s5pv210_pm_syscore_init);
> Index: linux-2.6/arch/arm/mach-exynos4/pm.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-exynos4/pm.c
> +++ linux-2.6/arch/arm/mach-exynos4/pm.c
> @@ -16,6 +16,7 @@
>
> #include <linux/init.h>
> #include <linux/suspend.h>
> +#include <linux/syscore_ops.h>
> #include <linux/io.h>
>
> #include <asm/cacheflush.h>
> @@ -372,7 +373,27 @@ void exynos4_scu_enable(void __iomem *sc
> flush_cache_all();
> }
>
> -static int exynos4_pm_resume(struct sys_device *dev)
> +static struct sysdev_driver exynos4_pm_driver = {
> + .add = exynos4_pm_add,
> +};
> +
> +static __init int exynos4_pm_drvinit(void)
> +{
> + unsigned int tmp;
> +
> + s3c_pm_init();
> +
> + /* All wakeup disable */
> +
> + tmp = __raw_readl(S5P_WAKEUP_MASK);
> + tmp |= ((0xFF << 8) | (0x1F << 1));
> + __raw_writel(tmp, S5P_WAKEUP_MASK);
> +
> + return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
> +}
> +arch_initcall(exynos4_pm_drvinit);
> +
> +static void exynos4_pm_resume(void)
> {
> /* For release retention */
>
> @@ -394,27 +415,15 @@ static int exynos4_pm_resume(struct sys_
> /* enable L2X0*/
> writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
> #endif
> -
> - return 0;
> }
>
> -static struct sysdev_driver exynos4_pm_driver = {
> - .add = exynos4_pm_add,
> +static struct syscore_ops exynos4_pm_syscore_ops = {
> .resume = exynos4_pm_resume,
> };
>
> -static __init int exynos4_pm_drvinit(void)
> +static __init int exynos4_pm_syscore_init(void)
> {
> - unsigned int tmp;
> -
> - s3c_pm_init();
> -
> - /* All wakeup disable */
> -
> - tmp = __raw_readl(S5P_WAKEUP_MASK);
> - tmp |= ((0xFF << 8) | (0x1F << 1));
> - __raw_writel(tmp, S5P_WAKEUP_MASK);
> -
> - return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
> + register_syscore_ops(&exynos4_pm_syscore_ops);
> + return 0;
> }
> -arch_initcall(exynos4_pm_drvinit);
> +arch_initcall(exynos4_pm_syscore_init);
> Index: linux-2.6/arch/arm/mach-s3c2410/mach-bast.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2410/mach-bast.c
> +++ linux-2.6/arch/arm/mach-s3c2410/mach-bast.c
> @@ -17,7 +17,7 @@
> #include <linux/timer.h>
> #include <linux/init.h>
> #include <linux/gpio.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/serial_core.h>
> #include <linux/platform_device.h>
> #include <linux/dm9000.h>
> @@ -214,17 +214,16 @@ static struct s3c2410_uartcfg bast_uartc
> /* NAND Flash on BAST board */
>
> #ifdef CONFIG_PM
> -static int bast_pm_suspend(struct sys_device *sd, pm_message_t state)
> +static int bast_pm_suspend(void)
> {
> /* ensure that an nRESET is not generated on resume. */
> gpio_direction_output(S3C2410_GPA(21), 1);
> return 0;
> }
>
> -static int bast_pm_resume(struct sys_device *sd)
> +static void bast_pm_resume(void)
> {
> s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
> - return 0;
> }
>
> #else
> @@ -232,16 +231,11 @@ static int bast_pm_resume(struct sys_dev
> #define bast_pm_resume NULL
> #endif
>
> -static struct sysdev_class bast_pm_sysclass = {
> - .name = "mach-bast",
> +static struct syscore_ops bast_pm_syscore_ops = {
> .suspend = bast_pm_suspend,
> .resume = bast_pm_resume,
> };
>
> -static struct sys_device bast_pm_sysdev = {
> - .cls = &bast_pm_sysclass,
> -};
> -
> static int smartmedia_map[] = { 0 };
> static int chip0_map[] = { 1 };
> static int chip1_map[] = { 2 };
> @@ -642,8 +636,7 @@ static void __init bast_map_io(void)
>
> static void __init bast_init(void)
> {
> - sysdev_class_register(&bast_pm_sysclass);
> - sysdev_register(&bast_pm_sysdev);
> + register_syscore_ops(&bast_pm_syscore_ops);
>
> s3c_i2c0_set_platdata(&bast_i2c_info);
> s3c_nand_set_platdata(&bast_nand_info);
> Index: linux-2.6/arch/arm/plat-s3c24xx/dma.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/plat-s3c24xx/dma.c
> +++ linux-2.6/arch/arm/plat-s3c24xx/dma.c
> @@ -22,7 +22,7 @@
> #include <linux/sched.h>
> #include <linux/spinlock.h>
> #include <linux/interrupt.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/slab.h>
> #include <linux/errno.h>
> #include <linux/io.h>
> @@ -1195,19 +1195,12 @@ int s3c2410_dma_getposition(unsigned int
>
> EXPORT_SYMBOL(s3c2410_dma_getposition);
>
> -static inline struct s3c2410_dma_chan *to_dma_chan(struct sys_device *dev)
> -{
> - return container_of(dev, struct s3c2410_dma_chan, dev);
> -}
> -
> -/* system device class */
> +/* system core operations */
>
> #ifdef CONFIG_PM
>
> -static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state)
> +static void s3c2410_dma_suspend_chan(s3c2410_dma_chan *cp)
> {
> - struct s3c2410_dma_chan *cp = to_dma_chan(dev);
> -
> printk(KERN_DEBUG "suspending dma channel %d\n", cp->number);
>
> if (dma_rdreg(cp, S3C2410_DMA_DMASKTRIG) & S3C2410_DMASKTRIG_ON) {
> @@ -1222,13 +1215,21 @@ static int s3c2410_dma_suspend(struct sy
>
> s3c2410_dma_dostop(cp);
> }
> +}
> +
> +static int s3c2410_dma_suspend(void)
> +{
> + struct s3c2410_dma_chan *cp = s3c2410_chans;
> + int channel;
> +
> + for (channel = 0; channel < dma_channels; cp++, channel++)
> + s3c2410_dma_suspend_chan(cp);
>
> return 0;
> }
>
> -static int s3c2410_dma_resume(struct sys_device *dev)
> +static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)
> {
> - struct s3c2410_dma_chan *cp = to_dma_chan(dev);
> unsigned int no = cp->number | DMACH_LOW_LEVEL;
>
> /* restore channel's hardware configuration */
> @@ -1249,13 +1250,21 @@ static int s3c2410_dma_resume(struct sys
> return 0;
> }
>
> +static void s3c2410_dma_resume(void)
> +{
> + struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1;
> + int channel;
> +
> + for (channel = dma_channels - 1; channel >= 0; cp++, channel--)
> + s3c2410_dma_resume_chan(cp);
> +}
> +
> #else
> #define s3c2410_dma_suspend NULL
> #define s3c2410_dma_resume NULL
> #endif /* CONFIG_PM */
>
> -struct sysdev_class dma_sysclass = {
> - .name = "s3c24xx-dma",
> +struct syscore_ops dma_syscore_ops = {
> .suspend = s3c2410_dma_suspend,
> .resume = s3c2410_dma_resume,
> };
> @@ -1269,39 +1278,14 @@ static void s3c2410_dma_cache_ctor(void
>
> /* initialisation code */
>
> -static int __init s3c24xx_dma_sysclass_init(void)
> +static int __init s3c24xx_dma_syscore_init(void)
> {
> - int ret = sysdev_class_register(&dma_sysclass);
> -
> - if (ret != 0)
> - printk(KERN_ERR "dma sysclass registration failed\n");
> -
> - return ret;
> -}
> -
> -core_initcall(s3c24xx_dma_sysclass_init);
> -
> -static int __init s3c24xx_dma_sysdev_register(void)
> -{
> - struct s3c2410_dma_chan *cp = s3c2410_chans;
> - int channel, ret;
> -
> - for (channel = 0; channel < dma_channels; cp++, channel++) {
> - cp->dev.cls = &dma_sysclass;
> - cp->dev.id = channel;
> - ret = sysdev_register(&cp->dev);
> -
> - if (ret) {
> - printk(KERN_ERR "error registering dev for dma %d\n",
> - channel);
> - return ret;
> - }
> - }
> + register_syscore_ops(&dma_syscore_ops);
>
> return 0;
> }
>
> -late_initcall(s3c24xx_dma_sysdev_register);
> +late_initcall(s3c24xx_dma_syscore_init);
>
> int __init s3c24xx_dma_init(unsigned int channels, unsigned int irq,
> unsigned int stride)
> Index: linux-2.6/arch/arm/mach-s3c2440/mach-osiris.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2440/mach-osiris.c
> +++ linux-2.6/arch/arm/mach-s3c2440/mach-osiris.c
> @@ -17,7 +17,7 @@
> #include <linux/init.h>
> #include <linux/gpio.h>
> #include <linux/device.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/serial_core.h>
> #include <linux/clk.h>
> #include <linux/i2c.h>
> @@ -284,7 +284,7 @@ static struct platform_device osiris_pcm
> #ifdef CONFIG_PM
> static unsigned char pm_osiris_ctrl0;
>
> -static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state)
> +static int osiris_pm_suspend(void)
> {
> unsigned int tmp;
>
> @@ -304,7 +304,7 @@ static int osiris_pm_suspend(struct sys_
> return 0;
> }
>
> -static int osiris_pm_resume(struct sys_device *sd)
> +static void osiris_pm_resume(void)
> {
> if (pm_osiris_ctrl0 & OSIRIS_CTRL0_FIX8)
> __raw_writeb(OSIRIS_CTRL1_FIX8, OSIRIS_VA_CTRL1);
> @@ -312,8 +312,6 @@ static int osiris_pm_resume(struct sys_d
> __raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0);
>
> s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
> -
> - return 0;
> }
>
> #else
> @@ -321,16 +319,11 @@ static int osiris_pm_resume(struct sys_d
> #define osiris_pm_resume NULL
> #endif
>
> -static struct sysdev_class osiris_pm_sysclass = {
> - .name = "mach-osiris",
> +static struct syscore_ops osiris_pm_syscore_ops = {
> .suspend = osiris_pm_suspend,
> .resume = osiris_pm_resume,
> };
>
> -static struct sys_device osiris_pm_sysdev = {
> - .cls = &osiris_pm_sysclass,
> -};
> -
> /* Link for DVS driver to TPS65011 */
>
> static void osiris_tps_release(struct device *dev)
> @@ -439,8 +432,7 @@ static void __init osiris_map_io(void)
>
> static void __init osiris_init(void)
> {
> - sysdev_class_register(&osiris_pm_sysclass);
> - sysdev_register(&osiris_pm_sysdev);
> + register_syscore_ops(&osiris_pm_syscore_ops);
>
> s3c_i2c0_set_platdata(NULL);
> s3c_nand_set_platdata(&osiris_nand_info);
> Index: linux-2.6/arch/arm/mach-s3c2412/mach-jive.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/mach-s3c2412/mach-jive.c
> +++ linux-2.6/arch/arm/mach-s3c2412/mach-jive.c
> @@ -17,7 +17,7 @@
> #include <linux/timer.h>
> #include <linux/init.h>
> #include <linux/gpio.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/serial_core.h>
> #include <linux/platform_device.h>
> #include <linux/i2c.h>
> @@ -486,7 +486,7 @@ static struct s3c2410_udc_mach_info jive
> /* Jive power management device */
>
> #ifdef CONFIG_PM
> -static int jive_pm_suspend(struct sys_device *sd, pm_message_t state)
> +static int jive_pm_suspend(void)
> {
> /* Write the magic value u-boot uses to check for resume into
> * the INFORM0 register, and ensure INFORM1 is set to the
> @@ -498,10 +498,9 @@ static int jive_pm_suspend(struct sys_de
> return 0;
> }
>
> -static int jive_pm_resume(struct sys_device *sd)
> +static void jive_pm_resume(void)
> {
> __raw_writel(0x0, S3C2412_INFORM0);
> - return 0;
> }
>
> #else
> @@ -509,16 +508,11 @@ static int jive_pm_resume(struct sys_dev
> #define jive_pm_resume NULL
> #endif
>
> -static struct sysdev_class jive_pm_sysclass = {
> - .name = "jive-pm",
> +static struct syscore_ops jive_pm_syscore_ops = {
> .suspend = jive_pm_suspend,
> .resume = jive_pm_resume,
> };
>
> -static struct sys_device jive_pm_sysdev = {
> - .cls = &jive_pm_sysclass,
> -};
> -
> static void __init jive_map_io(void)
> {
> s3c24xx_init_io(jive_iodesc, ARRAY_SIZE(jive_iodesc));
> @@ -536,10 +530,9 @@ static void jive_power_off(void)
>
> static void __init jive_machine_init(void)
> {
> - /* register system devices for managing low level suspend */
> + /* register system core operations for managing low level suspend */
>
> - sysdev_class_register(&jive_pm_sysclass);
> - sysdev_register(&jive_pm_sysdev);
> + register_syscore_ops(&jive_pm_syscore_ops);
>
> /* write our sleep configurations for the IO. Pull down all unused
> * IO, ensure that we have turned off all peripherals we do not
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

--
Ben Dooks, [email protected], http://www.fluff.org/ben/

Large Hadron Colada: A large Pina Colada that makes the universe disappear.

2011-03-28 16:18:35

by Kevin Hilman

[permalink] [raw]
Subject: Re: [PATCH 2/7] ARM / OMAP: Use struct syscore_ops for "core" power management

"Rafael J. Wysocki" <[email protected]> writes:

> From: Rafael J. Wysocki <[email protected]>
>
> Replace the sysdev class and struct sys_device used for power
> management in the OMAP's GPIO code with a struct syscore_ops object
> which is simpler.
>
> Signed-off-by: Rafael J. Wysocki <[email protected]>

Acked-by: Kevin Hilman <[email protected]>

Looks fine to me. We're in the process of converting this driver to
runtime PM. When that happens the syscore ops will be removed as well,
but I'm fine with this patch until we finish the runtime PM conversion.

Kevin

> ---
> arch/arm/plat-omap/gpio.c | 35 +++++++++--------------------------
> 1 file changed, 9 insertions(+), 26 deletions(-)
>
> Index: linux-2.6/arch/arm/plat-omap/gpio.c
> ===================================================================
> --- linux-2.6.orig/arch/arm/plat-omap/gpio.c
> +++ linux-2.6/arch/arm/plat-omap/gpio.c
> @@ -17,7 +17,7 @@
> #include <linux/init.h>
> #include <linux/module.h>
> #include <linux/interrupt.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/err.h>
> #include <linux/clk.h>
> #include <linux/io.h>
> @@ -1379,9 +1379,7 @@ static const struct dev_pm_ops omap_mpui
> .resume_noirq = omap_mpuio_resume_noirq,
> };
>
> -/* use platform_driver for this, now that there's no longer any
> - * point to sys_device (other than not disturbing old code).
> - */
> +/* use platform_driver for this. */
> static struct platform_driver omap_mpuio_driver = {
> .driver = {
> .name = "mpuio",
> @@ -1754,7 +1752,7 @@ static int __devinit omap_gpio_probe(str
> }
>
> #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
> -static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
> +static int omap_gpio_suspend(void)
> {
> int i;
>
> @@ -1804,12 +1802,12 @@ static int omap_gpio_suspend(struct sys_
> return 0;
> }
>
> -static int omap_gpio_resume(struct sys_device *dev)
> +static void omap_gpio_resume(void)
> {
> int i;
>
> if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
> - return 0;
> + return;
>
> for (i = 0; i < gpio_bank_count; i++) {
> struct gpio_bank *bank = &gpio_bank[i];
> @@ -1845,21 +1843,13 @@ static int omap_gpio_resume(struct sys_d
> __raw_writel(bank->saved_wakeup, wake_set);
> spin_unlock_irqrestore(&bank->lock, flags);
> }
> -
> - return 0;
> }
>
> -static struct sysdev_class omap_gpio_sysclass = {
> - .name = "gpio",
> +static struct syscore_ops omap_gpio_syscore_ops = {
> .suspend = omap_gpio_suspend,
> .resume = omap_gpio_resume,
> };
>
> -static struct sys_device omap_gpio_device = {
> - .id = 0,
> - .cls = &omap_gpio_sysclass,
> -};
> -
> #endif
>
> #ifdef CONFIG_ARCH_OMAP2PLUS
> @@ -2117,21 +2107,14 @@ postcore_initcall(omap_gpio_drv_reg);
>
> static int __init omap_gpio_sysinit(void)
> {
> - int ret = 0;
> -
> mpuio_init();
>
> #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
> - if (cpu_is_omap16xx() || cpu_class_is_omap2()) {
> - if (ret == 0) {
> - ret = sysdev_class_register(&omap_gpio_sysclass);
> - if (ret == 0)
> - ret = sysdev_register(&omap_gpio_device);
> - }
> - }
> + if (cpu_is_omap16xx() || cpu_class_is_omap2())
> + register_syscore_ops(&omap_gpio_syscore_ops);
> #endif
>
> - return ret;
> + return 0;
> }
>
> arch_initcall(omap_gpio_sysinit);

2011-03-28 19:42:01

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 6/7] ARM / Samsung: Use struct syscore_ops for "core" power management

On Monday, March 28, 2011, Ben Dooks wrote:
> On Mon, Mar 28, 2011 at 01:29:49AM +0200, Rafael J. Wysocki wrote:
> > From: Rafael J. Wysocki <[email protected]>
> >
> > Replace sysdev classes and struct sys_device objects used for "core"
> > power management by Samsung platforms with struct syscore_ops objects
> > that are simpler.
> >
> > This generally reduces the code size and the kernel memory footprint.
> > It also is necessary for removing sysdevs entirely from the kernel in
> > the future.
>
> Hmm, does it still allow the system to choose which bits are bound
> depending on the cpu being registered, as for the s3c stuff it isn't
> just about the suspend/resume, it's binding items that get registered
> early in the startup sequence?

The registering is still done through sysdevs, the syscore_ops are only
used for power management. I did my best to retain the existing flow of
control as far as possible.

Thanks,
Rafael

2011-04-17 21:16:31

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 1/14] PM: Fix error code paths executed after failing syscore_suspend()

From: Rafael J. Wysocki <[email protected]>

If syscore_suspend() fails in suspend_enter(), create_image() or
resume_target_kernel(), it is necessary to call sysdev_resume(),
because sysdev_suspend() has been called already and succeeded
and we are going to abort the transition.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
kernel/power/hibernate.c | 10 ++++++++--
kernel/power/suspend.c | 5 ++++-
2 files changed, 12 insertions(+), 3 deletions(-)

Index: linux-2.6/kernel/power/suspend.c
===================================================================
--- linux-2.6.orig/kernel/power/suspend.c
+++ linux-2.6/kernel/power/suspend.c
@@ -164,8 +164,11 @@ static int suspend_enter(suspend_state_t
BUG_ON(!irqs_disabled());

error = sysdev_suspend(PMSG_SUSPEND);
- if (!error)
+ if (!error) {
error = syscore_suspend();
+ if (error)
+ sysdev_resume();
+ }
if (!error) {
if (!(suspend_test(TEST_CORE) || pm_wakeup_pending())) {
error = suspend_ops->enter(state);
Index: linux-2.6/kernel/power/hibernate.c
===================================================================
--- linux-2.6.orig/kernel/power/hibernate.c
+++ linux-2.6/kernel/power/hibernate.c
@@ -273,8 +273,11 @@ static int create_image(int platform_mod
local_irq_disable();

error = sysdev_suspend(PMSG_FREEZE);
- if (!error)
+ if (!error) {
error = syscore_suspend();
+ if (error)
+ sysdev_resume();
+ }
if (error) {
printk(KERN_ERR "PM: Some system devices failed to power down, "
"aborting hibernation\n");
@@ -407,8 +410,11 @@ static int resume_target_kernel(bool pla
local_irq_disable();

error = sysdev_suspend(PMSG_QUIESCE);
- if (!error)
+ if (!error) {
error = syscore_suspend();
+ if (error)
+ sysdev_resume();
+ }
if (error)
goto Enable_irqs;

2011-04-17 21:16:06

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 0/14] Remove sysdev suspend/resume and shutdown operations

Hi,

The following series of patches fixes bugs related to the introduction
of struct syscore_ops later in this cycle, replaces sysdev suspend/resume
operations in all of the architectures still using them with struct
syscore_ops-based PM callbacks and finally removes the suspend/resume
and shutdown operations from struct sysdev_class and struct sysdev_driver.

Patches [1/14] and [2/14] are important bug fixes targeted at 2.6.39.
The remaining patches are regareded as 2.6.40 material, but I'd like to
put them into linux-next shortly, if there are no objections, to catch
problems that they may introduce before they hit the mainline. Again,
if there are no objections I'd like to merge these patches through the
suspend-2.6 tree.

[1/14] - Fix error code paths executed after failing syscore_suspend()
[2/14] - Add missing syscore_suspend() and syscore_resume() calls to
subsystems that should use them in addition to sysdev calls.

[3/14] - Use struct syscore_ops for core PM (instead of sysdevs) in the
common ARM code.
[4/14] - Use struct syscore_ops for core PM (instead of sysdevs) in ARM OMAP
code.
[5/14] - Use struct syscore_ops for core PM (instead of sysdevs) in ARM
Integrator code.
[6/14] - Use struct syscore_ops for core PM (instead of sysdevs) in ARM SA1100
code.
[7/14] - Use struct syscore_ops for core PM (instead of sysdevs) in ARM PXA
code.
[8/14] - Use struct syscore_ops for core PM (instead of sysdevs) in ARM Samsung
code.
[9/14] - Use struct syscore_ops for core PM (instead of sysdevs) in Blackfin
arch code.
[10/14] - Use struct syscore_ops for core PM (instead of sysdevs) in MIPS
arch code.
[11/14] - Use struct syscore_ops for core PM (instead of sysdevs) in AVR32
arch code.
[12/14] - Use struct syscore_ops for core PM (instead of sysdevs) in Unicore32
arch code.
[13/14] - Use struct syscore_ops for core PM (instead of sysdevs) in PowerPC
arch code.
[14/14] - Remove sysdev suspend/resume and shutdown operations.

Thanks,
Rafael

2011-04-17 21:16:43

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 2/14] PM: Add missing syscore_suspend() and syscore_resume() calls

From: Rafael J. Wysocki <[email protected]>

Device suspend/resume infrastructure is used not only by the suspend
and hibernate code in kernel/power, but also by , APM, Xen and the
kexec jump feature. However, commit 40dc166cb5dddbd36aa4ad11c03915ea
(PM / Core: Introduce struct syscore_ops for core subsystems PM)
failed to add syscore_suspend() and syscore_resume() calls to that
code, which generally leads to breakage when the features in question
are used.

To fix this problem, add the missing syscore_suspend() and
syscore_resume() calls to arch/x86/kernel/apm_32.c, kernel/kexec.c
and drivers/xen/manage.c.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/x86/kernel/apm_32.c | 5 +++++
drivers/xen/manage.c | 9 ++++++++-
kernel/kexec.c | 7 +++++++
3 files changed, 20 insertions(+), 1 deletion(-)

Index: linux-2.6/kernel/kexec.c
===================================================================
--- linux-2.6.orig/kernel/kexec.c
+++ linux-2.6/kernel/kexec.c
@@ -33,6 +33,7 @@
#include <linux/vmalloc.h>
#include <linux/swap.h>
#include <linux/kmsg_dump.h>
+#include <linux/syscore_ops.h>

#include <asm/page.h>
#include <asm/uaccess.h>
@@ -1532,6 +1533,11 @@ int kernel_kexec(void)
local_irq_disable();
/* Suspend system devices */
error = sysdev_suspend(PMSG_FREEZE);
+ if (!error) {
+ error = syscore_suspend();
+ if (error)
+ sysdev_resume();
+ }
if (error)
goto Enable_irqs;
} else
@@ -1546,6 +1552,7 @@ int kernel_kexec(void)

#ifdef CONFIG_KEXEC_JUMP
if (kexec_image->preserve_context) {
+ syscore_resume();
sysdev_resume();
Enable_irqs:
local_irq_enable();
Index: linux-2.6/drivers/xen/manage.c
===================================================================
--- linux-2.6.orig/drivers/xen/manage.c
+++ linux-2.6/drivers/xen/manage.c
@@ -8,6 +8,7 @@
#include <linux/sysrq.h>
#include <linux/stop_machine.h>
#include <linux/freezer.h>
+#include <linux/syscore_ops.h>

#include <xen/xen.h>
#include <xen/xenbus.h>
@@ -70,8 +71,13 @@ static int xen_suspend(void *data)
BUG_ON(!irqs_disabled());

err = sysdev_suspend(PMSG_FREEZE);
+ if (!err) {
+ err = syscore_suspend();
+ if (err)
+ sysdev_resume();
+ }
if (err) {
- printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
+ printk(KERN_ERR "xen_suspend: system core suspend failed: %d\n",
err);
return err;
}
@@ -95,6 +101,7 @@ static int xen_suspend(void *data)
xen_timer_resume();
}

+ syscore_resume();
sysdev_resume();

return 0;
Index: linux-2.6/arch/x86/kernel/apm_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/apm_32.c
+++ linux-2.6/arch/x86/kernel/apm_32.c
@@ -228,6 +228,7 @@
#include <linux/kthread.h>
#include <linux/jiffies.h>
#include <linux/acpi.h>
+#include <linux/syscore_ops.h>

#include <asm/system.h>
#include <asm/uaccess.h>
@@ -1238,6 +1239,7 @@ static int suspend(int vetoable)

local_irq_disable();
sysdev_suspend(PMSG_SUSPEND);
+ syscore_suspend();

local_irq_enable();

@@ -1255,6 +1257,7 @@ static int suspend(int vetoable)
apm_error("suspend", err);
err = (err == APM_SUCCESS) ? 0 : -EIO;

+ syscore_resume();
sysdev_resume();
local_irq_enable();

@@ -1280,6 +1283,7 @@ static void standby(void)

local_irq_disable();
sysdev_suspend(PMSG_SUSPEND);
+ syscore_suspend();
local_irq_enable();

err = set_system_power_state(APM_STATE_STANDBY);
@@ -1287,6 +1291,7 @@ static void standby(void)
apm_error("standby", err);

local_irq_disable();
+ syscore_resume();
sysdev_resume();
local_irq_enable();

2011-04-17 21:16:56

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 3/14] ARM: Use struct syscore_ops instead of sysdevs for PM in common code

From: Rafael J. Wysocki <[email protected]>

Convert some ARM architecture's common code to using
struct syscore_ops objects for power management instead of sysdev
classes and sysdevs.

This simplifies the code and reduces the kernel's memory footprint.
It also is necessary for removing sysdevs from the kernel entirely in
the future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/common/vic.c | 69 ++++++++++++++-------------------------
arch/arm/include/asm/mach/time.h | 1
arch/arm/kernel/leds.c | 28 +++++++++------
arch/arm/kernel/time.c | 35 ++++++-------------
arch/arm/vfp/vfpmodule.c | 19 ++--------
5 files changed, 58 insertions(+), 94 deletions(-)

Index: linux-2.6/arch/arm/kernel/time.c
===================================================================
--- linux-2.6.orig/arch/arm/kernel/time.c
+++ linux-2.6/arch/arm/kernel/time.c
@@ -21,7 +21,7 @@
#include <linux/timex.h>
#include <linux/errno.h>
#include <linux/profile.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/timer.h>
#include <linux/irq.h>

@@ -115,48 +115,37 @@ void timer_tick(void)
#endif

#if defined(CONFIG_PM) && !defined(CONFIG_GENERIC_CLOCKEVENTS)
-static int timer_suspend(struct sys_device *dev, pm_message_t state)
+static int timer_suspend(void)
{
- struct sys_timer *timer = container_of(dev, struct sys_timer, dev);
-
- if (timer->suspend != NULL)
- timer->suspend();
+ if (system_timer->suspend)
+ system_timer->suspend();

return 0;
}

-static int timer_resume(struct sys_device *dev)
+static void timer_resume(void)
{
- struct sys_timer *timer = container_of(dev, struct sys_timer, dev);
-
- if (timer->resume != NULL)
- timer->resume();
-
- return 0;
+ if (system_timer->resume)
+ system_timer->resume();
}
#else
#define timer_suspend NULL
#define timer_resume NULL
#endif

-static struct sysdev_class timer_sysclass = {
- .name = "timer",
+static struct syscore_ops timer_syscore_ops = {
.suspend = timer_suspend,
.resume = timer_resume,
};

-static int __init timer_init_sysfs(void)
+static int __init timer_init_syscore_ops(void)
{
- int ret = sysdev_class_register(&timer_sysclass);
- if (ret == 0) {
- system_timer->dev.cls = &timer_sysclass;
- ret = sysdev_register(&system_timer->dev);
- }
+ register_syscore_ops(&timer_syscore_ops);

- return ret;
+ return 0;
}

-device_initcall(timer_init_sysfs);
+device_initcall(timer_init_syscore_ops);

void __init time_init(void)
{
Index: linux-2.6/arch/arm/include/asm/mach/time.h
===================================================================
--- linux-2.6.orig/arch/arm/include/asm/mach/time.h
+++ linux-2.6/arch/arm/include/asm/mach/time.h
@@ -34,7 +34,6 @@
* timer interrupt which may be pending.
*/
struct sys_timer {
- struct sys_device dev;
void (*init)(void);
void (*suspend)(void);
void (*resume)(void);
Index: linux-2.6/arch/arm/kernel/leds.c
===================================================================
--- linux-2.6.orig/arch/arm/kernel/leds.c
+++ linux-2.6/arch/arm/kernel/leds.c
@@ -10,6 +10,7 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <asm/leds.h>

@@ -69,36 +70,37 @@ static ssize_t leds_store(struct sys_dev

static SYSDEV_ATTR(event, 0200, NULL, leds_store);

-static int leds_suspend(struct sys_device *dev, pm_message_t state)
+static struct sysdev_class leds_sysclass = {
+ .name = "leds",
+};
+
+static struct sys_device leds_device = {
+ .id = 0,
+ .cls = &leds_sysclass,
+};
+
+static int leds_suspend(void)
{
leds_event(led_stop);
return 0;
}

-static int leds_resume(struct sys_device *dev)
+static void leds_resume(void)
{
leds_event(led_start);
- return 0;
}

-static int leds_shutdown(struct sys_device *dev)
+static void leds_shutdown(void)
{
leds_event(led_halted);
- return 0;
}

-static struct sysdev_class leds_sysclass = {
- .name = "leds",
+static struct syscore_ops leds_syscore_ops = {
.shutdown = leds_shutdown,
.suspend = leds_suspend,
.resume = leds_resume,
};

-static struct sys_device leds_device = {
- .id = 0,
- .cls = &leds_sysclass,
-};
-
static int __init leds_init(void)
{
int ret;
@@ -107,6 +109,8 @@ static int __init leds_init(void)
ret = sysdev_register(&leds_device);
if (ret == 0)
ret = sysdev_create_file(&leds_device, &attr_event);
+ if (ret == 0)
+ register_syscore_ops(&leds_syscore_ops);
return ret;
}

Index: linux-2.6/arch/arm/common/vic.c
===================================================================
--- linux-2.6.orig/arch/arm/common/vic.c
+++ linux-2.6/arch/arm/common/vic.c
@@ -22,17 +22,16 @@
#include <linux/init.h>
#include <linux/list.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/device.h>
#include <linux/amba/bus.h>

#include <asm/mach/irq.h>
#include <asm/hardware/vic.h>

-#if defined(CONFIG_PM)
+#ifdef CONFIG_PM
/**
* struct vic_device - VIC PM device
- * @sysdev: The system device which is registered.
* @irq: The IRQ number for the base of the VIC.
* @base: The register base for the VIC.
* @resume_sources: A bitmask of interrupts for resume.
@@ -43,8 +42,6 @@
* @protect: Save for VIC_PROTECT.
*/
struct vic_device {
- struct sys_device sysdev;
-
void __iomem *base;
int irq;
u32 resume_sources;
@@ -59,11 +56,6 @@ struct vic_device {
static struct vic_device vic_devices[CONFIG_ARM_VIC_NR];

static int vic_id;
-
-static inline struct vic_device *to_vic(struct sys_device *sys)
-{
- return container_of(sys, struct vic_device, sysdev);
-}
#endif /* CONFIG_PM */

/**
@@ -85,10 +77,9 @@ static void vic_init2(void __iomem *base
writel(32, base + VIC_PL190_DEF_VECT_ADDR);
}

-#if defined(CONFIG_PM)
-static int vic_class_resume(struct sys_device *dev)
+#ifdef CONFIG_PM
+static void resume_one_vic(struct vic_device *vic)
{
- struct vic_device *vic = to_vic(dev);
void __iomem *base = vic->base;

printk(KERN_DEBUG "%s: resuming vic at %p\n", __func__, base);
@@ -107,13 +98,18 @@ static int vic_class_resume(struct sys_d

writel(vic->soft_int, base + VIC_INT_SOFT);
writel(~vic->soft_int, base + VIC_INT_SOFT_CLEAR);
+}

- return 0;
+static void vic_resume(void)
+{
+ int id;
+
+ for (id = vic_id - 1; id >= 0; id--)
+ resume_one_vic(vic_devices + id);
}

-static int vic_class_suspend(struct sys_device *dev, pm_message_t state)
+static void suspend_one_vic(struct vic_device *vic)
{
- struct vic_device *vic = to_vic(dev);
void __iomem *base = vic->base;

printk(KERN_DEBUG "%s: suspending vic at %p\n", __func__, base);
@@ -128,14 +124,21 @@ static int vic_class_suspend(struct sys_

writel(vic->resume_irqs, base + VIC_INT_ENABLE);
writel(~vic->resume_irqs, base + VIC_INT_ENABLE_CLEAR);
+}
+
+static int vic_suspend(void)
+{
+ int id;
+
+ for (id = 0; id < vic_id; id++)
+ suspend_one_vic(vic_devices + id);

return 0;
}

-struct sysdev_class vic_class = {
- .name = "vic",
- .suspend = vic_class_suspend,
- .resume = vic_class_resume,
+struct syscore_ops vic_syscore_ops = {
+ .suspend = vic_suspend,
+ .resume = vic_resume,
};

/**
@@ -147,30 +150,8 @@ struct sysdev_class vic_class = {
*/
static int __init vic_pm_init(void)
{
- struct vic_device *dev = vic_devices;
- int err;
- int id;
-
- if (vic_id == 0)
- return 0;
-
- err = sysdev_class_register(&vic_class);
- if (err) {
- printk(KERN_ERR "%s: cannot register class\n", __func__);
- return err;
- }
-
- for (id = 0; id < vic_id; id++, dev++) {
- dev->sysdev.id = id;
- dev->sysdev.cls = &vic_class;
-
- err = sysdev_register(&dev->sysdev);
- if (err) {
- printk(KERN_ERR "%s: failed to register device\n",
- __func__);
- return err;
- }
- }
+ if (vic_id > 0)
+ register_syscore_ops(&vic_syscore_ops);

return 0;
}
Index: linux-2.6/arch/arm/vfp/vfpmodule.c
===================================================================
--- linux-2.6.orig/arch/arm/vfp/vfpmodule.c
+++ linux-2.6/arch/arm/vfp/vfpmodule.c
@@ -398,9 +398,9 @@ static void vfp_enable(void *unused)
}

#ifdef CONFIG_PM
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

-static int vfp_pm_suspend(struct sys_device *dev, pm_message_t state)
+static int vfp_pm_suspend(void)
{
struct thread_info *ti = current_thread_info();
u32 fpexc = fmrx(FPEXC);
@@ -420,34 +420,25 @@ static int vfp_pm_suspend(struct sys_dev
return 0;
}

-static int vfp_pm_resume(struct sys_device *dev)
+static void vfp_pm_resume(void)
{
/* ensure we have access to the vfp */
vfp_enable(NULL);

/* and disable it to ensure the next usage restores the state */
fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
-
- return 0;
}

-static struct sysdev_class vfp_pm_sysclass = {
- .name = "vfp",
+static struct syscore_ops vfp_pm_syscore_ops = {
.suspend = vfp_pm_suspend,
.resume = vfp_pm_resume,
};

-static struct sys_device vfp_pm_sysdev = {
- .cls = &vfp_pm_sysclass,
-};
-
static void vfp_pm_init(void)
{
- sysdev_class_register(&vfp_pm_sysclass);
- sysdev_register(&vfp_pm_sysdev);
+ register_syscore_ops(&vfp_pm_syscore_ops);
}

-
#else
static inline void vfp_pm_init(void) { }
#endif /* CONFIG_PM */

2011-04-17 21:17:05

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 5/14] ARM / Integrator: Use struct syscore_ops for core PM

From: Rafael J. Wysocki <[email protected]>

Replace the sysdev class and struct sys_device used for power
management by the Integrator interrupt-handling code with a
struct syscore_ops object which is simpler.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/mach-integrator/integrator_ap.c | 26 +++++++++-----------------
1 file changed, 9 insertions(+), 17 deletions(-)

Index: linux-2.6/arch/arm/mach-integrator/integrator_ap.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-integrator/integrator_ap.c
+++ linux-2.6/arch/arm/mach-integrator/integrator_ap.c
@@ -24,7 +24,7 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/string.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/amba/bus.h>
#include <linux/amba/kmi.h>
#include <linux/clocksource.h>
@@ -180,13 +180,13 @@ static void __init ap_init_irq(void)
#ifdef CONFIG_PM
static unsigned long ic_irq_enable;

-static int irq_suspend(struct sys_device *dev, pm_message_t state)
+static int irq_suspend(void)
{
ic_irq_enable = readl(VA_IC_BASE + IRQ_ENABLE);
return 0;
}

-static int irq_resume(struct sys_device *dev)
+static void irq_resume(void)
{
/* disable all irq sources */
writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
@@ -194,33 +194,25 @@ static int irq_resume(struct sys_device
writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);

writel(ic_irq_enable, VA_IC_BASE + IRQ_ENABLE_SET);
- return 0;
}
#else
#define irq_suspend NULL
#define irq_resume NULL
#endif

-static struct sysdev_class irq_class = {
- .name = "irq",
+static struct syscore_ops irq_syscore_ops = {
.suspend = irq_suspend,
.resume = irq_resume,
};

-static struct sys_device irq_device = {
- .id = 0,
- .cls = &irq_class,
-};
-
-static int __init irq_init_sysfs(void)
+static int __init irq_syscore_init(void)
{
- int ret = sysdev_class_register(&irq_class);
- if (ret == 0)
- ret = sysdev_register(&irq_device);
- return ret;
+ register_syscore_ops(&irq_syscore_ops);
+
+ return 0;
}

-device_initcall(irq_init_sysfs);
+device_initcall(irq_syscore_init);

/*
* Flash handling.

2011-04-17 21:17:12

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 7/14] ARM / PXA: Use struct syscore_ops for "core" power management

From: Rafael J. Wysocki <[email protected]>

Replace sysdev classes and struct sys_device objects used for "core"
power management by the PXA platform code with struct syscore_ops
objects that are simpler.

This reduces the code size and the kernel memory footprint. It also
is necessary for removing sysdevs entirely from the kernel in the
future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/mach-pxa/balloon3.c | 1
arch/arm/mach-pxa/clock-pxa2xx.c | 18 ++----------
arch/arm/mach-pxa/clock-pxa3xx.c | 17 ++---------
arch/arm/mach-pxa/clock.h | 7 ++--
arch/arm/mach-pxa/cm-x270.c | 1
arch/arm/mach-pxa/cm-x2xx.c | 23 ++++------------
arch/arm/mach-pxa/colibri-evalboard.c | 1
arch/arm/mach-pxa/colibri-pxa270-income.c | 1
arch/arm/mach-pxa/colibri-pxa270.c | 1
arch/arm/mach-pxa/generic.h | 8 ++---
arch/arm/mach-pxa/irq.c | 17 ++---------
arch/arm/mach-pxa/lpd270.c | 20 ++++---------
arch/arm/mach-pxa/lubbock.c | 21 ++++----------
arch/arm/mach-pxa/mainstone.c | 22 ++++-----------
arch/arm/mach-pxa/mfp-pxa2xx.c | 12 +++-----
arch/arm/mach-pxa/mfp-pxa3xx.c | 21 +++-----------
arch/arm/mach-pxa/mioa701.c | 43 +++++-------------------------
arch/arm/mach-pxa/palmld.c | 1
arch/arm/mach-pxa/palmtreo.c | 1
arch/arm/mach-pxa/palmz72.c | 24 +++++-----------
arch/arm/mach-pxa/pxa25x.c | 25 ++++-------------
arch/arm/mach-pxa/pxa27x.c | 25 ++++-------------
arch/arm/mach-pxa/pxa3xx.c | 25 ++++-------------
arch/arm/mach-pxa/pxa95x.c | 20 ++-----------
arch/arm/mach-pxa/raumfeld.c | 1
arch/arm/mach-pxa/smemc.c | 29 ++++----------------
arch/arm/mach-pxa/trizeps4.c | 1
arch/arm/mach-pxa/viper.c | 12 ++++----
arch/arm/mach-pxa/vpac270.c | 1
arch/arm/plat-pxa/gpio.c | 17 ++---------
arch/arm/plat-pxa/mfp.c | 1
31 files changed, 110 insertions(+), 307 deletions(-)

Index: linux-2.6/arch/arm/plat-pxa/gpio.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-pxa/gpio.c
+++ linux-2.6/arch/arm/plat-pxa/gpio.c
@@ -15,7 +15,7 @@
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/slab.h>

#include <mach/gpio.h>
@@ -295,7 +295,7 @@ void __init pxa_init_gpio(int mux_irq, i
}

#ifdef CONFIG_PM
-static int pxa_gpio_suspend(struct sys_device *dev, pm_message_t state)
+static int pxa_gpio_suspend(void)
{
struct pxa_gpio_chip *c;
int gpio;
@@ -312,7 +312,7 @@ static int pxa_gpio_suspend(struct sys_d
return 0;
}

-static int pxa_gpio_resume(struct sys_device *dev)
+static void pxa_gpio_resume(void)
{
struct pxa_gpio_chip *c;
int gpio;
@@ -326,22 +326,13 @@ static int pxa_gpio_resume(struct sys_de
__raw_writel(c->saved_gfer, c->regbase + GFER_OFFSET);
__raw_writel(c->saved_gpdr, c->regbase + GPDR_OFFSET);
}
- return 0;
}
#else
#define pxa_gpio_suspend NULL
#define pxa_gpio_resume NULL
#endif

-struct sysdev_class pxa_gpio_sysclass = {
- .name = "gpio",
+struct syscore_ops pxa_gpio_syscore_ops = {
.suspend = pxa_gpio_suspend,
.resume = pxa_gpio_resume,
};
-
-static int __init pxa_gpio_init(void)
-{
- return sysdev_class_register(&pxa_gpio_sysclass);
-}
-
-core_initcall(pxa_gpio_init);
Index: linux-2.6/arch/arm/mach-pxa/generic.h
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/generic.h
+++ linux-2.6/arch/arm/mach-pxa/generic.h
@@ -61,10 +61,10 @@ extern unsigned pxa3xx_get_clk_frequency
#define pxa3xx_get_clk_frequency_khz(x) (0)
#endif

-extern struct sysdev_class pxa_irq_sysclass;
-extern struct sysdev_class pxa_gpio_sysclass;
-extern struct sysdev_class pxa2xx_mfp_sysclass;
-extern struct sysdev_class pxa3xx_mfp_sysclass;
+extern struct syscore_ops pxa_irq_syscore_ops;
+extern struct syscore_ops pxa_gpio_syscore_ops;
+extern struct syscore_ops pxa2xx_mfp_syscore_ops;
+extern struct syscore_ops pxa3xx_mfp_syscore_ops;

void __init pxa_set_ffuart_info(void *info);
void __init pxa_set_btuart_info(void *info);
Index: linux-2.6/arch/arm/mach-pxa/pxa95x.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/pxa95x.c
+++ linux-2.6/arch/arm/mach-pxa/pxa95x.c
@@ -18,7 +18,7 @@
#include <linux/i2c/pxa-i2c.h>
#include <linux/irq.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/hardware.h>
#include <mach/gpio.h>
@@ -260,16 +260,6 @@ static struct platform_device *devices[]
&pxa27x_device_pwm1,
};

-static struct sys_device pxa95x_sysdev[] = {
- {
- .cls = &pxa_irq_sysclass,
- }, {
- .cls = &pxa_gpio_sysclass,
- }, {
- .cls = &pxa3xx_clock_sysclass,
- }
-};
-
static int __init pxa95x_init(void)
{
int ret = 0, i;
@@ -293,11 +283,9 @@ static int __init pxa95x_init(void)
if ((ret = pxa_init_dma(IRQ_DMA, 32)))
return ret;

- for (i = 0; i < ARRAY_SIZE(pxa95x_sysdev); i++) {
- ret = sysdev_register(&pxa95x_sysdev[i]);
- if (ret)
- pr_err("failed to register sysdev[%d]\n", i);
- }
+ register_syscore_ops(&pxa_irq_syscore_ops);
+ register_syscore_ops(&pxa_gpio_syscore_ops);
+ register_syscore_ops(&pxa3xx_clock_syscore_ops);

ret = platform_add_devices(devices, ARRAY_SIZE(devices));
}
Index: linux-2.6/arch/arm/mach-pxa/clock-pxa3xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/clock-pxa3xx.c
+++ linux-2.6/arch/arm/mach-pxa/clock-pxa3xx.c
@@ -10,6 +10,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/syscore_ops.h>

#include <mach/smemc.h>
#include <mach/pxa3xx-regs.h>
@@ -182,7 +183,7 @@ const struct clkops clk_pxa3xx_pout_ops
static uint32_t cken[2];
static uint32_t accr;

-static int pxa3xx_clock_suspend(struct sys_device *d, pm_message_t state)
+static int pxa3xx_clock_suspend(void)
{
cken[0] = CKENA;
cken[1] = CKENB;
@@ -190,28 +191,18 @@ static int pxa3xx_clock_suspend(struct s
return 0;
}

-static int pxa3xx_clock_resume(struct sys_device *d)
+static void pxa3xx_clock_resume(void)
{
ACCR = accr;
CKENA = cken[0];
CKENB = cken[1];
- return 0;
}
#else
#define pxa3xx_clock_suspend NULL
#define pxa3xx_clock_resume NULL
#endif

-struct sysdev_class pxa3xx_clock_sysclass = {
- .name = "pxa3xx-clock",
+struct syscore_ops pxa3xx_clock_syscore_ops = {
.suspend = pxa3xx_clock_suspend,
.resume = pxa3xx_clock_resume,
};
-
-static int __init pxa3xx_clock_init(void)
-{
- if (cpu_is_pxa3xx() || cpu_is_pxa95x())
- return sysdev_class_register(&pxa3xx_clock_sysclass);
- return 0;
-}
-postcore_initcall(pxa3xx_clock_init);
Index: linux-2.6/arch/arm/mach-pxa/clock.h
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/clock.h
+++ linux-2.6/arch/arm/mach-pxa/clock.h
@@ -1,5 +1,5 @@
#include <linux/clkdev.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

struct clkops {
void (*enable)(struct clk *);
@@ -54,7 +54,7 @@ extern const struct clkops clk_pxa2xx_ck
void clk_pxa2xx_cken_enable(struct clk *clk);
void clk_pxa2xx_cken_disable(struct clk *clk);

-extern struct sysdev_class pxa2xx_clock_sysclass;
+extern struct syscore_ops pxa2xx_clock_syscore_ops;

#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA95x)
#define DEFINE_PXA3_CKEN(_name, _cken, _rate, _delay) \
@@ -74,5 +74,6 @@ extern const struct clkops clk_pxa3xx_sm
extern void clk_pxa3xx_cken_enable(struct clk *);
extern void clk_pxa3xx_cken_disable(struct clk *);

-extern struct sysdev_class pxa3xx_clock_sysclass;
+extern struct syscore_ops pxa3xx_clock_syscore_ops;
+
#endif
Index: linux-2.6/arch/arm/mach-pxa/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/irq.c
+++ linux-2.6/arch/arm/mach-pxa/irq.c
@@ -15,7 +15,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>
#include <linux/irq.h>

@@ -183,7 +183,7 @@ void __init pxa_init_irq(int irq_nr, set
static unsigned long saved_icmr[MAX_INTERNAL_IRQS/32];
static unsigned long saved_ipr[MAX_INTERNAL_IRQS];

-static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)
+static int pxa_irq_suspend(void)
{
int i;

@@ -202,7 +202,7 @@ static int pxa_irq_suspend(struct sys_de
return 0;
}

-static int pxa_irq_resume(struct sys_device *dev)
+static void pxa_irq_resume(void)
{
int i;

@@ -218,22 +218,13 @@ static int pxa_irq_resume(struct sys_dev
__raw_writel(saved_ipr[i], IRQ_BASE + IPR(i));

__raw_writel(1, IRQ_BASE + ICCR);
- return 0;
}
#else
#define pxa_irq_suspend NULL
#define pxa_irq_resume NULL
#endif

-struct sysdev_class pxa_irq_sysclass = {
- .name = "irq",
+struct syscore_ops pxa_irq_syscore_ops = {
.suspend = pxa_irq_suspend,
.resume = pxa_irq_resume,
};
-
-static int __init pxa_irq_init(void)
-{
- return sysdev_class_register(&pxa_irq_sysclass);
-}
-
-core_initcall(pxa_irq_init);
Index: linux-2.6/arch/arm/mach-pxa/clock-pxa2xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/clock-pxa2xx.c
+++ linux-2.6/arch/arm/mach-pxa/clock-pxa2xx.c
@@ -9,7 +9,7 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/pxa2xx-regs.h>

@@ -33,32 +33,22 @@ const struct clkops clk_pxa2xx_cken_ops
#ifdef CONFIG_PM
static uint32_t saved_cken;

-static int pxa2xx_clock_suspend(struct sys_device *d, pm_message_t state)
+static int pxa2xx_clock_suspend(void)
{
saved_cken = CKEN;
return 0;
}

-static int pxa2xx_clock_resume(struct sys_device *d)
+static void pxa2xx_clock_resume(void)
{
CKEN = saved_cken;
- return 0;
}
#else
#define pxa2xx_clock_suspend NULL
#define pxa2xx_clock_resume NULL
#endif

-struct sysdev_class pxa2xx_clock_sysclass = {
- .name = "pxa2xx-clock",
+struct syscore_ops pxa2xx_clock_syscore_ops = {
.suspend = pxa2xx_clock_suspend,
.resume = pxa2xx_clock_resume,
};
-
-static int __init pxa2xx_clock_init(void)
-{
- if (cpu_is_pxa2xx())
- return sysdev_class_register(&pxa2xx_clock_sysclass);
- return 0;
-}
-postcore_initcall(pxa2xx_clock_init);
Index: linux-2.6/arch/arm/mach-pxa/mfp-pxa3xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/mfp-pxa3xx.c
+++ linux-2.6/arch/arm/mach-pxa/mfp-pxa3xx.c
@@ -17,7 +17,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/hardware.h>
#include <mach/mfp-pxa3xx.h>
@@ -31,13 +31,13 @@
* a pull-down mode if they're an active low chip select, and we're
* just entering standby.
*/
-static int pxa3xx_mfp_suspend(struct sys_device *d, pm_message_t state)
+static int pxa3xx_mfp_suspend(void)
{
mfp_config_lpm();
return 0;
}

-static int pxa3xx_mfp_resume(struct sys_device *d)
+static void pxa3xx_mfp_resume(void)
{
mfp_config_run();

@@ -47,24 +47,13 @@ static int pxa3xx_mfp_resume(struct sys_
* preserve them here in case they will be referenced later
*/
ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S);
- return 0;
}
#else
#define pxa3xx_mfp_suspend NULL
#define pxa3xx_mfp_resume NULL
#endif

-struct sysdev_class pxa3xx_mfp_sysclass = {
- .name = "mfp",
+struct syscore_ops pxa3xx_mfp_syscore_ops = {
.suspend = pxa3xx_mfp_suspend,
- .resume = pxa3xx_mfp_resume,
+ .resume = pxa3xx_mfp_resume,
};
-
-static int __init mfp_init_devicefs(void)
-{
- if (cpu_is_pxa3xx())
- return sysdev_class_register(&pxa3xx_mfp_sysclass);
-
- return 0;
-}
-postcore_initcall(mfp_init_devicefs);
Index: linux-2.6/arch/arm/mach-pxa/pxa3xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/pxa3xx.c
+++ linux-2.6/arch/arm/mach-pxa/pxa3xx.c
@@ -20,7 +20,7 @@
#include <linux/platform_device.h>
#include <linux/irq.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/i2c/pxa-i2c.h>

#include <asm/mach/map.h>
@@ -427,21 +427,9 @@ static struct platform_device *devices[]
&pxa27x_device_pwm1,
};

-static struct sys_device pxa3xx_sysdev[] = {
- {
- .cls = &pxa_irq_sysclass,
- }, {
- .cls = &pxa3xx_mfp_sysclass,
- }, {
- .cls = &pxa_gpio_sysclass,
- }, {
- .cls = &pxa3xx_clock_sysclass,
- }
-};
-
static int __init pxa3xx_init(void)
{
- int i, ret = 0;
+ int ret = 0;

if (cpu_is_pxa3xx()) {

@@ -462,11 +450,10 @@ static int __init pxa3xx_init(void)

pxa3xx_init_pm();

- for (i = 0; i < ARRAY_SIZE(pxa3xx_sysdev); i++) {
- ret = sysdev_register(&pxa3xx_sysdev[i]);
- if (ret)
- pr_err("failed to register sysdev[%d]\n", i);
- }
+ register_syscore_ops(&pxa_irq_syscore_ops);
+ register_syscore_ops(&pxa3xx_mfp_syscore_ops);
+ register_syscore_ops(&pxa_gpio_syscore_ops);
+ register_syscore_ops(&pxa3xx_clock_syscore_ops);

ret = platform_add_devices(devices, ARRAY_SIZE(devices));
}
Index: linux-2.6/arch/arm/mach-pxa/mfp-pxa2xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/mfp-pxa2xx.c
+++ linux-2.6/arch/arm/mach-pxa/mfp-pxa2xx.c
@@ -16,7 +16,7 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/gpio.h>
#include <mach/pxa2xx-regs.h>
@@ -338,7 +338,7 @@ static unsigned long saved_gafr[2][4];
static unsigned long saved_gpdr[4];
static unsigned long saved_pgsr[4];

-static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state)
+static int pxa2xx_mfp_suspend(void)
{
int i;

@@ -365,7 +365,7 @@ static int pxa2xx_mfp_suspend(struct sys
return 0;
}

-static int pxa2xx_mfp_resume(struct sys_device *d)
+static void pxa2xx_mfp_resume(void)
{
int i;

@@ -376,15 +376,13 @@ static int pxa2xx_mfp_resume(struct sys_
PGSR(i) = saved_pgsr[i];
}
PSSR = PSSR_RDH | PSSR_PH;
- return 0;
}
#else
#define pxa2xx_mfp_suspend NULL
#define pxa2xx_mfp_resume NULL
#endif

-struct sysdev_class pxa2xx_mfp_sysclass = {
- .name = "mfp",
+struct syscore_ops pxa2xx_mfp_syscore_ops = {
.suspend = pxa2xx_mfp_suspend,
.resume = pxa2xx_mfp_resume,
};
@@ -409,6 +407,6 @@ static int __init pxa2xx_mfp_init(void)
for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++)
gpdr_lpm[i] = GPDR(i * 32);

- return sysdev_class_register(&pxa2xx_mfp_sysclass);
+ return 0;
}
postcore_initcall(pxa2xx_mfp_init);
Index: linux-2.6/arch/arm/mach-pxa/pxa25x.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/pxa25x.c
+++ linux-2.6/arch/arm/mach-pxa/pxa25x.c
@@ -21,7 +21,7 @@
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/suspend.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/irq.h>

#include <asm/mach/map.h>
@@ -350,21 +350,9 @@ static struct platform_device *pxa25x_de
&pxa_device_asoc_platform,
};

-static struct sys_device pxa25x_sysdev[] = {
- {
- .cls = &pxa_irq_sysclass,
- }, {
- .cls = &pxa2xx_mfp_sysclass,
- }, {
- .cls = &pxa_gpio_sysclass,
- }, {
- .cls = &pxa2xx_clock_sysclass,
- }
-};
-
static int __init pxa25x_init(void)
{
- int i, ret = 0;
+ int ret = 0;

if (cpu_is_pxa25x()) {

@@ -377,11 +365,10 @@ static int __init pxa25x_init(void)

pxa25x_init_pm();

- for (i = 0; i < ARRAY_SIZE(pxa25x_sysdev); i++) {
- ret = sysdev_register(&pxa25x_sysdev[i]);
- if (ret)
- pr_err("failed to register sysdev[%d]\n", i);
- }
+ register_syscore_ops(&pxa_irq_syscore_ops);
+ register_syscore_ops(&pxa2xx_mfp_syscore_ops);
+ register_syscore_ops(&pxa_gpio_syscore_ops);
+ register_syscore_ops(&pxa2xx_clock_syscore_ops);

ret = platform_add_devices(pxa25x_devices,
ARRAY_SIZE(pxa25x_devices));
Index: linux-2.6/arch/arm/mach-pxa/pxa27x.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/pxa27x.c
+++ linux-2.6/arch/arm/mach-pxa/pxa27x.c
@@ -16,7 +16,7 @@
#include <linux/init.h>
#include <linux/suspend.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/i2c/pxa-i2c.h>
@@ -428,21 +428,9 @@ static struct platform_device *devices[]
&pxa27x_device_pwm1,
};

-static struct sys_device pxa27x_sysdev[] = {
- {
- .cls = &pxa_irq_sysclass,
- }, {
- .cls = &pxa2xx_mfp_sysclass,
- }, {
- .cls = &pxa_gpio_sysclass,
- }, {
- .cls = &pxa2xx_clock_sysclass,
- }
-};
-
static int __init pxa27x_init(void)
{
- int i, ret = 0;
+ int ret = 0;

if (cpu_is_pxa27x()) {

@@ -455,11 +443,10 @@ static int __init pxa27x_init(void)

pxa27x_init_pm();

- for (i = 0; i < ARRAY_SIZE(pxa27x_sysdev); i++) {
- ret = sysdev_register(&pxa27x_sysdev[i]);
- if (ret)
- pr_err("failed to register sysdev[%d]\n", i);
- }
+ register_syscore_ops(&pxa_irq_syscore_ops);
+ register_syscore_ops(&pxa2xx_mfp_syscore_ops);
+ register_syscore_ops(&pxa_gpio_syscore_ops);
+ register_syscore_ops(&pxa2xx_clock_syscore_ops);

ret = platform_add_devices(devices, ARRAY_SIZE(devices));
}
Index: linux-2.6/arch/arm/mach-pxa/mioa701.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/mioa701.c
+++ linux-2.6/arch/arm/mach-pxa/mioa701.c
@@ -22,7 +22,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/input.h>
#include <linux/delay.h>
#include <linux/gpio_keys.h>
@@ -488,7 +488,7 @@ static void install_bootstrap(void)
}


-static int mioa701_sys_suspend(struct sys_device *sysdev, pm_message_t state)
+static int mioa701_sys_suspend(void)
{
int i = 0, is_bt_on;
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
@@ -514,7 +514,7 @@ static int mioa701_sys_suspend(struct sy
return 0;
}

-static int mioa701_sys_resume(struct sys_device *sysdev)
+static void mioa701_sys_resume(void)
{
int i = 0;
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
@@ -527,43 +527,18 @@ static int mioa701_sys_resume(struct sys
*mem_resume_enabler = save_buffer[i++];
*mem_resume_bt = save_buffer[i++];
*mem_resume_unknown = save_buffer[i++];
-
- return 0;
}

-static struct sysdev_class mioa701_sysclass = {
- .name = "mioa701",
-};
-
-static struct sys_device sysdev_bootstrap = {
- .cls = &mioa701_sysclass,
-};
-
-static struct sysdev_driver driver_bootstrap = {
- .suspend = &mioa701_sys_suspend,
- .resume = &mioa701_sys_resume,
+static struct syscore_ops mioa701_syscore_ops = {
+ .suspend = mioa701_sys_suspend,
+ .resume = mioa701_sys_resume,
};

static int __init bootstrap_init(void)
{
- int rc;
int save_size = mioa701_bootstrap_lg + (sizeof(u32) * 3);

- rc = sysdev_class_register(&mioa701_sysclass);
- if (rc) {
- printk(KERN_ERR "Failed registering mioa701 sys class\n");
- return -ENODEV;
- }
- rc = sysdev_register(&sysdev_bootstrap);
- if (rc) {
- printk(KERN_ERR "Failed registering mioa701 sys device\n");
- return -ENODEV;
- }
- rc = sysdev_driver_register(&mioa701_sysclass, &driver_bootstrap);
- if (rc) {
- printk(KERN_ERR "Failed registering PMU sys driver\n");
- return -ENODEV;
- }
+ register_syscore_ops(&mioa701_syscore_ops);

save_buffer = kmalloc(save_size, GFP_KERNEL);
if (!save_buffer)
@@ -576,9 +551,7 @@ static int __init bootstrap_init(void)
static void bootstrap_exit(void)
{
kfree(save_buffer);
- sysdev_driver_unregister(&mioa701_sysclass, &driver_bootstrap);
- sysdev_unregister(&sysdev_bootstrap);
- sysdev_class_unregister(&mioa701_sysclass);
+ unregister_syscore_ops(&mioa701_syscore_ops);

printk(KERN_CRIT "Unregistering mioa701 suspend will hang next"
"resume !!!\n");
Index: linux-2.6/arch/arm/mach-pxa/mainstone.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/mainstone.c
+++ linux-2.6/arch/arm/mach-pxa/mainstone.c
@@ -15,7 +15,7 @@

#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/bitops.h>
@@ -185,31 +185,21 @@ static void __init mainstone_init_irq(vo

#ifdef CONFIG_PM

-static int mainstone_irq_resume(struct sys_device *dev)
+static void mainstone_irq_resume(void)
{
MST_INTMSKENA = mainstone_irq_enabled;
- return 0;
}

-static struct sysdev_class mainstone_irq_sysclass = {
- .name = "cpld_irq",
+static struct syscore_ops mainstone_irq_syscore_ops = {
.resume = mainstone_irq_resume,
};

-static struct sys_device mainstone_irq_device = {
- .cls = &mainstone_irq_sysclass,
-};
-
static int __init mainstone_irq_device_init(void)
{
- int ret = -ENODEV;
+ if (machine_is_mainstone())
+ register_syscore_ops(&mainstone_irq_syscore_ops);

- if (machine_is_mainstone()) {
- ret = sysdev_class_register(&mainstone_irq_sysclass);
- if (ret == 0)
- ret = sysdev_register(&mainstone_irq_device);
- }
- return ret;
+ return 0;
}

device_initcall(mainstone_irq_device_init);
Index: linux-2.6/arch/arm/mach-pxa/cm-x2xx.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/cm-x2xx.c
+++ linux-2.6/arch/arm/mach-pxa/cm-x2xx.c
@@ -10,7 +10,7 @@
*/

#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/irq.h>
#include <linux/gpio.h>

@@ -388,7 +388,7 @@ static inline void cmx2xx_init_display(v
#ifdef CONFIG_PM
static unsigned long sleep_save_msc[10];

-static int cmx2xx_suspend(struct sys_device *dev, pm_message_t state)
+static int cmx2xx_suspend(void)
{
cmx2xx_pci_suspend();

@@ -412,7 +412,7 @@ static int cmx2xx_suspend(struct sys_dev
return 0;
}

-static int cmx2xx_resume(struct sys_device *dev)
+static void cmx2xx_resume(void)
{
cmx2xx_pci_resume();

@@ -420,27 +420,18 @@ static int cmx2xx_resume(struct sys_devi
__raw_writel(sleep_save_msc[0], MSC0);
__raw_writel(sleep_save_msc[1], MSC1);
__raw_writel(sleep_save_msc[2], MSC2);
-
- return 0;
}

-static struct sysdev_class cmx2xx_pm_sysclass = {
- .name = "pm",
+static struct syscore_ops cmx2xx_pm_syscore_ops = {
.resume = cmx2xx_resume,
.suspend = cmx2xx_suspend,
};

-static struct sys_device cmx2xx_pm_device = {
- .cls = &cmx2xx_pm_sysclass,
-};
-
static int __init cmx2xx_pm_init(void)
{
- int error;
- error = sysdev_class_register(&cmx2xx_pm_sysclass);
- if (error == 0)
- error = sysdev_register(&cmx2xx_pm_device);
- return error;
+ register_syscore_ops(&cmx2xx_pm_syscore_ops);
+
+ return 0;
}
#else
static int __init cmx2xx_pm_init(void) { return 0; }
Index: linux-2.6/arch/arm/mach-pxa/lpd270.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/lpd270.c
+++ linux-2.6/arch/arm/mach-pxa/lpd270.c
@@ -15,7 +15,7 @@

#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/bitops.h>
@@ -159,30 +159,22 @@ static void __init lpd270_init_irq(void)


#ifdef CONFIG_PM
-static int lpd270_irq_resume(struct sys_device *dev)
+static void lpd270_irq_resume(void)
{
__raw_writew(lpd270_irq_enabled, LPD270_INT_MASK);
- return 0;
}

-static struct sysdev_class lpd270_irq_sysclass = {
- .name = "cpld_irq",
+static struct syscore_ops lpd270_irq_syscore_ops = {
.resume = lpd270_irq_resume,
};

-static struct sys_device lpd270_irq_device = {
- .cls = &lpd270_irq_sysclass,
-};
-
static int __init lpd270_irq_device_init(void)
{
- int ret = -ENODEV;
if (machine_is_logicpd_pxa270()) {
- ret = sysdev_class_register(&lpd270_irq_sysclass);
- if (ret == 0)
- ret = sysdev_register(&lpd270_irq_device);
+ register_syscore_ops(&lpd270_irq_syscore_ops);
+ return 0;
}
- return ret;
+ return -ENODEV;
}

device_initcall(lpd270_irq_device_init);
Index: linux-2.6/arch/arm/mach-pxa/lubbock.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/lubbock.c
+++ linux-2.6/arch/arm/mach-pxa/lubbock.c
@@ -15,7 +15,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/major.h>
#include <linux/fb.h>
#include <linux/interrupt.h>
@@ -176,31 +176,22 @@ static void __init lubbock_init_irq(void

#ifdef CONFIG_PM

-static int lubbock_irq_resume(struct sys_device *dev)
+static void lubbock_irq_resume(void)
{
LUB_IRQ_MASK_EN = lubbock_irq_enabled;
- return 0;
}

-static struct sysdev_class lubbock_irq_sysclass = {
- .name = "cpld_irq",
+static struct syscore_ops lubbock_irq_syscore_ops = {
.resume = lubbock_irq_resume,
};

-static struct sys_device lubbock_irq_device = {
- .cls = &lubbock_irq_sysclass,
-};
-
static int __init lubbock_irq_device_init(void)
{
- int ret = -ENODEV;
-
if (machine_is_lubbock()) {
- ret = sysdev_class_register(&lubbock_irq_sysclass);
- if (ret == 0)
- ret = sysdev_register(&lubbock_irq_device);
+ register_syscore_ops(&lubbock_irq_syscore_ops);
+ return 0;
}
- return ret;
+ return -ENODEV;
}

device_initcall(lubbock_irq_device_init);
Index: linux-2.6/arch/arm/mach-pxa/viper.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/viper.c
+++ linux-2.6/arch/arm/mach-pxa/viper.c
@@ -44,6 +44,7 @@
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
+#include <linux/syscore_ops.h>

#include <mach/pxa25x.h>
#include <mach/audio.h>
@@ -130,20 +131,19 @@ static u8 viper_hw_version(void)
return v1;
}

-/* CPU sysdev */
-static int viper_cpu_suspend(struct sys_device *sysdev, pm_message_t state)
+/* CPU system core operations. */
+static int viper_cpu_suspend(void)
{
viper_icr_set_bit(VIPER_ICR_R_DIS);
return 0;
}

-static int viper_cpu_resume(struct sys_device *sysdev)
+static void viper_cpu_resume(void)
{
viper_icr_clear_bit(VIPER_ICR_R_DIS);
- return 0;
}

-static struct sysdev_driver viper_cpu_sysdev_driver = {
+static struct syscore_ops viper_cpu_syscore_ops = {
.suspend = viper_cpu_suspend,
.resume = viper_cpu_resume,
};
@@ -945,7 +945,7 @@ static void __init viper_init(void)
viper_init_vcore_gpios();
viper_init_cpufreq();

- sysdev_driver_register(&cpu_sysdev_class, &viper_cpu_sysdev_driver);
+ register_syscore_ops(&viper_cpu_syscore_ops);

if (version) {
pr_info("viper: hardware v%di%d detected. "
Index: linux-2.6/arch/arm/mach-pxa/palmz72.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/palmz72.c
+++ linux-2.6/arch/arm/mach-pxa/palmz72.c
@@ -19,7 +19,7 @@
*/

#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/gpio_keys.h>
@@ -233,9 +233,9 @@ static struct palmz72_resume_info palmz7

static unsigned long store_ptr;

-/* sys_device for Palm Zire 72 PM */
+/* syscore_ops for Palm Zire 72 PM */

-static int palmz72_pm_suspend(struct sys_device *dev, pm_message_t msg)
+static int palmz72_pm_suspend(void)
{
/* setup the resume_info struct for the original bootloader */
palmz72_resume_info.resume_addr = (u32) cpu_resume;
@@ -249,31 +249,23 @@ static int palmz72_pm_suspend(struct sys
return 0;
}

-static int palmz72_pm_resume(struct sys_device *dev)
+static void palmz72_pm_resume(void)
{
*PALMZ72_SAVE_DWORD = store_ptr;
- return 0;
}

-static struct sysdev_class palmz72_pm_sysclass = {
- .name = "palmz72_pm",
+static struct syscore_ops palmz72_pm_syscore_ops = {
.suspend = palmz72_pm_suspend,
.resume = palmz72_pm_resume,
};

-static struct sys_device palmz72_pm_device = {
- .cls = &palmz72_pm_sysclass,
-};
-
static int __init palmz72_pm_init(void)
{
- int ret = -ENODEV;
if (machine_is_palmz72()) {
- ret = sysdev_class_register(&palmz72_pm_sysclass);
- if (ret == 0)
- ret = sysdev_register(&palmz72_pm_device);
+ register_syscore_ops(&palmz72_pm_syscore_ops);
+ return 0;
}
- return ret;
+ return -ENODEV;
}

device_initcall(palmz72_pm_init);
Index: linux-2.6/arch/arm/mach-pxa/smemc.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/smemc.c
+++ linux-2.6/arch/arm/mach-pxa/smemc.c
@@ -6,7 +6,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/hardware.h>
#include <mach/smemc.h>
@@ -16,7 +16,7 @@ static unsigned long msc[2];
static unsigned long sxcnfg, memclkcfg;
static unsigned long csadrcfg[4];

-static int pxa3xx_smemc_suspend(struct sys_device *dev, pm_message_t state)
+static int pxa3xx_smemc_suspend(void)
{
msc[0] = __raw_readl(MSC0);
msc[1] = __raw_readl(MSC1);
@@ -30,7 +30,7 @@ static int pxa3xx_smemc_suspend(struct s
return 0;
}

-static int pxa3xx_smemc_resume(struct sys_device *dev)
+static void pxa3xx_smemc_resume(void)
{
__raw_writel(msc[0], MSC0);
__raw_writel(msc[1], MSC1);
@@ -40,34 +40,19 @@ static int pxa3xx_smemc_resume(struct sy
__raw_writel(csadrcfg[1], CSADRCFG1);
__raw_writel(csadrcfg[2], CSADRCFG2);
__raw_writel(csadrcfg[3], CSADRCFG3);
-
- return 0;
}

-static struct sysdev_class smemc_sysclass = {
- .name = "smemc",
+static struct syscore_ops smemc_syscore_ops = {
.suspend = pxa3xx_smemc_suspend,
.resume = pxa3xx_smemc_resume,
};

-static struct sys_device smemc_sysdev = {
- .id = 0,
- .cls = &smemc_sysclass,
-};
-
static int __init smemc_init(void)
{
- int ret = 0;
+ if (cpu_is_pxa3xx())
+ register_syscore_ops(&smemc_syscore_ops);

- if (cpu_is_pxa3xx()) {
- ret = sysdev_class_register(&smemc_sysclass);
- if (ret)
- return ret;
-
- ret = sysdev_register(&smemc_sysdev);
- }
-
- return ret;
+ return 0;
}
subsys_initcall(smemc_init);
#endif
Index: linux-2.6/arch/arm/mach-pxa/palmtreo.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/palmtreo.c
+++ linux-2.6/arch/arm/mach-pxa/palmtreo.c
@@ -25,7 +25,6 @@
#include <linux/pwm_backlight.h>
#include <linux/gpio.h>
#include <linux/power_supply.h>
-#include <linux/sysdev.h>
#include <linux/w1-gpio.h>

#include <asm/mach-types.h>
Index: linux-2.6/arch/arm/mach-pxa/palmld.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/palmld.c
+++ linux-2.6/arch/arm/mach-pxa/palmld.c
@@ -24,7 +24,6 @@
#include <linux/gpio.h>
#include <linux/wm97xx.h>
#include <linux/power_supply.h>
-#include <linux/sysdev.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
Index: linux-2.6/arch/arm/mach-pxa/colibri-pxa270.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/colibri-pxa270.c
+++ linux-2.6/arch/arm/mach-pxa/colibri-pxa270.c
@@ -17,7 +17,6 @@
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/ucb1400.h>

#include <asm/mach/arch.h>
Index: linux-2.6/arch/arm/mach-pxa/raumfeld.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/raumfeld.c
+++ linux-2.6/arch/arm/mach-pxa/raumfeld.c
@@ -18,7 +18,6 @@

#include <linux/init.h>
#include <linux/kernel.h>
-#include <linux/sysdev.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
Index: linux-2.6/arch/arm/mach-pxa/cm-x270.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/cm-x270.c
+++ linux-2.6/arch/arm/mach-pxa/cm-x270.c
@@ -10,7 +10,6 @@
*/

#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include <linux/delay.h>
Index: linux-2.6/arch/arm/mach-pxa/trizeps4.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/trizeps4.c
+++ linux-2.6/arch/arm/mach-pxa/trizeps4.c
@@ -15,7 +15,6 @@
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/bitops.h>
Index: linux-2.6/arch/arm/mach-pxa/colibri-evalboard.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/colibri-evalboard.c
+++ linux-2.6/arch/arm/mach-pxa/colibri-evalboard.c
@@ -13,7 +13,6 @@
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <asm/mach-types.h>
Index: linux-2.6/arch/arm/mach-pxa/vpac270.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/vpac270.c
+++ linux-2.6/arch/arm/mach-pxa/vpac270.c
@@ -16,7 +16,6 @@
#include <linux/gpio_keys.h>
#include <linux/input.h>
#include <linux/gpio.h>
-#include <linux/sysdev.h>
#include <linux/usb/gpio_vbus.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
Index: linux-2.6/arch/arm/mach-pxa/colibri-pxa270-income.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/colibri-pxa270-income.c
+++ linux-2.6/arch/arm/mach-pxa/colibri-pxa270-income.c
@@ -22,7 +22,6 @@
#include <linux/platform_device.h>
#include <linux/pwm_backlight.h>
#include <linux/i2c/pxa-i2c.h>
-#include <linux/sysdev.h>

#include <asm/irq.h>
#include <asm/mach-types.h>
Index: linux-2.6/arch/arm/mach-pxa/balloon3.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-pxa/balloon3.c
+++ linux-2.6/arch/arm/mach-pxa/balloon3.c
@@ -15,7 +15,6 @@

#include <linux/init.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/bitops.h>
Index: linux-2.6/arch/arm/plat-pxa/mfp.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-pxa/mfp.c
+++ linux-2.6/arch/arm/plat-pxa/mfp.c
@@ -17,7 +17,6 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
-#include <linux/sysdev.h>

#include <plat/mfp.h>

2011-04-17 21:17:21

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 12/14] PM / UNICORE32: Use struct syscore_ops instead of sysdevs for PM

From: Rafael J. Wysocki <[email protected]>

Make some UNICORE32 architecture's code use struct syscore_ops
objects for power management instead of sysdev classes and sysdevs.

This simplifies the code and reduces the kernel's memory footprint.
It also is necessary for removing sysdevs from the kernel entirely in
the future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/unicore32/kernel/irq.c | 23 ++++++++---------------
1 file changed, 8 insertions(+), 15 deletions(-)

Index: linux-2.6/arch/unicore32/kernel/irq.c
===================================================================
--- linux-2.6.orig/arch/unicore32/kernel/irq.c
+++ linux-2.6/arch/unicore32/kernel/irq.c
@@ -23,7 +23,7 @@
#include <linux/list.h>
#include <linux/kallsyms.h>
#include <linux/proc_fs.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/gpio.h>

#include <asm/system.h>
@@ -237,7 +237,7 @@ static struct puv3_irq_state {
unsigned int iccr;
} puv3_irq_state;

-static int puv3_irq_suspend(struct sys_device *dev, pm_message_t state)
+static int puv3_irq_suspend(void)
{
struct puv3_irq_state *st = &puv3_irq_state;

@@ -265,7 +265,7 @@ static int puv3_irq_suspend(struct sys_d
return 0;
}

-static int puv3_irq_resume(struct sys_device *dev)
+static void puv3_irq_resume(void)
{
struct puv3_irq_state *st = &puv3_irq_state;

@@ -278,27 +278,20 @@ static int puv3_irq_resume(struct sys_de

writel(st->icmr, INTC_ICMR);
}
- return 0;
}

-static struct sysdev_class puv3_irq_sysclass = {
- .name = "pkunity-irq",
+static struct syscore_ops puv3_irq_syscore_ops = {
.suspend = puv3_irq_suspend,
.resume = puv3_irq_resume,
};

-static struct sys_device puv3_irq_device = {
- .id = 0,
- .cls = &puv3_irq_sysclass,
-};
-
-static int __init puv3_irq_init_devicefs(void)
+static int __init puv3_irq_init_syscore(void)
{
- sysdev_class_register(&puv3_irq_sysclass);
- return sysdev_register(&puv3_irq_device);
+ register_syscore_ops(&puv3_irq_syscore_ops);
+ return 0;
}

-device_initcall(puv3_irq_init_devicefs);
+device_initcall(puv3_irq_init_syscore);

void __init init_IRQ(void)
{

2011-04-17 21:17:39

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 10/14] PM / MIPS: Use struct syscore_ops instead of sysdevs for PM

From: Rafael J. Wysocki <[email protected]>

Convert some MIPS architecture's code to using struct syscore_ops
objects for power management instead of sysdev classes and sysdevs.

This simplifies the code and reduces the kernel's memory footprint.
It also is necessary for removing sysdevs from the kernel entirely in
the future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/mips/alchemy/common/dbdma.c | 92 +++++++++++----------------------------
arch/mips/alchemy/common/irq.c | 62 +++++++++-----------------
arch/mips/jz4740/gpio.c | 52 +++++++++-------------
arch/mips/kernel/i8259.c | 26 +++--------
4 files changed, 80 insertions(+), 152 deletions(-)

Index: linux-2.6/arch/mips/alchemy/common/irq.c
===================================================================
--- linux-2.6.orig/arch/mips/alchemy/common/irq.c
+++ linux-2.6/arch/mips/alchemy/common/irq.c
@@ -30,7 +30,7 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/slab.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <asm/irq_cpu.h>
#include <asm/mipsregs.h>
@@ -556,17 +556,15 @@ void __init arch_init_irq(void)
}
}

-struct alchemy_ic_sysdev {
- struct sys_device sysdev;
+struct alchemy_ic {
void __iomem *base;
unsigned long pmdata[7];
};

-static int alchemy_ic_suspend(struct sys_device *dev, pm_message_t state)
-{
- struct alchemy_ic_sysdev *icdev =
- container_of(dev, struct alchemy_ic_sysdev, sysdev);
+static struct alchemy_ic alchemy_ic_data[2];

+static void alchemy_suspend_one_ic(struct alchemy_ic *icdev)
+{
icdev->pmdata[0] = __raw_readl(icdev->base + IC_CFG0RD);
icdev->pmdata[1] = __raw_readl(icdev->base + IC_CFG1RD);
icdev->pmdata[2] = __raw_readl(icdev->base + IC_CFG2RD);
@@ -574,15 +572,17 @@ static int alchemy_ic_suspend(struct sys
icdev->pmdata[4] = __raw_readl(icdev->base + IC_ASSIGNRD);
icdev->pmdata[5] = __raw_readl(icdev->base + IC_WAKERD);
icdev->pmdata[6] = __raw_readl(icdev->base + IC_MASKRD);
+}

+static int alchemy_ic_suspend(void)
+{
+ alchemy_suspend_one_ic(alchemy_ic_data);
+ alchemy_suspend_one_ic(alchemy_ic_data + 1);
return 0;
}

-static int alchemy_ic_resume(struct sys_device *dev)
+static void alchemy_resume_one_ic(struct alchemy_ic *icdev)
{
- struct alchemy_ic_sysdev *icdev =
- container_of(dev, struct alchemy_ic_sysdev, sysdev);
-
__raw_writel(0xffffffff, icdev->base + IC_MASKCLR);
__raw_writel(0xffffffff, icdev->base + IC_CFG0CLR);
__raw_writel(0xffffffff, icdev->base + IC_CFG1CLR);
@@ -604,42 +604,26 @@ static int alchemy_ic_resume(struct sys_

__raw_writel(icdev->pmdata[6], icdev->base + IC_MASKSET);
wmb();
+}

- return 0;
+static void alchemy_ic_resume(void)
+{
+ alchemy_resume_one_ic(alchemy_ic_data + 1);
+ alchemy_resume_one_ic(alchemy_ic_data);
}

-static struct sysdev_class alchemy_ic_sysdev_class = {
- .name = "ic",
+static struct syscore_ops alchemy_ic_syscore_ops = {
.suspend = alchemy_ic_suspend,
.resume = alchemy_ic_resume,
};

-static int __init alchemy_ic_sysdev_init(void)
+static int __init alchemy_ic_syscore_init(void)
{
- struct alchemy_ic_sysdev *icdev;
- unsigned long icbase[2] = { IC0_PHYS_ADDR, IC1_PHYS_ADDR };
- int err, i;
-
- err = sysdev_class_register(&alchemy_ic_sysdev_class);
- if (err)
- return err;
-
- for (i = 0; i < 2; i++) {
- icdev = kzalloc(sizeof(struct alchemy_ic_sysdev), GFP_KERNEL);
- if (!icdev)
- return -ENOMEM;
-
- icdev->base = ioremap(icbase[i], 0x1000);
-
- icdev->sysdev.id = i;
- icdev->sysdev.cls = &alchemy_ic_sysdev_class;
- err = sysdev_register(&icdev->sysdev);
- if (err) {
- kfree(icdev);
- return err;
- }
- }
+ alchemy_ic_data[0].base = ioremap(icbase[IC0_PHYS_ADDR], 0x1000);
+ alchemy_ic_data[1].base = ioremap(icbase[IC1_PHYS_ADDR], 0x1000);
+
+ register_syscore_ops(&alchemy_ic_syscore_ops);

return 0;
}
-device_initcall(alchemy_ic_sysdev_init);
+device_initcall(alchemy_ic_syscore_init);
Index: linux-2.6/arch/mips/alchemy/common/dbdma.c
===================================================================
--- linux-2.6.orig/arch/mips/alchemy/common/dbdma.c
+++ linux-2.6/arch/mips/alchemy/common/dbdma.c
@@ -36,7 +36,7 @@
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#include <linux/module.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <asm/mach-au1x00/au1000.h>
#include <asm/mach-au1x00/au1xxx_dbdma.h>

@@ -957,37 +957,30 @@ u32 au1xxx_dbdma_put_dscr(u32 chanid, au
return nbytes;
}

+static u32 alchemy_dbdma_pm_regs[NUM_DBDMA_CHANS + 1][6];

-struct alchemy_dbdma_sysdev {
- struct sys_device sysdev;
- u32 pm_regs[NUM_DBDMA_CHANS + 1][6];
-};
-
-static int alchemy_dbdma_suspend(struct sys_device *dev,
- pm_message_t state)
+static int alchemy_dbdma_suspend(void)
{
- struct alchemy_dbdma_sysdev *sdev =
- container_of(dev, struct alchemy_dbdma_sysdev, sysdev);
int i;
u32 addr;

addr = DDMA_GLOBAL_BASE;
- sdev->pm_regs[0][0] = au_readl(addr + 0x00);
- sdev->pm_regs[0][1] = au_readl(addr + 0x04);
- sdev->pm_regs[0][2] = au_readl(addr + 0x08);
- sdev->pm_regs[0][3] = au_readl(addr + 0x0c);
+ alchemy_dbdma_pm_regs[0][0] = au_readl(addr + 0x00);
+ alchemy_dbdma_pm_regs[0][1] = au_readl(addr + 0x04);
+ alchemy_dbdma_pm_regs[0][2] = au_readl(addr + 0x08);
+ alchemy_dbdma_pm_regs[0][3] = au_readl(addr + 0x0c);

/* save channel configurations */
for (i = 1, addr = DDMA_CHANNEL_BASE; i <= NUM_DBDMA_CHANS; i++) {
- sdev->pm_regs[i][0] = au_readl(addr + 0x00);
- sdev->pm_regs[i][1] = au_readl(addr + 0x04);
- sdev->pm_regs[i][2] = au_readl(addr + 0x08);
- sdev->pm_regs[i][3] = au_readl(addr + 0x0c);
- sdev->pm_regs[i][4] = au_readl(addr + 0x10);
- sdev->pm_regs[i][5] = au_readl(addr + 0x14);
+ alchemy_dbdma_pm_regs[i][0] = au_readl(addr + 0x00);
+ alchemy_dbdma_pm_regs[i][1] = au_readl(addr + 0x04);
+ alchemy_dbdma_pm_regs[i][2] = au_readl(addr + 0x08);
+ alchemy_dbdma_pm_regs[i][3] = au_readl(addr + 0x0c);
+ alchemy_dbdma_pm_regs[i][4] = au_readl(addr + 0x10);
+ alchemy_dbdma_pm_regs[i][5] = au_readl(addr + 0x14);

/* halt channel */
- au_writel(sdev->pm_regs[i][0] & ~1, addr + 0x00);
+ au_writel(alchemy_dbdma_pm_regs[i][0] & ~1, addr + 0x00);
au_sync();
while (!(au_readl(addr + 0x14) & 1))
au_sync();
@@ -1001,62 +994,35 @@ static int alchemy_dbdma_suspend(struct
return 0;
}

-static int alchemy_dbdma_resume(struct sys_device *dev)
+static void alchemy_dbdma_resume(void)
{
- struct alchemy_dbdma_sysdev *sdev =
- container_of(dev, struct alchemy_dbdma_sysdev, sysdev);
int i;
u32 addr;

addr = DDMA_GLOBAL_BASE;
- au_writel(sdev->pm_regs[0][0], addr + 0x00);
- au_writel(sdev->pm_regs[0][1], addr + 0x04);
- au_writel(sdev->pm_regs[0][2], addr + 0x08);
- au_writel(sdev->pm_regs[0][3], addr + 0x0c);
+ au_writel(alchemy_dbdma_pm_regs[0][0], addr + 0x00);
+ au_writel(alchemy_dbdma_pm_regs[0][1], addr + 0x04);
+ au_writel(alchemy_dbdma_pm_regs[0][2], addr + 0x08);
+ au_writel(alchemy_dbdma_pm_regs[0][3], addr + 0x0c);

/* restore channel configurations */
for (i = 1, addr = DDMA_CHANNEL_BASE; i <= NUM_DBDMA_CHANS; i++) {
- au_writel(sdev->pm_regs[i][0], addr + 0x00);
- au_writel(sdev->pm_regs[i][1], addr + 0x04);
- au_writel(sdev->pm_regs[i][2], addr + 0x08);
- au_writel(sdev->pm_regs[i][3], addr + 0x0c);
- au_writel(sdev->pm_regs[i][4], addr + 0x10);
- au_writel(sdev->pm_regs[i][5], addr + 0x14);
+ au_writel(alchemy_dbdma_pm_regs[i][0], addr + 0x00);
+ au_writel(alchemy_dbdma_pm_regs[i][1], addr + 0x04);
+ au_writel(alchemy_dbdma_pm_regs[i][2], addr + 0x08);
+ au_writel(alchemy_dbdma_pm_regs[i][3], addr + 0x0c);
+ au_writel(alchemy_dbdma_pm_regs[i][4], addr + 0x10);
+ au_writel(alchemy_dbdma_pm_regs[i][5], addr + 0x14);
au_sync();
addr += 0x100; /* next channel base */
}
-
- return 0;
}

-static struct sysdev_class alchemy_dbdma_sysdev_class = {
- .name = "dbdma",
+static struct syscore_ops alchemy_dbdma_syscore_ops = {
.suspend = alchemy_dbdma_suspend,
.resume = alchemy_dbdma_resume,
};

-static int __init alchemy_dbdma_sysdev_init(void)
-{
- struct alchemy_dbdma_sysdev *sdev;
- int ret;
-
- ret = sysdev_class_register(&alchemy_dbdma_sysdev_class);
- if (ret)
- return ret;
-
- sdev = kzalloc(sizeof(struct alchemy_dbdma_sysdev), GFP_KERNEL);
- if (!sdev)
- return -ENOMEM;
-
- sdev->sysdev.id = -1;
- sdev->sysdev.cls = &alchemy_dbdma_sysdev_class;
- ret = sysdev_register(&sdev->sysdev);
- if (ret)
- kfree(sdev);
-
- return ret;
-}
-
static int __init au1xxx_dbdma_init(void)
{
int irq_nr, ret;
@@ -1084,11 +1050,7 @@ static int __init au1xxx_dbdma_init(void
else {
dbdma_initialized = 1;
printk(KERN_INFO "Alchemy DBDMA initialized\n");
- ret = alchemy_dbdma_sysdev_init();
- if (ret) {
- printk(KERN_ERR "DBDMA PM init failed\n");
- ret = 0;
- }
+ register_syscore_ops(&alchemy_dbdma_syscore_ops);
}

return ret;
Index: linux-2.6/arch/mips/jz4740/gpio.c
===================================================================
--- linux-2.6.orig/arch/mips/jz4740/gpio.c
+++ linux-2.6/arch/mips/jz4740/gpio.c
@@ -18,7 +18,7 @@
#include <linux/init.h>

#include <linux/spinlock.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/delay.h>
@@ -86,7 +86,6 @@ struct jz_gpio_chip {
spinlock_t lock;

struct gpio_chip gpio_chip;
- struct sys_device sysdev;
};

static struct jz_gpio_chip jz4740_gpio_chips[];
@@ -459,49 +458,47 @@ static struct jz_gpio_chip jz4740_gpio_c
JZ4740_GPIO_CHIP(D),
};

-static inline struct jz_gpio_chip *sysdev_to_chip(struct sys_device *dev)
+static void jz4740_gpio_suspend_chip(struct jz_gpio_chip *chip)
{
- return container_of(dev, struct jz_gpio_chip, sysdev);
+ chip->suspend_mask = readl(chip->base + JZ_REG_GPIO_MASK);
+ writel(~(chip->wakeup), chip->base + JZ_REG_GPIO_MASK_SET);
+ writel(chip->wakeup, chip->base + JZ_REG_GPIO_MASK_CLEAR);
}

-static int jz4740_gpio_suspend(struct sys_device *dev, pm_message_t state)
+static int jz4740_gpio_suspend(void)
{
- struct jz_gpio_chip *chip = sysdev_to_chip(dev);
+ int i;

- chip->suspend_mask = readl(chip->base + JZ_REG_GPIO_MASK);
- writel(~(chip->wakeup), chip->base + JZ_REG_GPIO_MASK_SET);
- writel(chip->wakeup, chip->base + JZ_REG_GPIO_MASK_CLEAR);
+ for (i = 0; i < ARRAY_SIZE(jz4740_gpio_chips); i++)
+ jz4740_gpio_suspend_chip(&jz4740_gpio_chips[i]);

return 0;
}

-static int jz4740_gpio_resume(struct sys_device *dev)
+static void jz4740_gpio_resume_chip(struct jz_gpio_chip *chip)
{
- struct jz_gpio_chip *chip = sysdev_to_chip(dev);
uint32_t mask = chip->suspend_mask;

writel(~mask, chip->base + JZ_REG_GPIO_MASK_CLEAR);
writel(mask, chip->base + JZ_REG_GPIO_MASK_SET);
+}

- return 0;
+static void jz4740_gpio_resume(void)
+{
+ int i;
+
+ for (i = ARRAY_SIZE(jz4740_gpio_chips) - 1; i >= 0 ; i--)
+ jz4740_gpio_resume_chip(&jz4740_gpio_chips[i]);
}

-static struct sysdev_class jz4740_gpio_sysdev_class = {
- .name = "gpio",
+static struct syscore_ops jz4740_gpio_syscore_ops = {
.suspend = jz4740_gpio_suspend,
.resume = jz4740_gpio_resume,
};

-static int jz4740_gpio_chip_init(struct jz_gpio_chip *chip, unsigned int id)
+static void jz4740_gpio_chip_init(struct jz_gpio_chip *chip, unsigned int id)
{
- int ret, irq;
-
- chip->sysdev.id = id;
- chip->sysdev.cls = &jz4740_gpio_sysdev_class;
- ret = sysdev_register(&chip->sysdev);
-
- if (ret)
- return ret;
+ int irq;

spin_lock_init(&chip->lock);

@@ -519,22 +516,17 @@ static int jz4740_gpio_chip_init(struct
irq_set_chip_and_handler(irq, &jz_gpio_irq_chip,
handle_level_irq);
}
-
- return 0;
}

static int __init jz4740_gpio_init(void)
{
unsigned int i;
- int ret;
-
- ret = sysdev_class_register(&jz4740_gpio_sysdev_class);
- if (ret)
- return ret;

for (i = 0; i < ARRAY_SIZE(jz4740_gpio_chips); ++i)
jz4740_gpio_chip_init(&jz4740_gpio_chips[i], i);

+ register_syscore_ops(&jz4740_gpio_syscore_ops);
+
printk(KERN_INFO "JZ4740 GPIO initialized\n");

return 0;
Index: linux-2.6/arch/mips/kernel/i8259.c
===================================================================
--- linux-2.6.orig/arch/mips/kernel/i8259.c
+++ linux-2.6/arch/mips/kernel/i8259.c
@@ -14,7 +14,7 @@
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/irq.h>

#include <asm/i8259.h>
@@ -215,14 +215,13 @@ spurious_8259A_irq:
}
}

-static int i8259A_resume(struct sys_device *dev)
+static void i8259A_resume(void)
{
if (i8259A_auto_eoi >= 0)
init_8259A(i8259A_auto_eoi);
- return 0;
}

-static int i8259A_shutdown(struct sys_device *dev)
+static void i8259A_shutdown(void)
{
/* Put the i8259A into a quiescent state that
* the kernel initialization code can get it
@@ -232,29 +231,20 @@ static int i8259A_shutdown(struct sys_de
outb(0xff, PIC_MASTER_IMR); /* mask all of 8259A-1 */
outb(0xff, PIC_SLAVE_IMR); /* mask all of 8259A-1 */
}
- return 0;
}

-static struct sysdev_class i8259_sysdev_class = {
- .name = "i8259",
+static struct syscore_ops i8259_syscore_ops = {
.resume = i8259A_resume,
.shutdown = i8259A_shutdown,
};

-static struct sys_device device_i8259A = {
- .id = 0,
- .cls = &i8259_sysdev_class,
-};
-
-static int __init i8259A_init_sysfs(void)
+static int __init i8259A_init_syscore(void)
{
- int error = sysdev_class_register(&i8259_sysdev_class);
- if (!error)
- error = sysdev_register(&device_i8259A);
- return error;
+ register_syscore_ops(&i8259_syscore_ops);
+ return 0;
}

-device_initcall(i8259A_init_sysfs);
+device_initcall(i8259A_init_syscore);

static void init_8259A(int auto_eoi)
{

2011-04-17 21:17:55

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 14/14] PM: Remove sysdev suspend, resume and shutdown operations

From: Rafael J. Wysocki <[email protected]>

Since suspend, resume and shutdown operations in struct sysdev_class
and struct sysdev_driver are not used any more, remove them. Also
drop sysdev_suspend(), sysdev_resume() and sysdev_shutdown() used
for executing those operations and modify all of their users
accordingly. This reduces kernel code size quite a bit and reduces
its complexity.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/sh/Kconfig | 1
arch/x86/Kconfig | 1
arch/x86/kernel/apm_32.c | 4
drivers/base/Kconfig | 7 -
drivers/base/base.h | 2
drivers/base/sys.c | 202 -----------------------------------------------
drivers/xen/manage.c | 8 -
include/linux/device.h | 7 -
include/linux/pm.h | 8 -
include/linux/sysdev.h | 11 --
kernel/kexec.c | 9 --
kernel/power/hibernate.c | 18 ----
kernel/power/suspend.c | 8 -
kernel/sys.c | 3
14 files changed, 7 insertions(+), 282 deletions(-)

Index: linux-2.6/drivers/base/sys.c
===================================================================
--- linux-2.6.orig/drivers/base/sys.c
+++ linux-2.6/drivers/base/sys.c
@@ -328,203 +328,8 @@ void sysdev_unregister(struct sys_device
kobject_put(&sysdev->kobj);
}

-
-#ifndef CONFIG_ARCH_NO_SYSDEV_OPS
-/**
- * sysdev_shutdown - Shut down all system devices.
- *
- * Loop over each class of system devices, and the devices in each
- * of those classes. For each device, we call the shutdown method for
- * each driver registered for the device - the auxiliaries,
- * and the class driver.
- *
- * Note: The list is iterated in reverse order, so that we shut down
- * child devices before we shut down their parents. The list ordering
- * is guaranteed by virtue of the fact that child devices are registered
- * after their parents.
- */
-void sysdev_shutdown(void)
-{
- struct sysdev_class *cls;
-
- pr_debug("Shutting Down System Devices\n");
-
- mutex_lock(&sysdev_drivers_lock);
- list_for_each_entry_reverse(cls, &system_kset->list, kset.kobj.entry) {
- struct sys_device *sysdev;
-
- pr_debug("Shutting down type '%s':\n",
- kobject_name(&cls->kset.kobj));
-
- list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) {
- struct sysdev_driver *drv;
- pr_debug(" %s\n", kobject_name(&sysdev->kobj));
-
- /* Call auxiliary drivers first */
- list_for_each_entry(drv, &cls->drivers, entry) {
- if (drv->shutdown)
- drv->shutdown(sysdev);
- }
-
- /* Now call the generic one */
- if (cls->shutdown)
- cls->shutdown(sysdev);
- }
- }
- mutex_unlock(&sysdev_drivers_lock);
-}
-
-static void __sysdev_resume(struct sys_device *dev)
-{
- struct sysdev_class *cls = dev->cls;
- struct sysdev_driver *drv;
-
- /* First, call the class-specific one */
- if (cls->resume)
- cls->resume(dev);
- WARN_ONCE(!irqs_disabled(),
- "Interrupts enabled after %pF\n", cls->resume);
-
- /* Call auxiliary drivers next. */
- list_for_each_entry(drv, &cls->drivers, entry) {
- if (drv->resume)
- drv->resume(dev);
- WARN_ONCE(!irqs_disabled(),
- "Interrupts enabled after %pF\n", drv->resume);
- }
-}
-
-/**
- * sysdev_suspend - Suspend all system devices.
- * @state: Power state to enter.
- *
- * We perform an almost identical operation as sysdev_shutdown()
- * above, though calling ->suspend() instead. Interrupts are disabled
- * when this called. Devices are responsible for both saving state and
- * quiescing or powering down the device.
- *
- * This is only called by the device PM core, so we let them handle
- * all synchronization.
- */
-int sysdev_suspend(pm_message_t state)
-{
- struct sysdev_class *cls;
- struct sys_device *sysdev, *err_dev;
- struct sysdev_driver *drv, *err_drv;
- int ret;
-
- pr_debug("Checking wake-up interrupts\n");
-
- /* Return error code if there are any wake-up interrupts pending */
- ret = check_wakeup_irqs();
- if (ret)
- return ret;
-
- WARN_ONCE(!irqs_disabled(),
- "Interrupts enabled while suspending system devices\n");
-
- pr_debug("Suspending System Devices\n");
-
- list_for_each_entry_reverse(cls, &system_kset->list, kset.kobj.entry) {
- pr_debug("Suspending type '%s':\n",
- kobject_name(&cls->kset.kobj));
-
- list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) {
- pr_debug(" %s\n", kobject_name(&sysdev->kobj));
-
- /* Call auxiliary drivers first */
- list_for_each_entry(drv, &cls->drivers, entry) {
- if (drv->suspend) {
- ret = drv->suspend(sysdev, state);
- if (ret)
- goto aux_driver;
- }
- WARN_ONCE(!irqs_disabled(),
- "Interrupts enabled after %pF\n",
- drv->suspend);
- }
-
- /* Now call the generic one */
- if (cls->suspend) {
- ret = cls->suspend(sysdev, state);
- if (ret)
- goto cls_driver;
- WARN_ONCE(!irqs_disabled(),
- "Interrupts enabled after %pF\n",
- cls->suspend);
- }
- }
- }
- return 0;
- /* resume current sysdev */
-cls_driver:
- drv = NULL;
- printk(KERN_ERR "Class suspend failed for %s: %d\n",
- kobject_name(&sysdev->kobj), ret);
-
-aux_driver:
- if (drv)
- printk(KERN_ERR "Class driver suspend failed for %s: %d\n",
- kobject_name(&sysdev->kobj), ret);
- list_for_each_entry(err_drv, &cls->drivers, entry) {
- if (err_drv == drv)
- break;
- if (err_drv->resume)
- err_drv->resume(sysdev);
- }
-
- /* resume other sysdevs in current class */
- list_for_each_entry(err_dev, &cls->kset.list, kobj.entry) {
- if (err_dev == sysdev)
- break;
- pr_debug(" %s\n", kobject_name(&err_dev->kobj));
- __sysdev_resume(err_dev);
- }
-
- /* resume other classes */
- list_for_each_entry_continue(cls, &system_kset->list, kset.kobj.entry) {
- list_for_each_entry(err_dev, &cls->kset.list, kobj.entry) {
- pr_debug(" %s\n", kobject_name(&err_dev->kobj));
- __sysdev_resume(err_dev);
- }
- }
- return ret;
-}
-EXPORT_SYMBOL_GPL(sysdev_suspend);
-
-/**
- * sysdev_resume - Bring system devices back to life.
- *
- * Similar to sysdev_suspend(), but we iterate the list forwards
- * to guarantee that parent devices are resumed before their children.
- *
- * Note: Interrupts are disabled when called.
- */
-int sysdev_resume(void)
-{
- struct sysdev_class *cls;
-
- WARN_ONCE(!irqs_disabled(),
- "Interrupts enabled while resuming system devices\n");
-
- pr_debug("Resuming System Devices\n");
-
- list_for_each_entry(cls, &system_kset->list, kset.kobj.entry) {
- struct sys_device *sysdev;
-
- pr_debug("Resuming type '%s':\n",
- kobject_name(&cls->kset.kobj));
-
- list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) {
- pr_debug(" %s\n", kobject_name(&sysdev->kobj));
-
- __sysdev_resume(sysdev);
- }
- }
- return 0;
-}
-EXPORT_SYMBOL_GPL(sysdev_resume);
-#endif /* CONFIG_ARCH_NO_SYSDEV_OPS */
+EXPORT_SYMBOL_GPL(sysdev_register);
+EXPORT_SYMBOL_GPL(sysdev_unregister);

int __init system_bus_init(void)
{
@@ -534,9 +339,6 @@ int __init system_bus_init(void)
return 0;
}

-EXPORT_SYMBOL_GPL(sysdev_register);
-EXPORT_SYMBOL_GPL(sysdev_unregister);
-
#define to_ext_attr(x) container_of(x, struct sysdev_ext_attribute, attr)

ssize_t sysdev_store_ulong(struct sys_device *sysdev,
Index: linux-2.6/kernel/power/suspend.c
===================================================================
--- linux-2.6.orig/kernel/power/suspend.c
+++ linux-2.6/kernel/power/suspend.c
@@ -163,19 +163,13 @@ static int suspend_enter(suspend_state_t
arch_suspend_disable_irqs();
BUG_ON(!irqs_disabled());

- error = sysdev_suspend(PMSG_SUSPEND);
- if (!error) {
- error = syscore_suspend();
- if (error)
- sysdev_resume();
- }
+ error = syscore_suspend();
if (!error) {
if (!(suspend_test(TEST_CORE) || pm_wakeup_pending())) {
error = suspend_ops->enter(state);
events_check_enabled = false;
}
syscore_resume();
- sysdev_resume();
}

arch_suspend_enable_irqs();
Index: linux-2.6/kernel/power/hibernate.c
===================================================================
--- linux-2.6.orig/kernel/power/hibernate.c
+++ linux-2.6/kernel/power/hibernate.c
@@ -272,12 +272,7 @@ static int create_image(int platform_mod

local_irq_disable();

- error = sysdev_suspend(PMSG_FREEZE);
- if (!error) {
- error = syscore_suspend();
- if (error)
- sysdev_resume();
- }
+ error = syscore_suspend();
if (error) {
printk(KERN_ERR "PM: Some system devices failed to power down, "
"aborting hibernation\n");
@@ -302,7 +297,6 @@ static int create_image(int platform_mod

Power_up:
syscore_resume();
- sysdev_resume();
/* NOTE: dpm_resume_noirq() is just a resume() for devices
* that suspended with irqs off ... no overall powerup.
*/
@@ -409,12 +403,7 @@ static int resume_target_kernel(bool pla

local_irq_disable();

- error = sysdev_suspend(PMSG_QUIESCE);
- if (!error) {
- error = syscore_suspend();
- if (error)
- sysdev_resume();
- }
+ error = syscore_suspend();
if (error)
goto Enable_irqs;

@@ -442,7 +431,6 @@ static int resume_target_kernel(bool pla
touch_softlockup_watchdog();

syscore_resume();
- sysdev_resume();

Enable_irqs:
local_irq_enable();
@@ -528,7 +516,6 @@ int hibernation_platform_enter(void)
goto Platform_finish;

local_irq_disable();
- sysdev_suspend(PMSG_HIBERNATE);
syscore_suspend();
if (pm_wakeup_pending()) {
error = -EAGAIN;
@@ -541,7 +528,6 @@ int hibernation_platform_enter(void)

Power_up:
syscore_resume();
- sysdev_resume();
local_irq_enable();
enable_nonboot_cpus();

Index: linux-2.6/kernel/kexec.c
===================================================================
--- linux-2.6.orig/kernel/kexec.c
+++ linux-2.6/kernel/kexec.c
@@ -1531,13 +1531,7 @@ int kernel_kexec(void)
if (error)
goto Enable_cpus;
local_irq_disable();
- /* Suspend system devices */
- error = sysdev_suspend(PMSG_FREEZE);
- if (!error) {
- error = syscore_suspend();
- if (error)
- sysdev_resume();
- }
+ error = syscore_suspend();
if (error)
goto Enable_irqs;
} else
@@ -1553,7 +1547,6 @@ int kernel_kexec(void)
#ifdef CONFIG_KEXEC_JUMP
if (kexec_image->preserve_context) {
syscore_resume();
- sysdev_resume();
Enable_irqs:
local_irq_enable();
Enable_cpus:
Index: linux-2.6/drivers/xen/manage.c
===================================================================
--- linux-2.6.orig/drivers/xen/manage.c
+++ linux-2.6/drivers/xen/manage.c
@@ -70,12 +70,7 @@ static int xen_suspend(void *data)

BUG_ON(!irqs_disabled());

- err = sysdev_suspend(PMSG_FREEZE);
- if (!err) {
- err = syscore_suspend();
- if (err)
- sysdev_resume();
- }
+ err = syscore_suspend();
if (err) {
printk(KERN_ERR "xen_suspend: system core suspend failed: %d\n",
err);
@@ -102,7 +97,6 @@ static int xen_suspend(void *data)
}

syscore_resume();
- sysdev_resume();

return 0;
}
Index: linux-2.6/kernel/sys.c
===================================================================
--- linux-2.6.orig/kernel/sys.c
+++ linux-2.6/kernel/sys.c
@@ -315,7 +315,6 @@ void kernel_restart_prepare(char *cmd)
blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
system_state = SYSTEM_RESTART;
device_shutdown();
- sysdev_shutdown();
syscore_shutdown();
}

@@ -354,7 +353,6 @@ static void kernel_shutdown_prepare(enum
void kernel_halt(void)
{
kernel_shutdown_prepare(SYSTEM_HALT);
- sysdev_shutdown();
syscore_shutdown();
printk(KERN_EMERG "System halted.\n");
kmsg_dump(KMSG_DUMP_HALT);
@@ -374,7 +372,6 @@ void kernel_power_off(void)
if (pm_power_off_prepare)
pm_power_off_prepare();
disable_nonboot_cpus();
- sysdev_shutdown();
syscore_shutdown();
printk(KERN_EMERG "Power down.\n");
kmsg_dump(KMSG_DUMP_POWEROFF);
Index: linux-2.6/drivers/base/base.h
===================================================================
--- linux-2.6.orig/drivers/base/base.h
+++ linux-2.6/drivers/base/base.h
@@ -111,8 +111,6 @@ static inline int driver_match_device(st
return drv->bus->match ? drv->bus->match(dev, drv) : 1;
}

-extern void sysdev_shutdown(void);
-
extern char *make_class_name(const char *name, struct kobject *kobj);

extern int devres_release_all(struct device *dev);
Index: linux-2.6/include/linux/device.h
===================================================================
--- linux-2.6.orig/include/linux/device.h
+++ linux-2.6/include/linux/device.h
@@ -633,13 +633,6 @@ static inline int devtmpfs_mount(const c
/* drivers/base/power/shutdown.c */
extern void device_shutdown(void);

-#ifndef CONFIG_ARCH_NO_SYSDEV_OPS
-/* drivers/base/sys.c */
-extern void sysdev_shutdown(void);
-#else
-static inline void sysdev_shutdown(void) { }
-#endif
-
/* debugging and troubleshooting/diagnostic helpers. */
extern const char *dev_driver_string(const struct device *dev);

Index: linux-2.6/include/linux/pm.h
===================================================================
--- linux-2.6.orig/include/linux/pm.h
+++ linux-2.6/include/linux/pm.h
@@ -530,14 +530,6 @@ struct dev_power_domain {
*/

#ifdef CONFIG_PM_SLEEP
-#ifndef CONFIG_ARCH_NO_SYSDEV_OPS
-extern int sysdev_suspend(pm_message_t state);
-extern int sysdev_resume(void);
-#else
-static inline int sysdev_suspend(pm_message_t state) { return 0; }
-static inline int sysdev_resume(void) { return 0; }
-#endif
-
extern void device_pm_lock(void);
extern void dpm_resume_noirq(pm_message_t state);
extern void dpm_resume_end(pm_message_t state);
Index: linux-2.6/arch/x86/kernel/apm_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/apm_32.c
+++ linux-2.6/arch/x86/kernel/apm_32.c
@@ -1238,7 +1238,6 @@ static int suspend(int vetoable)
dpm_suspend_noirq(PMSG_SUSPEND);

local_irq_disable();
- sysdev_suspend(PMSG_SUSPEND);
syscore_suspend();

local_irq_enable();
@@ -1258,7 +1257,6 @@ static int suspend(int vetoable)
err = (err == APM_SUCCESS) ? 0 : -EIO;

syscore_resume();
- sysdev_resume();
local_irq_enable();

dpm_resume_noirq(PMSG_RESUME);
@@ -1282,7 +1280,6 @@ static void standby(void)
dpm_suspend_noirq(PMSG_SUSPEND);

local_irq_disable();
- sysdev_suspend(PMSG_SUSPEND);
syscore_suspend();
local_irq_enable();

@@ -1292,7 +1289,6 @@ static void standby(void)

local_irq_disable();
syscore_resume();
- sysdev_resume();
local_irq_enable();

dpm_resume_noirq(PMSG_RESUME);
Index: linux-2.6/arch/x86/Kconfig
===================================================================
--- linux-2.6.orig/arch/x86/Kconfig
+++ linux-2.6/arch/x86/Kconfig
@@ -71,7 +71,6 @@ config X86
select GENERIC_IRQ_SHOW
select IRQ_FORCED_THREADING
select USE_GENERIC_SMP_HELPERS if SMP
- select ARCH_NO_SYSDEV_OPS

config INSTRUCTION_DECODER
def_bool (KPROBES || PERF_EVENTS)
Index: linux-2.6/arch/sh/Kconfig
===================================================================
--- linux-2.6.orig/arch/sh/Kconfig
+++ linux-2.6/arch/sh/Kconfig
@@ -24,7 +24,6 @@ config SUPERH
select RTC_LIB
select GENERIC_ATOMIC64
select GENERIC_IRQ_SHOW
- select ARCH_NO_SYSDEV_OPS
help
The SuperH is a RISC processor targeted for use in embedded systems
and consumer electronics; it was also used in the Sega Dreamcast
Index: linux-2.6/drivers/base/Kconfig
===================================================================
--- linux-2.6.orig/drivers/base/Kconfig
+++ linux-2.6/drivers/base/Kconfig
@@ -168,11 +168,4 @@ config SYS_HYPERVISOR
bool
default n

-config ARCH_NO_SYSDEV_OPS
- bool
- ---help---
- To be selected by architectures that don't use sysdev class or
- sysdev driver power management (suspend/resume) and shutdown
- operations.
-
endmenu
Index: linux-2.6/include/linux/sysdev.h
===================================================================
--- linux-2.6.orig/include/linux/sysdev.h
+++ linux-2.6/include/linux/sysdev.h
@@ -34,12 +34,6 @@ struct sysdev_class {
struct list_head drivers;
struct sysdev_class_attribute **attrs;
struct kset kset;
-#ifndef CONFIG_ARCH_NO_SYSDEV_OPS
- /* Default operations for these types of devices */
- int (*shutdown)(struct sys_device *);
- int (*suspend)(struct sys_device *, pm_message_t state);
- int (*resume)(struct sys_device *);
-#endif
};

struct sysdev_class_attribute {
@@ -77,11 +71,6 @@ struct sysdev_driver {
struct list_head entry;
int (*add)(struct sys_device *);
int (*remove)(struct sys_device *);
-#ifndef CONFIG_ARCH_NO_SYSDEV_OPS
- int (*shutdown)(struct sys_device *);
- int (*suspend)(struct sys_device *, pm_message_t state);
- int (*resume)(struct sys_device *);
-#endif
};


2011-04-17 21:18:03

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 13/14] PM / PowerPC: Use struct syscore_ops instead of sysdevs for PM

From: Rafael J. Wysocki <[email protected]>

Make some PowerPC architecture's code use struct syscore_ops
objects for power management instead of sysdev classes and sysdevs.

This simplifies the code and reduces the kernel's memory footprint.
It also is necessary for removing sysdevs from the kernel entirely in
the future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/powerpc/include/asm/mpic.h | 3 --
arch/powerpc/platforms/cell/spu_base.c | 28 ++++++++++++-------
arch/powerpc/platforms/powermac/pic.c | 42 +++++++---------------------
arch/powerpc/sysdev/ipic.c | 36 ++++++------------------
arch/powerpc/sysdev/mpic.c | 48 +++++++++++++++++----------------
5 files changed, 64 insertions(+), 93 deletions(-)

Index: linux-2.6/arch/powerpc/platforms/powermac/pic.c
===================================================================
--- linux-2.6.orig/arch/powerpc/platforms/powermac/pic.c
+++ linux-2.6/arch/powerpc/platforms/powermac/pic.c
@@ -21,7 +21,7 @@
#include <linux/signal.h>
#include <linux/pci.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/adb.h>
#include <linux/pmu.h>
#include <linux/module.h>
@@ -677,7 +677,7 @@ not_found:
return viaint;
}

-static int pmacpic_suspend(struct sys_device *sysdev, pm_message_t state)
+static int pmacpic_suspend(void)
{
int viaint = pmacpic_find_viaint();

@@ -698,7 +698,7 @@ static int pmacpic_suspend(struct sys_de
return 0;
}

-static int pmacpic_resume(struct sys_device *sysdev)
+static void pmacpic_resume(void)
{
int i;

@@ -709,39 +709,19 @@ static int pmacpic_resume(struct sys_dev
for (i = 0; i < max_real_irqs; ++i)
if (test_bit(i, sleep_save_mask))
pmac_unmask_irq(irq_get_irq_data(i));
-
- return 0;
}

-#endif /* CONFIG_PM && CONFIG_PPC32 */
-
-static struct sysdev_class pmacpic_sysclass = {
- .name = "pmac_pic",
+static struct syscore_ops pmacpic_syscore_ops = {
+ .suspend = pmacpic_suspend,
+ .resume = pmacpic_resume,
};

-static struct sys_device device_pmacpic = {
- .id = 0,
- .cls = &pmacpic_sysclass,
-};
-
-static struct sysdev_driver driver_pmacpic = {
-#if defined(CONFIG_PM) && defined(CONFIG_PPC32)
- .suspend = &pmacpic_suspend,
- .resume = &pmacpic_resume,
-#endif /* CONFIG_PM && CONFIG_PPC32 */
-};
-
-static int __init init_pmacpic_sysfs(void)
+static int __init init_pmacpic_syscore(void)
{
-#ifdef CONFIG_PPC32
- if (max_irqs == 0)
- return -ENODEV;
-#endif
- printk(KERN_DEBUG "Registering pmac pic with sysfs...\n");
- sysdev_class_register(&pmacpic_sysclass);
- sysdev_register(&device_pmacpic);
- sysdev_driver_register(&pmacpic_sysclass, &driver_pmacpic);
+ register_syscore_ops(&pmacpic_syscore_ops);
return 0;
}
-machine_subsys_initcall(powermac, init_pmacpic_sysfs);

+machine_subsys_initcall(powermac, init_pmacpic_syscore);
+
+#endif /* CONFIG_PM && CONFIG_PPC32 */
Index: linux-2.6/arch/powerpc/platforms/cell/spu_base.c
===================================================================
--- linux-2.6.orig/arch/powerpc/platforms/cell/spu_base.c
+++ linux-2.6/arch/powerpc/platforms/cell/spu_base.c
@@ -32,6 +32,7 @@
#include <linux/io.h>
#include <linux/mutex.h>
#include <linux/linux_logo.h>
+#include <linux/syscore_ops.h>
#include <asm/spu.h>
#include <asm/spu_priv1.h>
#include <asm/spu_csa.h>
@@ -521,18 +522,8 @@ void spu_init_channels(struct spu *spu)
}
EXPORT_SYMBOL_GPL(spu_init_channels);

-static int spu_shutdown(struct sys_device *sysdev)
-{
- struct spu *spu = container_of(sysdev, struct spu, sysdev);
-
- spu_free_irqs(spu);
- spu_destroy_spu(spu);
- return 0;
-}
-
static struct sysdev_class spu_sysdev_class = {
.name = "spu",
- .shutdown = spu_shutdown,
};

int spu_add_sysdev_attr(struct sysdev_attribute *attr)
@@ -797,6 +788,22 @@ static inline void crash_register_spus(s
}
#endif

+static void spu_shutdown(void)
+{
+ struct spu *spu;
+
+ mutex_lock(&spu_full_list_mutex);
+ list_for_each_entry(spu, &spu_full_list, full_list) {
+ spu_free_irqs(spu);
+ spu_destroy_spu(spu);
+ }
+ mutex_unlock(&spu_full_list_mutex);
+}
+
+static struct syscore_ops spu_syscore_ops = {
+ .shutdown = spu_shutdown,
+};
+
static int __init init_spu_base(void)
{
int i, ret = 0;
@@ -830,6 +837,7 @@ static int __init init_spu_base(void)
crash_register_spus(&spu_full_list);
mutex_unlock(&spu_full_list_mutex);
spu_add_sysdev_attr(&attr_stat);
+ register_syscore_ops(&spu_syscore_ops);

spu_init_affinity();

Index: linux-2.6/arch/powerpc/sysdev/ipic.c
===================================================================
--- linux-2.6.orig/arch/powerpc/sysdev/ipic.c
+++ linux-2.6/arch/powerpc/sysdev/ipic.c
@@ -18,7 +18,7 @@
#include <linux/stddef.h>
#include <linux/sched.h>
#include <linux/signal.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/device.h>
#include <linux/bootmem.h>
#include <linux/spinlock.h>
@@ -902,7 +902,7 @@ static struct {
u32 sercr;
} ipic_saved_state;

-static int ipic_suspend(struct sys_device *sdev, pm_message_t state)
+static int ipic_suspend(void)
{
struct ipic *ipic = primary_ipic;

@@ -933,7 +933,7 @@ static int ipic_suspend(struct sys_devic
return 0;
}

-static int ipic_resume(struct sys_device *sdev)
+static void ipic_resume(void)
{
struct ipic *ipic = primary_ipic;

@@ -949,44 +949,26 @@ static int ipic_resume(struct sys_device
ipic_write(ipic->regs, IPIC_SECNR, ipic_saved_state.secnr);
ipic_write(ipic->regs, IPIC_SERMR, ipic_saved_state.sermr);
ipic_write(ipic->regs, IPIC_SERCR, ipic_saved_state.sercr);
-
- return 0;
}
#else
#define ipic_suspend NULL
#define ipic_resume NULL
#endif

-static struct sysdev_class ipic_sysclass = {
- .name = "ipic",
+static struct syscore_ops ipic_syscore_ops = {
.suspend = ipic_suspend,
.resume = ipic_resume,
};

-static struct sys_device device_ipic = {
- .id = 0,
- .cls = &ipic_sysclass,
-};
-
-static int __init init_ipic_sysfs(void)
+static int __init init_ipic_syscore(void)
{
- int rc;
-
if (!primary_ipic || !primary_ipic->regs)
return -ENODEV;
- printk(KERN_DEBUG "Registering ipic with sysfs...\n");

- rc = sysdev_class_register(&ipic_sysclass);
- if (rc) {
- printk(KERN_ERR "Failed registering ipic sys class\n");
- return -ENODEV;
- }
- rc = sysdev_register(&device_ipic);
- if (rc) {
- printk(KERN_ERR "Failed registering ipic sys device\n");
- return -ENODEV;
- }
+ printk(KERN_DEBUG "Registering ipic system core operations\n");
+ register_syscore_ops(&ipic_syscore_ops);
+
return 0;
}

-subsys_initcall(init_ipic_sysfs);
+subsys_initcall(init_ipic_syscore);
Index: linux-2.6/arch/powerpc/sysdev/mpic.c
===================================================================
--- linux-2.6.orig/arch/powerpc/sysdev/mpic.c
+++ linux-2.6/arch/powerpc/sysdev/mpic.c
@@ -27,6 +27,7 @@
#include <linux/spinlock.h>
#include <linux/pci.h>
#include <linux/slab.h>
+#include <linux/syscore_ops.h>

#include <asm/ptrace.h>
#include <asm/signal.h>
@@ -1702,9 +1703,8 @@ void mpic_reset_core(int cpu)
#endif /* CONFIG_SMP */

#ifdef CONFIG_PM
-static int mpic_suspend(struct sys_device *dev, pm_message_t state)
+static void mpic_suspend_one(struct mpic *mpic)
{
- struct mpic *mpic = container_of(dev, struct mpic, sysdev);
int i;

for (i = 0; i < mpic->num_sources; i++) {
@@ -1713,13 +1713,22 @@ static int mpic_suspend(struct sys_devic
mpic->save_data[i].dest =
mpic_irq_read(i, MPIC_INFO(IRQ_DESTINATION));
}
+}
+
+static int mpic_suspend(void)
+{
+ struct mpic *mpic = mpics;
+
+ while (mpic) {
+ mpic_suspend_one(mpic);
+ mpic = mpic->next;
+ }

return 0;
}

-static int mpic_resume(struct sys_device *dev)
+static void mpic_resume_one(struct mpic *mpic)
{
- struct mpic *mpic = container_of(dev, struct mpic, sysdev);
int i;

for (i = 0; i < mpic->num_sources; i++) {
@@ -1746,33 +1755,28 @@ static int mpic_resume(struct sys_device
}
#endif
} /* end for loop */
+}

- return 0;
+static void mpic_resume(void)
+{
+ struct mpic *mpic = mpics;
+
+ while (mpic) {
+ mpic_resume_one(mpic);
+ mpic = mpic->next;
+ }
}
-#endif

-static struct sysdev_class mpic_sysclass = {
-#ifdef CONFIG_PM
+static struct syscore_ops mpic_syscore_ops = {
.resume = mpic_resume,
.suspend = mpic_suspend,
-#endif
- .name = "mpic",
};

static int mpic_init_sys(void)
{
- struct mpic *mpic = mpics;
- int error, id = 0;
-
- error = sysdev_class_register(&mpic_sysclass);
-
- while (mpic && !error) {
- mpic->sysdev.cls = &mpic_sysclass;
- mpic->sysdev.id = id++;
- error = sysdev_register(&mpic->sysdev);
- mpic = mpic->next;
- }
- return error;
+ register_syscore_ops(&mpic_syscore_ops);
+ return 0;
}

device_initcall(mpic_init_sys);
+#endif
Index: linux-2.6/arch/powerpc/include/asm/mpic.h
===================================================================
--- linux-2.6.orig/arch/powerpc/include/asm/mpic.h
+++ linux-2.6/arch/powerpc/include/asm/mpic.h
@@ -3,7 +3,6 @@
#ifdef __KERNEL__

#include <linux/irq.h>
-#include <linux/sysdev.h>
#include <asm/dcr.h>
#include <asm/msi_bitmap.h>

@@ -320,8 +319,6 @@ struct mpic
/* link */
struct mpic *next;

- struct sys_device sysdev;
-
#ifdef CONFIG_PM
struct mpic_irq_save *save_data;
#endif

2011-04-17 21:17:46

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 9/14] PM / Blackfin: Use struct syscore_ops instead of sysdevs for PM

From: Rafael J. Wysocki <[email protected]>

Convert some Blackfin architecture's code to using struct syscore_ops
objects for power management instead of sysdev classes and sysdevs.

This simplifies the code and reduces the kernel's memory footprint.
It also is necessary for removing sysdevs from the kernel entirely in
the future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/blackfin/kernel/nmi.c | 30 +++++++++---------------------
1 file changed, 9 insertions(+), 21 deletions(-)

Index: linux-2.6/arch/blackfin/kernel/nmi.c
===================================================================
--- linux-2.6.orig/arch/blackfin/kernel/nmi.c
+++ linux-2.6/arch/blackfin/kernel/nmi.c
@@ -12,7 +12,7 @@

#include <linux/bitops.h>
#include <linux/hardirq.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/pm.h>
#include <linux/nmi.h>
#include <linux/smp.h>
@@ -196,43 +196,31 @@ void touch_nmi_watchdog(void)

/* Suspend/resume support */
#ifdef CONFIG_PM
-static int nmi_wdt_suspend(struct sys_device *dev, pm_message_t state)
+static int nmi_wdt_suspend(void)
{
nmi_wdt_stop();
return 0;
}

-static int nmi_wdt_resume(struct sys_device *dev)
+static void nmi_wdt_resume(void)
{
if (nmi_active)
nmi_wdt_start();
- return 0;
}

-static struct sysdev_class nmi_sysclass = {
- .name = DRV_NAME,
+static struct syscore_ops nmi_syscore_ops = {
.resume = nmi_wdt_resume,
.suspend = nmi_wdt_suspend,
};

-static struct sys_device device_nmi_wdt = {
- .id = 0,
- .cls = &nmi_sysclass,
-};
-
-static int __init init_nmi_wdt_sysfs(void)
+static int __init init_nmi_wdt_syscore(void)
{
- int error;
-
- if (!nmi_active)
- return 0;
+ if (nmi_active)
+ register_syscore_ops(&nmi_syscore_ops);

- error = sysdev_class_register(&nmi_sysclass);
- if (!error)
- error = sysdev_register(&device_nmi_wdt);
- return error;
+ return 0;
}
-late_initcall(init_nmi_wdt_sysfs);
+late_initcall(init_nmi_wdt_syscore);

#endif /* CONFIG_PM */

2011-04-17 21:16:48

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 4/14] ARM / OMAP: Use struct syscore_ops for "core" power management

From: Rafael J. Wysocki <[email protected]>

Replace the sysdev class and struct sys_device used for power
management in the OMAP's GPIO code with a struct syscore_ops object
which is simpler.

Signed-off-by: Rafael J. Wysocki <[email protected]>
Acked-by: Kevin Hilman <[email protected]>
---
arch/arm/plat-omap/gpio.c | 35 +++++++++--------------------------
1 file changed, 9 insertions(+), 26 deletions(-)

Index: linux-2.6/arch/arm/plat-omap/gpio.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-omap/gpio.c
+++ linux-2.6/arch/arm/plat-omap/gpio.c
@@ -17,7 +17,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/err.h>
#include <linux/clk.h>
#include <linux/io.h>
@@ -1372,9 +1372,7 @@ static const struct dev_pm_ops omap_mpui
.resume_noirq = omap_mpuio_resume_noirq,
};

-/* use platform_driver for this, now that there's no longer any
- * point to sys_device (other than not disturbing old code).
- */
+/* use platform_driver for this. */
static struct platform_driver omap_mpuio_driver = {
.driver = {
.name = "mpuio",
@@ -1745,7 +1743,7 @@ static int __devinit omap_gpio_probe(str
}

#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
-static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
+static int omap_gpio_suspend(void)
{
int i;

@@ -1795,12 +1793,12 @@ static int omap_gpio_suspend(struct sys_
return 0;
}

-static int omap_gpio_resume(struct sys_device *dev)
+static void omap_gpio_resume(void)
{
int i;

if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
- return 0;
+ return;

for (i = 0; i < gpio_bank_count; i++) {
struct gpio_bank *bank = &gpio_bank[i];
@@ -1836,21 +1834,13 @@ static int omap_gpio_resume(struct sys_d
__raw_writel(bank->saved_wakeup, wake_set);
spin_unlock_irqrestore(&bank->lock, flags);
}
-
- return 0;
}

-static struct sysdev_class omap_gpio_sysclass = {
- .name = "gpio",
+static struct syscore_ops omap_gpio_syscore_ops = {
.suspend = omap_gpio_suspend,
.resume = omap_gpio_resume,
};

-static struct sys_device omap_gpio_device = {
- .id = 0,
- .cls = &omap_gpio_sysclass,
-};
-
#endif

#ifdef CONFIG_ARCH_OMAP2PLUS
@@ -2108,21 +2098,14 @@ postcore_initcall(omap_gpio_drv_reg);

static int __init omap_gpio_sysinit(void)
{
- int ret = 0;
-
mpuio_init();

#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
- if (cpu_is_omap16xx() || cpu_class_is_omap2()) {
- if (ret == 0) {
- ret = sysdev_class_register(&omap_gpio_sysclass);
- if (ret == 0)
- ret = sysdev_register(&omap_gpio_device);
- }
- }
+ if (cpu_is_omap16xx() || cpu_class_is_omap2())
+ register_syscore_ops(&omap_gpio_syscore_ops);
#endif

- return ret;
+ return 0;
}

arch_initcall(omap_gpio_sysinit);

2011-04-17 21:18:41

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 11/14] PM / AVR32: Use struct syscore_ops instead of sysdevs for PM

From: Rafael J. Wysocki <[email protected]>

Convert some AVR32 architecture's code to using struct syscore_ops
objects for power management instead of sysdev classes and sysdevs.

This simplifies the code and reduces the kernel's memory footprint.
It also is necessary for removing sysdevs from the kernel entirely in
the future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/avr32/mach-at32ap/intc.c | 38 ++++++++++++--------------------------
1 file changed, 12 insertions(+), 26 deletions(-)

Index: linux-2.6/arch/avr32/mach-at32ap/intc.c
===================================================================
--- linux-2.6.orig/arch/avr32/mach-at32ap/intc.c
+++ linux-2.6/arch/avr32/mach-at32ap/intc.c
@@ -12,7 +12,7 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/platform_device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <asm/io.h>

@@ -21,7 +21,6 @@
struct intc {
void __iomem *regs;
struct irq_chip chip;
- struct sys_device sysdev;
#ifdef CONFIG_PM
unsigned long suspend_ipr;
unsigned long saved_ipr[64];
@@ -146,9 +145,8 @@ void intc_set_suspend_handler(unsigned l
intc0.suspend_ipr = offset;
}

-static int intc_suspend(struct sys_device *sdev, pm_message_t state)
+static int intc_suspend(void)
{
- struct intc *intc = container_of(sdev, struct intc, sysdev);
int i;

if (unlikely(!irqs_disabled())) {
@@ -156,28 +154,25 @@ static int intc_suspend(struct sys_devic
return -EINVAL;
}

- if (unlikely(!intc->suspend_ipr)) {
+ if (unlikely(!intc0.suspend_ipr)) {
pr_err("intc_suspend: suspend_ipr not initialized\n");
return -EINVAL;
}

for (i = 0; i < 64; i++) {
- intc->saved_ipr[i] = intc_readl(intc, INTPR0 + 4 * i);
- intc_writel(intc, INTPR0 + 4 * i, intc->suspend_ipr);
+ intc0.saved_ipr[i] = intc_readl(&intc0, INTPR0 + 4 * i);
+ intc_writel(&intc0, INTPR0 + 4 * i, intc0.suspend_ipr);
}

return 0;
}

-static int intc_resume(struct sys_device *sdev)
+static int intc_resume(void)
{
- struct intc *intc = container_of(sdev, struct intc, sysdev);
int i;

- WARN_ON(!irqs_disabled());
-
for (i = 0; i < 64; i++)
- intc_writel(intc, INTPR0 + 4 * i, intc->saved_ipr[i]);
+ intc_writel(&intc0, INTPR0 + 4 * i, intc0.saved_ipr[i]);

return 0;
}
@@ -186,27 +181,18 @@ static int intc_resume(struct sys_device
#define intc_resume NULL
#endif

-static struct sysdev_class intc_class = {
- .name = "intc",
+static struct syscore_ops intc_syscore_ops = {
.suspend = intc_suspend,
.resume = intc_resume,
};

-static int __init intc_init_sysdev(void)
+static int __init intc_init_syscore(void)
{
- int ret;
-
- ret = sysdev_class_register(&intc_class);
- if (ret)
- return ret;
+ register_syscore_ops(&intc_syscore_ops);

- intc0.sysdev.id = 0;
- intc0.sysdev.cls = &intc_class;
- ret = sysdev_register(&intc0.sysdev);
-
- return ret;
+ return 0;
}
-device_initcall(intc_init_sysdev);
+device_initcall(intc_init_syscore);

unsigned long intc_get_pending(unsigned int group)
{

2011-04-17 21:19:03

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 6/14] ARM / SA1100: Use struct syscore_ops for "core" power management

From: Rafael J. Wysocki <[email protected]>

Replace the sysdev class and struct sys_device used for power
management by the SA1100 interrupt-handling code with a
struct syscore_ops object which is simpler.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/mach-sa1100/irq.c | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)

Index: linux-2.6/arch/arm/mach-sa1100/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-sa1100/irq.c
+++ linux-2.6/arch/arm/mach-sa1100/irq.c
@@ -14,7 +14,7 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/ioport.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <mach/hardware.h>
#include <asm/mach/irq.h>
@@ -234,7 +234,7 @@ static struct sa1100irq_state {
unsigned int iccr;
} sa1100irq_state;

-static int sa1100irq_suspend(struct sys_device *dev, pm_message_t state)
+static int sa1100irq_suspend(void)
{
struct sa1100irq_state *st = &sa1100irq_state;

@@ -264,7 +264,7 @@ static int sa1100irq_suspend(struct sys_
return 0;
}

-static int sa1100irq_resume(struct sys_device *dev)
+static void sa1100irq_resume(void)
{
struct sa1100irq_state *st = &sa1100irq_state;

@@ -277,24 +277,17 @@ static int sa1100irq_resume(struct sys_d

ICMR = st->icmr;
}
- return 0;
}

-static struct sysdev_class sa1100irq_sysclass = {
- .name = "sa11x0-irq",
+static struct syscore_ops sa1100irq_syscore_ops = {
.suspend = sa1100irq_suspend,
.resume = sa1100irq_resume,
};

-static struct sys_device sa1100irq_device = {
- .id = 0,
- .cls = &sa1100irq_sysclass,
-};
-
static int __init sa1100irq_init_devicefs(void)
{
- sysdev_class_register(&sa1100irq_sysclass);
- return sysdev_register(&sa1100irq_device);
+ register_syscore_ops(&sa1100irq_syscore_ops);
+ return 0;
}

device_initcall(sa1100irq_init_devicefs);

2011-04-17 21:19:08

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH 8/14] ARM / Samsung: Use struct syscore_ops for "core" power management

From: Rafael J. Wysocki <[email protected]>

Replace sysdev classes and struct sys_device objects used for "core"
power management by Samsung platforms with struct syscore_ops objects
that are simpler.

This generally reduces the code size and the kernel memory footprint.
It also is necessary for removing sysdevs entirely from the kernel in
the future.

Signed-off-by: Rafael J. Wysocki <[email protected]>
---
arch/arm/mach-exynos4/pm.c | 45 ++++++++++++--------
arch/arm/mach-s3c2410/irq.c | 30 -------------
arch/arm/mach-s3c2410/mach-bast.c | 17 ++-----
arch/arm/mach-s3c2410/pm.c | 13 ++---
arch/arm/mach-s3c2410/s3c2410.c | 5 ++
arch/arm/mach-s3c2412/irq.c | 2
arch/arm/mach-s3c2412/mach-jive.c | 19 ++------
arch/arm/mach-s3c2412/pm.c | 27 ++++++------
arch/arm/mach-s3c2412/s3c2412.c | 4 +
arch/arm/mach-s3c2416/irq.c | 2
arch/arm/mach-s3c2416/pm.c | 27 +++++-------
arch/arm/mach-s3c2416/s3c2416.c | 5 ++
arch/arm/mach-s3c2440/mach-osiris.c | 18 ++------
arch/arm/mach-s3c2440/s3c2440.c | 8 +++
arch/arm/mach-s3c2440/s3c2442.c | 6 ++
arch/arm/mach-s3c2440/s3c244x-irq.c | 4 -
arch/arm/mach-s3c2440/s3c244x.c | 62 ++++++++++++++--------------
arch/arm/mach-s3c64xx/irq-pm.c | 18 ++++----
arch/arm/mach-s5pv210/pm.c | 25 +++++++----
arch/arm/plat-s3c24xx/dma.c | 68 +++++++++++--------------------
arch/arm/plat-s3c24xx/irq-pm.c | 7 ---
arch/arm/plat-s5p/irq-pm.c | 7 ---
arch/arm/plat-samsung/include/plat/cpu.h | 6 ++
arch/arm/plat-samsung/include/plat/pm.h | 6 +-
24 files changed, 203 insertions(+), 228 deletions(-)

Index: linux-2.6/arch/arm/plat-samsung/include/plat/pm.h
===================================================================
--- linux-2.6.orig/arch/arm/plat-samsung/include/plat/pm.h
+++ linux-2.6/arch/arm/plat-samsung/include/plat/pm.h
@@ -103,14 +103,16 @@ extern void s3c_pm_do_restore_core(struc

#ifdef CONFIG_PM
extern int s3c_irqext_wake(struct irq_data *data, unsigned int state);
-extern int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state);
-extern int s3c24xx_irq_resume(struct sys_device *dev);
+extern int s3c24xx_irq_suspend(void);
+extern void s3c24xx_irq_resume(void);
#else
#define s3c_irqext_wake NULL
#define s3c24xx_irq_suspend NULL
#define s3c24xx_irq_resume NULL
#endif

+extern struct syscore_ops s3c24xx_irq_syscore_ops;
+
/* PM debug functions */

#ifdef CONFIG_SAMSUNG_PM_DEBUG
Index: linux-2.6/arch/arm/plat-s5p/irq-pm.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-s5p/irq-pm.c
+++ linux-2.6/arch/arm/plat-s5p/irq-pm.c
@@ -16,7 +16,6 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>

#include <plat/cpu.h>
#include <plat/irqs.h>
@@ -77,17 +76,15 @@ static struct sleep_save eint_save[] = {
SAVE_ITEM(S5P_EINT_MASK(3)),
};

-int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
+int s3c24xx_irq_suspend(void)
{
s3c_pm_do_save(eint_save, ARRAY_SIZE(eint_save));

return 0;
}

-int s3c24xx_irq_resume(struct sys_device *dev)
+void s3c24xx_irq_resume(void)
{
s3c_pm_do_restore(eint_save, ARRAY_SIZE(eint_save));
-
- return 0;
}

Index: linux-2.6/arch/arm/plat-s3c24xx/irq-pm.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-s3c24xx/irq-pm.c
+++ linux-2.6/arch/arm/plat-s3c24xx/irq-pm.c
@@ -14,7 +14,6 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>
#include <linux/irq.h>

#include <plat/cpu.h>
@@ -65,7 +64,7 @@ static unsigned long save_extint[3];
static unsigned long save_eintflt[4];
static unsigned long save_eintmask;

-int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
+int s3c24xx_irq_suspend(void)
{
unsigned int i;

@@ -81,7 +80,7 @@ int s3c24xx_irq_suspend(struct sys_devic
return 0;
}

-int s3c24xx_irq_resume(struct sys_device *dev)
+void s3c24xx_irq_resume(void)
{
unsigned int i;

@@ -93,6 +92,4 @@ int s3c24xx_irq_resume(struct sys_device

s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
__raw_writel(save_eintmask, S3C24XX_EINTMASK);
-
- return 0;
}
Index: linux-2.6/arch/arm/mach-s3c2410/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2410/irq.c
+++ linux-2.6/arch/arm/mach-s3c2410/irq.c
@@ -23,38 +23,12 @@
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>

#include <plat/cpu.h>
#include <plat/pm.h>

-static int s3c2410_irq_add(struct sys_device *sysdev)
-{
- return 0;
-}
-
-static struct sysdev_driver s3c2410_irq_driver = {
- .add = s3c2410_irq_add,
+struct syscore_ops s3c24xx_irq_syscore_ops = {
.suspend = s3c24xx_irq_suspend,
.resume = s3c24xx_irq_resume,
};
-
-static int __init s3c2410_irq_init(void)
-{
- return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_irq_driver);
-}
-
-arch_initcall(s3c2410_irq_init);
-
-static struct sysdev_driver s3c2410a_irq_driver = {
- .add = s3c2410_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
-};
-
-static int __init s3c2410a_irq_init(void)
-{
- return sysdev_driver_register(&s3c2410a_sysclass, &s3c2410a_irq_driver);
-}
-
-arch_initcall(s3c2410a_irq_init);
Index: linux-2.6/arch/arm/mach-s3c2410/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2410/pm.c
+++ linux-2.6/arch/arm/mach-s3c2410/pm.c
@@ -25,6 +25,7 @@
#include <linux/errno.h>
#include <linux/time.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/gpio.h>
#include <linux/io.h>

@@ -92,7 +93,7 @@ static void s3c2410_pm_prepare(void)
}
}

-static int s3c2410_pm_resume(struct sys_device *dev)
+static void s3c2410_pm_resume(void)
{
unsigned long tmp;

@@ -104,10 +105,12 @@ static int s3c2410_pm_resume(struct sys_

if ( machine_is_aml_m5900() )
s3c2410_gpio_setpin(S3C2410_GPF(2), 0);
-
- return 0;
}

+struct syscore_ops s3c2410_pm_syscore_ops = {
+ .resume = s3c2410_pm_resume,
+};
+
static int s3c2410_pm_add(struct sys_device *dev)
{
pm_cpu_prep = s3c2410_pm_prepare;
@@ -119,7 +122,6 @@ static int s3c2410_pm_add(struct sys_dev
#if defined(CONFIG_CPU_S3C2410)
static struct sysdev_driver s3c2410_pm_driver = {
.add = s3c2410_pm_add,
- .resume = s3c2410_pm_resume,
};

/* register ourselves */
@@ -133,7 +135,6 @@ arch_initcall(s3c2410_pm_drvinit);

static struct sysdev_driver s3c2410a_pm_driver = {
.add = s3c2410_pm_add,
- .resume = s3c2410_pm_resume,
};

static int __init s3c2410a_pm_drvinit(void)
@@ -147,7 +148,6 @@ arch_initcall(s3c2410a_pm_drvinit);
#if defined(CONFIG_CPU_S3C2440)
static struct sysdev_driver s3c2440_pm_driver = {
.add = s3c2410_pm_add,
- .resume = s3c2410_pm_resume,
};

static int __init s3c2440_pm_drvinit(void)
@@ -161,7 +161,6 @@ arch_initcall(s3c2440_pm_drvinit);
#if defined(CONFIG_CPU_S3C2442)
static struct sysdev_driver s3c2442_pm_driver = {
.add = s3c2410_pm_add,
- .resume = s3c2410_pm_resume,
};

static int __init s3c2442_pm_drvinit(void)
Index: linux-2.6/arch/arm/plat-samsung/include/plat/cpu.h
===================================================================
--- linux-2.6.orig/arch/arm/plat-samsung/include/plat/cpu.h
+++ linux-2.6/arch/arm/plat-samsung/include/plat/cpu.h
@@ -68,6 +68,12 @@ extern void s3c24xx_init_uartdevs(char *
struct sys_timer;
extern struct sys_timer s3c24xx_timer;

+extern struct syscore_ops s3c2410_pm_syscore_ops;
+extern struct syscore_ops s3c2412_pm_syscore_ops;
+extern struct syscore_ops s3c2416_pm_syscore_ops;
+extern struct syscore_ops s3c244x_pm_syscore_ops;
+extern struct syscore_ops s3c64xx_irq_syscore_ops;
+
/* system device classes */

extern struct sysdev_class s3c2410_sysclass;
Index: linux-2.6/arch/arm/mach-s3c2410/s3c2410.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2410/s3c2410.c
+++ linux-2.6/arch/arm/mach-s3c2410/s3c2410.c
@@ -19,6 +19,7 @@
#include <linux/gpio.h>
#include <linux/clk.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/io.h>
@@ -40,6 +41,7 @@
#include <plat/devs.h>
#include <plat/clock.h>
#include <plat/pll.h>
+#include <plat/pm.h>

#include <plat/gpio-core.h>
#include <plat/gpio-cfg.h>
@@ -168,6 +170,9 @@ int __init s3c2410_init(void)
{
printk("S3C2410: Initialising architecture\n");

+ register_syscore_ops(&s3c2410_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
return sysdev_register(&s3c2410_sysdev);
}

Index: linux-2.6/arch/arm/mach-s3c2412/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2412/irq.c
+++ linux-2.6/arch/arm/mach-s3c2412/irq.c
@@ -202,8 +202,6 @@ static int s3c2412_irq_add(struct sys_de

static struct sysdev_driver s3c2412_irq_driver = {
.add = s3c2412_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
};

static int s3c2412_irq_init(void)
Index: linux-2.6/arch/arm/mach-s3c2412/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2412/pm.c
+++ linux-2.6/arch/arm/mach-s3c2412/pm.c
@@ -17,6 +17,7 @@
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/platform_device.h>
#include <linux/io.h>

@@ -86,13 +87,24 @@ static struct sleep_save s3c2412_sleep[]
SAVE_ITEM(S3C2413_GPJSLPCON),
};

-static int s3c2412_pm_suspend(struct sys_device *dev, pm_message_t state)
+static struct sysdev_driver s3c2412_pm_driver = {
+ .add = s3c2412_pm_add,
+};
+
+static __init int s3c2412_pm_init(void)
+{
+ return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver);
+}
+
+arch_initcall(s3c2412_pm_init);
+
+static int s3c2412_pm_suspend(void)
{
s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
return 0;
}

-static int s3c2412_pm_resume(struct sys_device *dev)
+static void s3c2412_pm_resume(void)
{
unsigned long tmp;

@@ -102,18 +114,9 @@ static int s3c2412_pm_resume(struct sys_
__raw_writel(tmp, S3C2412_PWRCFG);

s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
- return 0;
}

-static struct sysdev_driver s3c2412_pm_driver = {
- .add = s3c2412_pm_add,
+struct syscore_ops s3c2412_pm_syscore_ops = {
.suspend = s3c2412_pm_suspend,
.resume = s3c2412_pm_resume,
};
-
-static __init int s3c2412_pm_init(void)
-{
- return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver);
-}
-
-arch_initcall(s3c2412_pm_init);
Index: linux-2.6/arch/arm/mach-s3c2412/s3c2412.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2412/s3c2412.c
+++ linux-2.6/arch/arm/mach-s3c2412/s3c2412.c
@@ -19,6 +19,7 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/io.h>
@@ -244,5 +245,8 @@ int __init s3c2412_init(void)
{
printk("S3C2412: Initialising architecture\n");

+ register_syscore_ops(&s3c2412_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
return sysdev_register(&s3c2412_sysdev);
}
Index: linux-2.6/arch/arm/mach-s3c2416/irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2416/irq.c
+++ linux-2.6/arch/arm/mach-s3c2416/irq.c
@@ -236,8 +236,6 @@ static int __init s3c2416_irq_add(struct

static struct sysdev_driver s3c2416_irq_driver = {
.add = s3c2416_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
};

static int __init s3c2416_irq_init(void)
Index: linux-2.6/arch/arm/mach-s3c2416/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2416/pm.c
+++ linux-2.6/arch/arm/mach-s3c2416/pm.c
@@ -11,6 +11,7 @@
*/

#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>

#include <asm/cacheflush.h>
@@ -55,30 +56,26 @@ static int s3c2416_pm_add(struct sys_dev
return 0;
}

-static int s3c2416_pm_suspend(struct sys_device *dev, pm_message_t state)
+static struct sysdev_driver s3c2416_pm_driver = {
+ .add = s3c2416_pm_add,
+};
+
+static __init int s3c2416_pm_init(void)
{
- return 0;
+ return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_pm_driver);
}

-static int s3c2416_pm_resume(struct sys_device *dev)
+arch_initcall(s3c2416_pm_init);
+
+
+static void s3c2416_pm_resume(void)
{
/* unset the return-from-sleep amd inform flags */
__raw_writel(0x0, S3C2443_PWRMODE);
__raw_writel(0x0, S3C2412_INFORM0);
__raw_writel(0x0, S3C2412_INFORM1);
-
- return 0;
}

-static struct sysdev_driver s3c2416_pm_driver = {
- .add = s3c2416_pm_add,
- .suspend = s3c2416_pm_suspend,
+struct syscore_ops s3c2416_pm_syscore_ops = {
.resume = s3c2416_pm_resume,
};
-
-static __init int s3c2416_pm_init(void)
-{
- return sysdev_driver_register(&s3c2416_sysclass, &s3c2416_pm_driver);
-}
-
-arch_initcall(s3c2416_pm_init);
Index: linux-2.6/arch/arm/mach-s3c2416/s3c2416.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2416/s3c2416.c
+++ linux-2.6/arch/arm/mach-s3c2416/s3c2416.c
@@ -32,6 +32,7 @@
#include <linux/platform_device.h>
#include <linux/serial_core.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/clk.h>
#include <linux/io.h>

@@ -54,6 +55,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <plat/sdhci.h>
+#include <plat/pm.h>

#include <plat/iic-core.h>
#include <plat/fb-core.h>
@@ -95,6 +97,9 @@ int __init s3c2416_init(void)

s3c_fb_setname("s3c2443-fb");

+ register_syscore_ops(&s3c2416_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
return sysdev_register(&s3c2416_sysdev);
}

Index: linux-2.6/arch/arm/mach-s3c2440/s3c244x-irq.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/s3c244x-irq.c
+++ linux-2.6/arch/arm/mach-s3c2440/s3c244x-irq.c
@@ -116,8 +116,6 @@ static int s3c244x_irq_add(struct sys_de

static struct sysdev_driver s3c2440_irq_driver = {
.add = s3c244x_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
};

static int s3c2440_irq_init(void)
@@ -129,8 +127,6 @@ arch_initcall(s3c2440_irq_init);

static struct sysdev_driver s3c2442_irq_driver = {
.add = s3c244x_irq_add,
- .suspend = s3c24xx_irq_suspend,
- .resume = s3c24xx_irq_resume,
};


Index: linux-2.6/arch/arm/mach-s3c2440/s3c244x.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/s3c244x.c
+++ linux-2.6/arch/arm/mach-s3c2440/s3c244x.c
@@ -19,6 +19,7 @@
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/clk.h>
#include <linux/io.h>

@@ -134,45 +135,14 @@ void __init s3c244x_init_clocks(int xtal
s3c2410_baseclk_add();
}

-#ifdef CONFIG_PM
-
-static struct sleep_save s3c244x_sleep[] = {
- SAVE_ITEM(S3C2440_DSC0),
- SAVE_ITEM(S3C2440_DSC1),
- SAVE_ITEM(S3C2440_GPJDAT),
- SAVE_ITEM(S3C2440_GPJCON),
- SAVE_ITEM(S3C2440_GPJUP)
-};
-
-static int s3c244x_suspend(struct sys_device *dev, pm_message_t state)
-{
- s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
- return 0;
-}
-
-static int s3c244x_resume(struct sys_device *dev)
-{
- s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
- return 0;
-}
-
-#else
-#define s3c244x_suspend NULL
-#define s3c244x_resume NULL
-#endif
-
/* Since the S3C2442 and S3C2440 share items, put both sysclasses here */

struct sysdev_class s3c2440_sysclass = {
.name = "s3c2440-core",
- .suspend = s3c244x_suspend,
- .resume = s3c244x_resume
};

struct sysdev_class s3c2442_sysclass = {
.name = "s3c2442-core",
- .suspend = s3c244x_suspend,
- .resume = s3c244x_resume
};

/* need to register class before we actually register the device, and
@@ -194,3 +164,33 @@ static int __init s3c2442_core_init(void
}

core_initcall(s3c2442_core_init);
+
+
+#ifdef CONFIG_PM
+static struct sleep_save s3c244x_sleep[] = {
+ SAVE_ITEM(S3C2440_DSC0),
+ SAVE_ITEM(S3C2440_DSC1),
+ SAVE_ITEM(S3C2440_GPJDAT),
+ SAVE_ITEM(S3C2440_GPJCON),
+ SAVE_ITEM(S3C2440_GPJUP)
+};
+
+static int s3c244x_suspend(void)
+{
+ s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
+ return 0;
+}
+
+static void s3c244x_resume(void)
+{
+ s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
+}
+#else
+#define s3c244x_suspend NULL
+#define s3c244x_resume NULL
+#endif
+
+struct syscore_ops s3c244x_pm_syscore_ops = {
+ .suspend = s3c244x_suspend,
+ .resume = s3c244x_resume,
+};
Index: linux-2.6/arch/arm/mach-s3c2440/s3c2440.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/s3c2440.c
+++ linux-2.6/arch/arm/mach-s3c2440/s3c2440.c
@@ -19,6 +19,7 @@
#include <linux/platform_device.h>
#include <linux/serial_core.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/gpio.h>
#include <linux/clk.h>
#include <linux/io.h>
@@ -33,6 +34,7 @@
#include <plat/devs.h>
#include <plat/cpu.h>
#include <plat/s3c244x.h>
+#include <plat/pm.h>

#include <plat/gpio-core.h>
#include <plat/gpio-cfg.h>
@@ -51,6 +53,12 @@ int __init s3c2440_init(void)
s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
s3c_device_wdt.resource[1].end = IRQ_S3C2440_WDT;

+ /* register suspend/resume handlers */
+
+ register_syscore_ops(&s3c2410_pm_syscore_ops);
+ register_syscore_ops(&s3c244x_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
/* register our system device for everything else */

return sysdev_register(&s3c2440_sysdev);
Index: linux-2.6/arch/arm/mach-s3c2440/s3c2442.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/s3c2442.c
+++ linux-2.6/arch/arm/mach-s3c2440/s3c2442.c
@@ -29,6 +29,7 @@
#include <linux/err.h>
#include <linux/device.h>
#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/mutex.h>
@@ -45,6 +46,7 @@
#include <plat/clock.h>
#include <plat/cpu.h>
#include <plat/s3c244x.h>
+#include <plat/pm.h>

#include <plat/gpio-core.h>
#include <plat/gpio-cfg.h>
@@ -167,6 +169,10 @@ int __init s3c2442_init(void)
{
printk("S3C2442: Initialising architecture\n");

+ register_syscore_ops(&s3c2410_pm_syscore_ops);
+ register_syscore_ops(&s3c244x_pm_syscore_ops);
+ register_syscore_ops(&s3c24xx_irq_syscore_ops);
+
return sysdev_register(&s3c2442_sysdev);
}

Index: linux-2.6/arch/arm/mach-s3c64xx/irq-pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c64xx/irq-pm.c
+++ linux-2.6/arch/arm/mach-s3c64xx/irq-pm.c
@@ -13,7 +13,7 @@
*/

#include <linux/kernel.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/interrupt.h>
#include <linux/serial_core.h>
#include <linux/irq.h>
@@ -54,7 +54,7 @@ static struct irq_grp_save {

static u32 irq_uart_mask[CONFIG_SERIAL_SAMSUNG_UARTS];

-static int s3c64xx_irq_pm_suspend(struct sys_device *dev, pm_message_t state)
+static int s3c64xx_irq_pm_suspend(void)
{
struct irq_grp_save *grp = eint_grp_save;
int i;
@@ -75,7 +75,7 @@ static int s3c64xx_irq_pm_suspend(struct
return 0;
}

-static int s3c64xx_irq_pm_resume(struct sys_device *dev)
+static void s3c64xx_irq_pm_resume(void)
{
struct irq_grp_save *grp = eint_grp_save;
int i;
@@ -94,18 +94,18 @@ static int s3c64xx_irq_pm_resume(struct
}

S3C_PMDBG("%s: IRQ configuration restored\n", __func__);
- return 0;
}

-static struct sysdev_driver s3c64xx_irq_driver = {
+struct syscore_ops s3c64xx_irq_syscore_ops = {
.suspend = s3c64xx_irq_pm_suspend,
.resume = s3c64xx_irq_pm_resume,
};

-static int __init s3c64xx_irq_pm_init(void)
+static __init int s3c64xx_syscore_init(void)
{
- return sysdev_driver_register(&s3c64xx_sysclass, &s3c64xx_irq_driver);
-}
+ register_syscore_ops(&s3c64xx_irq_syscore_ops);

-arch_initcall(s3c64xx_irq_pm_init);
+ return 0;
+}

+core_initcall(s3c64xx_syscore_init);
Index: linux-2.6/arch/arm/mach-s5pv210/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s5pv210/pm.c
+++ linux-2.6/arch/arm/mach-s5pv210/pm.c
@@ -16,6 +16,7 @@

#include <linux/init.h>
#include <linux/suspend.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>

#include <plat/cpu.h>
@@ -140,7 +141,17 @@ static int s5pv210_pm_add(struct sys_dev
return 0;
}

-static int s5pv210_pm_resume(struct sys_device *dev)
+static struct sysdev_driver s5pv210_pm_driver = {
+ .add = s5pv210_pm_add,
+};
+
+static __init int s5pv210_pm_drvinit(void)
+{
+ return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver);
+}
+arch_initcall(s5pv210_pm_drvinit);
+
+static void s5pv210_pm_resume(void)
{
u32 tmp;

@@ -150,17 +161,15 @@ static int s5pv210_pm_resume(struct sys_
__raw_writel(tmp , S5P_OTHERS);

s3c_pm_do_restore_core(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));
-
- return 0;
}

-static struct sysdev_driver s5pv210_pm_driver = {
- .add = s5pv210_pm_add,
+static struct syscore_ops s5pv210_pm_syscore_ops = {
.resume = s5pv210_pm_resume,
};

-static __init int s5pv210_pm_drvinit(void)
+static __init int s5pv210_pm_syscore_init(void)
{
- return sysdev_driver_register(&s5pv210_sysclass, &s5pv210_pm_driver);
+ register_syscore_ops(&s5pv210_pm_syscore_ops);
+ return 0;
}
-arch_initcall(s5pv210_pm_drvinit);
+arch_initcall(s5pv210_pm_syscore_init);
Index: linux-2.6/arch/arm/mach-exynos4/pm.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-exynos4/pm.c
+++ linux-2.6/arch/arm/mach-exynos4/pm.c
@@ -16,6 +16,7 @@

#include <linux/init.h>
#include <linux/suspend.h>
+#include <linux/syscore_ops.h>
#include <linux/io.h>

#include <asm/cacheflush.h>
@@ -372,7 +373,27 @@ void exynos4_scu_enable(void __iomem *sc
flush_cache_all();
}

-static int exynos4_pm_resume(struct sys_device *dev)
+static struct sysdev_driver exynos4_pm_driver = {
+ .add = exynos4_pm_add,
+};
+
+static __init int exynos4_pm_drvinit(void)
+{
+ unsigned int tmp;
+
+ s3c_pm_init();
+
+ /* All wakeup disable */
+
+ tmp = __raw_readl(S5P_WAKEUP_MASK);
+ tmp |= ((0xFF << 8) | (0x1F << 1));
+ __raw_writel(tmp, S5P_WAKEUP_MASK);
+
+ return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
+}
+arch_initcall(exynos4_pm_drvinit);
+
+static void exynos4_pm_resume(void)
{
/* For release retention */

@@ -394,27 +415,15 @@ static int exynos4_pm_resume(struct sys_
/* enable L2X0*/
writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
#endif
-
- return 0;
}

-static struct sysdev_driver exynos4_pm_driver = {
- .add = exynos4_pm_add,
+static struct syscore_ops exynos4_pm_syscore_ops = {
.resume = exynos4_pm_resume,
};

-static __init int exynos4_pm_drvinit(void)
+static __init int exynos4_pm_syscore_init(void)
{
- unsigned int tmp;
-
- s3c_pm_init();
-
- /* All wakeup disable */
-
- tmp = __raw_readl(S5P_WAKEUP_MASK);
- tmp |= ((0xFF << 8) | (0x1F << 1));
- __raw_writel(tmp, S5P_WAKEUP_MASK);
-
- return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
+ register_syscore_ops(&exynos4_pm_syscore_ops);
+ return 0;
}
-arch_initcall(exynos4_pm_drvinit);
+arch_initcall(exynos4_pm_syscore_init);
Index: linux-2.6/arch/arm/mach-s3c2410/mach-bast.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2410/mach-bast.c
+++ linux-2.6/arch/arm/mach-s3c2410/mach-bast.c
@@ -17,7 +17,7 @@
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/gpio.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/dm9000.h>
@@ -214,17 +214,16 @@ static struct s3c2410_uartcfg bast_uartc
/* NAND Flash on BAST board */

#ifdef CONFIG_PM
-static int bast_pm_suspend(struct sys_device *sd, pm_message_t state)
+static int bast_pm_suspend(void)
{
/* ensure that an nRESET is not generated on resume. */
gpio_direction_output(S3C2410_GPA(21), 1);
return 0;
}

-static int bast_pm_resume(struct sys_device *sd)
+static void bast_pm_resume(void)
{
s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
- return 0;
}

#else
@@ -232,16 +231,11 @@ static int bast_pm_resume(struct sys_dev
#define bast_pm_resume NULL
#endif

-static struct sysdev_class bast_pm_sysclass = {
- .name = "mach-bast",
+static struct syscore_ops bast_pm_syscore_ops = {
.suspend = bast_pm_suspend,
.resume = bast_pm_resume,
};

-static struct sys_device bast_pm_sysdev = {
- .cls = &bast_pm_sysclass,
-};
-
static int smartmedia_map[] = { 0 };
static int chip0_map[] = { 1 };
static int chip1_map[] = { 2 };
@@ -642,8 +636,7 @@ static void __init bast_map_io(void)

static void __init bast_init(void)
{
- sysdev_class_register(&bast_pm_sysclass);
- sysdev_register(&bast_pm_sysdev);
+ register_syscore_ops(&bast_pm_syscore_ops);

s3c_i2c0_set_platdata(&bast_i2c_info);
s3c_nand_set_platdata(&bast_nand_info);
Index: linux-2.6/arch/arm/plat-s3c24xx/dma.c
===================================================================
--- linux-2.6.orig/arch/arm/plat-s3c24xx/dma.c
+++ linux-2.6/arch/arm/plat-s3c24xx/dma.c
@@ -22,7 +22,7 @@
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/io.h>
@@ -1195,19 +1195,12 @@ int s3c2410_dma_getposition(unsigned int

EXPORT_SYMBOL(s3c2410_dma_getposition);

-static inline struct s3c2410_dma_chan *to_dma_chan(struct sys_device *dev)
-{
- return container_of(dev, struct s3c2410_dma_chan, dev);
-}
-
-/* system device class */
+/* system core operations */

#ifdef CONFIG_PM

-static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state)
+static void s3c2410_dma_suspend_chan(s3c2410_dma_chan *cp)
{
- struct s3c2410_dma_chan *cp = to_dma_chan(dev);
-
printk(KERN_DEBUG "suspending dma channel %d\n", cp->number);

if (dma_rdreg(cp, S3C2410_DMA_DMASKTRIG) & S3C2410_DMASKTRIG_ON) {
@@ -1222,13 +1215,21 @@ static int s3c2410_dma_suspend(struct sy

s3c2410_dma_dostop(cp);
}
+}
+
+static int s3c2410_dma_suspend(void)
+{
+ struct s3c2410_dma_chan *cp = s3c2410_chans;
+ int channel;
+
+ for (channel = 0; channel < dma_channels; cp++, channel++)
+ s3c2410_dma_suspend_chan(cp);

return 0;
}

-static int s3c2410_dma_resume(struct sys_device *dev)
+static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)
{
- struct s3c2410_dma_chan *cp = to_dma_chan(dev);
unsigned int no = cp->number | DMACH_LOW_LEVEL;

/* restore channel's hardware configuration */
@@ -1249,13 +1250,21 @@ static int s3c2410_dma_resume(struct sys
return 0;
}

+static void s3c2410_dma_resume(void)
+{
+ struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1;
+ int channel;
+
+ for (channel = dma_channels - 1; channel >= 0; cp++, channel--)
+ s3c2410_dma_resume_chan(cp);
+}
+
#else
#define s3c2410_dma_suspend NULL
#define s3c2410_dma_resume NULL
#endif /* CONFIG_PM */

-struct sysdev_class dma_sysclass = {
- .name = "s3c24xx-dma",
+struct syscore_ops dma_syscore_ops = {
.suspend = s3c2410_dma_suspend,
.resume = s3c2410_dma_resume,
};
@@ -1269,39 +1278,14 @@ static void s3c2410_dma_cache_ctor(void

/* initialisation code */

-static int __init s3c24xx_dma_sysclass_init(void)
+static int __init s3c24xx_dma_syscore_init(void)
{
- int ret = sysdev_class_register(&dma_sysclass);
-
- if (ret != 0)
- printk(KERN_ERR "dma sysclass registration failed\n");
-
- return ret;
-}
-
-core_initcall(s3c24xx_dma_sysclass_init);
-
-static int __init s3c24xx_dma_sysdev_register(void)
-{
- struct s3c2410_dma_chan *cp = s3c2410_chans;
- int channel, ret;
-
- for (channel = 0; channel < dma_channels; cp++, channel++) {
- cp->dev.cls = &dma_sysclass;
- cp->dev.id = channel;
- ret = sysdev_register(&cp->dev);
-
- if (ret) {
- printk(KERN_ERR "error registering dev for dma %d\n",
- channel);
- return ret;
- }
- }
+ register_syscore_ops(&dma_syscore_ops);

return 0;
}

-late_initcall(s3c24xx_dma_sysdev_register);
+late_initcall(s3c24xx_dma_syscore_init);

int __init s3c24xx_dma_init(unsigned int channels, unsigned int irq,
unsigned int stride)
Index: linux-2.6/arch/arm/mach-s3c2440/mach-osiris.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2440/mach-osiris.c
+++ linux-2.6/arch/arm/mach-s3c2440/mach-osiris.c
@@ -17,7 +17,7 @@
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/device.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/clk.h>
#include <linux/i2c.h>
@@ -284,7 +284,7 @@ static struct platform_device osiris_pcm
#ifdef CONFIG_PM
static unsigned char pm_osiris_ctrl0;

-static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state)
+static int osiris_pm_suspend(void)
{
unsigned int tmp;

@@ -304,7 +304,7 @@ static int osiris_pm_suspend(struct sys_
return 0;
}

-static int osiris_pm_resume(struct sys_device *sd)
+static void osiris_pm_resume(void)
{
if (pm_osiris_ctrl0 & OSIRIS_CTRL0_FIX8)
__raw_writeb(OSIRIS_CTRL1_FIX8, OSIRIS_VA_CTRL1);
@@ -312,8 +312,6 @@ static int osiris_pm_resume(struct sys_d
__raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0);

s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
-
- return 0;
}

#else
@@ -321,16 +319,11 @@ static int osiris_pm_resume(struct sys_d
#define osiris_pm_resume NULL
#endif

-static struct sysdev_class osiris_pm_sysclass = {
- .name = "mach-osiris",
+static struct syscore_ops osiris_pm_syscore_ops = {
.suspend = osiris_pm_suspend,
.resume = osiris_pm_resume,
};

-static struct sys_device osiris_pm_sysdev = {
- .cls = &osiris_pm_sysclass,
-};
-
/* Link for DVS driver to TPS65011 */

static void osiris_tps_release(struct device *dev)
@@ -439,8 +432,7 @@ static void __init osiris_map_io(void)

static void __init osiris_init(void)
{
- sysdev_class_register(&osiris_pm_sysclass);
- sysdev_register(&osiris_pm_sysdev);
+ register_syscore_ops(&osiris_pm_syscore_ops);

s3c_i2c0_set_platdata(NULL);
s3c_nand_set_platdata(&osiris_nand_info);
Index: linux-2.6/arch/arm/mach-s3c2412/mach-jive.c
===================================================================
--- linux-2.6.orig/arch/arm/mach-s3c2412/mach-jive.c
+++ linux-2.6/arch/arm/mach-s3c2412/mach-jive.c
@@ -17,7 +17,7 @@
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/gpio.h>
-#include <linux/sysdev.h>
+#include <linux/syscore_ops.h>
#include <linux/serial_core.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
@@ -486,7 +486,7 @@ static struct s3c2410_udc_mach_info jive
/* Jive power management device */

#ifdef CONFIG_PM
-static int jive_pm_suspend(struct sys_device *sd, pm_message_t state)
+static int jive_pm_suspend(void)
{
/* Write the magic value u-boot uses to check for resume into
* the INFORM0 register, and ensure INFORM1 is set to the
@@ -498,10 +498,9 @@ static int jive_pm_suspend(struct sys_de
return 0;
}

-static int jive_pm_resume(struct sys_device *sd)
+static void jive_pm_resume(void)
{
__raw_writel(0x0, S3C2412_INFORM0);
- return 0;
}

#else
@@ -509,16 +508,11 @@ static int jive_pm_resume(struct sys_dev
#define jive_pm_resume NULL
#endif

-static struct sysdev_class jive_pm_sysclass = {
- .name = "jive-pm",
+static struct syscore_ops jive_pm_syscore_ops = {
.suspend = jive_pm_suspend,
.resume = jive_pm_resume,
};

-static struct sys_device jive_pm_sysdev = {
- .cls = &jive_pm_sysclass,
-};
-
static void __init jive_map_io(void)
{
s3c24xx_init_io(jive_iodesc, ARRAY_SIZE(jive_iodesc));
@@ -536,10 +530,9 @@ static void jive_power_off(void)

static void __init jive_machine_init(void)
{
- /* register system devices for managing low level suspend */
+ /* register system core operations for managing low level suspend */

- sysdev_class_register(&jive_pm_sysclass);
- sysdev_register(&jive_pm_sysdev);
+ register_syscore_ops(&jive_pm_syscore_ops);

/* write our sleep configurations for the IO. Pull down all unused
* IO, ensure that we have turned off all peripherals we do not

2011-04-17 21:49:40

by Kukjin Kim

[permalink] [raw]
Subject: RE: [PATCH 8/14] ARM / Samsung: Use struct syscore_ops for "core" power management

Rafael J. Wysocki wrote:
>
> From: Rafael J. Wysocki <[email protected]>
>
> Replace sysdev classes and struct sys_device objects used for "core"
> power management by Samsung platforms with struct syscore_ops objects
> that are simpler.
>
> This generally reduces the code size and the kernel memory footprint.
> It also is necessary for removing sysdevs entirely from the kernel in
> the future.
>
> Signed-off-by: Rafael J. Wysocki <[email protected]>

Acked-by: Kukjin Kim <[email protected]>

> ---
> arch/arm/mach-exynos4/pm.c | 45 ++++++++++++--------
> arch/arm/mach-s3c2410/irq.c | 30 -------------
> arch/arm/mach-s3c2410/mach-bast.c | 17 ++-----
> arch/arm/mach-s3c2410/pm.c | 13 ++---
> arch/arm/mach-s3c2410/s3c2410.c | 5 ++
> arch/arm/mach-s3c2412/irq.c | 2
> arch/arm/mach-s3c2412/mach-jive.c | 19 ++------
> arch/arm/mach-s3c2412/pm.c | 27 ++++++------
> arch/arm/mach-s3c2412/s3c2412.c | 4 +
> arch/arm/mach-s3c2416/irq.c | 2
> arch/arm/mach-s3c2416/pm.c | 27 +++++-------
> arch/arm/mach-s3c2416/s3c2416.c | 5 ++
> arch/arm/mach-s3c2440/mach-osiris.c | 18 ++------
> arch/arm/mach-s3c2440/s3c2440.c | 8 +++
> arch/arm/mach-s3c2440/s3c2442.c | 6 ++
> arch/arm/mach-s3c2440/s3c244x-irq.c | 4 -
> arch/arm/mach-s3c2440/s3c244x.c | 62
++++++++++++++--------------
> arch/arm/mach-s3c64xx/irq-pm.c | 18 ++++----
> arch/arm/mach-s5pv210/pm.c | 25 +++++++----
> arch/arm/plat-s3c24xx/dma.c | 68
+++++++++++-----------------
> ---
> arch/arm/plat-s3c24xx/irq-pm.c | 7 ---
> arch/arm/plat-s5p/irq-pm.c | 7 ---
> arch/arm/plat-samsung/include/plat/cpu.h | 6 ++
> arch/arm/plat-samsung/include/plat/pm.h | 6 +-
> 24 files changed, 203 insertions(+), 228 deletions(-)
>

Thanks.

Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.

2011-04-18 02:34:48

by Mike Frysinger

[permalink] [raw]
Subject: Re: [PATCH 9/14] PM / Blackfin: Use struct syscore_ops instead of sysdevs for PM

On Sun, Apr 17, 2011 at 17:11, Rafael J. Wysocki wrote:
> Convert some Blackfin architecture's code to using struct syscore_ops
> objects for power management instead of sysdev classes and sysdevs.
>
> This simplifies the code and reduces the kernel's memory footprint.
> It also is necessary for removing sysdevs from the kernel entirely in
> the future.

looks straight forward enough ...
Acked-by: Mike Frysinger <[email protected]>

> +static struct syscore_ops nmi_syscore_ops = {
>        .resume         = nmi_wdt_resume,
>        .suspend        = nmi_wdt_suspend,
>  };

a bit sad this couldnt be made const
-mike

2011-04-18 06:02:27

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH 0/14] Remove sysdev suspend/resume and shutdown operations

On Sun, Apr 17, 2011 at 11:01:53PM +0200, Rafael J. Wysocki wrote:
> Hi,
>
> The following series of patches fixes bugs related to the introduction
> of struct syscore_ops later in this cycle, replaces sysdev suspend/resume
> operations in all of the architectures still using them with struct
> syscore_ops-based PM callbacks and finally removes the suspend/resume
> and shutdown operations from struct sysdev_class and struct sysdev_driver.
>
> Patches [1/14] and [2/14] are important bug fixes targeted at 2.6.39.
> The remaining patches are regareded as 2.6.40 material, but I'd like to
> put them into linux-next shortly, if there are no objections, to catch
> problems that they may introduce before they hit the mainline. Again,
> if there are no objections I'd like to merge these patches through the
> suspend-2.6 tree.

No objection from me at all, thanks for doing this they look great.

Acked-by: Greg Kroah-Hartman <[email protected]>

2011-04-18 08:51:53

by Ian Campbell

[permalink] [raw]
Subject: Re: [PATCH 2/14] PM: Add missing syscore_suspend() and syscore_resume() calls

On Sun, 2011-04-17 at 23:06 +0200, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <[email protected]>
>
> Device suspend/resume infrastructure is used not only by the suspend
> and hibernate code in kernel/power, but also by , APM, Xen and the
> kexec jump feature. However, commit 40dc166cb5dddbd36aa4ad11c03915ea
> (PM / Core: Introduce struct syscore_ops for core subsystems PM)
> failed to add syscore_suspend() and syscore_resume() calls to that
> code, which generally leads to breakage when the features in question
> are used.
>
> To fix this problem, add the missing syscore_suspend() and
> syscore_resume() calls to arch/x86/kernel/apm_32.c, kernel/kexec.c
> and drivers/xen/manage.c.

Xen bit looks ok to me:
Acked-by: Ian Campbell <[email protected]>

>
> Signed-off-by: Rafael J. Wysocki <[email protected]>
> ---
> arch/x86/kernel/apm_32.c | 5 +++++
> drivers/xen/manage.c | 9 ++++++++-
> kernel/kexec.c | 7 +++++++
> 3 files changed, 20 insertions(+), 1 deletion(-)
>
> Index: linux-2.6/kernel/kexec.c
> ===================================================================
> --- linux-2.6.orig/kernel/kexec.c
> +++ linux-2.6/kernel/kexec.c
> @@ -33,6 +33,7 @@
> #include <linux/vmalloc.h>
> #include <linux/swap.h>
> #include <linux/kmsg_dump.h>
> +#include <linux/syscore_ops.h>
>
> #include <asm/page.h>
> #include <asm/uaccess.h>
> @@ -1532,6 +1533,11 @@ int kernel_kexec(void)
> local_irq_disable();
> /* Suspend system devices */
> error = sysdev_suspend(PMSG_FREEZE);
> + if (!error) {
> + error = syscore_suspend();
> + if (error)
> + sysdev_resume();
> + }
> if (error)
> goto Enable_irqs;
> } else
> @@ -1546,6 +1552,7 @@ int kernel_kexec(void)
>
> #ifdef CONFIG_KEXEC_JUMP
> if (kexec_image->preserve_context) {
> + syscore_resume();
> sysdev_resume();
> Enable_irqs:
> local_irq_enable();
> Index: linux-2.6/drivers/xen/manage.c
> ===================================================================
> --- linux-2.6.orig/drivers/xen/manage.c
> +++ linux-2.6/drivers/xen/manage.c
> @@ -8,6 +8,7 @@
> #include <linux/sysrq.h>
> #include <linux/stop_machine.h>
> #include <linux/freezer.h>
> +#include <linux/syscore_ops.h>
>
> #include <xen/xen.h>
> #include <xen/xenbus.h>
> @@ -70,8 +71,13 @@ static int xen_suspend(void *data)
> BUG_ON(!irqs_disabled());
>
> err = sysdev_suspend(PMSG_FREEZE);
> + if (!err) {
> + err = syscore_suspend();
> + if (err)
> + sysdev_resume();
> + }
> if (err) {
> - printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
> + printk(KERN_ERR "xen_suspend: system core suspend failed: %d\n",
> err);
> return err;
> }
> @@ -95,6 +101,7 @@ static int xen_suspend(void *data)
> xen_timer_resume();
> }
>
> + syscore_resume();
> sysdev_resume();
>
> return 0;
> Index: linux-2.6/arch/x86/kernel/apm_32.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/apm_32.c
> +++ linux-2.6/arch/x86/kernel/apm_32.c
> @@ -228,6 +228,7 @@
> #include <linux/kthread.h>
> #include <linux/jiffies.h>
> #include <linux/acpi.h>
> +#include <linux/syscore_ops.h>
>
> #include <asm/system.h>
> #include <asm/uaccess.h>
> @@ -1238,6 +1239,7 @@ static int suspend(int vetoable)
>
> local_irq_disable();
> sysdev_suspend(PMSG_SUSPEND);
> + syscore_suspend();
>
> local_irq_enable();
>
> @@ -1255,6 +1257,7 @@ static int suspend(int vetoable)
> apm_error("suspend", err);
> err = (err == APM_SUCCESS) ? 0 : -EIO;
>
> + syscore_resume();
> sysdev_resume();
> local_irq_enable();
>
> @@ -1280,6 +1283,7 @@ static void standby(void)
>
> local_irq_disable();
> sysdev_suspend(PMSG_SUSPEND);
> + syscore_suspend();
> local_irq_enable();
>
> err = set_system_power_state(APM_STATE_STANDBY);
> @@ -1287,6 +1291,7 @@ static void standby(void)
> apm_error("standby", err);
>
> local_irq_disable();
> + syscore_resume();
> sysdev_resume();
> local_irq_enable();
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

--
Ian Campbell

Tact in audacity is knowing how far you can go without going too far.
-- Jean Cocteau

2011-04-18 10:41:13

by Ralf Baechle

[permalink] [raw]
Subject: Re: [PATCH 10/14] PM / MIPS: Use struct syscore_ops instead of sysdevs for PM

This patch breaks the Alchemy kernel compile; below patch on top of it fixes
that again.

Signed-off-by: Ralf Baechle <[email protected]>

---
arch/mips/alchemy/common/irq.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

Index: linux-mips/arch/mips/alchemy/common/irq.c
===================================================================
--- linux-mips.orig/arch/mips/alchemy/common/irq.c
+++ linux-mips/arch/mips/alchemy/common/irq.c
@@ -619,8 +619,8 @@ static struct syscore_ops alchemy_ic_sys

static int __init alchemy_ic_syscore_init(void)
{
- alchemy_ic_data[0].base = ioremap(icbase[IC0_PHYS_ADDR], 0x1000);
- alchemy_ic_data[1].base = ioremap(icbase[IC1_PHYS_ADDR], 0x1000);
+ alchemy_ic_data[0].base = ioremap(IC0_PHYS_ADDR, 0x1000);
+ alchemy_ic_data[1].base = ioremap(IC1_PHYS_ADDR, 0x1000);

register_syscore_ops(&alchemy_ic_syscore_ops);

2011-04-18 20:02:48

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 10/14] PM / MIPS: Use struct syscore_ops instead of sysdevs for PM

On Monday, April 18, 2011, Ralf Baechle wrote:
> This patch breaks the Alchemy kernel compile; below patch on top of it fixes
> that again.
>
> Signed-off-by: Ralf Baechle <[email protected]>

Thanks! If you don't mind, I'd like to fold your patch into [10/14].

Rafael


> ---
> arch/mips/alchemy/common/irq.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> Index: linux-mips/arch/mips/alchemy/common/irq.c
> ===================================================================
> --- linux-mips.orig/arch/mips/alchemy/common/irq.c
> +++ linux-mips/arch/mips/alchemy/common/irq.c
> @@ -619,8 +619,8 @@ static struct syscore_ops alchemy_ic_sys
>
> static int __init alchemy_ic_syscore_init(void)
> {
> - alchemy_ic_data[0].base = ioremap(icbase[IC0_PHYS_ADDR], 0x1000);
> - alchemy_ic_data[1].base = ioremap(icbase[IC1_PHYS_ADDR], 0x1000);
> + alchemy_ic_data[0].base = ioremap(IC0_PHYS_ADDR, 0x1000);
> + alchemy_ic_data[1].base = ioremap(IC1_PHYS_ADDR, 0x1000);
>
> register_syscore_ops(&alchemy_ic_syscore_ops);
>
>
>

2011-04-18 21:43:22

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 9/14] PM / Blackfin: Use struct syscore_ops instead of sysdevs for PM

On Monday, April 18, 2011, Mike Frysinger wrote:
> On Sun, Apr 17, 2011 at 17:11, Rafael J. Wysocki wrote:
> > Convert some Blackfin architecture's code to using struct syscore_ops
> > objects for power management instead of sysdev classes and sysdevs.
> >
> > This simplifies the code and reduces the kernel's memory footprint.
> > It also is necessary for removing sysdevs from the kernel entirely in
> > the future.
>
> looks straight forward enough ...
> Acked-by: Mike Frysinger <[email protected]>
>
> > +static struct syscore_ops nmi_syscore_ops = {
> > .resume = nmi_wdt_resume,
> > .suspend = nmi_wdt_suspend,
> > };
>
> a bit sad this couldnt be made const

Well, that would trigger a compiler warning from register_syscore_ops().

However, I'm going to make that change change everywhere at once when all of
the conversions have been made, since it looks like we're only going to have
static syscore_ops.

Thanks,
Rafael

2011-04-19 03:08:13

by Lars-Peter Clausen

[permalink] [raw]
Subject: Re: [PATCH 10/14] PM / MIPS: Use struct syscore_ops instead of sysdevs for PM

On 04/17/2011 11:12 PM, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <[email protected]>
>
> Convert some MIPS architecture's code to using struct syscore_ops
> objects for power management instead of sysdev classes and sysdevs.
>
> This simplifies the code and reduces the kernel's memory footprint.
> It also is necessary for removing sysdevs from the kernel entirely in
> the future.
>
> Signed-off-by: Rafael J. Wysocki <[email protected]>

For the jz4740 part:
Acked-and-tested-by: Lars-Peter Clausen <[email protected]>

> ---
> arch/mips/alchemy/common/dbdma.c | 92 +++++++++++----------------------------
> arch/mips/alchemy/common/irq.c | 62 +++++++++-----------------
> arch/mips/jz4740/gpio.c | 52 +++++++++-------------
> arch/mips/kernel/i8259.c | 26 +++--------
> 4 files changed, 80 insertions(+), 152 deletions(-)
>
> Index: linux-2.6/arch/mips/alchemy/common/irq.c
> ===================================================================
> --- linux-2.6.orig/arch/mips/alchemy/common/irq.c
> +++ linux-2.6/arch/mips/alchemy/common/irq.c
> @@ -30,7 +30,7 @@
> #include <linux/interrupt.h>
> #include <linux/irq.h>
> #include <linux/slab.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
>
> #include <asm/irq_cpu.h>
> #include <asm/mipsregs.h>
> @@ -556,17 +556,15 @@ void __init arch_init_irq(void)
> }
> }
>
> -struct alchemy_ic_sysdev {
> - struct sys_device sysdev;
> +struct alchemy_ic {
> void __iomem *base;
> unsigned long pmdata[7];
> };
>
> -static int alchemy_ic_suspend(struct sys_device *dev, pm_message_t state)
> -{
> - struct alchemy_ic_sysdev *icdev =
> - container_of(dev, struct alchemy_ic_sysdev, sysdev);
> +static struct alchemy_ic alchemy_ic_data[2];
>
> +static void alchemy_suspend_one_ic(struct alchemy_ic *icdev)
> +{
> icdev->pmdata[0] = __raw_readl(icdev->base + IC_CFG0RD);
> icdev->pmdata[1] = __raw_readl(icdev->base + IC_CFG1RD);
> icdev->pmdata[2] = __raw_readl(icdev->base + IC_CFG2RD);
> @@ -574,15 +572,17 @@ static int alchemy_ic_suspend(struct sys
> icdev->pmdata[4] = __raw_readl(icdev->base + IC_ASSIGNRD);
> icdev->pmdata[5] = __raw_readl(icdev->base + IC_WAKERD);
> icdev->pmdata[6] = __raw_readl(icdev->base + IC_MASKRD);
> +}
>
> +static int alchemy_ic_suspend(void)
> +{
> + alchemy_suspend_one_ic(alchemy_ic_data);
> + alchemy_suspend_one_ic(alchemy_ic_data + 1);
> return 0;
> }
>
> -static int alchemy_ic_resume(struct sys_device *dev)
> +static void alchemy_resume_one_ic(struct alchemy_ic *icdev)
> {
> - struct alchemy_ic_sysdev *icdev =
> - container_of(dev, struct alchemy_ic_sysdev, sysdev);
> -
> __raw_writel(0xffffffff, icdev->base + IC_MASKCLR);
> __raw_writel(0xffffffff, icdev->base + IC_CFG0CLR);
> __raw_writel(0xffffffff, icdev->base + IC_CFG1CLR);
> @@ -604,42 +604,26 @@ static int alchemy_ic_resume(struct sys_
>
> __raw_writel(icdev->pmdata[6], icdev->base + IC_MASKSET);
> wmb();
> +}
>
> - return 0;
> +static void alchemy_ic_resume(void)
> +{
> + alchemy_resume_one_ic(alchemy_ic_data + 1);
> + alchemy_resume_one_ic(alchemy_ic_data);
> }
>
> -static struct sysdev_class alchemy_ic_sysdev_class = {
> - .name = "ic",
> +static struct syscore_ops alchemy_ic_syscore_ops = {
> .suspend = alchemy_ic_suspend,
> .resume = alchemy_ic_resume,
> };
>
> -static int __init alchemy_ic_sysdev_init(void)
> +static int __init alchemy_ic_syscore_init(void)
> {
> - struct alchemy_ic_sysdev *icdev;
> - unsigned long icbase[2] = { IC0_PHYS_ADDR, IC1_PHYS_ADDR };
> - int err, i;
> -
> - err = sysdev_class_register(&alchemy_ic_sysdev_class);
> - if (err)
> - return err;
> -
> - for (i = 0; i < 2; i++) {
> - icdev = kzalloc(sizeof(struct alchemy_ic_sysdev), GFP_KERNEL);
> - if (!icdev)
> - return -ENOMEM;
> -
> - icdev->base = ioremap(icbase[i], 0x1000);
> -
> - icdev->sysdev.id = i;
> - icdev->sysdev.cls = &alchemy_ic_sysdev_class;
> - err = sysdev_register(&icdev->sysdev);
> - if (err) {
> - kfree(icdev);
> - return err;
> - }
> - }
> + alchemy_ic_data[0].base = ioremap(icbase[IC0_PHYS_ADDR], 0x1000);
> + alchemy_ic_data[1].base = ioremap(icbase[IC1_PHYS_ADDR], 0x1000);
> +
> + register_syscore_ops(&alchemy_ic_syscore_ops);
>
> return 0;
> }
> -device_initcall(alchemy_ic_sysdev_init);
> +device_initcall(alchemy_ic_syscore_init);
> Index: linux-2.6/arch/mips/alchemy/common/dbdma.c
> ===================================================================
> --- linux-2.6.orig/arch/mips/alchemy/common/dbdma.c
> +++ linux-2.6/arch/mips/alchemy/common/dbdma.c
> @@ -36,7 +36,7 @@
> #include <linux/spinlock.h>
> #include <linux/interrupt.h>
> #include <linux/module.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <asm/mach-au1x00/au1000.h>
> #include <asm/mach-au1x00/au1xxx_dbdma.h>
>
> @@ -957,37 +957,30 @@ u32 au1xxx_dbdma_put_dscr(u32 chanid, au
> return nbytes;
> }
>
> +static u32 alchemy_dbdma_pm_regs[NUM_DBDMA_CHANS + 1][6];
>
> -struct alchemy_dbdma_sysdev {
> - struct sys_device sysdev;
> - u32 pm_regs[NUM_DBDMA_CHANS + 1][6];
> -};
> -
> -static int alchemy_dbdma_suspend(struct sys_device *dev,
> - pm_message_t state)
> +static int alchemy_dbdma_suspend(void)
> {
> - struct alchemy_dbdma_sysdev *sdev =
> - container_of(dev, struct alchemy_dbdma_sysdev, sysdev);
> int i;
> u32 addr;
>
> addr = DDMA_GLOBAL_BASE;
> - sdev->pm_regs[0][0] = au_readl(addr + 0x00);
> - sdev->pm_regs[0][1] = au_readl(addr + 0x04);
> - sdev->pm_regs[0][2] = au_readl(addr + 0x08);
> - sdev->pm_regs[0][3] = au_readl(addr + 0x0c);
> + alchemy_dbdma_pm_regs[0][0] = au_readl(addr + 0x00);
> + alchemy_dbdma_pm_regs[0][1] = au_readl(addr + 0x04);
> + alchemy_dbdma_pm_regs[0][2] = au_readl(addr + 0x08);
> + alchemy_dbdma_pm_regs[0][3] = au_readl(addr + 0x0c);
>
> /* save channel configurations */
> for (i = 1, addr = DDMA_CHANNEL_BASE; i <= NUM_DBDMA_CHANS; i++) {
> - sdev->pm_regs[i][0] = au_readl(addr + 0x00);
> - sdev->pm_regs[i][1] = au_readl(addr + 0x04);
> - sdev->pm_regs[i][2] = au_readl(addr + 0x08);
> - sdev->pm_regs[i][3] = au_readl(addr + 0x0c);
> - sdev->pm_regs[i][4] = au_readl(addr + 0x10);
> - sdev->pm_regs[i][5] = au_readl(addr + 0x14);
> + alchemy_dbdma_pm_regs[i][0] = au_readl(addr + 0x00);
> + alchemy_dbdma_pm_regs[i][1] = au_readl(addr + 0x04);
> + alchemy_dbdma_pm_regs[i][2] = au_readl(addr + 0x08);
> + alchemy_dbdma_pm_regs[i][3] = au_readl(addr + 0x0c);
> + alchemy_dbdma_pm_regs[i][4] = au_readl(addr + 0x10);
> + alchemy_dbdma_pm_regs[i][5] = au_readl(addr + 0x14);
>
> /* halt channel */
> - au_writel(sdev->pm_regs[i][0] & ~1, addr + 0x00);
> + au_writel(alchemy_dbdma_pm_regs[i][0] & ~1, addr + 0x00);
> au_sync();
> while (!(au_readl(addr + 0x14) & 1))
> au_sync();
> @@ -1001,62 +994,35 @@ static int alchemy_dbdma_suspend(struct
> return 0;
> }
>
> -static int alchemy_dbdma_resume(struct sys_device *dev)
> +static void alchemy_dbdma_resume(void)
> {
> - struct alchemy_dbdma_sysdev *sdev =
> - container_of(dev, struct alchemy_dbdma_sysdev, sysdev);
> int i;
> u32 addr;
>
> addr = DDMA_GLOBAL_BASE;
> - au_writel(sdev->pm_regs[0][0], addr + 0x00);
> - au_writel(sdev->pm_regs[0][1], addr + 0x04);
> - au_writel(sdev->pm_regs[0][2], addr + 0x08);
> - au_writel(sdev->pm_regs[0][3], addr + 0x0c);
> + au_writel(alchemy_dbdma_pm_regs[0][0], addr + 0x00);
> + au_writel(alchemy_dbdma_pm_regs[0][1], addr + 0x04);
> + au_writel(alchemy_dbdma_pm_regs[0][2], addr + 0x08);
> + au_writel(alchemy_dbdma_pm_regs[0][3], addr + 0x0c);
>
> /* restore channel configurations */
> for (i = 1, addr = DDMA_CHANNEL_BASE; i <= NUM_DBDMA_CHANS; i++) {
> - au_writel(sdev->pm_regs[i][0], addr + 0x00);
> - au_writel(sdev->pm_regs[i][1], addr + 0x04);
> - au_writel(sdev->pm_regs[i][2], addr + 0x08);
> - au_writel(sdev->pm_regs[i][3], addr + 0x0c);
> - au_writel(sdev->pm_regs[i][4], addr + 0x10);
> - au_writel(sdev->pm_regs[i][5], addr + 0x14);
> + au_writel(alchemy_dbdma_pm_regs[i][0], addr + 0x00);
> + au_writel(alchemy_dbdma_pm_regs[i][1], addr + 0x04);
> + au_writel(alchemy_dbdma_pm_regs[i][2], addr + 0x08);
> + au_writel(alchemy_dbdma_pm_regs[i][3], addr + 0x0c);
> + au_writel(alchemy_dbdma_pm_regs[i][4], addr + 0x10);
> + au_writel(alchemy_dbdma_pm_regs[i][5], addr + 0x14);
> au_sync();
> addr += 0x100; /* next channel base */
> }
> -
> - return 0;
> }
>
> -static struct sysdev_class alchemy_dbdma_sysdev_class = {
> - .name = "dbdma",
> +static struct syscore_ops alchemy_dbdma_syscore_ops = {
> .suspend = alchemy_dbdma_suspend,
> .resume = alchemy_dbdma_resume,
> };
>
> -static int __init alchemy_dbdma_sysdev_init(void)
> -{
> - struct alchemy_dbdma_sysdev *sdev;
> - int ret;
> -
> - ret = sysdev_class_register(&alchemy_dbdma_sysdev_class);
> - if (ret)
> - return ret;
> -
> - sdev = kzalloc(sizeof(struct alchemy_dbdma_sysdev), GFP_KERNEL);
> - if (!sdev)
> - return -ENOMEM;
> -
> - sdev->sysdev.id = -1;
> - sdev->sysdev.cls = &alchemy_dbdma_sysdev_class;
> - ret = sysdev_register(&sdev->sysdev);
> - if (ret)
> - kfree(sdev);
> -
> - return ret;
> -}
> -
> static int __init au1xxx_dbdma_init(void)
> {
> int irq_nr, ret;
> @@ -1084,11 +1050,7 @@ static int __init au1xxx_dbdma_init(void
> else {
> dbdma_initialized = 1;
> printk(KERN_INFO "Alchemy DBDMA initialized\n");
> - ret = alchemy_dbdma_sysdev_init();
> - if (ret) {
> - printk(KERN_ERR "DBDMA PM init failed\n");
> - ret = 0;
> - }
> + register_syscore_ops(&alchemy_dbdma_syscore_ops);
> }
>
> return ret;
> Index: linux-2.6/arch/mips/jz4740/gpio.c
> ===================================================================
> --- linux-2.6.orig/arch/mips/jz4740/gpio.c
> +++ linux-2.6/arch/mips/jz4740/gpio.c
> @@ -18,7 +18,7 @@
> #include <linux/init.h>
>
> #include <linux/spinlock.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/io.h>
> #include <linux/gpio.h>
> #include <linux/delay.h>
> @@ -86,7 +86,6 @@ struct jz_gpio_chip {
> spinlock_t lock;
>
> struct gpio_chip gpio_chip;
> - struct sys_device sysdev;
> };
>
> static struct jz_gpio_chip jz4740_gpio_chips[];
> @@ -459,49 +458,47 @@ static struct jz_gpio_chip jz4740_gpio_c
> JZ4740_GPIO_CHIP(D),
> };
>
> -static inline struct jz_gpio_chip *sysdev_to_chip(struct sys_device *dev)
> +static void jz4740_gpio_suspend_chip(struct jz_gpio_chip *chip)
> {
> - return container_of(dev, struct jz_gpio_chip, sysdev);
> + chip->suspend_mask = readl(chip->base + JZ_REG_GPIO_MASK);
> + writel(~(chip->wakeup), chip->base + JZ_REG_GPIO_MASK_SET);
> + writel(chip->wakeup, chip->base + JZ_REG_GPIO_MASK_CLEAR);
> }
>
> -static int jz4740_gpio_suspend(struct sys_device *dev, pm_message_t state)
> +static int jz4740_gpio_suspend(void)
> {
> - struct jz_gpio_chip *chip = sysdev_to_chip(dev);
> + int i;
>
> - chip->suspend_mask = readl(chip->base + JZ_REG_GPIO_MASK);
> - writel(~(chip->wakeup), chip->base + JZ_REG_GPIO_MASK_SET);
> - writel(chip->wakeup, chip->base + JZ_REG_GPIO_MASK_CLEAR);
> + for (i = 0; i < ARRAY_SIZE(jz4740_gpio_chips); i++)
> + jz4740_gpio_suspend_chip(&jz4740_gpio_chips[i]);
>
> return 0;
> }
>
> -static int jz4740_gpio_resume(struct sys_device *dev)
> +static void jz4740_gpio_resume_chip(struct jz_gpio_chip *chip)
> {
> - struct jz_gpio_chip *chip = sysdev_to_chip(dev);
> uint32_t mask = chip->suspend_mask;
>
> writel(~mask, chip->base + JZ_REG_GPIO_MASK_CLEAR);
> writel(mask, chip->base + JZ_REG_GPIO_MASK_SET);
> +}
>
> - return 0;
> +static void jz4740_gpio_resume(void)
> +{
> + int i;
> +
> + for (i = ARRAY_SIZE(jz4740_gpio_chips) - 1; i >= 0 ; i--)
> + jz4740_gpio_resume_chip(&jz4740_gpio_chips[i]);
> }
>
> -static struct sysdev_class jz4740_gpio_sysdev_class = {
> - .name = "gpio",
> +static struct syscore_ops jz4740_gpio_syscore_ops = {
> .suspend = jz4740_gpio_suspend,
> .resume = jz4740_gpio_resume,
> };
>
> -static int jz4740_gpio_chip_init(struct jz_gpio_chip *chip, unsigned int id)
> +static void jz4740_gpio_chip_init(struct jz_gpio_chip *chip, unsigned int id)
> {
> - int ret, irq;
> -
> - chip->sysdev.id = id;
> - chip->sysdev.cls = &jz4740_gpio_sysdev_class;
> - ret = sysdev_register(&chip->sysdev);
> -
> - if (ret)
> - return ret;
> + int irq;
>
> spin_lock_init(&chip->lock);
>
> @@ -519,22 +516,17 @@ static int jz4740_gpio_chip_init(struct
> irq_set_chip_and_handler(irq, &jz_gpio_irq_chip,
> handle_level_irq);
> }
> -
> - return 0;
> }
>
> static int __init jz4740_gpio_init(void)
> {
> unsigned int i;
> - int ret;
> -
> - ret = sysdev_class_register(&jz4740_gpio_sysdev_class);
> - if (ret)
> - return ret;
>
> for (i = 0; i < ARRAY_SIZE(jz4740_gpio_chips); ++i)
> jz4740_gpio_chip_init(&jz4740_gpio_chips[i], i);
>
> + register_syscore_ops(&jz4740_gpio_syscore_ops);
> +
> printk(KERN_INFO "JZ4740 GPIO initialized\n");
>
> return 0;
> Index: linux-2.6/arch/mips/kernel/i8259.c
> ===================================================================
> --- linux-2.6.orig/arch/mips/kernel/i8259.c
> +++ linux-2.6/arch/mips/kernel/i8259.c
> @@ -14,7 +14,7 @@
> #include <linux/interrupt.h>
> #include <linux/kernel.h>
> #include <linux/spinlock.h>
> -#include <linux/sysdev.h>
> +#include <linux/syscore_ops.h>
> #include <linux/irq.h>
>
> #include <asm/i8259.h>
> @@ -215,14 +215,13 @@ spurious_8259A_irq:
> }
> }
>
> -static int i8259A_resume(struct sys_device *dev)
> +static void i8259A_resume(void)
> {
> if (i8259A_auto_eoi >= 0)
> init_8259A(i8259A_auto_eoi);
> - return 0;
> }
>
> -static int i8259A_shutdown(struct sys_device *dev)
> +static void i8259A_shutdown(void)
> {
> /* Put the i8259A into a quiescent state that
> * the kernel initialization code can get it
> @@ -232,29 +231,20 @@ static int i8259A_shutdown(struct sys_de
> outb(0xff, PIC_MASTER_IMR); /* mask all of 8259A-1 */
> outb(0xff, PIC_SLAVE_IMR); /* mask all of 8259A-1 */
> }
> - return 0;
> }
>
> -static struct sysdev_class i8259_sysdev_class = {
> - .name = "i8259",
> +static struct syscore_ops i8259_syscore_ops = {
> .resume = i8259A_resume,
> .shutdown = i8259A_shutdown,
> };
>
> -static struct sys_device device_i8259A = {
> - .id = 0,
> - .cls = &i8259_sysdev_class,
> -};
> -
> -static int __init i8259A_init_sysfs(void)
> +static int __init i8259A_init_syscore(void)
> {
> - int error = sysdev_class_register(&i8259_sysdev_class);
> - if (!error)
> - error = sysdev_register(&device_i8259A);
> - return error;
> + register_syscore_ops(&i8259_syscore_ops);
> + return 0;
> }
>
> -device_initcall(i8259A_init_sysfs);
> +device_initcall(i8259A_init_syscore);
>
> static void init_8259A(int auto_eoi)
> {
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/

2011-04-19 08:08:28

by Xuetao Guan

[permalink] [raw]
Subject: RE: [PATCH 12/14] PM / UNICORE32: Use struct syscore_ops instead of sysdevs for PM



> -----Original Message-----
> From: Rafael J. Wysocki [mailto:[email protected]]
> Sent: Monday, April 18, 2011 5:14 AM
> To: LKML
> Cc: Greg KH; Kay Sievers; Linux PM mailing list; Russell King; [email protected]; Kevin Hilman; linux-arm-
> [email protected]; Ben Dooks; Mike Frysinger; Ralf Baechle; Hans-Christian Egtvedt; Guan Xuetao; Benjamin Herrenschmidt;
> [email protected]; Jiri Kosina; Konrad Rzeszutek Wilk; Jeremy Fitzhardinge
> Subject: [PATCH 12/14] PM / UNICORE32: Use struct syscore_ops instead of sysdevs for PM
>
> From: Rafael J. Wysocki <[email protected]>
>
> Make some UNICORE32 architecture's code use struct syscore_ops
> objects for power management instead of sysdev classes and sysdevs.
>
> This simplifies the code and reduces the kernel's memory footprint.
> It also is necessary for removing sysdevs from the kernel entirely in
> the future.
>
> Signed-off-by: Rafael J. Wysocki <[email protected]>

Acked-by: Guan Xuetao <[email protected]>

2011-04-26 12:29:29

by Hans-Christian Egtvedt

[permalink] [raw]
Subject: Re: [PATCH 11/14] PM / AVR32: Use struct syscore_ops instead of sysdevs for PM

On Sun, 2011-04-17 at 23:13 +0200, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <[email protected]>
>
> Convert some AVR32 architecture's code to using struct syscore_ops
> objects for power management instead of sysdev classes and sysdevs.
>
> This simplifies the code and reduces the kernel's memory footprint.
> It also is necessary for removing sysdevs from the kernel entirely in
> the future.
>
> Signed-off-by: Rafael J. Wysocki <[email protected]>

Acked-by: Hans-Christian Egtvedt <[email protected]>

Thanks, nice work. Tested and run on hardware.

<snipp>

--
Hans-Christian Egtvedt

2011-04-26 17:13:48

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 11/14] PM / AVR32: Use struct syscore_ops instead of sysdevs for PM

On Tuesday, April 26, 2011, Hans-Christian Egtvedt wrote:
> On Sun, 2011-04-17 at 23:13 +0200, Rafael J. Wysocki wrote:
> > From: Rafael J. Wysocki <[email protected]>
> >
> > Convert some AVR32 architecture's code to using struct syscore_ops
> > objects for power management instead of sysdev classes and sysdevs.
> >
> > This simplifies the code and reduces the kernel's memory footprint.
> > It also is necessary for removing sysdevs from the kernel entirely in
> > the future.
> >
> > Signed-off-by: Rafael J. Wysocki <[email protected]>
>
> Acked-by: Hans-Christian Egtvedt <[email protected]>
>
> Thanks, nice work. Tested and run on hardware.

Thanks!

Rafael