This patch adds the context save restore functions for UART Signed-off-by: Rajendra Nayak <rnayak@xxxxxx> --- arch/arm/mach-omap2/serial.c | 62 +++++++++++++++++++++++++++++++++++++++++++ include/linux/serial_reg.h | 1 2 files changed, 63 insertions(+) Index: linux-omap-2.6/arch/arm/mach-omap2/serial.c =================================================================== --- linux-omap-2.6.orig/arch/arm/mach-omap2/serial.c 2008-07-01 11:08:08.844690432 +0530 +++ linux-omap-2.6/arch/arm/mach-omap2/serial.c 2008-07-01 12:14:14.542572349 +0530 @@ -83,6 +83,16 @@ static const u32 omap34xx_uart_padconf[O CONTROL_PADCONF_UART3_RX }; +struct omap_uart_regs { + u16 dll; + u16 dlh; + u16 ier; + u16 sysc; + u16 scr; + u16 wer; +}; +static struct omap_uart_regs uart_ctx[OMAP_MAX_NR_PORTS]; + static struct plat_serial8250_port serial_platform_data[] = { { .membase = (__force void __iomem *)IO_ADDRESS(OMAP_UART1_BASE), @@ -293,6 +303,58 @@ void __init omap_serial_init(void) omap_serial_kick(); } +void omap_save_uart_ctx(int unum) +{ + u16 lcr = 0; + + struct plat_serial8250_port *p = serial_platform_data + unum; + + if (uart_ick[unum] == NULL) + return; + + lcr = serial_read_reg(p, UART_LCR); + serial_write_reg(p, UART_LCR, 0xBF); + uart_ctx[unum].dll = serial_read_reg(p, UART_DLL); + uart_ctx[unum].dlh = serial_read_reg(p, UART_DLM); + serial_write_reg(p, UART_LCR, lcr); + uart_ctx[unum].ier = serial_read_reg(p, UART_IER); + uart_ctx[unum].sysc = serial_read_reg(p, UART_OMAP_SYSC); + uart_ctx[unum].scr = serial_read_reg(p, UART_OMAP_SCR); + uart_ctx[unum].wer = serial_read_reg(p, UART_OMAP_WER); +} +EXPORT_SYMBOL(omap_save_uart_ctx); + +void omap_restore_uart_ctx(int unum) +{ + u16 efr = 0; + + struct plat_serial8250_port *p = serial_platform_data + unum; + + if (uart_ick[unum] == NULL) + return; + + serial_write_reg(p, UART_OMAP_MDR1, 0x7); + serial_write_reg(p, UART_LCR, 0xBF); /* Config B mode */ + efr = serial_read_reg(p, UART_EFR); + serial_write_reg(p, UART_EFR, UART_EFR_ECB); + serial_write_reg(p, UART_LCR, 0x0); /* Operational mode */ + serial_write_reg(p, UART_IER, 0x0); + serial_write_reg(p, UART_LCR, 0xBF); /* Config B mode */ + serial_write_reg(p, UART_DLL, uart_ctx[unum].dll); + serial_write_reg(p, UART_DLM, uart_ctx[unum].dlh); + serial_write_reg(p, UART_LCR, 0x0); /* Operational mode */ + serial_write_reg(p, UART_IER, uart_ctx[unum].ier); + serial_write_reg(p, UART_FCR, 0xA1); + serial_write_reg(p, UART_LCR, 0xBF); /* Config B mode */ + serial_write_reg(p, UART_EFR, efr); + serial_write_reg(p, UART_LCR, UART_LCR_WLEN8); + serial_write_reg(p, UART_OMAP_SCR, uart_ctx[unum].scr); + serial_write_reg(p, UART_OMAP_WER, uart_ctx[unum].wer); + serial_write_reg(p, UART_OMAP_SYSC, uart_ctx[unum].sysc); + serial_write_reg(p, UART_OMAP_MDR1, 0x00); /* UART 16x mode */ +} +EXPORT_SYMBOL(omap_restore_uart_ctx); + static struct platform_device serial_device = { .name = "serial8250", .id = PLAT8250_DEV_PLATFORM, Index: linux-omap-2.6/include/linux/serial_reg.h =================================================================== --- linux-omap-2.6.orig/include/linux/serial_reg.h 2008-07-01 10:40:40.758251704 +0530 +++ linux-omap-2.6/include/linux/serial_reg.h 2008-07-01 12:08:11.157338527 +0530 @@ -323,6 +323,7 @@ #define UART_OMAP_MVER 0x14 /* Module version register */ #define UART_OMAP_SYSC 0x15 /* System configuration register */ #define UART_OMAP_SYSS 0x16 /* System status register */ +#define UART_OMAP_WER 0x17 /* Wake-up enable register */ #endif /* _LINUX_SERIAL_REG_H */ -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html