Resending this patch after fixing Russell's comments. This patch adds the context save restore functions for UART Signed-off-by: Rajendra Nayak <rnayak@xxxxxx> --- arch/arm/mach-omap2/serial.c | 55 +++++++++++++++++++++++++++++++ arch/arm/plat-omap/include/mach/serial.h | 12 ++++++ include/linux/serial_reg.h | 1 3 files changed, 68 insertions(+) Index: linux-omap-2.6/arch/arm/mach-omap2/serial.c =================================================================== --- linux-omap-2.6.orig/arch/arm/mach-omap2/serial.c 2008-09-02 13:06:15.000000000 +0530 +++ linux-omap-2.6/arch/arm/mach-omap2/serial.c 2008-09-02 13:06:20.000000000 +0530 @@ -290,6 +290,61 @@ void __init omap_serial_init(void) omap_serial_kick(); } +#ifdef CONFIG_ARCH_OMAP3 +static struct omap3_uart_regs uart_ctx[OMAP_MAX_NR_PORTS]; +void omap3_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(omap3_save_uart_ctx); + +void omap3_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(omap3_restore_uart_ctx); +#endif /* CONFIG_ARCH_OMAP3 */ + 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-09-02 13:06:10.000000000 +0530 +++ linux-omap-2.6/include/linux/serial_reg.h 2008-09-02 13:16:00.000000000 +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 */ Index: linux-omap-2.6/arch/arm/plat-omap/include/mach/serial.h =================================================================== --- linux-omap-2.6.orig/arch/arm/plat-omap/include/mach/serial.h 2008-09-02 13:06:10.000000000 +0530 +++ linux-omap-2.6/arch/arm/plat-omap/include/mach/serial.h 2008-09-02 13:08:24.000000000 +0530 @@ -40,4 +40,16 @@ __ret; \ }) +#ifndef __ASSEMBLY__ +struct omap3_uart_regs { + u16 dll; + u16 dlh; + u16 ier; + u16 sysc; + u16 scr; + u16 wer; +}; +extern void omap3_save_uart_ctx(int unum); +extern void omap3_restore_uart_ctx(int unum); +#endif /* __ASSEMBLY__ */ #endif -- 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