diff options
Diffstat (limited to 'arch/arm/plat-s3c/pm.c')
-rw-r--r-- | arch/arm/plat-s3c/pm.c | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/arch/arm/plat-s3c/pm.c b/arch/arm/plat-s3c/pm.c index e320b0ff3852..78bf50a14027 100644 --- a/arch/arm/plat-s3c/pm.c +++ b/arch/arm/plat-s3c/pm.c | |||
@@ -72,33 +72,50 @@ static inline void s3c_pm_debug_init(void) | |||
72 | 72 | ||
73 | #ifdef CONFIG_S3C2410_PM_DEBUG | 73 | #ifdef CONFIG_S3C2410_PM_DEBUG |
74 | 74 | ||
75 | #define SAVE_UART(va) \ | 75 | struct pm_uart_save uart_save[CONFIG_SERIAL_SAMSUNG_UARTS]; |
76 | SAVE_ITEM((va) + S3C2410_ULCON), \ | 76 | |
77 | SAVE_ITEM((va) + S3C2410_UCON), \ | 77 | static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save) |
78 | SAVE_ITEM((va) + S3C2410_UFCON), \ | 78 | { |
79 | SAVE_ITEM((va) + S3C2410_UMCON), \ | 79 | void __iomem *regs = S3C_VA_UARTx(uart); |
80 | SAVE_ITEM((va) + S3C2410_UBRDIV) | 80 | |
81 | 81 | save->ulcon = __raw_readl(regs + S3C2410_ULCON); | |
82 | static struct sleep_save uart_save[] = { | 82 | save->ucon = __raw_readl(regs + S3C2410_UCON); |
83 | SAVE_UART(S3C_VA_UART0), | 83 | save->ufcon = __raw_readl(regs + S3C2410_UFCON); |
84 | SAVE_UART(S3C_VA_UART1), | 84 | save->umcon = __raw_readl(regs + S3C2410_UMCON); |
85 | #ifndef CONFIG_CPU_S3C2400 | 85 | save->ubrdiv = __raw_readl(regs + S3C2410_UBRDIV); |
86 | SAVE_UART(S3C_VA_UART2), | 86 | } |
87 | #endif | ||
88 | }; | ||
89 | 87 | ||
90 | static void s3c_pm_save_uart(void) | 88 | static void s3c_pm_save_uarts(void) |
91 | { | 89 | { |
92 | s3c_pm_do_save(uart_save, ARRAY_SIZE(uart_save)); | 90 | struct pm_uart_save *save = uart_save; |
91 | unsigned int uart; | ||
92 | |||
93 | for (uart = 0; uart < CONFIG_SERIAL_SAMSUNG_UARTS; uart++, save++) | ||
94 | s3c_pm_save_uart(uart, save); | ||
95 | } | ||
96 | |||
97 | static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save) | ||
98 | { | ||
99 | void __iomem *regs = S3C_VA_UARTx(uart); | ||
100 | |||
101 | __raw_writel(save->ulcon, regs + S3C2410_ULCON); | ||
102 | __raw_writel(save->ucon, regs + S3C2410_UCON); | ||
103 | __raw_writel(save->ufcon, regs + S3C2410_UFCON); | ||
104 | __raw_writel(save->umcon, regs + S3C2410_UMCON); | ||
105 | __raw_writel(save->ubrdiv, regs + S3C2410_UBRDIV); | ||
93 | } | 106 | } |
94 | 107 | ||
95 | static void s3c_pm_restore_uart(void) | 108 | static void s3c_pm_restore_uarts(void) |
96 | { | 109 | { |
97 | s3c_pm_do_restore(uart_save, ARRAY_SIZE(uart_save)); | 110 | struct pm_uart_save *save = uart_save; |
111 | unsigned int uart; | ||
112 | |||
113 | for (uart = 0; uart < CONFIG_SERIAL_SAMSUNG_UARTS; uart++, save++) | ||
114 | s3c_pm_restore_uart(uart, save); | ||
98 | } | 115 | } |
99 | #else | 116 | #else |
100 | static void s3c_pm_save_uart(void) { } | 117 | static void s3c_pm_save_uarts(void) { } |
101 | static void s3c_pm_restore_uart(void) { } | 118 | static void s3c_pm_restore_uarts(void) { } |
102 | #endif | 119 | #endif |
103 | 120 | ||
104 | /* The IRQ ext-int code goes here, it is too small to currently bother | 121 | /* The IRQ ext-int code goes here, it is too small to currently bother |
@@ -250,7 +267,7 @@ static int s3c_pm_enter(suspend_state_t state) | |||
250 | /* save all necessary core registers not covered by the drivers */ | 267 | /* save all necessary core registers not covered by the drivers */ |
251 | 268 | ||
252 | s3c_pm_save_gpios(); | 269 | s3c_pm_save_gpios(); |
253 | s3c_pm_save_uart(); | 270 | s3c_pm_save_uarts(); |
254 | s3c_pm_save_core(); | 271 | s3c_pm_save_core(); |
255 | 272 | ||
256 | /* set the irq configuration for wake */ | 273 | /* set the irq configuration for wake */ |
@@ -293,7 +310,7 @@ static int s3c_pm_enter(suspend_state_t state) | |||
293 | /* restore the system state */ | 310 | /* restore the system state */ |
294 | 311 | ||
295 | s3c_pm_restore_core(); | 312 | s3c_pm_restore_core(); |
296 | s3c_pm_restore_uart(); | 313 | s3c_pm_restore_uarts(); |
297 | s3c_pm_restore_gpios(); | 314 | s3c_pm_restore_gpios(); |
298 | 315 | ||
299 | s3c_pm_debug_init(); | 316 | s3c_pm_debug_init(); |