serial: imx: add hibernation support

During hibernation, freeze/thaw/restore dev_pm_ops are called instead of
suspend/resume. Hook up the hibernation ops. The _noirq parts are
identical, but suspend/resume are replaced with variants that do not
enable wakeup from i.MX UART. There is no need to restore register
contents in thaw_noirq.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Philipp Zabel 2017-11-01 13:51:41 +01:00 committed by Greg Kroah-Hartman
parent 2a76fa2830
commit 94be6d74d0
1 changed files with 28 additions and 0 deletions

View File

@ -2350,11 +2350,39 @@ static int imx_serial_port_resume(struct device *dev)
return 0;
}
static int imx_serial_port_freeze(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct imx_port *sport = platform_get_drvdata(pdev);
uart_suspend_port(&imx_reg, &sport->port);
/* Needed to enable clock in suspend_noirq */
return clk_prepare(sport->clk_ipg);
}
static int imx_serial_port_thaw(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct imx_port *sport = platform_get_drvdata(pdev);
uart_resume_port(&imx_reg, &sport->port);
clk_unprepare(sport->clk_ipg);
return 0;
}
static const struct dev_pm_ops imx_serial_port_pm_ops = {
.suspend_noirq = imx_serial_port_suspend_noirq,
.resume_noirq = imx_serial_port_resume_noirq,
.freeze_noirq = imx_serial_port_suspend_noirq,
.restore_noirq = imx_serial_port_resume_noirq,
.suspend = imx_serial_port_suspend,
.resume = imx_serial_port_resume,
.freeze = imx_serial_port_freeze,
.thaw = imx_serial_port_thaw,
.restore = imx_serial_port_thaw,
};
static struct platform_driver serial_imx_driver = {