mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 18:09:57 +00:00
Merge branch 'syscore' into for-linus
* syscore: PM: Remove sysdev suspend, resume and shutdown operations PM / PowerPC: Use struct syscore_ops instead of sysdevs for PM PM / UNICORE32: Use struct syscore_ops instead of sysdevs for PM PM / AVR32: Use struct syscore_ops instead of sysdevs for PM PM / Blackfin: Use struct syscore_ops instead of sysdevs for PM ARM / Samsung: Use struct syscore_ops for "core" power management ARM / PXA: Use struct syscore_ops for "core" power management ARM / SA1100: Use struct syscore_ops for "core" power management ARM / Integrator: Use struct syscore_ops for core PM ARM / OMAP: Use struct syscore_ops for "core" power management ARM: Use struct syscore_ops instead of sysdevs for PM in common code
This commit is contained in:
commit
2d2a9163bd
85 changed files with 508 additions and 1135 deletions
|
@ -22,17 +22,16 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/amba/bus.h>
|
#include <linux/amba/bus.h>
|
||||||
|
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
#include <asm/hardware/vic.h>
|
#include <asm/hardware/vic.h>
|
||||||
|
|
||||||
#if defined(CONFIG_PM)
|
#ifdef CONFIG_PM
|
||||||
/**
|
/**
|
||||||
* struct vic_device - VIC PM device
|
* struct vic_device - VIC PM device
|
||||||
* @sysdev: The system device which is registered.
|
|
||||||
* @irq: The IRQ number for the base of the VIC.
|
* @irq: The IRQ number for the base of the VIC.
|
||||||
* @base: The register base for the VIC.
|
* @base: The register base for the VIC.
|
||||||
* @resume_sources: A bitmask of interrupts for resume.
|
* @resume_sources: A bitmask of interrupts for resume.
|
||||||
|
@ -43,8 +42,6 @@
|
||||||
* @protect: Save for VIC_PROTECT.
|
* @protect: Save for VIC_PROTECT.
|
||||||
*/
|
*/
|
||||||
struct vic_device {
|
struct vic_device {
|
||||||
struct sys_device sysdev;
|
|
||||||
|
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
int irq;
|
int irq;
|
||||||
u32 resume_sources;
|
u32 resume_sources;
|
||||||
|
@ -59,11 +56,6 @@ struct vic_device {
|
||||||
static struct vic_device vic_devices[CONFIG_ARM_VIC_NR];
|
static struct vic_device vic_devices[CONFIG_ARM_VIC_NR];
|
||||||
|
|
||||||
static int vic_id;
|
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 */
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -85,10 +77,9 @@ static void vic_init2(void __iomem *base)
|
||||||
writel(32, base + VIC_PL190_DEF_VECT_ADDR);
|
writel(32, base + VIC_PL190_DEF_VECT_ADDR);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_PM)
|
#ifdef CONFIG_PM
|
||||||
static int vic_class_resume(struct sys_device *dev)
|
static void resume_one_vic(struct vic_device *vic)
|
||||||
{
|
{
|
||||||
struct vic_device *vic = to_vic(dev);
|
|
||||||
void __iomem *base = vic->base;
|
void __iomem *base = vic->base;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: resuming vic at %p\n", __func__, base);
|
printk(KERN_DEBUG "%s: resuming vic at %p\n", __func__, base);
|
||||||
|
@ -107,13 +98,18 @@ static int vic_class_resume(struct sys_device *dev)
|
||||||
|
|
||||||
writel(vic->soft_int, base + VIC_INT_SOFT);
|
writel(vic->soft_int, base + VIC_INT_SOFT);
|
||||||
writel(~vic->soft_int, base + VIC_INT_SOFT_CLEAR);
|
writel(~vic->soft_int, base + VIC_INT_SOFT_CLEAR);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vic_class_suspend(struct sys_device *dev, pm_message_t state)
|
static void vic_resume(void)
|
||||||
|
{
|
||||||
|
int id;
|
||||||
|
|
||||||
|
for (id = vic_id - 1; id >= 0; id--)
|
||||||
|
resume_one_vic(vic_devices + id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void suspend_one_vic(struct vic_device *vic)
|
||||||
{
|
{
|
||||||
struct vic_device *vic = to_vic(dev);
|
|
||||||
void __iomem *base = vic->base;
|
void __iomem *base = vic->base;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: suspending vic at %p\n", __func__, base);
|
printk(KERN_DEBUG "%s: suspending vic at %p\n", __func__, base);
|
||||||
|
@ -128,14 +124,21 @@ static int vic_class_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
|
|
||||||
writel(vic->resume_irqs, base + VIC_INT_ENABLE);
|
writel(vic->resume_irqs, base + VIC_INT_ENABLE);
|
||||||
writel(~vic->resume_irqs, base + VIC_INT_ENABLE_CLEAR);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sysdev_class vic_class = {
|
struct syscore_ops vic_syscore_ops = {
|
||||||
.name = "vic",
|
.suspend = vic_suspend,
|
||||||
.suspend = vic_class_suspend,
|
.resume = vic_resume,
|
||||||
.resume = vic_class_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -147,30 +150,8 @@ struct sysdev_class vic_class = {
|
||||||
*/
|
*/
|
||||||
static int __init vic_pm_init(void)
|
static int __init vic_pm_init(void)
|
||||||
{
|
{
|
||||||
struct vic_device *dev = vic_devices;
|
if (vic_id > 0)
|
||||||
int err;
|
register_syscore_ops(&vic_syscore_ops);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
* timer interrupt which may be pending.
|
* timer interrupt which may be pending.
|
||||||
*/
|
*/
|
||||||
struct sys_timer {
|
struct sys_timer {
|
||||||
struct sys_device dev;
|
|
||||||
void (*init)(void);
|
void (*init)(void);
|
||||||
void (*suspend)(void);
|
void (*suspend)(void);
|
||||||
void (*resume)(void);
|
void (*resume)(void);
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <asm/leds.h>
|
#include <asm/leds.h>
|
||||||
|
|
||||||
|
@ -69,29 +70,8 @@ static ssize_t leds_store(struct sys_device *dev,
|
||||||
|
|
||||||
static SYSDEV_ATTR(event, 0200, NULL, leds_store);
|
static SYSDEV_ATTR(event, 0200, NULL, leds_store);
|
||||||
|
|
||||||
static int leds_suspend(struct sys_device *dev, pm_message_t state)
|
|
||||||
{
|
|
||||||
leds_event(led_stop);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int leds_resume(struct sys_device *dev)
|
|
||||||
{
|
|
||||||
leds_event(led_start);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int leds_shutdown(struct sys_device *dev)
|
|
||||||
{
|
|
||||||
leds_event(led_halted);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct sysdev_class leds_sysclass = {
|
static struct sysdev_class leds_sysclass = {
|
||||||
.name = "leds",
|
.name = "leds",
|
||||||
.shutdown = leds_shutdown,
|
|
||||||
.suspend = leds_suspend,
|
|
||||||
.resume = leds_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device leds_device = {
|
static struct sys_device leds_device = {
|
||||||
|
@ -99,6 +79,28 @@ static struct sys_device leds_device = {
|
||||||
.cls = &leds_sysclass,
|
.cls = &leds_sysclass,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int leds_suspend(void)
|
||||||
|
{
|
||||||
|
leds_event(led_stop);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void leds_resume(void)
|
||||||
|
{
|
||||||
|
leds_event(led_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void leds_shutdown(void)
|
||||||
|
{
|
||||||
|
leds_event(led_halted);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct syscore_ops leds_syscore_ops = {
|
||||||
|
.shutdown = leds_shutdown,
|
||||||
|
.suspend = leds_suspend,
|
||||||
|
.resume = leds_resume,
|
||||||
|
};
|
||||||
|
|
||||||
static int __init leds_init(void)
|
static int __init leds_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -107,6 +109,8 @@ static int __init leds_init(void)
|
||||||
ret = sysdev_register(&leds_device);
|
ret = sysdev_register(&leds_device);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = sysdev_create_file(&leds_device, &attr_event);
|
ret = sysdev_create_file(&leds_device, &attr_event);
|
||||||
|
if (ret == 0)
|
||||||
|
register_syscore_ops(&leds_syscore_ops);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include <linux/timex.h>
|
#include <linux/timex.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/profile.h>
|
#include <linux/profile.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
|
@ -115,48 +115,37 @@ void timer_tick(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PM) && !defined(CONFIG_GENERIC_CLOCKEVENTS)
|
#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 (system_timer->suspend)
|
||||||
|
system_timer->suspend();
|
||||||
if (timer->suspend != NULL)
|
|
||||||
timer->suspend();
|
|
||||||
|
|
||||||
return 0;
|
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 (system_timer->resume)
|
||||||
|
system_timer->resume();
|
||||||
if (timer->resume != NULL)
|
|
||||||
timer->resume();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define timer_suspend NULL
|
#define timer_suspend NULL
|
||||||
#define timer_resume NULL
|
#define timer_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct sysdev_class timer_sysclass = {
|
static struct syscore_ops timer_syscore_ops = {
|
||||||
.name = "timer",
|
|
||||||
.suspend = timer_suspend,
|
.suspend = timer_suspend,
|
||||||
.resume = timer_resume,
|
.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);
|
register_syscore_ops(&timer_syscore_ops);
|
||||||
if (ret == 0) {
|
|
||||||
system_timer->dev.cls = &timer_sysclass;
|
return 0;
|
||||||
ret = sysdev_register(&system_timer->dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
device_initcall(timer_init_syscore_ops);
|
||||||
}
|
|
||||||
|
|
||||||
device_initcall(timer_init_sysfs);
|
|
||||||
|
|
||||||
void __init time_init(void)
|
void __init time_init(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
@ -372,7 +373,27 @@ void exynos4_scu_enable(void __iomem *scu_base)
|
||||||
flush_cache_all();
|
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 */
|
/* For release retention */
|
||||||
|
|
||||||
|
@ -394,27 +415,15 @@ static int exynos4_pm_resume(struct sys_device *dev)
|
||||||
/* enable L2X0*/
|
/* enable L2X0*/
|
||||||
writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
|
writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_driver exynos4_pm_driver = {
|
static struct syscore_ops exynos4_pm_syscore_ops = {
|
||||||
.add = exynos4_pm_add,
|
|
||||||
.resume = exynos4_pm_resume,
|
.resume = exynos4_pm_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init int exynos4_pm_drvinit(void)
|
static __init int exynos4_pm_syscore_init(void)
|
||||||
{
|
{
|
||||||
unsigned int tmp;
|
register_syscore_ops(&exynos4_pm_syscore_ops);
|
||||||
|
return 0;
|
||||||
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);
|
arch_initcall(exynos4_pm_syscore_init);
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/amba/bus.h>
|
#include <linux/amba/bus.h>
|
||||||
#include <linux/amba/kmi.h>
|
#include <linux/amba/kmi.h>
|
||||||
#include <linux/clocksource.h>
|
#include <linux/clocksource.h>
|
||||||
|
@ -180,13 +180,13 @@ static void __init ap_init_irq(void)
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static unsigned long ic_irq_enable;
|
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);
|
ic_irq_enable = readl(VA_IC_BASE + IRQ_ENABLE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int irq_resume(struct sys_device *dev)
|
static void irq_resume(void)
|
||||||
{
|
{
|
||||||
/* disable all irq sources */
|
/* disable all irq sources */
|
||||||
writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
|
writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
|
||||||
|
@ -194,33 +194,25 @@ static int irq_resume(struct sys_device *dev)
|
||||||
writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
|
writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
|
||||||
|
|
||||||
writel(ic_irq_enable, VA_IC_BASE + IRQ_ENABLE_SET);
|
writel(ic_irq_enable, VA_IC_BASE + IRQ_ENABLE_SET);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define irq_suspend NULL
|
#define irq_suspend NULL
|
||||||
#define irq_resume NULL
|
#define irq_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct sysdev_class irq_class = {
|
static struct syscore_ops irq_syscore_ops = {
|
||||||
.name = "irq",
|
|
||||||
.suspend = irq_suspend,
|
.suspend = irq_suspend,
|
||||||
.resume = irq_resume,
|
.resume = irq_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device irq_device = {
|
static int __init irq_syscore_init(void)
|
||||||
.id = 0,
|
|
||||||
.cls = &irq_class,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init irq_init_sysfs(void)
|
|
||||||
{
|
{
|
||||||
int ret = sysdev_class_register(&irq_class);
|
register_syscore_ops(&irq_syscore_ops);
|
||||||
if (ret == 0)
|
|
||||||
ret = sysdev_register(&irq_device);
|
return 0;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(irq_init_sysfs);
|
device_initcall(irq_syscore_init);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flash handling.
|
* Flash handling.
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <mach/pxa2xx-regs.h>
|
#include <mach/pxa2xx-regs.h>
|
||||||
|
|
||||||
|
@ -33,32 +33,22 @@ const struct clkops clk_pxa2xx_cken_ops = {
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static uint32_t saved_cken;
|
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;
|
saved_cken = CKEN;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pxa2xx_clock_resume(struct sys_device *d)
|
static void pxa2xx_clock_resume(void)
|
||||||
{
|
{
|
||||||
CKEN = saved_cken;
|
CKEN = saved_cken;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define pxa2xx_clock_suspend NULL
|
#define pxa2xx_clock_suspend NULL
|
||||||
#define pxa2xx_clock_resume NULL
|
#define pxa2xx_clock_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct sysdev_class pxa2xx_clock_sysclass = {
|
struct syscore_ops pxa2xx_clock_syscore_ops = {
|
||||||
.name = "pxa2xx-clock",
|
|
||||||
.suspend = pxa2xx_clock_suspend,
|
.suspend = pxa2xx_clock_suspend,
|
||||||
.resume = pxa2xx_clock_resume,
|
.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);
|
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <mach/smemc.h>
|
#include <mach/smemc.h>
|
||||||
#include <mach/pxa3xx-regs.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 cken[2];
|
||||||
static uint32_t accr;
|
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[0] = CKENA;
|
||||||
cken[1] = CKENB;
|
cken[1] = CKENB;
|
||||||
|
@ -190,28 +191,18 @@ static int pxa3xx_clock_suspend(struct sys_device *d, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pxa3xx_clock_resume(struct sys_device *d)
|
static void pxa3xx_clock_resume(void)
|
||||||
{
|
{
|
||||||
ACCR = accr;
|
ACCR = accr;
|
||||||
CKENA = cken[0];
|
CKENA = cken[0];
|
||||||
CKENB = cken[1];
|
CKENB = cken[1];
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define pxa3xx_clock_suspend NULL
|
#define pxa3xx_clock_suspend NULL
|
||||||
#define pxa3xx_clock_resume NULL
|
#define pxa3xx_clock_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct sysdev_class pxa3xx_clock_sysclass = {
|
struct syscore_ops pxa3xx_clock_syscore_ops = {
|
||||||
.name = "pxa3xx-clock",
|
|
||||||
.suspend = pxa3xx_clock_suspend,
|
.suspend = pxa3xx_clock_suspend,
|
||||||
.resume = pxa3xx_clock_resume,
|
.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);
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <linux/clkdev.h>
|
#include <linux/clkdev.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
struct clkops {
|
struct clkops {
|
||||||
void (*enable)(struct clk *);
|
void (*enable)(struct clk *);
|
||||||
|
@ -54,7 +54,7 @@ extern const struct clkops clk_pxa2xx_cken_ops;
|
||||||
void clk_pxa2xx_cken_enable(struct clk *clk);
|
void clk_pxa2xx_cken_enable(struct clk *clk);
|
||||||
void clk_pxa2xx_cken_disable(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)
|
#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA95x)
|
||||||
#define DEFINE_PXA3_CKEN(_name, _cken, _rate, _delay) \
|
#define DEFINE_PXA3_CKEN(_name, _cken, _rate, _delay) \
|
||||||
|
@ -74,5 +74,6 @@ extern const struct clkops clk_pxa3xx_smemc_ops;
|
||||||
extern void clk_pxa3xx_cken_enable(struct clk *);
|
extern void clk_pxa3xx_cken_enable(struct clk *);
|
||||||
extern void clk_pxa3xx_cken_disable(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
|
#endif
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
|
||||||
|
@ -388,7 +388,7 @@ static inline void cmx2xx_init_display(void) {}
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static unsigned long sleep_save_msc[10];
|
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();
|
cmx2xx_pci_suspend();
|
||||||
|
|
||||||
|
@ -412,7 +412,7 @@ static int cmx2xx_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmx2xx_resume(struct sys_device *dev)
|
static void cmx2xx_resume(void)
|
||||||
{
|
{
|
||||||
cmx2xx_pci_resume();
|
cmx2xx_pci_resume();
|
||||||
|
|
||||||
|
@ -420,27 +420,18 @@ static int cmx2xx_resume(struct sys_device *dev)
|
||||||
__raw_writel(sleep_save_msc[0], MSC0);
|
__raw_writel(sleep_save_msc[0], MSC0);
|
||||||
__raw_writel(sleep_save_msc[1], MSC1);
|
__raw_writel(sleep_save_msc[1], MSC1);
|
||||||
__raw_writel(sleep_save_msc[2], MSC2);
|
__raw_writel(sleep_save_msc[2], MSC2);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class cmx2xx_pm_sysclass = {
|
static struct syscore_ops cmx2xx_pm_syscore_ops = {
|
||||||
.name = "pm",
|
|
||||||
.resume = cmx2xx_resume,
|
.resume = cmx2xx_resume,
|
||||||
.suspend = cmx2xx_suspend,
|
.suspend = cmx2xx_suspend,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device cmx2xx_pm_device = {
|
|
||||||
.cls = &cmx2xx_pm_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init cmx2xx_pm_init(void)
|
static int __init cmx2xx_pm_init(void)
|
||||||
{
|
{
|
||||||
int error;
|
register_syscore_ops(&cmx2xx_pm_syscore_ops);
|
||||||
error = sysdev_class_register(&cmx2xx_pm_sysclass);
|
|
||||||
if (error == 0)
|
return 0;
|
||||||
error = sysdev_register(&cmx2xx_pm_device);
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static int __init cmx2xx_pm_init(void) { return 0; }
|
static int __init cmx2xx_pm_init(void) { return 0; }
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/pwm_backlight.h>
|
#include <linux/pwm_backlight.h>
|
||||||
#include <linux/i2c/pxa-i2c.h>
|
#include <linux/i2c/pxa-i2c.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/ucb1400.h>
|
#include <linux/ucb1400.h>
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
|
|
@ -61,10 +61,10 @@ extern unsigned pxa3xx_get_clk_frequency_khz(int);
|
||||||
#define pxa3xx_get_clk_frequency_khz(x) (0)
|
#define pxa3xx_get_clk_frequency_khz(x) (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern struct sysdev_class pxa_irq_sysclass;
|
extern struct syscore_ops pxa_irq_syscore_ops;
|
||||||
extern struct sysdev_class pxa_gpio_sysclass;
|
extern struct syscore_ops pxa_gpio_syscore_ops;
|
||||||
extern struct sysdev_class pxa2xx_mfp_sysclass;
|
extern struct syscore_ops pxa2xx_mfp_syscore_ops;
|
||||||
extern struct sysdev_class pxa3xx_mfp_sysclass;
|
extern struct syscore_ops pxa3xx_mfp_syscore_ops;
|
||||||
|
|
||||||
void __init pxa_set_ffuart_info(void *info);
|
void __init pxa_set_ffuart_info(void *info);
|
||||||
void __init pxa_set_btuart_info(void *info);
|
void __init pxa_set_btuart_info(void *info);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ void __init pxa_init_irq(int irq_nr, set_wake_t fn)
|
||||||
static unsigned long saved_icmr[MAX_INTERNAL_IRQS/32];
|
static unsigned long saved_icmr[MAX_INTERNAL_IRQS/32];
|
||||||
static unsigned long saved_ipr[MAX_INTERNAL_IRQS];
|
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;
|
int i;
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pxa_irq_resume(struct sys_device *dev)
|
static void pxa_irq_resume(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -218,22 +218,13 @@ static int pxa_irq_resume(struct sys_device *dev)
|
||||||
__raw_writel(saved_ipr[i], IRQ_BASE + IPR(i));
|
__raw_writel(saved_ipr[i], IRQ_BASE + IPR(i));
|
||||||
|
|
||||||
__raw_writel(1, IRQ_BASE + ICCR);
|
__raw_writel(1, IRQ_BASE + ICCR);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define pxa_irq_suspend NULL
|
#define pxa_irq_suspend NULL
|
||||||
#define pxa_irq_resume NULL
|
#define pxa_irq_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct sysdev_class pxa_irq_sysclass = {
|
struct syscore_ops pxa_irq_syscore_ops = {
|
||||||
.name = "irq",
|
|
||||||
.suspend = pxa_irq_suspend,
|
.suspend = pxa_irq_suspend,
|
||||||
.resume = pxa_irq_resume,
|
.resume = pxa_irq_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init pxa_irq_init(void)
|
|
||||||
{
|
|
||||||
return sysdev_class_register(&pxa_irq_sysclass);
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(pxa_irq_init);
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
@ -159,30 +159,22 @@ static void __init lpd270_init_irq(void)
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#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);
|
__raw_writew(lpd270_irq_enabled, LPD270_INT_MASK);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class lpd270_irq_sysclass = {
|
static struct syscore_ops lpd270_irq_syscore_ops = {
|
||||||
.name = "cpld_irq",
|
|
||||||
.resume = lpd270_irq_resume,
|
.resume = lpd270_irq_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device lpd270_irq_device = {
|
|
||||||
.cls = &lpd270_irq_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init lpd270_irq_device_init(void)
|
static int __init lpd270_irq_device_init(void)
|
||||||
{
|
{
|
||||||
int ret = -ENODEV;
|
|
||||||
if (machine_is_logicpd_pxa270()) {
|
if (machine_is_logicpd_pxa270()) {
|
||||||
ret = sysdev_class_register(&lpd270_irq_sysclass);
|
register_syscore_ops(&lpd270_irq_syscore_ops);
|
||||||
if (ret == 0)
|
return 0;
|
||||||
ret = sysdev_register(&lpd270_irq_device);
|
|
||||||
}
|
}
|
||||||
return ret;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(lpd270_irq_device_init);
|
device_initcall(lpd270_irq_device_init);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/major.h>
|
#include <linux/major.h>
|
||||||
#include <linux/fb.h>
|
#include <linux/fb.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
@ -176,31 +176,22 @@ static void __init lubbock_init_irq(void)
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#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;
|
LUB_IRQ_MASK_EN = lubbock_irq_enabled;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class lubbock_irq_sysclass = {
|
static struct syscore_ops lubbock_irq_syscore_ops = {
|
||||||
.name = "cpld_irq",
|
|
||||||
.resume = lubbock_irq_resume,
|
.resume = lubbock_irq_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device lubbock_irq_device = {
|
|
||||||
.cls = &lubbock_irq_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init lubbock_irq_device_init(void)
|
static int __init lubbock_irq_device_init(void)
|
||||||
{
|
{
|
||||||
int ret = -ENODEV;
|
|
||||||
|
|
||||||
if (machine_is_lubbock()) {
|
if (machine_is_lubbock()) {
|
||||||
ret = sysdev_class_register(&lubbock_irq_sysclass);
|
register_syscore_ops(&lubbock_irq_syscore_ops);
|
||||||
if (ret == 0)
|
return 0;
|
||||||
ret = sysdev_register(&lubbock_irq_device);
|
|
||||||
}
|
}
|
||||||
return ret;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(lubbock_irq_device_init);
|
device_initcall(lubbock_irq_device_init);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
@ -185,31 +185,21 @@ static void __init mainstone_init_irq(void)
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
|
||||||
static int mainstone_irq_resume(struct sys_device *dev)
|
static void mainstone_irq_resume(void)
|
||||||
{
|
{
|
||||||
MST_INTMSKENA = mainstone_irq_enabled;
|
MST_INTMSKENA = mainstone_irq_enabled;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class mainstone_irq_sysclass = {
|
static struct syscore_ops mainstone_irq_syscore_ops = {
|
||||||
.name = "cpld_irq",
|
|
||||||
.resume = mainstone_irq_resume,
|
.resume = mainstone_irq_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device mainstone_irq_device = {
|
|
||||||
.cls = &mainstone_irq_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init mainstone_irq_device_init(void)
|
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()) {
|
return 0;
|
||||||
ret = sysdev_class_register(&mainstone_irq_sysclass);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = sysdev_register(&mainstone_irq_device);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(mainstone_irq_device_init);
|
device_initcall(mainstone_irq_device_init);
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <mach/pxa2xx-regs.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_gpdr[4];
|
||||||
static unsigned long saved_pgsr[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;
|
int i;
|
||||||
|
|
||||||
|
@ -365,7 +365,7 @@ static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pxa2xx_mfp_resume(struct sys_device *d)
|
static void pxa2xx_mfp_resume(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -376,15 +376,13 @@ static int pxa2xx_mfp_resume(struct sys_device *d)
|
||||||
PGSR(i) = saved_pgsr[i];
|
PGSR(i) = saved_pgsr[i];
|
||||||
}
|
}
|
||||||
PSSR = PSSR_RDH | PSSR_PH;
|
PSSR = PSSR_RDH | PSSR_PH;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define pxa2xx_mfp_suspend NULL
|
#define pxa2xx_mfp_suspend NULL
|
||||||
#define pxa2xx_mfp_resume NULL
|
#define pxa2xx_mfp_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct sysdev_class pxa2xx_mfp_sysclass = {
|
struct syscore_ops pxa2xx_mfp_syscore_ops = {
|
||||||
.name = "mfp",
|
|
||||||
.suspend = pxa2xx_mfp_suspend,
|
.suspend = pxa2xx_mfp_suspend,
|
||||||
.resume = pxa2xx_mfp_resume,
|
.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++)
|
for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++)
|
||||||
gpdr_lpm[i] = GPDR(i * 32);
|
gpdr_lpm[i] = GPDR(i * 32);
|
||||||
|
|
||||||
return sysdev_class_register(&pxa2xx_mfp_sysclass);
|
return 0;
|
||||||
}
|
}
|
||||||
postcore_initcall(pxa2xx_mfp_init);
|
postcore_initcall(pxa2xx_mfp_init);
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <mach/mfp-pxa3xx.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
|
* a pull-down mode if they're an active low chip select, and we're
|
||||||
* just entering standby.
|
* 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();
|
mfp_config_lpm();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pxa3xx_mfp_resume(struct sys_device *d)
|
static void pxa3xx_mfp_resume(void)
|
||||||
{
|
{
|
||||||
mfp_config_run();
|
mfp_config_run();
|
||||||
|
|
||||||
|
@ -47,24 +47,13 @@ static int pxa3xx_mfp_resume(struct sys_device *d)
|
||||||
* preserve them here in case they will be referenced later
|
* preserve them here in case they will be referenced later
|
||||||
*/
|
*/
|
||||||
ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S);
|
ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define pxa3xx_mfp_suspend NULL
|
#define pxa3xx_mfp_suspend NULL
|
||||||
#define pxa3xx_mfp_resume NULL
|
#define pxa3xx_mfp_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct sysdev_class pxa3xx_mfp_sysclass = {
|
struct syscore_ops pxa3xx_mfp_syscore_ops = {
|
||||||
.name = "mfp",
|
|
||||||
.suspend = pxa3xx_mfp_suspend,
|
.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);
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/gpio_keys.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;
|
int i = 0, is_bt_on;
|
||||||
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
|
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
|
||||||
|
@ -514,7 +514,7 @@ static int mioa701_sys_suspend(struct sys_device *sysdev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mioa701_sys_resume(struct sys_device *sysdev)
|
static void mioa701_sys_resume(void)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
|
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
|
||||||
|
@ -527,43 +527,18 @@ static int mioa701_sys_resume(struct sys_device *sysdev)
|
||||||
*mem_resume_enabler = save_buffer[i++];
|
*mem_resume_enabler = save_buffer[i++];
|
||||||
*mem_resume_bt = save_buffer[i++];
|
*mem_resume_bt = save_buffer[i++];
|
||||||
*mem_resume_unknown = save_buffer[i++];
|
*mem_resume_unknown = save_buffer[i++];
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class mioa701_sysclass = {
|
static struct syscore_ops mioa701_syscore_ops = {
|
||||||
.name = "mioa701",
|
.suspend = mioa701_sys_suspend,
|
||||||
};
|
.resume = mioa701_sys_resume,
|
||||||
|
|
||||||
static struct sys_device sysdev_bootstrap = {
|
|
||||||
.cls = &mioa701_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sysdev_driver driver_bootstrap = {
|
|
||||||
.suspend = &mioa701_sys_suspend,
|
|
||||||
.resume = &mioa701_sys_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init bootstrap_init(void)
|
static int __init bootstrap_init(void)
|
||||||
{
|
{
|
||||||
int rc;
|
|
||||||
int save_size = mioa701_bootstrap_lg + (sizeof(u32) * 3);
|
int save_size = mioa701_bootstrap_lg + (sizeof(u32) * 3);
|
||||||
|
|
||||||
rc = sysdev_class_register(&mioa701_sysclass);
|
register_syscore_ops(&mioa701_syscore_ops);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
save_buffer = kmalloc(save_size, GFP_KERNEL);
|
save_buffer = kmalloc(save_size, GFP_KERNEL);
|
||||||
if (!save_buffer)
|
if (!save_buffer)
|
||||||
|
@ -576,9 +551,7 @@ static int __init bootstrap_init(void)
|
||||||
static void bootstrap_exit(void)
|
static void bootstrap_exit(void)
|
||||||
{
|
{
|
||||||
kfree(save_buffer);
|
kfree(save_buffer);
|
||||||
sysdev_driver_unregister(&mioa701_sysclass, &driver_bootstrap);
|
unregister_syscore_ops(&mioa701_syscore_ops);
|
||||||
sysdev_unregister(&sysdev_bootstrap);
|
|
||||||
sysdev_class_unregister(&mioa701_sysclass);
|
|
||||||
|
|
||||||
printk(KERN_CRIT "Unregistering mioa701 suspend will hang next"
|
printk(KERN_CRIT "Unregistering mioa701 suspend will hang next"
|
||||||
"resume !!!\n");
|
"resume !!!\n");
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/wm97xx.h>
|
#include <linux/wm97xx.h>
|
||||||
#include <linux/power_supply.h>
|
#include <linux/power_supply.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <linux/pwm_backlight.h>
|
#include <linux/pwm_backlight.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/power_supply.h>
|
#include <linux/power_supply.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/w1-gpio.h>
|
#include <linux/w1-gpio.h>
|
||||||
|
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
|
@ -233,9 +233,9 @@ static struct palmz72_resume_info palmz72_resume_info = {
|
||||||
|
|
||||||
static unsigned long store_ptr;
|
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 */
|
/* setup the resume_info struct for the original bootloader */
|
||||||
palmz72_resume_info.resume_addr = (u32) cpu_resume;
|
palmz72_resume_info.resume_addr = (u32) cpu_resume;
|
||||||
|
@ -249,31 +249,23 @@ static int palmz72_pm_suspend(struct sys_device *dev, pm_message_t msg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int palmz72_pm_resume(struct sys_device *dev)
|
static void palmz72_pm_resume(void)
|
||||||
{
|
{
|
||||||
*PALMZ72_SAVE_DWORD = store_ptr;
|
*PALMZ72_SAVE_DWORD = store_ptr;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class palmz72_pm_sysclass = {
|
static struct syscore_ops palmz72_pm_syscore_ops = {
|
||||||
.name = "palmz72_pm",
|
|
||||||
.suspend = palmz72_pm_suspend,
|
.suspend = palmz72_pm_suspend,
|
||||||
.resume = palmz72_pm_resume,
|
.resume = palmz72_pm_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device palmz72_pm_device = {
|
|
||||||
.cls = &palmz72_pm_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init palmz72_pm_init(void)
|
static int __init palmz72_pm_init(void)
|
||||||
{
|
{
|
||||||
int ret = -ENODEV;
|
|
||||||
if (machine_is_palmz72()) {
|
if (machine_is_palmz72()) {
|
||||||
ret = sysdev_class_register(&palmz72_pm_sysclass);
|
register_syscore_ops(&palmz72_pm_syscore_ops);
|
||||||
if (ret == 0)
|
return 0;
|
||||||
ret = sysdev_register(&palmz72_pm_device);
|
|
||||||
}
|
}
|
||||||
return ret;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(palmz72_pm_init);
|
device_initcall(palmz72_pm_init);
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
@ -350,21 +350,9 @@ static struct platform_device *pxa25x_devices[] __initdata = {
|
||||||
&pxa_device_asoc_platform,
|
&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)
|
static int __init pxa25x_init(void)
|
||||||
{
|
{
|
||||||
int i, ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (cpu_is_pxa25x()) {
|
if (cpu_is_pxa25x()) {
|
||||||
|
|
||||||
|
@ -377,11 +365,10 @@ static int __init pxa25x_init(void)
|
||||||
|
|
||||||
pxa25x_init_pm();
|
pxa25x_init_pm();
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(pxa25x_sysdev); i++) {
|
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||||
ret = sysdev_register(&pxa25x_sysdev[i]);
|
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||||
if (ret)
|
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||||
pr_err("failed to register sysdev[%d]\n", i);
|
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
||||||
}
|
|
||||||
|
|
||||||
ret = platform_add_devices(pxa25x_devices,
|
ret = platform_add_devices(pxa25x_devices,
|
||||||
ARRAY_SIZE(pxa25x_devices));
|
ARRAY_SIZE(pxa25x_devices));
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/i2c/pxa-i2c.h>
|
#include <linux/i2c/pxa-i2c.h>
|
||||||
|
@ -428,21 +428,9 @@ static struct platform_device *devices[] __initdata = {
|
||||||
&pxa27x_device_pwm1,
|
&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)
|
static int __init pxa27x_init(void)
|
||||||
{
|
{
|
||||||
int i, ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (cpu_is_pxa27x()) {
|
if (cpu_is_pxa27x()) {
|
||||||
|
|
||||||
|
@ -455,11 +443,10 @@ static int __init pxa27x_init(void)
|
||||||
|
|
||||||
pxa27x_init_pm();
|
pxa27x_init_pm();
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(pxa27x_sysdev); i++) {
|
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||||
ret = sysdev_register(&pxa27x_sysdev[i]);
|
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||||
if (ret)
|
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||||
pr_err("failed to register sysdev[%d]\n", i);
|
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
||||||
}
|
|
||||||
|
|
||||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/i2c/pxa-i2c.h>
|
#include <linux/i2c/pxa-i2c.h>
|
||||||
|
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
@ -427,21 +427,9 @@ static struct platform_device *devices[] __initdata = {
|
||||||
&pxa27x_device_pwm1,
|
&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)
|
static int __init pxa3xx_init(void)
|
||||||
{
|
{
|
||||||
int i, ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (cpu_is_pxa3xx()) {
|
if (cpu_is_pxa3xx()) {
|
||||||
|
|
||||||
|
@ -462,11 +450,10 @@ static int __init pxa3xx_init(void)
|
||||||
|
|
||||||
pxa3xx_init_pm();
|
pxa3xx_init_pm();
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(pxa3xx_sysdev); i++) {
|
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||||
ret = sysdev_register(&pxa3xx_sysdev[i]);
|
register_syscore_ops(&pxa3xx_mfp_syscore_ops);
|
||||||
if (ret)
|
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||||
pr_err("failed to register sysdev[%d]\n", i);
|
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
||||||
}
|
|
||||||
|
|
||||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#include <linux/i2c/pxa-i2c.h>
|
#include <linux/i2c/pxa-i2c.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
|
@ -260,16 +260,6 @@ static struct platform_device *devices[] __initdata = {
|
||||||
&pxa27x_device_pwm1,
|
&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)
|
static int __init pxa95x_init(void)
|
||||||
{
|
{
|
||||||
int ret = 0, i;
|
int ret = 0, i;
|
||||||
|
@ -293,11 +283,9 @@ static int __init pxa95x_init(void)
|
||||||
if ((ret = pxa_init_dma(IRQ_DMA, 32)))
|
if ((ret = pxa_init_dma(IRQ_DMA, 32)))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(pxa95x_sysdev); i++) {
|
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||||
ret = sysdev_register(&pxa95x_sysdev[i]);
|
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||||
if (ret)
|
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
||||||
pr_err("failed to register sysdev[%d]\n", i);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <mach/smemc.h>
|
#include <mach/smemc.h>
|
||||||
|
@ -16,7 +16,7 @@ static unsigned long msc[2];
|
||||||
static unsigned long sxcnfg, memclkcfg;
|
static unsigned long sxcnfg, memclkcfg;
|
||||||
static unsigned long csadrcfg[4];
|
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[0] = __raw_readl(MSC0);
|
||||||
msc[1] = __raw_readl(MSC1);
|
msc[1] = __raw_readl(MSC1);
|
||||||
|
@ -30,7 +30,7 @@ static int pxa3xx_smemc_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
return 0;
|
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[0], MSC0);
|
||||||
__raw_writel(msc[1], MSC1);
|
__raw_writel(msc[1], MSC1);
|
||||||
|
@ -40,34 +40,19 @@ static int pxa3xx_smemc_resume(struct sys_device *dev)
|
||||||
__raw_writel(csadrcfg[1], CSADRCFG1);
|
__raw_writel(csadrcfg[1], CSADRCFG1);
|
||||||
__raw_writel(csadrcfg[2], CSADRCFG2);
|
__raw_writel(csadrcfg[2], CSADRCFG2);
|
||||||
__raw_writel(csadrcfg[3], CSADRCFG3);
|
__raw_writel(csadrcfg[3], CSADRCFG3);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class smemc_sysclass = {
|
static struct syscore_ops smemc_syscore_ops = {
|
||||||
.name = "smemc",
|
|
||||||
.suspend = pxa3xx_smemc_suspend,
|
.suspend = pxa3xx_smemc_suspend,
|
||||||
.resume = pxa3xx_smemc_resume,
|
.resume = pxa3xx_smemc_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device smemc_sysdev = {
|
|
||||||
.id = 0,
|
|
||||||
.cls = &smemc_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init smemc_init(void)
|
static int __init smemc_init(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
if (cpu_is_pxa3xx())
|
||||||
|
register_syscore_ops(&smemc_syscore_ops);
|
||||||
|
|
||||||
if (cpu_is_pxa3xx()) {
|
return 0;
|
||||||
ret = sysdev_class_register(&smemc_sysclass);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = sysdev_register(&smemc_sysdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
subsys_initcall(smemc_init);
|
subsys_initcall(smemc_init);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <mach/pxa25x.h>
|
#include <mach/pxa25x.h>
|
||||||
#include <mach/audio.h>
|
#include <mach/audio.h>
|
||||||
|
@ -130,20 +131,19 @@ static u8 viper_hw_version(void)
|
||||||
return v1;
|
return v1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CPU sysdev */
|
/* CPU system core operations. */
|
||||||
static int viper_cpu_suspend(struct sys_device *sysdev, pm_message_t state)
|
static int viper_cpu_suspend(void)
|
||||||
{
|
{
|
||||||
viper_icr_set_bit(VIPER_ICR_R_DIS);
|
viper_icr_set_bit(VIPER_ICR_R_DIS);
|
||||||
return 0;
|
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);
|
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,
|
.suspend = viper_cpu_suspend,
|
||||||
.resume = viper_cpu_resume,
|
.resume = viper_cpu_resume,
|
||||||
};
|
};
|
||||||
|
@ -945,7 +945,7 @@ static void __init viper_init(void)
|
||||||
viper_init_vcore_gpios();
|
viper_init_vcore_gpios();
|
||||||
viper_init_cpufreq();
|
viper_init_cpufreq();
|
||||||
|
|
||||||
sysdev_driver_register(&cpu_sysdev_class, &viper_cpu_sysdev_driver);
|
register_syscore_ops(&viper_cpu_syscore_ops);
|
||||||
|
|
||||||
if (version) {
|
if (version) {
|
||||||
pr_info("viper: hardware v%di%d detected. "
|
pr_info("viper: hardware v%di%d detected. "
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/usb/gpio_vbus.h>
|
#include <linux/usb/gpio_vbus.h>
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
|
|
|
@ -23,38 +23,12 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <plat/cpu.h>
|
#include <plat/cpu.h>
|
||||||
#include <plat/pm.h>
|
#include <plat/pm.h>
|
||||||
|
|
||||||
static int s3c2410_irq_add(struct sys_device *sysdev)
|
struct syscore_ops s3c24xx_irq_syscore_ops = {
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct sysdev_driver s3c2410_irq_driver = {
|
|
||||||
.add = s3c2410_irq_add,
|
|
||||||
.suspend = s3c24xx_irq_suspend,
|
.suspend = s3c24xx_irq_suspend,
|
||||||
.resume = s3c24xx_irq_resume,
|
.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);
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/dm9000.h>
|
#include <linux/dm9000.h>
|
||||||
|
@ -214,17 +214,16 @@ static struct s3c2410_uartcfg bast_uartcfgs[] __initdata = {
|
||||||
/* NAND Flash on BAST board */
|
/* NAND Flash on BAST board */
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#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. */
|
/* ensure that an nRESET is not generated on resume. */
|
||||||
gpio_direction_output(S3C2410_GPA(21), 1);
|
gpio_direction_output(S3C2410_GPA(21), 1);
|
||||||
return 0;
|
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);
|
s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -232,16 +231,11 @@ static int bast_pm_resume(struct sys_device *sd)
|
||||||
#define bast_pm_resume NULL
|
#define bast_pm_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct sysdev_class bast_pm_sysclass = {
|
static struct syscore_ops bast_pm_syscore_ops = {
|
||||||
.name = "mach-bast",
|
|
||||||
.suspend = bast_pm_suspend,
|
.suspend = bast_pm_suspend,
|
||||||
.resume = bast_pm_resume,
|
.resume = bast_pm_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device bast_pm_sysdev = {
|
|
||||||
.cls = &bast_pm_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int smartmedia_map[] = { 0 };
|
static int smartmedia_map[] = { 0 };
|
||||||
static int chip0_map[] = { 1 };
|
static int chip0_map[] = { 1 };
|
||||||
static int chip1_map[] = { 2 };
|
static int chip1_map[] = { 2 };
|
||||||
|
@ -642,8 +636,7 @@ static void __init bast_map_io(void)
|
||||||
|
|
||||||
static void __init bast_init(void)
|
static void __init bast_init(void)
|
||||||
{
|
{
|
||||||
sysdev_class_register(&bast_pm_sysclass);
|
register_syscore_ops(&bast_pm_syscore_ops);
|
||||||
sysdev_register(&bast_pm_sysdev);
|
|
||||||
|
|
||||||
s3c_i2c0_set_platdata(&bast_i2c_info);
|
s3c_i2c0_set_platdata(&bast_i2c_info);
|
||||||
s3c_nand_set_platdata(&bast_nand_info);
|
s3c_nand_set_platdata(&bast_nand_info);
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/io.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;
|
unsigned long tmp;
|
||||||
|
|
||||||
|
@ -104,10 +105,12 @@ static int s3c2410_pm_resume(struct sys_device *dev)
|
||||||
|
|
||||||
if ( machine_is_aml_m5900() )
|
if ( machine_is_aml_m5900() )
|
||||||
s3c2410_gpio_setpin(S3C2410_GPF(2), 0);
|
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)
|
static int s3c2410_pm_add(struct sys_device *dev)
|
||||||
{
|
{
|
||||||
pm_cpu_prep = s3c2410_pm_prepare;
|
pm_cpu_prep = s3c2410_pm_prepare;
|
||||||
|
@ -119,7 +122,6 @@ static int s3c2410_pm_add(struct sys_device *dev)
|
||||||
#if defined(CONFIG_CPU_S3C2410)
|
#if defined(CONFIG_CPU_S3C2410)
|
||||||
static struct sysdev_driver s3c2410_pm_driver = {
|
static struct sysdev_driver s3c2410_pm_driver = {
|
||||||
.add = s3c2410_pm_add,
|
.add = s3c2410_pm_add,
|
||||||
.resume = s3c2410_pm_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* register ourselves */
|
/* register ourselves */
|
||||||
|
@ -133,7 +135,6 @@ arch_initcall(s3c2410_pm_drvinit);
|
||||||
|
|
||||||
static struct sysdev_driver s3c2410a_pm_driver = {
|
static struct sysdev_driver s3c2410a_pm_driver = {
|
||||||
.add = s3c2410_pm_add,
|
.add = s3c2410_pm_add,
|
||||||
.resume = s3c2410_pm_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init s3c2410a_pm_drvinit(void)
|
static int __init s3c2410a_pm_drvinit(void)
|
||||||
|
@ -147,7 +148,6 @@ arch_initcall(s3c2410a_pm_drvinit);
|
||||||
#if defined(CONFIG_CPU_S3C2440)
|
#if defined(CONFIG_CPU_S3C2440)
|
||||||
static struct sysdev_driver s3c2440_pm_driver = {
|
static struct sysdev_driver s3c2440_pm_driver = {
|
||||||
.add = s3c2410_pm_add,
|
.add = s3c2410_pm_add,
|
||||||
.resume = s3c2410_pm_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init s3c2440_pm_drvinit(void)
|
static int __init s3c2440_pm_drvinit(void)
|
||||||
|
@ -161,7 +161,6 @@ arch_initcall(s3c2440_pm_drvinit);
|
||||||
#if defined(CONFIG_CPU_S3C2442)
|
#if defined(CONFIG_CPU_S3C2442)
|
||||||
static struct sysdev_driver s3c2442_pm_driver = {
|
static struct sysdev_driver s3c2442_pm_driver = {
|
||||||
.add = s3c2410_pm_add,
|
.add = s3c2410_pm_add,
|
||||||
.resume = s3c2410_pm_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init s3c2442_pm_drvinit(void)
|
static int __init s3c2442_pm_drvinit(void)
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
@ -40,6 +41,7 @@
|
||||||
#include <plat/devs.h>
|
#include <plat/devs.h>
|
||||||
#include <plat/clock.h>
|
#include <plat/clock.h>
|
||||||
#include <plat/pll.h>
|
#include <plat/pll.h>
|
||||||
|
#include <plat/pm.h>
|
||||||
|
|
||||||
#include <plat/gpio-core.h>
|
#include <plat/gpio-core.h>
|
||||||
#include <plat/gpio-cfg.h>
|
#include <plat/gpio-cfg.h>
|
||||||
|
@ -168,6 +170,9 @@ int __init s3c2410_init(void)
|
||||||
{
|
{
|
||||||
printk("S3C2410: Initialising architecture\n");
|
printk("S3C2410: Initialising architecture\n");
|
||||||
|
|
||||||
|
register_syscore_ops(&s3c2410_pm_syscore_ops);
|
||||||
|
register_syscore_ops(&s3c24xx_irq_syscore_ops);
|
||||||
|
|
||||||
return sysdev_register(&s3c2410_sysdev);
|
return sysdev_register(&s3c2410_sysdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -202,8 +202,6 @@ static int s3c2412_irq_add(struct sys_device *sysdev)
|
||||||
|
|
||||||
static struct sysdev_driver s3c2412_irq_driver = {
|
static struct sysdev_driver s3c2412_irq_driver = {
|
||||||
.add = s3c2412_irq_add,
|
.add = s3c2412_irq_add,
|
||||||
.suspend = s3c24xx_irq_suspend,
|
|
||||||
.resume = s3c24xx_irq_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int s3c2412_irq_init(void)
|
static int s3c2412_irq_init(void)
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
|
@ -486,7 +486,7 @@ static struct s3c2410_udc_mach_info jive_udc_cfg __initdata = {
|
||||||
/* Jive power management device */
|
/* Jive power management device */
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#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
|
/* Write the magic value u-boot uses to check for resume into
|
||||||
* the INFORM0 register, and ensure INFORM1 is set to the
|
* the INFORM0 register, and ensure INFORM1 is set to the
|
||||||
|
@ -498,10 +498,9 @@ static int jive_pm_suspend(struct sys_device *sd, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int jive_pm_resume(struct sys_device *sd)
|
static void jive_pm_resume(void)
|
||||||
{
|
{
|
||||||
__raw_writel(0x0, S3C2412_INFORM0);
|
__raw_writel(0x0, S3C2412_INFORM0);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -509,16 +508,11 @@ static int jive_pm_resume(struct sys_device *sd)
|
||||||
#define jive_pm_resume NULL
|
#define jive_pm_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct sysdev_class jive_pm_sysclass = {
|
static struct syscore_ops jive_pm_syscore_ops = {
|
||||||
.name = "jive-pm",
|
|
||||||
.suspend = jive_pm_suspend,
|
.suspend = jive_pm_suspend,
|
||||||
.resume = jive_pm_resume,
|
.resume = jive_pm_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device jive_pm_sysdev = {
|
|
||||||
.cls = &jive_pm_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init jive_map_io(void)
|
static void __init jive_map_io(void)
|
||||||
{
|
{
|
||||||
s3c24xx_init_io(jive_iodesc, ARRAY_SIZE(jive_iodesc));
|
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)
|
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);
|
register_syscore_ops(&jive_pm_syscore_ops);
|
||||||
sysdev_register(&jive_pm_sysdev);
|
|
||||||
|
|
||||||
/* write our sleep configurations for the IO. Pull down all unused
|
/* write our sleep configurations for the IO. Pull down all unused
|
||||||
* IO, ensure that we have turned off all peripherals we do not
|
* IO, ensure that we have turned off all peripherals we do not
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
|
@ -86,13 +87,24 @@ static struct sleep_save s3c2412_sleep[] = {
|
||||||
SAVE_ITEM(S3C2413_GPJSLPCON),
|
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));
|
s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int s3c2412_pm_resume(struct sys_device *dev)
|
static void s3c2412_pm_resume(void)
|
||||||
{
|
{
|
||||||
unsigned long tmp;
|
unsigned long tmp;
|
||||||
|
|
||||||
|
@ -102,18 +114,9 @@ static int s3c2412_pm_resume(struct sys_device *dev)
|
||||||
__raw_writel(tmp, S3C2412_PWRCFG);
|
__raw_writel(tmp, S3C2412_PWRCFG);
|
||||||
|
|
||||||
s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
|
s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_driver s3c2412_pm_driver = {
|
struct syscore_ops s3c2412_pm_syscore_ops = {
|
||||||
.add = s3c2412_pm_add,
|
|
||||||
.suspend = s3c2412_pm_suspend,
|
.suspend = s3c2412_pm_suspend,
|
||||||
.resume = s3c2412_pm_resume,
|
.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);
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
@ -244,5 +245,8 @@ int __init s3c2412_init(void)
|
||||||
{
|
{
|
||||||
printk("S3C2412: Initialising architecture\n");
|
printk("S3C2412: Initialising architecture\n");
|
||||||
|
|
||||||
|
register_syscore_ops(&s3c2412_pm_syscore_ops);
|
||||||
|
register_syscore_ops(&s3c24xx_irq_syscore_ops);
|
||||||
|
|
||||||
return sysdev_register(&s3c2412_sysdev);
|
return sysdev_register(&s3c2412_sysdev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -236,8 +236,6 @@ static int __init s3c2416_irq_add(struct sys_device *sysdev)
|
||||||
|
|
||||||
static struct sysdev_driver s3c2416_irq_driver = {
|
static struct sysdev_driver s3c2416_irq_driver = {
|
||||||
.add = s3c2416_irq_add,
|
.add = s3c2416_irq_add,
|
||||||
.suspend = s3c24xx_irq_suspend,
|
|
||||||
.resume = s3c24xx_irq_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init s3c2416_irq_init(void)
|
static int __init s3c2416_irq_init(void)
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
@ -55,25 +56,8 @@ static int s3c2416_pm_add(struct sys_device *sysdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int s3c2416_pm_suspend(struct sys_device *dev, pm_message_t state)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int s3c2416_pm_resume(struct sys_device *dev)
|
|
||||||
{
|
|
||||||
/* 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 = {
|
static struct sysdev_driver s3c2416_pm_driver = {
|
||||||
.add = s3c2416_pm_add,
|
.add = s3c2416_pm_add,
|
||||||
.suspend = s3c2416_pm_suspend,
|
|
||||||
.resume = s3c2416_pm_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init int s3c2416_pm_init(void)
|
static __init int s3c2416_pm_init(void)
|
||||||
|
@ -82,3 +66,16 @@ static __init int s3c2416_pm_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
arch_initcall(s3c2416_pm_init);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct syscore_ops s3c2416_pm_syscore_ops = {
|
||||||
|
.resume = s3c2416_pm_resume,
|
||||||
|
};
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
|
@ -54,6 +55,7 @@
|
||||||
#include <plat/devs.h>
|
#include <plat/devs.h>
|
||||||
#include <plat/cpu.h>
|
#include <plat/cpu.h>
|
||||||
#include <plat/sdhci.h>
|
#include <plat/sdhci.h>
|
||||||
|
#include <plat/pm.h>
|
||||||
|
|
||||||
#include <plat/iic-core.h>
|
#include <plat/iic-core.h>
|
||||||
#include <plat/fb-core.h>
|
#include <plat/fb-core.h>
|
||||||
|
@ -95,6 +97,9 @@ int __init s3c2416_init(void)
|
||||||
|
|
||||||
s3c_fb_setname("s3c2443-fb");
|
s3c_fb_setname("s3c2443-fb");
|
||||||
|
|
||||||
|
register_syscore_ops(&s3c2416_pm_syscore_ops);
|
||||||
|
register_syscore_ops(&s3c24xx_irq_syscore_ops);
|
||||||
|
|
||||||
return sysdev_register(&s3c2416_sysdev);
|
return sysdev_register(&s3c2416_sysdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
|
@ -284,7 +284,7 @@ static struct platform_device osiris_pcmcia = {
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static unsigned char pm_osiris_ctrl0;
|
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;
|
unsigned int tmp;
|
||||||
|
|
||||||
|
@ -304,7 +304,7 @@ static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int osiris_pm_resume(struct sys_device *sd)
|
static void osiris_pm_resume(void)
|
||||||
{
|
{
|
||||||
if (pm_osiris_ctrl0 & OSIRIS_CTRL0_FIX8)
|
if (pm_osiris_ctrl0 & OSIRIS_CTRL0_FIX8)
|
||||||
__raw_writeb(OSIRIS_CTRL1_FIX8, OSIRIS_VA_CTRL1);
|
__raw_writeb(OSIRIS_CTRL1_FIX8, OSIRIS_VA_CTRL1);
|
||||||
|
@ -312,8 +312,6 @@ static int osiris_pm_resume(struct sys_device *sd)
|
||||||
__raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0);
|
__raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0);
|
||||||
|
|
||||||
s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
|
s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -321,16 +319,11 @@ static int osiris_pm_resume(struct sys_device *sd)
|
||||||
#define osiris_pm_resume NULL
|
#define osiris_pm_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct sysdev_class osiris_pm_sysclass = {
|
static struct syscore_ops osiris_pm_syscore_ops = {
|
||||||
.name = "mach-osiris",
|
|
||||||
.suspend = osiris_pm_suspend,
|
.suspend = osiris_pm_suspend,
|
||||||
.resume = osiris_pm_resume,
|
.resume = osiris_pm_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device osiris_pm_sysdev = {
|
|
||||||
.cls = &osiris_pm_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Link for DVS driver to TPS65011 */
|
/* Link for DVS driver to TPS65011 */
|
||||||
|
|
||||||
static void osiris_tps_release(struct device *dev)
|
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)
|
static void __init osiris_init(void)
|
||||||
{
|
{
|
||||||
sysdev_class_register(&osiris_pm_sysclass);
|
register_syscore_ops(&osiris_pm_syscore_ops);
|
||||||
sysdev_register(&osiris_pm_sysdev);
|
|
||||||
|
|
||||||
s3c_i2c0_set_platdata(NULL);
|
s3c_i2c0_set_platdata(NULL);
|
||||||
s3c_nand_set_platdata(&osiris_nand_info);
|
s3c_nand_set_platdata(&osiris_nand_info);
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
@ -33,6 +34,7 @@
|
||||||
#include <plat/devs.h>
|
#include <plat/devs.h>
|
||||||
#include <plat/cpu.h>
|
#include <plat/cpu.h>
|
||||||
#include <plat/s3c244x.h>
|
#include <plat/s3c244x.h>
|
||||||
|
#include <plat/pm.h>
|
||||||
|
|
||||||
#include <plat/gpio-core.h>
|
#include <plat/gpio-core.h>
|
||||||
#include <plat/gpio-cfg.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].start = IRQ_S3C2440_WDT;
|
||||||
s3c_device_wdt.resource[1].end = 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 */
|
/* register our system device for everything else */
|
||||||
|
|
||||||
return sysdev_register(&s3c2440_sysdev);
|
return sysdev_register(&s3c2440_sysdev);
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
@ -45,6 +46,7 @@
|
||||||
#include <plat/clock.h>
|
#include <plat/clock.h>
|
||||||
#include <plat/cpu.h>
|
#include <plat/cpu.h>
|
||||||
#include <plat/s3c244x.h>
|
#include <plat/s3c244x.h>
|
||||||
|
#include <plat/pm.h>
|
||||||
|
|
||||||
#include <plat/gpio-core.h>
|
#include <plat/gpio-core.h>
|
||||||
#include <plat/gpio-cfg.h>
|
#include <plat/gpio-cfg.h>
|
||||||
|
@ -167,6 +169,10 @@ int __init s3c2442_init(void)
|
||||||
{
|
{
|
||||||
printk("S3C2442: Initialising architecture\n");
|
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);
|
return sysdev_register(&s3c2442_sysdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,8 +116,6 @@ static int s3c244x_irq_add(struct sys_device *sysdev)
|
||||||
|
|
||||||
static struct sysdev_driver s3c2440_irq_driver = {
|
static struct sysdev_driver s3c2440_irq_driver = {
|
||||||
.add = s3c244x_irq_add,
|
.add = s3c244x_irq_add,
|
||||||
.suspend = s3c24xx_irq_suspend,
|
|
||||||
.resume = s3c24xx_irq_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int s3c2440_irq_init(void)
|
static int s3c2440_irq_init(void)
|
||||||
|
@ -129,8 +127,6 @@ arch_initcall(s3c2440_irq_init);
|
||||||
|
|
||||||
static struct sysdev_driver s3c2442_irq_driver = {
|
static struct sysdev_driver s3c2442_irq_driver = {
|
||||||
.add = s3c244x_irq_add,
|
.add = s3c244x_irq_add,
|
||||||
.suspend = s3c24xx_irq_suspend,
|
|
||||||
.resume = s3c24xx_irq_resume,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
|
@ -134,45 +135,14 @@ void __init s3c244x_init_clocks(int xtal)
|
||||||
s3c2410_baseclk_add();
|
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 */
|
/* Since the S3C2442 and S3C2440 share items, put both sysclasses here */
|
||||||
|
|
||||||
struct sysdev_class s3c2440_sysclass = {
|
struct sysdev_class s3c2440_sysclass = {
|
||||||
.name = "s3c2440-core",
|
.name = "s3c2440-core",
|
||||||
.suspend = s3c244x_suspend,
|
|
||||||
.resume = s3c244x_resume
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sysdev_class s3c2442_sysclass = {
|
struct sysdev_class s3c2442_sysclass = {
|
||||||
.name = "s3c2442-core",
|
.name = "s3c2442-core",
|
||||||
.suspend = s3c244x_suspend,
|
|
||||||
.resume = s3c244x_resume
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* need to register class before we actually register the device, and
|
/* 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);
|
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,
|
||||||
|
};
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
@ -54,7 +54,7 @@ static struct irq_grp_save {
|
||||||
|
|
||||||
static u32 irq_uart_mask[CONFIG_SERIAL_SAMSUNG_UARTS];
|
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;
|
struct irq_grp_save *grp = eint_grp_save;
|
||||||
int i;
|
int i;
|
||||||
|
@ -75,7 +75,7 @@ static int s3c64xx_irq_pm_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
return 0;
|
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;
|
struct irq_grp_save *grp = eint_grp_save;
|
||||||
int i;
|
int i;
|
||||||
|
@ -94,18 +94,18 @@ static int s3c64xx_irq_pm_resume(struct sys_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
S3C_PMDBG("%s: IRQ configuration restored\n", __func__);
|
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,
|
.suspend = s3c64xx_irq_pm_suspend,
|
||||||
.resume = s3c64xx_irq_pm_resume,
|
.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);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
arch_initcall(s3c64xx_irq_pm_init);
|
core_initcall(s3c64xx_syscore_init);
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
#include <plat/cpu.h>
|
#include <plat/cpu.h>
|
||||||
|
@ -140,7 +141,17 @@ static int s5pv210_pm_add(struct sys_device *sysdev)
|
||||||
return 0;
|
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;
|
u32 tmp;
|
||||||
|
|
||||||
|
@ -150,17 +161,15 @@ static int s5pv210_pm_resume(struct sys_device *dev)
|
||||||
__raw_writel(tmp , S5P_OTHERS);
|
__raw_writel(tmp , S5P_OTHERS);
|
||||||
|
|
||||||
s3c_pm_do_restore_core(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));
|
s3c_pm_do_restore_core(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_driver s5pv210_pm_driver = {
|
static struct syscore_ops s5pv210_pm_syscore_ops = {
|
||||||
.add = s5pv210_pm_add,
|
|
||||||
.resume = s5pv210_pm_resume,
|
.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);
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
@ -234,7 +234,7 @@ static struct sa1100irq_state {
|
||||||
unsigned int iccr;
|
unsigned int iccr;
|
||||||
} sa1100irq_state;
|
} 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;
|
struct sa1100irq_state *st = &sa1100irq_state;
|
||||||
|
|
||||||
|
@ -264,7 +264,7 @@ static int sa1100irq_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sa1100irq_resume(struct sys_device *dev)
|
static void sa1100irq_resume(void)
|
||||||
{
|
{
|
||||||
struct sa1100irq_state *st = &sa1100irq_state;
|
struct sa1100irq_state *st = &sa1100irq_state;
|
||||||
|
|
||||||
|
@ -277,24 +277,17 @@ static int sa1100irq_resume(struct sys_device *dev)
|
||||||
|
|
||||||
ICMR = st->icmr;
|
ICMR = st->icmr;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class sa1100irq_sysclass = {
|
static struct syscore_ops sa1100irq_syscore_ops = {
|
||||||
.name = "sa11x0-irq",
|
|
||||||
.suspend = sa1100irq_suspend,
|
.suspend = sa1100irq_suspend,
|
||||||
.resume = sa1100irq_resume,
|
.resume = sa1100irq_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device sa1100irq_device = {
|
|
||||||
.id = 0,
|
|
||||||
.cls = &sa1100irq_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init sa1100irq_init_devicefs(void)
|
static int __init sa1100irq_init_devicefs(void)
|
||||||
{
|
{
|
||||||
sysdev_class_register(&sa1100irq_sysclass);
|
register_syscore_ops(&sa1100irq_syscore_ops);
|
||||||
return sysdev_register(&sa1100irq_device);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(sa1100irq_init_devicefs);
|
device_initcall(sa1100irq_init_devicefs);
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
@ -1372,9 +1372,7 @@ static const struct dev_pm_ops omap_mpuio_dev_pm_ops = {
|
||||||
.resume_noirq = omap_mpuio_resume_noirq,
|
.resume_noirq = omap_mpuio_resume_noirq,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* use platform_driver for this, now that there's no longer any
|
/* use platform_driver for this. */
|
||||||
* point to sys_device (other than not disturbing old code).
|
|
||||||
*/
|
|
||||||
static struct platform_driver omap_mpuio_driver = {
|
static struct platform_driver omap_mpuio_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "mpuio",
|
.name = "mpuio",
|
||||||
|
@ -1745,7 +1743,7 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
|
#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;
|
int i;
|
||||||
|
|
||||||
|
@ -1795,12 +1793,12 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int omap_gpio_resume(struct sys_device *dev)
|
static void omap_gpio_resume(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
|
if (!cpu_class_is_omap2() && !cpu_is_omap16xx())
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < gpio_bank_count; i++) {
|
for (i = 0; i < gpio_bank_count; i++) {
|
||||||
struct gpio_bank *bank = &gpio_bank[i];
|
struct gpio_bank *bank = &gpio_bank[i];
|
||||||
|
@ -1836,21 +1834,13 @@ static int omap_gpio_resume(struct sys_device *dev)
|
||||||
__raw_writel(bank->saved_wakeup, wake_set);
|
__raw_writel(bank->saved_wakeup, wake_set);
|
||||||
spin_unlock_irqrestore(&bank->lock, flags);
|
spin_unlock_irqrestore(&bank->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class omap_gpio_sysclass = {
|
static struct syscore_ops omap_gpio_syscore_ops = {
|
||||||
.name = "gpio",
|
|
||||||
.suspend = omap_gpio_suspend,
|
.suspend = omap_gpio_suspend,
|
||||||
.resume = omap_gpio_resume,
|
.resume = omap_gpio_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device omap_gpio_device = {
|
|
||||||
.id = 0,
|
|
||||||
.cls = &omap_gpio_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_OMAP2PLUS
|
#ifdef CONFIG_ARCH_OMAP2PLUS
|
||||||
|
@ -2108,21 +2098,14 @@ postcore_initcall(omap_gpio_drv_reg);
|
||||||
|
|
||||||
static int __init omap_gpio_sysinit(void)
|
static int __init omap_gpio_sysinit(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
mpuio_init();
|
mpuio_init();
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
|
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
|
||||||
if (cpu_is_omap16xx() || cpu_class_is_omap2()) {
|
if (cpu_is_omap16xx() || cpu_class_is_omap2())
|
||||||
if (ret == 0) {
|
register_syscore_ops(&omap_gpio_syscore_ops);
|
||||||
ret = sysdev_class_register(&omap_gpio_sysclass);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = sysdev_register(&omap_gpio_device);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
arch_initcall(omap_gpio_sysinit);
|
arch_initcall(omap_gpio_sysinit);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
|
@ -295,7 +295,7 @@ void __init pxa_init_gpio(int mux_irq, int start, int end, set_wake_t fn)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#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;
|
struct pxa_gpio_chip *c;
|
||||||
int gpio;
|
int gpio;
|
||||||
|
@ -312,7 +312,7 @@ static int pxa_gpio_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pxa_gpio_resume(struct sys_device *dev)
|
static void pxa_gpio_resume(void)
|
||||||
{
|
{
|
||||||
struct pxa_gpio_chip *c;
|
struct pxa_gpio_chip *c;
|
||||||
int gpio;
|
int gpio;
|
||||||
|
@ -326,22 +326,13 @@ static int pxa_gpio_resume(struct sys_device *dev)
|
||||||
__raw_writel(c->saved_gfer, c->regbase + GFER_OFFSET);
|
__raw_writel(c->saved_gfer, c->regbase + GFER_OFFSET);
|
||||||
__raw_writel(c->saved_gpdr, c->regbase + GPDR_OFFSET);
|
__raw_writel(c->saved_gpdr, c->regbase + GPDR_OFFSET);
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define pxa_gpio_suspend NULL
|
#define pxa_gpio_suspend NULL
|
||||||
#define pxa_gpio_resume NULL
|
#define pxa_gpio_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct sysdev_class pxa_gpio_sysclass = {
|
struct syscore_ops pxa_gpio_syscore_ops = {
|
||||||
.name = "gpio",
|
|
||||||
.suspend = pxa_gpio_suspend,
|
.suspend = pxa_gpio_suspend,
|
||||||
.resume = pxa_gpio_resume,
|
.resume = pxa_gpio_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init pxa_gpio_init(void)
|
|
||||||
{
|
|
||||||
return sysdev_class_register(&pxa_gpio_sysclass);
|
|
||||||
}
|
|
||||||
|
|
||||||
core_initcall(pxa_gpio_init);
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
|
|
||||||
#include <plat/mfp.h>
|
#include <plat/mfp.h>
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
@ -1195,19 +1195,12 @@ int s3c2410_dma_getposition(unsigned int channel, dma_addr_t *src, dma_addr_t *d
|
||||||
|
|
||||||
EXPORT_SYMBOL(s3c2410_dma_getposition);
|
EXPORT_SYMBOL(s3c2410_dma_getposition);
|
||||||
|
|
||||||
static inline struct s3c2410_dma_chan *to_dma_chan(struct sys_device *dev)
|
/* system core operations */
|
||||||
{
|
|
||||||
return container_of(dev, struct s3c2410_dma_chan, dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* system device class */
|
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#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);
|
printk(KERN_DEBUG "suspending dma channel %d\n", cp->number);
|
||||||
|
|
||||||
if (dma_rdreg(cp, S3C2410_DMA_DMASKTRIG) & S3C2410_DMASKTRIG_ON) {
|
if (dma_rdreg(cp, S3C2410_DMA_DMASKTRIG) & S3C2410_DMASKTRIG_ON) {
|
||||||
|
@ -1222,13 +1215,21 @@ static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
|
|
||||||
s3c2410_dma_dostop(cp);
|
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;
|
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;
|
unsigned int no = cp->number | DMACH_LOW_LEVEL;
|
||||||
|
|
||||||
/* restore channel's hardware configuration */
|
/* restore channel's hardware configuration */
|
||||||
|
@ -1249,13 +1250,21 @@ static int s3c2410_dma_resume(struct sys_device *dev)
|
||||||
return 0;
|
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
|
#else
|
||||||
#define s3c2410_dma_suspend NULL
|
#define s3c2410_dma_suspend NULL
|
||||||
#define s3c2410_dma_resume NULL
|
#define s3c2410_dma_resume NULL
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
struct sysdev_class dma_sysclass = {
|
struct syscore_ops dma_syscore_ops = {
|
||||||
.name = "s3c24xx-dma",
|
|
||||||
.suspend = s3c2410_dma_suspend,
|
.suspend = s3c2410_dma_suspend,
|
||||||
.resume = s3c2410_dma_resume,
|
.resume = s3c2410_dma_resume,
|
||||||
};
|
};
|
||||||
|
@ -1269,39 +1278,14 @@ static void s3c2410_dma_cache_ctor(void *p)
|
||||||
|
|
||||||
/* initialisation code */
|
/* 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);
|
register_syscore_ops(&dma_syscore_ops);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
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,
|
int __init s3c24xx_dma_init(unsigned int channels, unsigned int irq,
|
||||||
unsigned int stride)
|
unsigned int stride)
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
#include <plat/cpu.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_eintflt[4];
|
||||||
static unsigned long save_eintmask;
|
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;
|
unsigned int i;
|
||||||
|
|
||||||
|
@ -81,7 +80,7 @@ int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int s3c24xx_irq_resume(struct sys_device *dev)
|
void s3c24xx_irq_resume(void)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
@ -93,6 +92,4 @@ int s3c24xx_irq_resume(struct sys_device *dev)
|
||||||
|
|
||||||
s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
|
s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
|
||||||
__raw_writel(save_eintmask, S3C24XX_EINTMASK);
|
__raw_writel(save_eintmask, S3C24XX_EINTMASK);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
|
|
||||||
#include <plat/cpu.h>
|
#include <plat/cpu.h>
|
||||||
#include <plat/irqs.h>
|
#include <plat/irqs.h>
|
||||||
|
@ -77,17 +76,15 @@ static struct sleep_save eint_save[] = {
|
||||||
SAVE_ITEM(S5P_EINT_MASK(3)),
|
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));
|
s3c_pm_do_save(eint_save, ARRAY_SIZE(eint_save));
|
||||||
|
|
||||||
return 0;
|
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));
|
s3c_pm_do_restore(eint_save, ARRAY_SIZE(eint_save));
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,12 @@ extern void s3c24xx_init_uartdevs(char *name,
|
||||||
struct sys_timer;
|
struct sys_timer;
|
||||||
extern struct sys_timer s3c24xx_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 */
|
/* system device classes */
|
||||||
|
|
||||||
extern struct sysdev_class s3c2410_sysclass;
|
extern struct sysdev_class s3c2410_sysclass;
|
||||||
|
|
|
@ -103,14 +103,16 @@ extern void s3c_pm_do_restore_core(struct sleep_save *ptr, int count);
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
extern int s3c_irqext_wake(struct irq_data *data, unsigned int state);
|
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_suspend(void);
|
||||||
extern int s3c24xx_irq_resume(struct sys_device *dev);
|
extern void s3c24xx_irq_resume(void);
|
||||||
#else
|
#else
|
||||||
#define s3c_irqext_wake NULL
|
#define s3c_irqext_wake NULL
|
||||||
#define s3c24xx_irq_suspend NULL
|
#define s3c24xx_irq_suspend NULL
|
||||||
#define s3c24xx_irq_resume NULL
|
#define s3c24xx_irq_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern struct syscore_ops s3c24xx_irq_syscore_ops;
|
||||||
|
|
||||||
/* PM debug functions */
|
/* PM debug functions */
|
||||||
|
|
||||||
#ifdef CONFIG_SAMSUNG_PM_DEBUG
|
#ifdef CONFIG_SAMSUNG_PM_DEBUG
|
||||||
|
|
|
@ -398,9 +398,9 @@ static void vfp_enable(void *unused)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#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();
|
struct thread_info *ti = current_thread_info();
|
||||||
u32 fpexc = fmrx(FPEXC);
|
u32 fpexc = fmrx(FPEXC);
|
||||||
|
@ -420,34 +420,25 @@ static int vfp_pm_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vfp_pm_resume(struct sys_device *dev)
|
static void vfp_pm_resume(void)
|
||||||
{
|
{
|
||||||
/* ensure we have access to the vfp */
|
/* ensure we have access to the vfp */
|
||||||
vfp_enable(NULL);
|
vfp_enable(NULL);
|
||||||
|
|
||||||
/* and disable it to ensure the next usage restores the state */
|
/* and disable it to ensure the next usage restores the state */
|
||||||
fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
|
fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class vfp_pm_sysclass = {
|
static struct syscore_ops vfp_pm_syscore_ops = {
|
||||||
.name = "vfp",
|
|
||||||
.suspend = vfp_pm_suspend,
|
.suspend = vfp_pm_suspend,
|
||||||
.resume = vfp_pm_resume,
|
.resume = vfp_pm_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device vfp_pm_sysdev = {
|
|
||||||
.cls = &vfp_pm_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void vfp_pm_init(void)
|
static void vfp_pm_init(void)
|
||||||
{
|
{
|
||||||
sysdev_class_register(&vfp_pm_sysclass);
|
register_syscore_ops(&vfp_pm_syscore_ops);
|
||||||
sysdev_register(&vfp_pm_sysdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline void vfp_pm_init(void) { }
|
static inline void vfp_pm_init(void) { }
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@
|
||||||
struct intc {
|
struct intc {
|
||||||
void __iomem *regs;
|
void __iomem *regs;
|
||||||
struct irq_chip chip;
|
struct irq_chip chip;
|
||||||
struct sys_device sysdev;
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
unsigned long suspend_ipr;
|
unsigned long suspend_ipr;
|
||||||
unsigned long saved_ipr[64];
|
unsigned long saved_ipr[64];
|
||||||
|
@ -146,9 +145,8 @@ void intc_set_suspend_handler(unsigned long offset)
|
||||||
intc0.suspend_ipr = offset;
|
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;
|
int i;
|
||||||
|
|
||||||
if (unlikely(!irqs_disabled())) {
|
if (unlikely(!irqs_disabled())) {
|
||||||
|
@ -156,28 +154,25 @@ static int intc_suspend(struct sys_device *sdev, pm_message_t state)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(!intc->suspend_ipr)) {
|
if (unlikely(!intc0.suspend_ipr)) {
|
||||||
pr_err("intc_suspend: suspend_ipr not initialized\n");
|
pr_err("intc_suspend: suspend_ipr not initialized\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 64; i++) {
|
for (i = 0; i < 64; i++) {
|
||||||
intc->saved_ipr[i] = intc_readl(intc, INTPR0 + 4 * i);
|
intc0.saved_ipr[i] = intc_readl(&intc0, INTPR0 + 4 * i);
|
||||||
intc_writel(intc, INTPR0 + 4 * i, intc->suspend_ipr);
|
intc_writel(&intc0, INTPR0 + 4 * i, intc0.suspend_ipr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
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;
|
int i;
|
||||||
|
|
||||||
WARN_ON(!irqs_disabled());
|
|
||||||
|
|
||||||
for (i = 0; i < 64; i++)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -186,27 +181,18 @@ static int intc_resume(struct sys_device *sdev)
|
||||||
#define intc_resume NULL
|
#define intc_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct sysdev_class intc_class = {
|
static struct syscore_ops intc_syscore_ops = {
|
||||||
.name = "intc",
|
|
||||||
.suspend = intc_suspend,
|
.suspend = intc_suspend,
|
||||||
.resume = intc_resume,
|
.resume = intc_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init intc_init_sysdev(void)
|
static int __init intc_init_syscore(void)
|
||||||
{
|
{
|
||||||
int ret;
|
register_syscore_ops(&intc_syscore_ops);
|
||||||
|
|
||||||
ret = sysdev_class_register(&intc_class);
|
return 0;
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
intc0.sysdev.id = 0;
|
|
||||||
intc0.sysdev.cls = &intc_class;
|
|
||||||
ret = sysdev_register(&intc0.sysdev);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
device_initcall(intc_init_sysdev);
|
device_initcall(intc_init_syscore);
|
||||||
|
|
||||||
unsigned long intc_get_pending(unsigned int group)
|
unsigned long intc_get_pending(unsigned int group)
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
#include <linux/nmi.h>
|
#include <linux/nmi.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
|
@ -196,43 +196,31 @@ void touch_nmi_watchdog(void)
|
||||||
|
|
||||||
/* Suspend/resume support */
|
/* Suspend/resume support */
|
||||||
#ifdef CONFIG_PM
|
#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();
|
nmi_wdt_stop();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nmi_wdt_resume(struct sys_device *dev)
|
static void nmi_wdt_resume(void)
|
||||||
{
|
{
|
||||||
if (nmi_active)
|
if (nmi_active)
|
||||||
nmi_wdt_start();
|
nmi_wdt_start();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class nmi_sysclass = {
|
static struct syscore_ops nmi_syscore_ops = {
|
||||||
.name = DRV_NAME,
|
|
||||||
.resume = nmi_wdt_resume,
|
.resume = nmi_wdt_resume,
|
||||||
.suspend = nmi_wdt_suspend,
|
.suspend = nmi_wdt_suspend,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device device_nmi_wdt = {
|
static int __init init_nmi_wdt_syscore(void)
|
||||||
.id = 0,
|
|
||||||
.cls = &nmi_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init init_nmi_wdt_sysfs(void)
|
|
||||||
{
|
{
|
||||||
int error;
|
if (nmi_active)
|
||||||
|
register_syscore_ops(&nmi_syscore_ops);
|
||||||
|
|
||||||
if (!nmi_active)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error = sysdev_class_register(&nmi_sysclass);
|
|
||||||
if (!error)
|
|
||||||
error = sysdev_register(&device_nmi_wdt);
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
late_initcall(init_nmi_wdt_sysfs);
|
late_initcall(init_nmi_wdt_syscore);
|
||||||
|
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/sysdev.h>
|
|
||||||
#include <asm/dcr.h>
|
#include <asm/dcr.h>
|
||||||
#include <asm/msi_bitmap.h>
|
#include <asm/msi_bitmap.h>
|
||||||
|
|
||||||
|
@ -320,8 +319,6 @@ struct mpic
|
||||||
/* link */
|
/* link */
|
||||||
struct mpic *next;
|
struct mpic *next;
|
||||||
|
|
||||||
struct sys_device sysdev;
|
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
struct mpic_irq_save *save_data;
|
struct mpic_irq_save *save_data;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/linux_logo.h>
|
#include <linux/linux_logo.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
#include <asm/spu.h>
|
#include <asm/spu.h>
|
||||||
#include <asm/spu_priv1.h>
|
#include <asm/spu_priv1.h>
|
||||||
#include <asm/spu_csa.h>
|
#include <asm/spu_csa.h>
|
||||||
|
@ -521,18 +522,8 @@ void spu_init_channels(struct spu *spu)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(spu_init_channels);
|
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 = {
|
static struct sysdev_class spu_sysdev_class = {
|
||||||
.name = "spu",
|
.name = "spu",
|
||||||
.shutdown = spu_shutdown,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int spu_add_sysdev_attr(struct sysdev_attribute *attr)
|
int spu_add_sysdev_attr(struct sysdev_attribute *attr)
|
||||||
|
@ -797,6 +788,22 @@ static inline void crash_register_spus(struct list_head *list)
|
||||||
}
|
}
|
||||||
#endif
|
#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)
|
static int __init init_spu_base(void)
|
||||||
{
|
{
|
||||||
int i, ret = 0;
|
int i, ret = 0;
|
||||||
|
@ -830,6 +837,7 @@ static int __init init_spu_base(void)
|
||||||
crash_register_spus(&spu_full_list);
|
crash_register_spus(&spu_full_list);
|
||||||
mutex_unlock(&spu_full_list_mutex);
|
mutex_unlock(&spu_full_list_mutex);
|
||||||
spu_add_sysdev_attr(&attr_stat);
|
spu_add_sysdev_attr(&attr_stat);
|
||||||
|
register_syscore_ops(&spu_syscore_ops);
|
||||||
|
|
||||||
spu_init_affinity();
|
spu_init_affinity();
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/adb.h>
|
#include <linux/adb.h>
|
||||||
#include <linux/pmu.h>
|
#include <linux/pmu.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -677,7 +677,7 @@ static int pmacpic_find_viaint(void)
|
||||||
return viaint;
|
return viaint;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pmacpic_suspend(struct sys_device *sysdev, pm_message_t state)
|
static int pmacpic_suspend(void)
|
||||||
{
|
{
|
||||||
int viaint = pmacpic_find_viaint();
|
int viaint = pmacpic_find_viaint();
|
||||||
|
|
||||||
|
@ -698,7 +698,7 @@ static int pmacpic_suspend(struct sys_device *sysdev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pmacpic_resume(struct sys_device *sysdev)
|
static void pmacpic_resume(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -709,39 +709,19 @@ static int pmacpic_resume(struct sys_device *sysdev)
|
||||||
for (i = 0; i < max_real_irqs; ++i)
|
for (i = 0; i < max_real_irqs; ++i)
|
||||||
if (test_bit(i, sleep_save_mask))
|
if (test_bit(i, sleep_save_mask))
|
||||||
pmac_unmask_irq(irq_get_irq_data(i));
|
pmac_unmask_irq(irq_get_irq_data(i));
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_PM && CONFIG_PPC32 */
|
static struct syscore_ops pmacpic_syscore_ops = {
|
||||||
|
.suspend = pmacpic_suspend,
|
||||||
static struct sysdev_class pmacpic_sysclass = {
|
.resume = pmacpic_resume,
|
||||||
.name = "pmac_pic",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device device_pmacpic = {
|
static int __init init_pmacpic_syscore(void)
|
||||||
.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)
|
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_PPC32
|
register_syscore_ops(&pmacpic_syscore_ops);
|
||||||
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);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
machine_subsys_initcall(powermac, init_pmacpic_sysfs);
|
|
||||||
|
|
||||||
|
machine_subsys_initcall(powermac, init_pmacpic_syscore);
|
||||||
|
|
||||||
|
#endif /* CONFIG_PM && CONFIG_PPC32 */
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
@ -902,7 +902,7 @@ static struct {
|
||||||
u32 sercr;
|
u32 sercr;
|
||||||
} ipic_saved_state;
|
} 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;
|
struct ipic *ipic = primary_ipic;
|
||||||
|
|
||||||
|
@ -933,7 +933,7 @@ static int ipic_suspend(struct sys_device *sdev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipic_resume(struct sys_device *sdev)
|
static void ipic_resume(void)
|
||||||
{
|
{
|
||||||
struct ipic *ipic = primary_ipic;
|
struct ipic *ipic = primary_ipic;
|
||||||
|
|
||||||
|
@ -949,44 +949,26 @@ static int ipic_resume(struct sys_device *sdev)
|
||||||
ipic_write(ipic->regs, IPIC_SECNR, ipic_saved_state.secnr);
|
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_SERMR, ipic_saved_state.sermr);
|
||||||
ipic_write(ipic->regs, IPIC_SERCR, ipic_saved_state.sercr);
|
ipic_write(ipic->regs, IPIC_SERCR, ipic_saved_state.sercr);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define ipic_suspend NULL
|
#define ipic_suspend NULL
|
||||||
#define ipic_resume NULL
|
#define ipic_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct sysdev_class ipic_sysclass = {
|
static struct syscore_ops ipic_syscore_ops = {
|
||||||
.name = "ipic",
|
|
||||||
.suspend = ipic_suspend,
|
.suspend = ipic_suspend,
|
||||||
.resume = ipic_resume,
|
.resume = ipic_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device device_ipic = {
|
static int __init init_ipic_syscore(void)
|
||||||
.id = 0,
|
|
||||||
.cls = &ipic_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init init_ipic_sysfs(void)
|
|
||||||
{
|
{
|
||||||
int rc;
|
|
||||||
|
|
||||||
if (!primary_ipic || !primary_ipic->regs)
|
if (!primary_ipic || !primary_ipic->regs)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
printk(KERN_DEBUG "Registering ipic with sysfs...\n");
|
|
||||||
|
|
||||||
rc = sysdev_class_register(&ipic_sysclass);
|
printk(KERN_DEBUG "Registering ipic system core operations\n");
|
||||||
if (rc) {
|
register_syscore_ops(&ipic_syscore_ops);
|
||||||
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;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
subsys_initcall(init_ipic_sysfs);
|
subsys_initcall(init_ipic_syscore);
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/signal.h>
|
#include <asm/signal.h>
|
||||||
|
@ -1702,9 +1703,8 @@ void mpic_reset_core(int cpu)
|
||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#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;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < mpic->num_sources; i++) {
|
for (i = 0; i < mpic->num_sources; i++) {
|
||||||
|
@ -1713,13 +1713,22 @@ static int mpic_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
mpic->save_data[i].dest =
|
mpic->save_data[i].dest =
|
||||||
mpic_irq_read(i, MPIC_INFO(IRQ_DESTINATION));
|
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;
|
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;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < mpic->num_sources; i++) {
|
for (i = 0; i < mpic->num_sources; i++) {
|
||||||
|
@ -1746,33 +1755,28 @@ static int mpic_resume(struct sys_device *dev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} /* end for loop */
|
} /* end for loop */
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct sysdev_class mpic_sysclass = {
|
static void mpic_resume(void)
|
||||||
#ifdef CONFIG_PM
|
{
|
||||||
|
struct mpic *mpic = mpics;
|
||||||
|
|
||||||
|
while (mpic) {
|
||||||
|
mpic_resume_one(mpic);
|
||||||
|
mpic = mpic->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct syscore_ops mpic_syscore_ops = {
|
||||||
.resume = mpic_resume,
|
.resume = mpic_resume,
|
||||||
.suspend = mpic_suspend,
|
.suspend = mpic_suspend,
|
||||||
#endif
|
|
||||||
.name = "mpic",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mpic_init_sys(void)
|
static int mpic_init_sys(void)
|
||||||
{
|
{
|
||||||
struct mpic *mpic = mpics;
|
register_syscore_ops(&mpic_syscore_ops);
|
||||||
int error, id = 0;
|
return 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(mpic_init_sys);
|
device_initcall(mpic_init_sys);
|
||||||
|
#endif
|
||||||
|
|
|
@ -24,7 +24,6 @@ config SUPERH
|
||||||
select RTC_LIB
|
select RTC_LIB
|
||||||
select GENERIC_ATOMIC64
|
select GENERIC_ATOMIC64
|
||||||
select GENERIC_IRQ_SHOW
|
select GENERIC_IRQ_SHOW
|
||||||
select ARCH_NO_SYSDEV_OPS
|
|
||||||
help
|
help
|
||||||
The SuperH is a RISC processor targeted for use in embedded systems
|
The SuperH is a RISC processor targeted for use in embedded systems
|
||||||
and consumer electronics; it was also used in the Sega Dreamcast
|
and consumer electronics; it was also used in the Sega Dreamcast
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/kallsyms.h>
|
#include <linux/kallsyms.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/syscore_ops.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
@ -237,7 +237,7 @@ static struct puv3_irq_state {
|
||||||
unsigned int iccr;
|
unsigned int iccr;
|
||||||
} puv3_irq_state;
|
} 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;
|
struct puv3_irq_state *st = &puv3_irq_state;
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ static int puv3_irq_suspend(struct sys_device *dev, pm_message_t state)
|
||||||
return 0;
|
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;
|
struct puv3_irq_state *st = &puv3_irq_state;
|
||||||
|
|
||||||
|
@ -278,27 +278,20 @@ static int puv3_irq_resume(struct sys_device *dev)
|
||||||
|
|
||||||
writel(st->icmr, INTC_ICMR);
|
writel(st->icmr, INTC_ICMR);
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sysdev_class puv3_irq_sysclass = {
|
static struct syscore_ops puv3_irq_syscore_ops = {
|
||||||
.name = "pkunity-irq",
|
|
||||||
.suspend = puv3_irq_suspend,
|
.suspend = puv3_irq_suspend,
|
||||||
.resume = puv3_irq_resume,
|
.resume = puv3_irq_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device puv3_irq_device = {
|
static int __init puv3_irq_init_syscore(void)
|
||||||
.id = 0,
|
|
||||||
.cls = &puv3_irq_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init puv3_irq_init_devicefs(void)
|
|
||||||
{
|
{
|
||||||
sysdev_class_register(&puv3_irq_sysclass);
|
register_syscore_ops(&puv3_irq_syscore_ops);
|
||||||
return sysdev_register(&puv3_irq_device);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(puv3_irq_init_devicefs);
|
device_initcall(puv3_irq_init_syscore);
|
||||||
|
|
||||||
void __init init_IRQ(void)
|
void __init init_IRQ(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -71,7 +71,6 @@ config X86
|
||||||
select GENERIC_IRQ_SHOW
|
select GENERIC_IRQ_SHOW
|
||||||
select IRQ_FORCED_THREADING
|
select IRQ_FORCED_THREADING
|
||||||
select USE_GENERIC_SMP_HELPERS if SMP
|
select USE_GENERIC_SMP_HELPERS if SMP
|
||||||
select ARCH_NO_SYSDEV_OPS
|
|
||||||
|
|
||||||
config INSTRUCTION_DECODER
|
config INSTRUCTION_DECODER
|
||||||
def_bool (KPROBES || PERF_EVENTS)
|
def_bool (KPROBES || PERF_EVENTS)
|
||||||
|
|
|
@ -1238,7 +1238,6 @@ static int suspend(int vetoable)
|
||||||
dpm_suspend_noirq(PMSG_SUSPEND);
|
dpm_suspend_noirq(PMSG_SUSPEND);
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
sysdev_suspend(PMSG_SUSPEND);
|
|
||||||
syscore_suspend();
|
syscore_suspend();
|
||||||
|
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
@ -1258,7 +1257,6 @@ static int suspend(int vetoable)
|
||||||
err = (err == APM_SUCCESS) ? 0 : -EIO;
|
err = (err == APM_SUCCESS) ? 0 : -EIO;
|
||||||
|
|
||||||
syscore_resume();
|
syscore_resume();
|
||||||
sysdev_resume();
|
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
dpm_resume_noirq(PMSG_RESUME);
|
dpm_resume_noirq(PMSG_RESUME);
|
||||||
|
@ -1282,7 +1280,6 @@ static void standby(void)
|
||||||
dpm_suspend_noirq(PMSG_SUSPEND);
|
dpm_suspend_noirq(PMSG_SUSPEND);
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
sysdev_suspend(PMSG_SUSPEND);
|
|
||||||
syscore_suspend();
|
syscore_suspend();
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
|
@ -1292,7 +1289,6 @@ static void standby(void)
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
syscore_resume();
|
syscore_resume();
|
||||||
sysdev_resume();
|
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
dpm_resume_noirq(PMSG_RESUME);
|
dpm_resume_noirq(PMSG_RESUME);
|
||||||
|
|
|
@ -168,11 +168,4 @@ config SYS_HYPERVISOR
|
||||||
bool
|
bool
|
||||||
default n
|
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
|
endmenu
|
||||||
|
|
|
@ -111,8 +111,6 @@ static inline int driver_match_device(struct device_driver *drv,
|
||||||
return drv->bus->match ? drv->bus->match(dev, drv) : 1;
|
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 char *make_class_name(const char *name, struct kobject *kobj);
|
||||||
|
|
||||||
extern int devres_release_all(struct device *dev);
|
extern int devres_release_all(struct device *dev);
|
||||||
|
|
|
@ -328,203 +328,8 @@ void sysdev_unregister(struct sys_device *sysdev)
|
||||||
kobject_put(&sysdev->kobj);
|
kobject_put(&sysdev->kobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL_GPL(sysdev_register);
|
||||||
#ifndef CONFIG_ARCH_NO_SYSDEV_OPS
|
EXPORT_SYMBOL_GPL(sysdev_unregister);
|
||||||
/**
|
|
||||||
* 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 */
|
|
||||||
|
|
||||||
int __init system_bus_init(void)
|
int __init system_bus_init(void)
|
||||||
{
|
{
|
||||||
|
@ -534,9 +339,6 @@ int __init system_bus_init(void)
|
||||||
return 0;
|
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)
|
#define to_ext_attr(x) container_of(x, struct sysdev_ext_attribute, attr)
|
||||||
|
|
||||||
ssize_t sysdev_store_ulong(struct sys_device *sysdev,
|
ssize_t sysdev_store_ulong(struct sys_device *sysdev,
|
||||||
|
|
|
@ -70,12 +70,7 @@ static int xen_suspend(void *data)
|
||||||
|
|
||||||
BUG_ON(!irqs_disabled());
|
BUG_ON(!irqs_disabled());
|
||||||
|
|
||||||
err = sysdev_suspend(PMSG_FREEZE);
|
|
||||||
if (!err) {
|
|
||||||
err = syscore_suspend();
|
err = syscore_suspend();
|
||||||
if (err)
|
|
||||||
sysdev_resume();
|
|
||||||
}
|
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "xen_suspend: system core suspend failed: %d\n",
|
printk(KERN_ERR "xen_suspend: system core suspend failed: %d\n",
|
||||||
err);
|
err);
|
||||||
|
@ -102,7 +97,6 @@ static int xen_suspend(void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
syscore_resume();
|
syscore_resume();
|
||||||
sysdev_resume();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -633,13 +633,6 @@ static inline int devtmpfs_mount(const char *mountpoint) { return 0; }
|
||||||
/* drivers/base/power/shutdown.c */
|
/* drivers/base/power/shutdown.c */
|
||||||
extern void device_shutdown(void);
|
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. */
|
/* debugging and troubleshooting/diagnostic helpers. */
|
||||||
extern const char *dev_driver_string(const struct device *dev);
|
extern const char *dev_driver_string(const struct device *dev);
|
||||||
|
|
||||||
|
|
|
@ -529,14 +529,6 @@ struct dev_power_domain {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#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 device_pm_lock(void);
|
||||||
extern void dpm_resume_noirq(pm_message_t state);
|
extern void dpm_resume_noirq(pm_message_t state);
|
||||||
extern void dpm_resume_end(pm_message_t state);
|
extern void dpm_resume_end(pm_message_t state);
|
||||||
|
|
|
@ -34,12 +34,6 @@ struct sysdev_class {
|
||||||
struct list_head drivers;
|
struct list_head drivers;
|
||||||
struct sysdev_class_attribute **attrs;
|
struct sysdev_class_attribute **attrs;
|
||||||
struct kset kset;
|
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 {
|
struct sysdev_class_attribute {
|
||||||
|
@ -77,11 +71,6 @@ struct sysdev_driver {
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
int (*add)(struct sys_device *);
|
int (*add)(struct sys_device *);
|
||||||
int (*remove)(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
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1531,13 +1531,7 @@ int kernel_kexec(void)
|
||||||
if (error)
|
if (error)
|
||||||
goto Enable_cpus;
|
goto Enable_cpus;
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
/* Suspend system devices */
|
|
||||||
error = sysdev_suspend(PMSG_FREEZE);
|
|
||||||
if (!error) {
|
|
||||||
error = syscore_suspend();
|
error = syscore_suspend();
|
||||||
if (error)
|
|
||||||
sysdev_resume();
|
|
||||||
}
|
|
||||||
if (error)
|
if (error)
|
||||||
goto Enable_irqs;
|
goto Enable_irqs;
|
||||||
} else
|
} else
|
||||||
|
@ -1553,7 +1547,6 @@ int kernel_kexec(void)
|
||||||
#ifdef CONFIG_KEXEC_JUMP
|
#ifdef CONFIG_KEXEC_JUMP
|
||||||
if (kexec_image->preserve_context) {
|
if (kexec_image->preserve_context) {
|
||||||
syscore_resume();
|
syscore_resume();
|
||||||
sysdev_resume();
|
|
||||||
Enable_irqs:
|
Enable_irqs:
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
Enable_cpus:
|
Enable_cpus:
|
||||||
|
|
|
@ -272,12 +272,7 @@ static int create_image(int platform_mode)
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
error = sysdev_suspend(PMSG_FREEZE);
|
|
||||||
if (!error) {
|
|
||||||
error = syscore_suspend();
|
error = syscore_suspend();
|
||||||
if (error)
|
|
||||||
sysdev_resume();
|
|
||||||
}
|
|
||||||
if (error) {
|
if (error) {
|
||||||
printk(KERN_ERR "PM: Some system devices failed to power down, "
|
printk(KERN_ERR "PM: Some system devices failed to power down, "
|
||||||
"aborting hibernation\n");
|
"aborting hibernation\n");
|
||||||
|
@ -302,7 +297,6 @@ static int create_image(int platform_mode)
|
||||||
|
|
||||||
Power_up:
|
Power_up:
|
||||||
syscore_resume();
|
syscore_resume();
|
||||||
sysdev_resume();
|
|
||||||
/* NOTE: dpm_resume_noirq() is just a resume() for devices
|
/* NOTE: dpm_resume_noirq() is just a resume() for devices
|
||||||
* that suspended with irqs off ... no overall powerup.
|
* that suspended with irqs off ... no overall powerup.
|
||||||
*/
|
*/
|
||||||
|
@ -409,12 +403,7 @@ static int resume_target_kernel(bool platform_mode)
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
error = sysdev_suspend(PMSG_QUIESCE);
|
|
||||||
if (!error) {
|
|
||||||
error = syscore_suspend();
|
error = syscore_suspend();
|
||||||
if (error)
|
|
||||||
sysdev_resume();
|
|
||||||
}
|
|
||||||
if (error)
|
if (error)
|
||||||
goto Enable_irqs;
|
goto Enable_irqs;
|
||||||
|
|
||||||
|
@ -442,7 +431,6 @@ static int resume_target_kernel(bool platform_mode)
|
||||||
touch_softlockup_watchdog();
|
touch_softlockup_watchdog();
|
||||||
|
|
||||||
syscore_resume();
|
syscore_resume();
|
||||||
sysdev_resume();
|
|
||||||
|
|
||||||
Enable_irqs:
|
Enable_irqs:
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
@ -528,7 +516,6 @@ int hibernation_platform_enter(void)
|
||||||
goto Platform_finish;
|
goto Platform_finish;
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
sysdev_suspend(PMSG_HIBERNATE);
|
|
||||||
syscore_suspend();
|
syscore_suspend();
|
||||||
if (pm_wakeup_pending()) {
|
if (pm_wakeup_pending()) {
|
||||||
error = -EAGAIN;
|
error = -EAGAIN;
|
||||||
|
@ -541,7 +528,6 @@ int hibernation_platform_enter(void)
|
||||||
|
|
||||||
Power_up:
|
Power_up:
|
||||||
syscore_resume();
|
syscore_resume();
|
||||||
sysdev_resume();
|
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
enable_nonboot_cpus();
|
enable_nonboot_cpus();
|
||||||
|
|
||||||
|
|
|
@ -163,19 +163,13 @@ static int suspend_enter(suspend_state_t state)
|
||||||
arch_suspend_disable_irqs();
|
arch_suspend_disable_irqs();
|
||||||
BUG_ON(!irqs_disabled());
|
BUG_ON(!irqs_disabled());
|
||||||
|
|
||||||
error = sysdev_suspend(PMSG_SUSPEND);
|
|
||||||
if (!error) {
|
|
||||||
error = syscore_suspend();
|
error = syscore_suspend();
|
||||||
if (error)
|
|
||||||
sysdev_resume();
|
|
||||||
}
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
if (!(suspend_test(TEST_CORE) || pm_wakeup_pending())) {
|
if (!(suspend_test(TEST_CORE) || pm_wakeup_pending())) {
|
||||||
error = suspend_ops->enter(state);
|
error = suspend_ops->enter(state);
|
||||||
events_check_enabled = false;
|
events_check_enabled = false;
|
||||||
}
|
}
|
||||||
syscore_resume();
|
syscore_resume();
|
||||||
sysdev_resume();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
arch_suspend_enable_irqs();
|
arch_suspend_enable_irqs();
|
||||||
|
|
|
@ -315,7 +315,6 @@ void kernel_restart_prepare(char *cmd)
|
||||||
blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
|
blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
|
||||||
system_state = SYSTEM_RESTART;
|
system_state = SYSTEM_RESTART;
|
||||||
device_shutdown();
|
device_shutdown();
|
||||||
sysdev_shutdown();
|
|
||||||
syscore_shutdown();
|
syscore_shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,7 +353,6 @@ static void kernel_shutdown_prepare(enum system_states state)
|
||||||
void kernel_halt(void)
|
void kernel_halt(void)
|
||||||
{
|
{
|
||||||
kernel_shutdown_prepare(SYSTEM_HALT);
|
kernel_shutdown_prepare(SYSTEM_HALT);
|
||||||
sysdev_shutdown();
|
|
||||||
syscore_shutdown();
|
syscore_shutdown();
|
||||||
printk(KERN_EMERG "System halted.\n");
|
printk(KERN_EMERG "System halted.\n");
|
||||||
kmsg_dump(KMSG_DUMP_HALT);
|
kmsg_dump(KMSG_DUMP_HALT);
|
||||||
|
@ -374,7 +372,6 @@ void kernel_power_off(void)
|
||||||
if (pm_power_off_prepare)
|
if (pm_power_off_prepare)
|
||||||
pm_power_off_prepare();
|
pm_power_off_prepare();
|
||||||
disable_nonboot_cpus();
|
disable_nonboot_cpus();
|
||||||
sysdev_shutdown();
|
|
||||||
syscore_shutdown();
|
syscore_shutdown();
|
||||||
printk(KERN_EMERG "Power down.\n");
|
printk(KERN_EMERG "Power down.\n");
|
||||||
kmsg_dump(KMSG_DUMP_POWEROFF);
|
kmsg_dump(KMSG_DUMP_POWEROFF);
|
||||||
|
|
Loading…
Reference in a new issue