[PATCH 08/15] watchdog: orion: Add per-compatible clock initialization
From: Ezequiel Garcia <hidden>
Date: 2013-08-27 14:34:32
Subsystem:
the rest, watchdog device drivers · Maintainers:
Linus Torvalds, Wim Van Sebroeck, Guenter Roeck
Following the introduction of the compatible-data field, it's now possible to further abstract the clock initialization. This will allow to support SoC with a different clock setup. Signed-off-by: Ezequiel Garcia <redacted> --- drivers/watchdog/orion_wdt.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/drivers/watchdog/orion_wdt.c b/drivers/watchdog/orion_wdt.c
index ed1df3a..696f383 100644
--- a/drivers/watchdog/orion_wdt.c
+++ b/drivers/watchdog/orion_wdt.c@@ -39,9 +39,13 @@ static bool nowayout = WATCHDOG_NOWAYOUT; static int heartbeat = -1; /* module parameter (seconds) */ +struct orion_watchdog; + struct orion_watchdog_data { int wdt_counter_offset; int wdt_enable_bit; + int (*clock_init) (struct platform_device *, + struct orion_watchdog *); }; struct orion_watchdog {
@@ -53,6 +57,17 @@ struct orion_watchdog { struct orion_watchdog_data *data; }; +static int orion_wdt_clock_init(struct platform_device *pdev, + struct orion_watchdog *dev) +{ + dev->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(dev->clk)) + return -ENODEV; + clk_prepare_enable(dev->clk); + dev->clk_rate = clk_get_rate(dev->clk); + return 0; +} + static int orion_wdt_ping(struct watchdog_device *wdt_dev) { struct orion_watchdog *dev = watchdog_get_drvdata(wdt_dev);
@@ -139,6 +154,7 @@ static const struct watchdog_ops orion_wdt_ops = { static const struct orion_watchdog_data orion_data = { .wdt_enable_bit = BIT(4), .wdt_counter_offset = 0x24, + .clock_init = orion_wdt_clock_init, }; static const struct of_device_id orion_wdt_of_match_table[] = {
@@ -173,13 +189,6 @@ static int orion_wdt_probe(struct platform_device *pdev) dev->wdt.min_timeout = 1; dev->data = (struct orion_watchdog_data *)match->data; - dev->clk = devm_clk_get(&pdev->dev, NULL); - if (IS_ERR(dev->clk)) { - dev_err(&pdev->dev, "Orion Watchdog missing clock\n"); - return -ENODEV; - } - clk_prepare_enable(dev->clk); - dev->clk_rate = clk_get_rate(dev->clk); spin_lock_init(&dev->lock); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -190,6 +199,11 @@ static int orion_wdt_probe(struct platform_device *pdev) if (!dev->reg) return -ENOMEM; + ret = dev->data->clock_init(pdev, dev); + if (ret) { + dev_err(&pdev->dev, "cannot initialize clock\n"); + return ret; + } wdt_max_duration = WDT_MAX_CYCLE_COUNT / dev->clk_rate; dev->wdt.timeout = wdt_max_duration;
--
1.8.1.5