Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aefbaf3a authored by Xiubo Li's avatar Xiubo Li Committed by Wim Van Sebroeck
Browse files

watchdog: imx2_wdt: Add power management support.



Add power management operations(suspend and resume) as part of
dev_pm_ops for IMX2 watchdog driver.

Signed-off-by: default avatarXiubo Li <Li.Xiubo@freescale.com>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent 44e8967d
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -326,6 +326,52 @@ static void imx2_wdt_shutdown(struct platform_device *pdev)
	}
}

#ifdef CONFIG_PM_SLEEP
/* Disable watchdog if it is active during suspend */
static int imx2_wdt_suspend(struct device *dev)
{
	struct watchdog_device *wdog = dev_get_drvdata(dev);
	struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog);

	imx2_wdt_set_timeout(wdog, IMX2_WDT_MAX_TIME);
	imx2_wdt_ping(wdog);

	/* Watchdog has been stopped but IP block is still running */
	if (!watchdog_active(&wdog) && imx2_wdt_is_running(wdev))
		del_timer_sync(&wdev->timer);

	clk_disable_unprepare(wdev->clk);

	return 0;
}

/* Enable watchdog and configure it if necessary */
static int imx2_wdt_resume(struct device *dev)
{
	struct watchdog_device *wdog = dev_get_drvdata(dev);
	struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog);

	clk_prepare_enable(wdev->clk);

	if (watchdog_active(wdog) && !imx2_wdt_is_running(wdev)) {
		/* Resumes from deep sleep we need restart
		 * the watchdog again.
		 */
		imx2_wdt_setup(wdog);
		imx2_wdt_set_timeout(wdog, wdog->timeout);
		imx2_wdt_ping(wdog);
	} else if (imx2_wdt_is_running(wdev)) {
		imx2_wdt_ping(wdog);
		mod_timer(&wdev->timer, jiffies + wdog->timeout * HZ / 2);
	}

	return 0;
}
#endif

static SIMPLE_DEV_PM_OPS(imx2_wdt_pm_ops, imx2_wdt_suspend,
			 imx2_wdt_resume);

static const struct of_device_id imx2_wdt_dt_ids[] = {
	{ .compatible = "fsl,imx21-wdt", },
	{ /* sentinel */ }
@@ -337,6 +383,7 @@ static struct platform_driver imx2_wdt_driver = {
	.shutdown	= imx2_wdt_shutdown,
	.driver		= {
		.name	= DRIVER_NAME,
		.pm     = &imx2_wdt_pm_ops,
		.of_match_table = imx2_wdt_dt_ids,
	},
};