1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/device.h>
14#include <linux/syscore_ops.h>
15#include <linux/io.h>
16
17#include <asm/cacheflush.h>
18
19#include <mach/regs-s3c2443-clock.h>
20
21#include <plat/cpu.h>
22#include <plat/pm.h>
23
24#include "s3c2412-power.h"
25
26#ifdef CONFIG_PM_SLEEP
27extern void s3c2412_sleep_enter(void);
28
29static int s3c2416_cpu_suspend(unsigned long arg)
30{
31
32 __raw_writel(S3C2443_PWRCFG_SLEEP, S3C2443_PWRCFG);
33
34
35 __raw_writel(0x2BED, S3C2443_PWRMODE);
36
37 s3c2412_sleep_enter();
38
39 pr_info("Failed to suspend the system\n");
40 return 1;
41}
42
43static void s3c2416_pm_prepare(void)
44{
45
46
47
48
49
50 __raw_writel(0x2BED, S3C2412_INFORM0);
51 __raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1);
52}
53
54static int s3c2416_pm_add(struct device *dev, struct subsys_interface *sif)
55{
56 pm_cpu_prep = s3c2416_pm_prepare;
57 pm_cpu_sleep = s3c2416_cpu_suspend;
58
59 return 0;
60}
61
62static struct subsys_interface s3c2416_pm_interface = {
63 .name = "s3c2416_pm",
64 .subsys = &s3c2416_subsys,
65 .add_dev = s3c2416_pm_add,
66};
67
68static __init int s3c2416_pm_init(void)
69{
70 return subsys_interface_register(&s3c2416_pm_interface);
71}
72
73arch_initcall(s3c2416_pm_init);
74#endif
75
76static void s3c2416_pm_resume(void)
77{
78
79 __raw_writel(0x0, S3C2443_PWRMODE);
80 __raw_writel(0x0, S3C2412_INFORM0);
81 __raw_writel(0x0, S3C2412_INFORM1);
82}
83
84struct syscore_ops s3c2416_pm_syscore_ops = {
85 .resume = s3c2416_pm_resume,
86};
87