aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-s3c/pm.c
diff options
context:
space:
mode:
authorBen Dooks <ben-linux@fluff.org>2008-12-11 19:24:20 -0500
committerBen Dooks <ben-linux@fluff.org>2009-03-08 08:37:10 -0400
commitd2b07fe2a3e35d8e58cceb63ab58831d706da939 (patch)
treefec7bcae153eb12d482a809967ac4809809337fe /arch/arm/plat-s3c/pm.c
parentef30e14420df546bc6576b00f9caf3379b6699d1 (diff)
[ARM] S3C: Update UART save over PM suspend/resume
Change the way the UART state is saved over suspend to allow the s3c64xx code to modify the settings on resume to avoid any illegal state changes to the UART clocks. This will also allow us to save the UDIVSLOT register on newer SoCs. Move to using a structure for the UART use the extant Kconfig configuration specifying the number of UARTs. Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Diffstat (limited to 'arch/arm/plat-s3c/pm.c')
-rw-r--r--arch/arm/plat-s3c/pm.c61
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) \ 75struct pm_uart_save uart_save[CONFIG_SERIAL_SAMSUNG_UARTS];
76 SAVE_ITEM((va) + S3C2410_ULCON), \ 76
77 SAVE_ITEM((va) + S3C2410_UCON), \ 77static 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);
82static 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
90static void s3c_pm_save_uart(void) 88static 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
97static 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
95static void s3c_pm_restore_uart(void) 108static 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
100static void s3c_pm_save_uart(void) { } 117static void s3c_pm_save_uarts(void) { }
101static void s3c_pm_restore_uart(void) { } 118static 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();