diff options
author | Anson Huang <b20788@freescale.com> | 2014-04-29 00:33:52 -0400 |
---|---|---|
committer | Huang Shijie <b32955@freescale.com> | 2014-06-18 00:58:19 -0400 |
commit | 5ad668295aeee17b4bae21d8741252a843dce528 (patch) | |
tree | 9a6fd1ceaf9c0a88ed5f138c3164c8ad93a23745 | |
parent | ff0e51f6fa07c7b43047700f110a004b873d668c (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.c | 26 |
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 | ||
231 | struct imx_port_ucrs { | 232 | struct 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; |