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

Commit ebcffcda authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull small watchdog update from Wim Van Sebroeck:
 - fix the argument of watchdog_active() in imx2_wdt
 - Add power management support to the imx2_wdt watchdog.

* git://www.linux-watchdog.org/linux-watchdog:
  watchdog: imx2_wdt: Fix the argument of watchdog_active()
  watchdog: imx2_wdt: Add power management support.
parents 0ec28c37 ba90f261
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,
	},
};