aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnson Huang <b20788@freescale.com>2014-04-29 00:33:52 -0400
committerHuang Shijie <b32955@freescale.com>2014-06-18 00:58:19 -0400
commit5ad668295aeee17b4bae21d8741252a843dce528 (patch)
tree9a6fd1ceaf9c0a88ed5f138c3164c8ad93a23745
parentff0e51f6fa07c7b43047700f110a004b873d668c (diff)
ENGR00318938-1 serial: imx: add UART save/restore during DSM enter/exit
When Mega/Fast mix is off, UART controller will lost power, so need to add save/restore to make it work after resume. Signed-off-by: Anson Huang <b20788@freescale.com> Signed-off-by: Huang Shijie <b32955@freescale.com>
-rw-r--r--drivers/tty/serial/imx.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index e2f93874989b..62c0cd5fe7c7 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -226,6 +226,7 @@ struct imx_port {
226 unsigned int tx_bytes; 226 unsigned int tx_bytes;
227 unsigned int dma_tx_nents; 227 unsigned int dma_tx_nents;
228 wait_queue_head_t dma_wait; 228 wait_queue_head_t dma_wait;
229 unsigned int saved_reg[11];
229}; 230};
230 231
231struct imx_port_ucrs { 232struct imx_port_ucrs {
@@ -1810,6 +1811,19 @@ static int serial_imx_suspend(struct platform_device *dev, pm_message_t state)
1810 1811
1811 uart_suspend_port(&imx_reg, &sport->port); 1812 uart_suspend_port(&imx_reg, &sport->port);
1812 1813
1814 /* Save necessary regs */
1815 sport->saved_reg[0] = readl(sport->port.membase + UCR1);
1816 sport->saved_reg[1] = readl(sport->port.membase + UCR2);
1817 sport->saved_reg[2] = readl(sport->port.membase + UCR3);
1818 sport->saved_reg[3] = readl(sport->port.membase + UCR4);
1819 sport->saved_reg[4] = readl(sport->port.membase + UFCR);
1820 sport->saved_reg[5] = readl(sport->port.membase + UESC);
1821 sport->saved_reg[6] = readl(sport->port.membase + UTIM);
1822 sport->saved_reg[7] = readl(sport->port.membase + UBIR);
1823 sport->saved_reg[8] = readl(sport->port.membase + UBMR);
1824 sport->saved_reg[9] = readl(sport->port.membase + UBRC);
1825 sport->saved_reg[10] = readl(sport->port.membase + IMX21_UTS);
1826
1813 return 0; 1827 return 0;
1814} 1828}
1815 1829
@@ -1818,6 +1832,18 @@ static int serial_imx_resume(struct platform_device *dev)
1818 struct imx_port *sport = platform_get_drvdata(dev); 1832 struct imx_port *sport = platform_get_drvdata(dev);
1819 unsigned int val; 1833 unsigned int val;
1820 1834
1835 writel(sport->saved_reg[4], sport->port.membase + UFCR);
1836 writel(sport->saved_reg[5], sport->port.membase + UESC);
1837 writel(sport->saved_reg[6], sport->port.membase + UTIM);
1838 writel(sport->saved_reg[7], sport->port.membase + UBIR);
1839 writel(sport->saved_reg[8], sport->port.membase + UBMR);
1840 writel(sport->saved_reg[9], sport->port.membase + UBRC);
1841 writel(sport->saved_reg[10], sport->port.membase + IMX21_UTS);
1842 writel(sport->saved_reg[0], sport->port.membase + UCR1);
1843 writel(sport->saved_reg[1] | 0x1, sport->port.membase + UCR2);
1844 writel(sport->saved_reg[2], sport->port.membase + UCR3);
1845 writel(sport->saved_reg[3], sport->port.membase + UCR4);
1846
1821 /* disable wakeup from i.MX UART */ 1847 /* disable wakeup from i.MX UART */
1822 val = readl(sport->port.membase + UCR3); 1848 val = readl(sport->port.membase + UCR3);
1823 val &= ~UCR3_AWAKEN; 1849 val &= ~UCR3_AWAKEN;