diff options
author | Kyungmin Park <kyungmin.park@samsung.com> | 2009-11-17 02:41:17 -0500 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2009-11-30 20:33:15 -0500 |
commit | c3fcf5d1a43cc27393f77d07b1323232095173de (patch) | |
tree | 544d53172edc45f2fafa20b511e2926528c2430b /arch | |
parent | b0d5217cfb0a2357ac076977400c648cccff6154 (diff) |
ARM: S5PC1XX: add cpu idle and system reset support
Add CPU idle support by a call to SoC build-in power management core.
Add system reset support by a simple write to system controll register.
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-s5pc100/cpu.c | 22 | ||||
-rw-r--r-- | arch/arm/mach-s5pc100/include/mach/system.h | 13 | ||||
-rw-r--r-- | arch/arm/plat-s3c/include/plat/cpu.h | 6 | ||||
-rw-r--r-- | arch/arm/plat-s5pc1xx/include/plat/regs-power.h | 84 |
4 files changed, 122 insertions, 3 deletions
diff --git a/arch/arm/mach-s5pc100/cpu.c b/arch/arm/mach-s5pc100/cpu.c index 0e718890da32..a23ca5795bc8 100644 --- a/arch/arm/mach-s5pc100/cpu.c +++ b/arch/arm/mach-s5pc100/cpu.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #include <linux/serial_core.h> | 22 | #include <linux/serial_core.h> |
23 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
24 | 24 | ||
25 | #include <asm/proc-fns.h> | ||
26 | |||
25 | #include <asm/mach/arch.h> | 27 | #include <asm/mach/arch.h> |
26 | #include <asm/mach/map.h> | 28 | #include <asm/mach/map.h> |
27 | #include <asm/mach/irq.h> | 29 | #include <asm/mach/irq.h> |
@@ -32,6 +34,7 @@ | |||
32 | 34 | ||
33 | #include <plat/cpu-freq.h> | 35 | #include <plat/cpu-freq.h> |
34 | #include <plat/regs-serial.h> | 36 | #include <plat/regs-serial.h> |
37 | #include <plat/regs-power.h> | ||
35 | 38 | ||
36 | #include <plat/cpu.h> | 39 | #include <plat/cpu.h> |
37 | #include <plat/devs.h> | 40 | #include <plat/devs.h> |
@@ -45,6 +48,23 @@ | |||
45 | static struct map_desc s5pc100_iodesc[] __initdata = { | 48 | static struct map_desc s5pc100_iodesc[] __initdata = { |
46 | }; | 49 | }; |
47 | 50 | ||
51 | static void s5pc100_idle(void) | ||
52 | { | ||
53 | unsigned long tmp; | ||
54 | |||
55 | tmp = __raw_readl(S5PC100_PWR_CFG); | ||
56 | tmp &= ~S5PC100_PWRCFG_CFG_DEEP_IDLE; | ||
57 | tmp &= ~S5PC100_PWRCFG_CFG_WFI_MASK; | ||
58 | tmp |= S5PC100_PWRCFG_CFG_WFI_DEEP_IDLE; | ||
59 | __raw_writel(tmp, S5PC100_PWR_CFG); | ||
60 | |||
61 | tmp = __raw_readl(S5PC100_OTHERS); | ||
62 | tmp |= S5PC100_PMU_INT_DISABLE; | ||
63 | __raw_writel(tmp, S5PC100_OTHERS); | ||
64 | |||
65 | cpu_do_idle(); | ||
66 | } | ||
67 | |||
48 | /* s5pc100_map_io | 68 | /* s5pc100_map_io |
49 | * | 69 | * |
50 | * register the standard cpu IO areas | 70 | * register the standard cpu IO areas |
@@ -93,5 +113,7 @@ int __init s5pc100_init(void) | |||
93 | { | 113 | { |
94 | printk(KERN_DEBUG "S5PC100: Initialising architecture\n"); | 114 | printk(KERN_DEBUG "S5PC100: Initialising architecture\n"); |
95 | 115 | ||
116 | s5pc1xx_idle = s5pc100_idle; | ||
117 | |||
96 | return sysdev_register(&s5pc100_sysdev); | 118 | return sysdev_register(&s5pc100_sysdev); |
97 | } | 119 | } |
diff --git a/arch/arm/mach-s5pc100/include/mach/system.h b/arch/arm/mach-s5pc100/include/mach/system.h index e39014375470..f0d31a2a598c 100644 --- a/arch/arm/mach-s5pc100/include/mach/system.h +++ b/arch/arm/mach-s5pc100/include/mach/system.h | |||
@@ -11,14 +11,21 @@ | |||
11 | #ifndef __ASM_ARCH_SYSTEM_H | 11 | #ifndef __ASM_ARCH_SYSTEM_H |
12 | #define __ASM_ARCH_SYSTEM_H __FILE__ | 12 | #define __ASM_ARCH_SYSTEM_H __FILE__ |
13 | 13 | ||
14 | #include <linux/io.h> | ||
15 | #include <mach/map.h> | ||
16 | #include <plat/regs-clock.h> | ||
17 | |||
18 | void (*s5pc1xx_idle)(void); | ||
19 | |||
14 | static void arch_idle(void) | 20 | static void arch_idle(void) |
15 | { | 21 | { |
16 | /* nothing here yet */ | 22 | if (s5pc1xx_idle) |
23 | s5pc1xx_idle(); | ||
17 | } | 24 | } |
18 | 25 | ||
19 | static void arch_reset(char mode, const char *cmd) | 26 | static void arch_reset(char mode, const char *cmd) |
20 | { | 27 | { |
21 | /* nothing here yet */ | 28 | __raw_writel(S5PC100_SWRESET_RESETVAL, S5PC100_SWRESET); |
29 | return; | ||
22 | } | 30 | } |
23 | |||
24 | #endif /* __ASM_ARCH_IRQ_H */ | 31 | #endif /* __ASM_ARCH_IRQ_H */ |
diff --git a/arch/arm/plat-s3c/include/plat/cpu.h b/arch/arm/plat-s3c/include/plat/cpu.h index fbc3d498e02e..d1131ca11e97 100644 --- a/arch/arm/plat-s3c/include/plat/cpu.h +++ b/arch/arm/plat-s3c/include/plat/cpu.h | |||
@@ -12,6 +12,9 @@ | |||
12 | 12 | ||
13 | /* todo - fix when rmk changes iodescs to use `void __iomem *` */ | 13 | /* todo - fix when rmk changes iodescs to use `void __iomem *` */ |
14 | 14 | ||
15 | #ifndef __SAMSUNG_PLAT_CPU_H | ||
16 | #define __SAMSUNG_PLAT_CPU_H | ||
17 | |||
15 | #define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE } | 18 | #define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE } |
16 | 19 | ||
17 | #ifndef MHZ | 20 | #ifndef MHZ |
@@ -73,3 +76,6 @@ extern struct sysdev_class s3c2443_sysclass; | |||
73 | extern struct sysdev_class s3c6410_sysclass; | 76 | extern struct sysdev_class s3c6410_sysclass; |
74 | extern struct sysdev_class s3c64xx_sysclass; | 77 | extern struct sysdev_class s3c64xx_sysclass; |
75 | 78 | ||
79 | extern void (*s5pc1xx_idle)(void); | ||
80 | |||
81 | #endif | ||
diff --git a/arch/arm/plat-s5pc1xx/include/plat/regs-power.h b/arch/arm/plat-s5pc1xx/include/plat/regs-power.h new file mode 100644 index 000000000000..02ffa491b53a --- /dev/null +++ b/arch/arm/plat-s5pc1xx/include/plat/regs-power.h | |||
@@ -0,0 +1,84 @@ | |||
1 | /* arch/arm/plat-s5pc1xx/include/plat/regs-clock.h | ||
2 | * | ||
3 | * Copyright 2009 Samsung Electronics Co. | ||
4 | * Jongse Won <jongse.won@samsung.com> | ||
5 | * | ||
6 | * S5PC1XX clock register definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARM_REGS_PWR | ||
14 | #define __ASM_ARM_REGS_PWR __FILE__ | ||
15 | |||
16 | #define S5PC1XX_PWRREG(x) (S5PC1XX_VA_PWR + (x)) | ||
17 | |||
18 | /* s5pc100 (0xE0108000) register for power management */ | ||
19 | #define S5PC100_PWR_CFG S5PC1XX_PWRREG(0x0) | ||
20 | #define S5PC100_EINT_WAKEUP_MASK S5PC1XX_PWRREG(0x4) | ||
21 | #define S5PC100_NORMAL_CFG S5PC1XX_PWRREG(0x10) | ||
22 | #define S5PC100_STOP_CFG S5PC1XX_PWRREG(0x14) | ||
23 | #define S5PC100_SLEEP_CFG S5PC1XX_PWRREG(0x18) | ||
24 | #define S5PC100_STOP_MEM_CFG S5PC1XX_PWRREG(0x1C) | ||
25 | #define S5PC100_OSC_FREQ S5PC1XX_PWRREG(0x100) | ||
26 | #define S5PC100_OSC_STABLE S5PC1XX_PWRREG(0x104) | ||
27 | #define S5PC100_PWR_STABLE S5PC1XX_PWRREG(0x108) | ||
28 | #define S5PC100_MTC_STABLE S5PC1XX_PWRREG(0x110) | ||
29 | #define S5PC100_CLAMP_STABLE S5PC1XX_PWRREG(0x114) | ||
30 | #define S5PC100_OTHERS S5PC1XX_PWRREG(0x200) | ||
31 | #define S5PC100_RST_STAT S5PC1XX_PWRREG(0x300) | ||
32 | #define S5PC100_WAKEUP_STAT S5PC1XX_PWRREG(0x304) | ||
33 | #define S5PC100_BLK_PWR_STAT S5PC1XX_PWRREG(0x308) | ||
34 | #define S5PC100_INFORM0 S5PC1XX_PWRREG(0x400) | ||
35 | #define S5PC100_INFORM1 S5PC1XX_PWRREG(0x404) | ||
36 | #define S5PC100_INFORM2 S5PC1XX_PWRREG(0x408) | ||
37 | #define S5PC100_INFORM3 S5PC1XX_PWRREG(0x40C) | ||
38 | #define S5PC100_INFORM4 S5PC1XX_PWRREG(0x410) | ||
39 | #define S5PC100_INFORM5 S5PC1XX_PWRREG(0x414) | ||
40 | #define S5PC100_INFORM6 S5PC1XX_PWRREG(0x418) | ||
41 | #define S5PC100_INFORM7 S5PC1XX_PWRREG(0x41C) | ||
42 | #define S5PC100_DCGIDX_MAP0 S5PC1XX_PWRREG(0x500) | ||
43 | #define S5PC100_DCGIDX_MAP1 S5PC1XX_PWRREG(0x504) | ||
44 | #define S5PC100_DCGIDX_MAP2 S5PC1XX_PWRREG(0x508) | ||
45 | #define S5PC100_DCGPERF_MAP0 S5PC1XX_PWRREG(0x50C) | ||
46 | #define S5PC100_DCGPERF_MAP1 S5PC1XX_PWRREG(0x510) | ||
47 | #define S5PC100_DVCIDX_MAP S5PC1XX_PWRREG(0x514) | ||
48 | #define S5PC100_FREQ_CPU S5PC1XX_PWRREG(0x518) | ||
49 | #define S5PC100_FREQ_DPM S5PC1XX_PWRREG(0x51C) | ||
50 | #define S5PC100_DVSEMCLK_EN S5PC1XX_PWRREG(0x520) | ||
51 | #define S5PC100_APLL_CON_L8 S5PC1XX_PWRREG(0x600) | ||
52 | #define S5PC100_APLL_CON_L7 S5PC1XX_PWRREG(0x604) | ||
53 | #define S5PC100_APLL_CON_L6 S5PC1XX_PWRREG(0x608) | ||
54 | #define S5PC100_APLL_CON_L5 S5PC1XX_PWRREG(0x60C) | ||
55 | #define S5PC100_APLL_CON_L4 S5PC1XX_PWRREG(0x610) | ||
56 | #define S5PC100_APLL_CON_L3 S5PC1XX_PWRREG(0x614) | ||
57 | #define S5PC100_APLL_CON_L2 S5PC1XX_PWRREG(0x618) | ||
58 | #define S5PC100_APLL_CON_L1 S5PC1XX_PWRREG(0x61C) | ||
59 | #define S5PC100_IEM_CONTROL S5PC1XX_PWRREG(0x620) | ||
60 | #define S5PC100_CLKDIV_IEM_L8 S5PC1XX_PWRREG(0x700) | ||
61 | #define S5PC100_CLKDIV_IEM_L7 S5PC1XX_PWRREG(0x704) | ||
62 | #define S5PC100_CLKDIV_IEM_L6 S5PC1XX_PWRREG(0x708) | ||
63 | #define S5PC100_CLKDIV_IEM_L5 S5PC1XX_PWRREG(0x70C) | ||
64 | #define S5PC100_CLKDIV_IEM_L4 S5PC1XX_PWRREG(0x710) | ||
65 | #define S5PC100_CLKDIV_IEM_L3 S5PC1XX_PWRREG(0x714) | ||
66 | #define S5PC100_CLKDIV_IEM_L2 S5PC1XX_PWRREG(0x718) | ||
67 | #define S5PC100_CLKDIV_IEM_L1 S5PC1XX_PWRREG(0x71C) | ||
68 | #define S5PC100_IEM_HPMCLK_DIV S5PC1XX_PWRREG(0x724) | ||
69 | |||
70 | /* PWR_CFG */ | ||
71 | #define S5PC100_PWRCFG_CFG_DEEP_IDLE (1 << 31) | ||
72 | #define S5PC100_PWRCFG_CFG_WFI_MASK (3 << 5) | ||
73 | #define S5PC100_PWRCFG_CFG_WFI_IDLE (0 << 5) | ||
74 | #define S5PC100_PWRCFG_CFG_WFI_DEEP_IDLE (1 << 5) | ||
75 | #define S5PC100_PWRCFG_CFG_WFI_STOP (2 << 5) | ||
76 | #define S5PC100_PWRCFG_CFG_WFI_SLEEP (3 << 5) | ||
77 | |||
78 | /* SLEEP_CFG */ | ||
79 | #define S5PC100_SLEEP_OSC_EN_SLEEP (1 << 0) | ||
80 | |||
81 | /* OTHERS */ | ||
82 | #define S5PC100_PMU_INT_DISABLE (1 << 24) | ||
83 | |||
84 | #endif /* __ASM_ARM_REGS_PWR */ | ||