public inbox for linux-watchdog@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/7] watchdog: mpc8xxx: several cleanups
@ 2015-08-12  8:15 Uwe Kleine-König
  2015-08-12  8:15 ` [PATCH v2 1/7] watchdog: mpc8xxx: remove dead code Uwe Kleine-König
                   ` (6 more replies)
  0 siblings, 7 replies; 13+ messages in thread
From: Uwe Kleine-König @ 2015-08-12  8:15 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: Guenter Roeck, kernel, linux-watchdog

Hello,

this is the reviewed series of some cleanups to the mpc8xxx watchdog driver.
v1 was sent starting with Message-Id:
1438942067-1654-1-git-send-email-u.kleine-koenig@pengutronix.de .

Patch 6 "watchdog: mpc8xxx: use better error code when watchdog cannot
be enabled" is new. This fixed a checkpatch warning that is reported for
patch 4. The finding is wrong though, because this patch only does
some code rearrangements and doesn't introduce the warning.

Also I split patch "watchdog: mpc8xxx: make use of
of_device_get_match_data" from v1 to really only do that and the
remaining cleanup done there is now in a separate patch (the
devm_ioremap_resource one).

Also I fixed the wording in the last patch as pointed out by Guenter.

Uwe Kleine-König (7):
  watchdog: mpc8xxx: remove dead code
  watchdog: mpc8xxx: simplify registration
  watchdog: mpc8xxx: make use of of_device_get_match_data
  watchdog: mpc8xxx: use devm_ioremap_resource to map memory
  watchdog: mpc8xxx: use dynamic memory for device specific data
  watchdog: mpc8xxx: use better error code when watchdog cannot be
    enabled
  watchdog: mpc8xxx: allow to compile for MPC512x

 drivers/watchdog/Kconfig       |   2 +-
 drivers/watchdog/mpc8xxx_wdt.c | 156 +++++++++++++++++------------------------
 2 files changed, 67 insertions(+), 91 deletions(-)

-- 
2.4.6


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/7] watchdog: mpc8xxx: remove dead code
  2015-08-12  8:15 [PATCH v2 0/7] watchdog: mpc8xxx: several cleanups Uwe Kleine-König
@ 2015-08-12  8:15 ` Uwe Kleine-König
  2015-08-12  8:15 ` [PATCH v2 2/7] watchdog: mpc8xxx: simplify registration Uwe Kleine-König
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 13+ messages in thread
From: Uwe Kleine-König @ 2015-08-12  8:15 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: Guenter Roeck, kernel, linux-watchdog

Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/watchdog/mpc8xxx_wdt.c | 15 ++-------------
 1 file changed, 2 insertions(+), 13 deletions(-)

diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
index 689381a24887..8ad42b83f995 100644
--- a/drivers/watchdog/mpc8xxx_wdt.c
+++ b/drivers/watchdog/mpc8xxx_wdt.c
@@ -68,12 +68,6 @@ module_param(nowayout, bool, 0);
 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started "
 		 "(default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
-/*
- * We always prescale, but if someone really doesn't want to they can set this
- * to 0
- */
-static int prescale = 1;
-
 static DEFINE_SPINLOCK(wdt_spinlock);
 
 static void mpc8xxx_wdt_keepalive(void)
@@ -101,11 +95,9 @@ static void mpc8xxx_wdt_timer_ping(unsigned long arg)
 
 static int mpc8xxx_wdt_start(struct watchdog_device *w)
 {
-	u32 tmp = SWCRR_SWEN;
+	u32 tmp = SWCRR_SWEN | SWCRR_SWPR;
 
 	/* Good, fire up the show */
-	if (prescale)
-		tmp |= SWCRR_SWPR;
 	if (reset)
 		tmp |= SWCRR_SWRI;
 
@@ -179,10 +171,7 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	}
 
 	/* Calculate the timeout in seconds */
-	if (prescale)
-		timeout_sec = (timeout * wdt_type->prescaler) / freq;
-	else
-		timeout_sec = timeout / freq;
+	timeout_sec = (timeout * wdt_type->prescaler) / freq;
 
 	mpc8xxx_wdt_dev.timeout = timeout_sec;
 #ifdef MODULE
-- 
2.4.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 2/7] watchdog: mpc8xxx: simplify registration
  2015-08-12  8:15 [PATCH v2 0/7] watchdog: mpc8xxx: several cleanups Uwe Kleine-König
  2015-08-12  8:15 ` [PATCH v2 1/7] watchdog: mpc8xxx: remove dead code Uwe Kleine-König
@ 2015-08-12  8:15 ` Uwe Kleine-König
  2015-08-12  8:15 ` [PATCH v2 3/7] watchdog: mpc8xxx: make use of of_device_get_match_data Uwe Kleine-König
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 13+ messages in thread
From: Uwe Kleine-König @ 2015-08-12  8:15 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: Guenter Roeck, kernel, linux-watchdog

Since commit ef90174f8210 ("watchdog: watchdog_core: Add watchdog
registration deferral mechanism") there is no need to delay the call to
watchdog_register_device any more. So simplify the registration code
accordingly.

Resetting wd_base to NULL can the also be dropped because nothing
depends on it being NULL to signal probe failure any more. (The matching
wd_base = NULL in .remove was missing, too.)

Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/watchdog/mpc8xxx_wdt.c | 38 +++++++-------------------------------
 1 file changed, 7 insertions(+), 31 deletions(-)

diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
index 8ad42b83f995..e0acda3282d9 100644
--- a/drivers/watchdog/mpc8xxx_wdt.c
+++ b/drivers/watchdog/mpc8xxx_wdt.c
@@ -51,7 +51,6 @@ struct mpc8xxx_wdt_type {
 };
 
 static struct mpc8xxx_wdt __iomem *wd_base;
-static int mpc8xxx_wdt_init_late(void);
 
 static u16 timeout = 0xffff;
 module_param(timeout, ushort, 0);
@@ -174,11 +173,14 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	timeout_sec = (timeout * wdt_type->prescaler) / freq;
 
 	mpc8xxx_wdt_dev.timeout = timeout_sec;
-#ifdef MODULE
-	ret = mpc8xxx_wdt_init_late();
-	if (ret)
+
+	watchdog_set_nowayout(&mpc8xxx_wdt_dev, nowayout);
+
+	ret = watchdog_register_device(&mpc8xxx_wdt_dev);
+	if (ret) {
+		pr_err("cannot register watchdog device (err=%d)\n", ret);
 		goto err_unmap;
-#endif
+	}
 
 	pr_info("WDT driver for MPC8xxx initialized. mode:%s timeout=%d (%d seconds)\n",
 		reset ? "reset" : "interrupt", timeout, timeout_sec);
@@ -193,7 +195,6 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	return 0;
 err_unmap:
 	iounmap(wd_base);
-	wd_base = NULL;
 	return ret;
 }
 
@@ -242,31 +243,6 @@ static struct platform_driver mpc8xxx_wdt_driver = {
 	},
 };
 
-/*
- * We do wdt initialization in two steps: arch_initcall probes the wdt
- * very early to start pinging the watchdog (misc devices are not yet
- * available), and later module_init() just registers the misc device.
- */
-static int mpc8xxx_wdt_init_late(void)
-{
-	int ret;
-
-	if (!wd_base)
-		return -ENODEV;
-
-	watchdog_set_nowayout(&mpc8xxx_wdt_dev, nowayout);
-
-	ret = watchdog_register_device(&mpc8xxx_wdt_dev);
-	if (ret) {
-		pr_err("cannot register watchdog device (err=%d)\n", ret);
-		return ret;
-	}
-	return 0;
-}
-#ifndef MODULE
-module_init(mpc8xxx_wdt_init_late);
-#endif
-
 static int __init mpc8xxx_wdt_init(void)
 {
 	return platform_driver_register(&mpc8xxx_wdt_driver);
-- 
2.4.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 3/7] watchdog: mpc8xxx: make use of of_device_get_match_data
  2015-08-12  8:15 [PATCH v2 0/7] watchdog: mpc8xxx: several cleanups Uwe Kleine-König
  2015-08-12  8:15 ` [PATCH v2 1/7] watchdog: mpc8xxx: remove dead code Uwe Kleine-König
  2015-08-12  8:15 ` [PATCH v2 2/7] watchdog: mpc8xxx: simplify registration Uwe Kleine-König
@ 2015-08-12  8:15 ` Uwe Kleine-König
  2015-08-12 10:16   ` Guenter Roeck
  2015-08-12  8:15 ` [PATCH v2 4/7] watchdog: mpc8xxx: use devm_ioremap_resource to map memory Uwe Kleine-König
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 13+ messages in thread
From: Uwe Kleine-König @ 2015-08-12  8:15 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: Guenter Roeck, kernel, linux-watchdog

This function is new in v4.2-rc1 and makes a forward declaration of the
match table superfluous which can so be removed.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/watchdog/mpc8xxx_wdt.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
index e0acda3282d9..fb1fe967cf57 100644
--- a/drivers/watchdog/mpc8xxx_wdt.c
+++ b/drivers/watchdog/mpc8xxx_wdt.c
@@ -139,7 +139,6 @@ static struct watchdog_device mpc8xxx_wdt_dev = {
 	.ops = &mpc8xxx_wdt_ops,
 };
 
-static const struct of_device_id mpc8xxx_wdt_match[];
 static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 {
 	int ret;
@@ -150,10 +149,9 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	bool enabled;
 	unsigned int timeout_sec;
 
-	match = of_match_device(mpc8xxx_wdt_match, &ofdev->dev);
-	if (!match)
+	wdt_type = of_device_get_match_data(&ofdev->dev);
+	if (!wdt_type)
 		return -EINVAL;
-	wdt_type = match->data;
 
 	if (!freq || freq == -1)
 		return -EINVAL;
-- 
2.4.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 4/7] watchdog: mpc8xxx: use devm_ioremap_resource to map memory
  2015-08-12  8:15 [PATCH v2 0/7] watchdog: mpc8xxx: several cleanups Uwe Kleine-König
                   ` (2 preceding siblings ...)
  2015-08-12  8:15 ` [PATCH v2 3/7] watchdog: mpc8xxx: make use of of_device_get_match_data Uwe Kleine-König
@ 2015-08-12  8:15 ` Uwe Kleine-König
  2015-08-12 10:18   ` Guenter Roeck
  2015-08-12  8:15 ` [PATCH v2 5/7] watchdog: mpc8xxx: use dynamic memory for device specific data Uwe Kleine-König
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 13+ messages in thread
From: Uwe Kleine-König @ 2015-08-12  8:15 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: Guenter Roeck, kernel, linux-watchdog

This simplifies the error paths and device unbinding.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/watchdog/mpc8xxx_wdt.c | 19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
index fb1fe967cf57..a6790fcfa69b 100644
--- a/drivers/watchdog/mpc8xxx_wdt.c
+++ b/drivers/watchdog/mpc8xxx_wdt.c
@@ -142,8 +142,7 @@ static struct watchdog_device mpc8xxx_wdt_dev = {
 static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 {
 	int ret;
-	const struct of_device_id *match;
-	struct device_node *np = ofdev->dev.of_node;
+	struct resource *res;
 	const struct mpc8xxx_wdt_type *wdt_type;
 	u32 freq = fsl_get_sys_freq();
 	bool enabled;
@@ -156,15 +155,15 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	if (!freq || freq == -1)
 		return -EINVAL;
 
-	wd_base = of_iomap(np, 0);
-	if (!wd_base)
-		return -ENOMEM;
+	res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
+	wd_base = devm_ioremap_resource(&ofdev->dev, res);
+	if (IS_ERR(wd_base))
+		return PTR_ERR(wd_base);
 
 	enabled = in_be32(&wd_base->swcrr) & SWCRR_SWEN;
 	if (!enabled && wdt_type->hw_enabled) {
 		pr_info("could not be enabled in software\n");
-		ret = -ENOSYS;
-		goto err_unmap;
+		return -ENOSYS;
 	}
 
 	/* Calculate the timeout in seconds */
@@ -177,7 +176,7 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	ret = watchdog_register_device(&mpc8xxx_wdt_dev);
 	if (ret) {
 		pr_err("cannot register watchdog device (err=%d)\n", ret);
-		goto err_unmap;
+		return ret;
 	}
 
 	pr_info("WDT driver for MPC8xxx initialized. mode:%s timeout=%d (%d seconds)\n",
@@ -191,9 +190,6 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	if (enabled)
 		mod_timer(&wdt_timer, jiffies);
 	return 0;
-err_unmap:
-	iounmap(wd_base);
-	return ret;
 }
 
 static int mpc8xxx_wdt_remove(struct platform_device *ofdev)
@@ -202,7 +198,6 @@ static int mpc8xxx_wdt_remove(struct platform_device *ofdev)
 		reset ? "reset" : "machine check exception");
 	del_timer_sync(&wdt_timer);
 	watchdog_unregister_device(&mpc8xxx_wdt_dev);
-	iounmap(wd_base);
 
 	return 0;
 }
-- 
2.4.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 5/7] watchdog: mpc8xxx: use dynamic memory for device specific data
  2015-08-12  8:15 [PATCH v2 0/7] watchdog: mpc8xxx: several cleanups Uwe Kleine-König
                   ` (3 preceding siblings ...)
  2015-08-12  8:15 ` [PATCH v2 4/7] watchdog: mpc8xxx: use devm_ioremap_resource to map memory Uwe Kleine-König
@ 2015-08-12  8:15 ` Uwe Kleine-König
  2015-08-12 10:21   ` Guenter Roeck
  2015-08-12  8:15 ` [PATCH v2 6/7] watchdog: mpc8xxx: use better error code when watchdog cannot be enabled Uwe Kleine-König
  2015-08-12  8:15 ` [PATCH v2 7/7] watchdog: mpc8xxx: allow to compile for MPC512x Uwe Kleine-König
  6 siblings, 1 reply; 13+ messages in thread
From: Uwe Kleine-König @ 2015-08-12  8:15 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: Guenter Roeck, kernel, linux-watchdog

Instead of relying on global static memory dynamically allocate the
needed data. This has the benefit of some saved bytes if the driver is
not in use and making it possible to bind more than one device (even
though this has no known use case).

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/watchdog/mpc8xxx_wdt.c | 88 +++++++++++++++++++++++++-----------------
 1 file changed, 53 insertions(+), 35 deletions(-)

diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
index a6790fcfa69b..0b69797d3417 100644
--- a/drivers/watchdog/mpc8xxx_wdt.c
+++ b/drivers/watchdog/mpc8xxx_wdt.c
@@ -50,7 +50,12 @@ struct mpc8xxx_wdt_type {
 	bool hw_enabled;
 };
 
-static struct mpc8xxx_wdt __iomem *wd_base;
+struct mpc8xxx_wdt_ddata {
+	struct mpc8xxx_wdt __iomem *base;
+	struct watchdog_device wdd;
+	struct timer_list timer;
+	spinlock_t lock;
+};
 
 static u16 timeout = 0xffff;
 module_param(timeout, ushort, 0);
@@ -67,33 +72,29 @@ module_param(nowayout, bool, 0);
 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started "
 		 "(default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
-static DEFINE_SPINLOCK(wdt_spinlock);
-
-static void mpc8xxx_wdt_keepalive(void)
+static void mpc8xxx_wdt_keepalive(struct mpc8xxx_wdt_ddata *ddata)
 {
 	/* Ping the WDT */
-	spin_lock(&wdt_spinlock);
-	out_be16(&wd_base->swsrr, 0x556c);
-	out_be16(&wd_base->swsrr, 0xaa39);
-	spin_unlock(&wdt_spinlock);
+	spin_lock(&ddata->lock);
+	out_be16(&ddata->base->swsrr, 0x556c);
+	out_be16(&ddata->base->swsrr, 0xaa39);
+	spin_unlock(&ddata->lock);
 }
 
-static struct watchdog_device mpc8xxx_wdt_dev;
-static void mpc8xxx_wdt_timer_ping(unsigned long arg);
-static DEFINE_TIMER(wdt_timer, mpc8xxx_wdt_timer_ping, 0,
-		(unsigned long)&mpc8xxx_wdt_dev);
-
 static void mpc8xxx_wdt_timer_ping(unsigned long arg)
 {
-	struct watchdog_device *w = (struct watchdog_device *)arg;
+	struct mpc8xxx_wdt_ddata *ddata = (void *)arg;
 
-	mpc8xxx_wdt_keepalive();
+	mpc8xxx_wdt_keepalive(ddata);
 	/* We're pinging it twice faster than needed, just to be sure. */
-	mod_timer(&wdt_timer, jiffies + HZ * w->timeout / 2);
+	mod_timer(&ddata->timer, jiffies + HZ * ddata->wdd.timeout / 2);
 }
 
 static int mpc8xxx_wdt_start(struct watchdog_device *w)
 {
+	struct mpc8xxx_wdt_ddata *ddata =
+		container_of(w, struct mpc8xxx_wdt_ddata, wdd);
+
 	u32 tmp = SWCRR_SWEN | SWCRR_SWPR;
 
 	/* Good, fire up the show */
@@ -102,22 +103,28 @@ static int mpc8xxx_wdt_start(struct watchdog_device *w)
 
 	tmp |= timeout << 16;
 
-	out_be32(&wd_base->swcrr, tmp);
+	out_be32(&ddata->base->swcrr, tmp);
 
-	del_timer_sync(&wdt_timer);
+	del_timer_sync(&ddata->timer);
 
 	return 0;
 }
 
 static int mpc8xxx_wdt_ping(struct watchdog_device *w)
 {
-	mpc8xxx_wdt_keepalive();
+	struct mpc8xxx_wdt_ddata *ddata =
+		container_of(w, struct mpc8xxx_wdt_ddata, wdd);
+
+	mpc8xxx_wdt_keepalive(ddata);
 	return 0;
 }
 
 static int mpc8xxx_wdt_stop(struct watchdog_device *w)
 {
-	mod_timer(&wdt_timer, jiffies);
+	struct mpc8xxx_wdt_ddata *ddata =
+		container_of(w, struct mpc8xxx_wdt_ddata, wdd);
+
+	mod_timer(&ddata->timer, jiffies);
 	return 0;
 }
 
@@ -134,16 +141,12 @@ static struct watchdog_ops mpc8xxx_wdt_ops = {
 	.stop = mpc8xxx_wdt_stop,
 };
 
-static struct watchdog_device mpc8xxx_wdt_dev = {
-	.info = &mpc8xxx_wdt_info,
-	.ops = &mpc8xxx_wdt_ops,
-};
-
 static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 {
 	int ret;
 	struct resource *res;
 	const struct mpc8xxx_wdt_type *wdt_type;
+	struct mpc8xxx_wdt_ddata *ddata;
 	u32 freq = fsl_get_sys_freq();
 	bool enabled;
 	unsigned int timeout_sec;
@@ -155,25 +158,36 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	if (!freq || freq == -1)
 		return -EINVAL;
 
+	ddata = devm_kzalloc(&ofdev->dev, sizeof(*ddata), GFP_KERNEL);
+	if (!ddata)
+		return -ENOMEM;
+
 	res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
-	wd_base = devm_ioremap_resource(&ofdev->dev, res);
-	if (IS_ERR(wd_base))
-		return PTR_ERR(wd_base);
+	ddata->base = devm_ioremap_resource(&ofdev->dev, res);
+	if (IS_ERR(ddata->base))
+		return PTR_ERR(ddata->base);
 
-	enabled = in_be32(&wd_base->swcrr) & SWCRR_SWEN;
+	enabled = in_be32(&ddata->base->swcrr) & SWCRR_SWEN;
 	if (!enabled && wdt_type->hw_enabled) {
 		pr_info("could not be enabled in software\n");
 		return -ENOSYS;
 	}
 
+	spin_lock_init(&ddata->lock);
+	setup_timer(&ddata->timer, mpc8xxx_wdt_timer_ping,
+		    (unsigned long)ddata);
+
+	ddata->wdd.info = &mpc8xxx_wdt_info,
+	ddata->wdd.ops = &mpc8xxx_wdt_ops,
+
 	/* Calculate the timeout in seconds */
 	timeout_sec = (timeout * wdt_type->prescaler) / freq;
 
-	mpc8xxx_wdt_dev.timeout = timeout_sec;
+	ddata->wdd.timeout = timeout_sec;
 
-	watchdog_set_nowayout(&mpc8xxx_wdt_dev, nowayout);
+	watchdog_set_nowayout(&ddata->wdd, nowayout);
 
-	ret = watchdog_register_device(&mpc8xxx_wdt_dev);
+	ret = watchdog_register_device(&ddata->wdd);
 	if (ret) {
 		pr_err("cannot register watchdog device (err=%d)\n", ret);
 		return ret;
@@ -188,16 +202,20 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	 * userspace handles it.
 	 */
 	if (enabled)
-		mod_timer(&wdt_timer, jiffies);
+		mod_timer(&ddata->timer, jiffies);
+
+	platform_set_drvdata(ofdev, ddata);
 	return 0;
 }
 
 static int mpc8xxx_wdt_remove(struct platform_device *ofdev)
 {
+	struct mpc8xxx_wdt_ddata *ddata = platform_get_drvdata(ofdev);
+
 	pr_crit("Watchdog removed, expect the %s soon!\n",
 		reset ? "reset" : "machine check exception");
-	del_timer_sync(&wdt_timer);
-	watchdog_unregister_device(&mpc8xxx_wdt_dev);
+	del_timer_sync(&ddata->timer);
+	watchdog_unregister_device(&ddata->wdd);
 
 	return 0;
 }
-- 
2.4.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 6/7] watchdog: mpc8xxx: use better error code when watchdog cannot be enabled
  2015-08-12  8:15 [PATCH v2 0/7] watchdog: mpc8xxx: several cleanups Uwe Kleine-König
                   ` (4 preceding siblings ...)
  2015-08-12  8:15 ` [PATCH v2 5/7] watchdog: mpc8xxx: use dynamic memory for device specific data Uwe Kleine-König
@ 2015-08-12  8:15 ` Uwe Kleine-König
  2015-08-12 10:21   ` Guenter Roeck
  2015-08-12  8:15 ` [PATCH v2 7/7] watchdog: mpc8xxx: allow to compile for MPC512x Uwe Kleine-König
  6 siblings, 1 reply; 13+ messages in thread
From: Uwe Kleine-König @ 2015-08-12  8:15 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: Guenter Roeck, kernel, linux-watchdog

checkpatch warns about ENOSYS, telling "ENOSYS means 'invalid syscall
nr' and nothing else". So use ENODEV instead.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/watchdog/mpc8xxx_wdt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
index 0b69797d3417..5f2273aac37d 100644
--- a/drivers/watchdog/mpc8xxx_wdt.c
+++ b/drivers/watchdog/mpc8xxx_wdt.c
@@ -170,7 +170,7 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
 	enabled = in_be32(&ddata->base->swcrr) & SWCRR_SWEN;
 	if (!enabled && wdt_type->hw_enabled) {
 		pr_info("could not be enabled in software\n");
-		return -ENOSYS;
+		return -ENODEV;
 	}
 
 	spin_lock_init(&ddata->lock);
-- 
2.4.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 7/7] watchdog: mpc8xxx: allow to compile for MPC512x
  2015-08-12  8:15 [PATCH v2 0/7] watchdog: mpc8xxx: several cleanups Uwe Kleine-König
                   ` (5 preceding siblings ...)
  2015-08-12  8:15 ` [PATCH v2 6/7] watchdog: mpc8xxx: use better error code when watchdog cannot be enabled Uwe Kleine-König
@ 2015-08-12  8:15 ` Uwe Kleine-König
  2015-08-12 10:22   ` Guenter Roeck
  6 siblings, 1 reply; 13+ messages in thread
From: Uwe Kleine-König @ 2015-08-12  8:15 UTC (permalink / raw)
  To: Wim Van Sebroeck; +Cc: Guenter Roeck, kernel, linux-watchdog

The MPC5125 processor features a watchdog device that is identical to
the MPC8610 one. So allow to enable the driver for MPC512x kernel
configurations.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 drivers/watchdog/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 241fafde42cb..8c43ae9bde2b 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -1333,7 +1333,7 @@ config MPC5200_WDT
 
 config 8xxx_WDT
 	tristate "MPC8xxx Platform Watchdog Timer"
-	depends on PPC_8xx || PPC_83xx || PPC_86xx
+	depends on PPC_8xx || PPC_83xx || PPC_86xx || PPC_MPC512x
 	select WATCHDOG_CORE
 	help
 	  This driver is for a SoC level watchdog that exists on some
-- 
2.4.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 3/7] watchdog: mpc8xxx: make use of of_device_get_match_data
  2015-08-12  8:15 ` [PATCH v2 3/7] watchdog: mpc8xxx: make use of of_device_get_match_data Uwe Kleine-König
@ 2015-08-12 10:16   ` Guenter Roeck
  0 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2015-08-12 10:16 UTC (permalink / raw)
  To: Uwe Kleine-König, Wim Van Sebroeck; +Cc: kernel, linux-watchdog

On 08/12/2015 01:15 AM, Uwe Kleine-König wrote:
> This function is new in v4.2-rc1 and makes a forward declaration of the
> match table superfluous which can so be removed.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

> ---
>   drivers/watchdog/mpc8xxx_wdt.c | 6 ++----
>   1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
> index e0acda3282d9..fb1fe967cf57 100644
> --- a/drivers/watchdog/mpc8xxx_wdt.c
> +++ b/drivers/watchdog/mpc8xxx_wdt.c
> @@ -139,7 +139,6 @@ static struct watchdog_device mpc8xxx_wdt_dev = {
>   	.ops = &mpc8xxx_wdt_ops,
>   };
>
> -static const struct of_device_id mpc8xxx_wdt_match[];
>   static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   {
>   	int ret;
> @@ -150,10 +149,9 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   	bool enabled;
>   	unsigned int timeout_sec;
>
> -	match = of_match_device(mpc8xxx_wdt_match, &ofdev->dev);
> -	if (!match)
> +	wdt_type = of_device_get_match_data(&ofdev->dev);
> +	if (!wdt_type)
>   		return -EINVAL;
> -	wdt_type = match->data;
>
>   	if (!freq || freq == -1)
>   		return -EINVAL;
>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 4/7] watchdog: mpc8xxx: use devm_ioremap_resource to map memory
  2015-08-12  8:15 ` [PATCH v2 4/7] watchdog: mpc8xxx: use devm_ioremap_resource to map memory Uwe Kleine-König
@ 2015-08-12 10:18   ` Guenter Roeck
  0 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2015-08-12 10:18 UTC (permalink / raw)
  To: Uwe Kleine-König, Wim Van Sebroeck; +Cc: kernel, linux-watchdog

On 08/12/2015 01:15 AM, Uwe Kleine-König wrote:
> This simplifies the error paths and device unbinding.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

> ---
>   drivers/watchdog/mpc8xxx_wdt.c | 19 +++++++------------
>   1 file changed, 7 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
> index fb1fe967cf57..a6790fcfa69b 100644
> --- a/drivers/watchdog/mpc8xxx_wdt.c
> +++ b/drivers/watchdog/mpc8xxx_wdt.c
> @@ -142,8 +142,7 @@ static struct watchdog_device mpc8xxx_wdt_dev = {
>   static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   {
>   	int ret;
> -	const struct of_device_id *match;
> -	struct device_node *np = ofdev->dev.of_node;
> +	struct resource *res;
>   	const struct mpc8xxx_wdt_type *wdt_type;
>   	u32 freq = fsl_get_sys_freq();
>   	bool enabled;
> @@ -156,15 +155,15 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   	if (!freq || freq == -1)
>   		return -EINVAL;
>
> -	wd_base = of_iomap(np, 0);
> -	if (!wd_base)
> -		return -ENOMEM;
> +	res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
> +	wd_base = devm_ioremap_resource(&ofdev->dev, res);
> +	if (IS_ERR(wd_base))
> +		return PTR_ERR(wd_base);
>
>   	enabled = in_be32(&wd_base->swcrr) & SWCRR_SWEN;
>   	if (!enabled && wdt_type->hw_enabled) {
>   		pr_info("could not be enabled in software\n");
> -		ret = -ENOSYS;
> -		goto err_unmap;
> +		return -ENOSYS;
>   	}
>
>   	/* Calculate the timeout in seconds */
> @@ -177,7 +176,7 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   	ret = watchdog_register_device(&mpc8xxx_wdt_dev);
>   	if (ret) {
>   		pr_err("cannot register watchdog device (err=%d)\n", ret);
> -		goto err_unmap;
> +		return ret;
>   	}
>
>   	pr_info("WDT driver for MPC8xxx initialized. mode:%s timeout=%d (%d seconds)\n",
> @@ -191,9 +190,6 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   	if (enabled)
>   		mod_timer(&wdt_timer, jiffies);
>   	return 0;
> -err_unmap:
> -	iounmap(wd_base);
> -	return ret;
>   }
>
>   static int mpc8xxx_wdt_remove(struct platform_device *ofdev)
> @@ -202,7 +198,6 @@ static int mpc8xxx_wdt_remove(struct platform_device *ofdev)
>   		reset ? "reset" : "machine check exception");
>   	del_timer_sync(&wdt_timer);
>   	watchdog_unregister_device(&mpc8xxx_wdt_dev);
> -	iounmap(wd_base);
>
>   	return 0;
>   }
>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 5/7] watchdog: mpc8xxx: use dynamic memory for device specific data
  2015-08-12  8:15 ` [PATCH v2 5/7] watchdog: mpc8xxx: use dynamic memory for device specific data Uwe Kleine-König
@ 2015-08-12 10:21   ` Guenter Roeck
  0 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2015-08-12 10:21 UTC (permalink / raw)
  To: Uwe Kleine-König, Wim Van Sebroeck; +Cc: kernel, linux-watchdog

On 08/12/2015 01:15 AM, Uwe Kleine-König wrote:
> Instead of relying on global static memory dynamically allocate the
> needed data. This has the benefit of some saved bytes if the driver is
> not in use and making it possible to bind more than one device (even
> though this has no known use case).
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

> ---
>   drivers/watchdog/mpc8xxx_wdt.c | 88 +++++++++++++++++++++++++-----------------
>   1 file changed, 53 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
> index a6790fcfa69b..0b69797d3417 100644
> --- a/drivers/watchdog/mpc8xxx_wdt.c
> +++ b/drivers/watchdog/mpc8xxx_wdt.c
> @@ -50,7 +50,12 @@ struct mpc8xxx_wdt_type {
>   	bool hw_enabled;
>   };
>
> -static struct mpc8xxx_wdt __iomem *wd_base;
> +struct mpc8xxx_wdt_ddata {
> +	struct mpc8xxx_wdt __iomem *base;
> +	struct watchdog_device wdd;
> +	struct timer_list timer;
> +	spinlock_t lock;
> +};
>
>   static u16 timeout = 0xffff;
>   module_param(timeout, ushort, 0);
> @@ -67,33 +72,29 @@ module_param(nowayout, bool, 0);
>   MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started "
>   		 "(default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
>
> -static DEFINE_SPINLOCK(wdt_spinlock);
> -
> -static void mpc8xxx_wdt_keepalive(void)
> +static void mpc8xxx_wdt_keepalive(struct mpc8xxx_wdt_ddata *ddata)
>   {
>   	/* Ping the WDT */
> -	spin_lock(&wdt_spinlock);
> -	out_be16(&wd_base->swsrr, 0x556c);
> -	out_be16(&wd_base->swsrr, 0xaa39);
> -	spin_unlock(&wdt_spinlock);
> +	spin_lock(&ddata->lock);
> +	out_be16(&ddata->base->swsrr, 0x556c);
> +	out_be16(&ddata->base->swsrr, 0xaa39);
> +	spin_unlock(&ddata->lock);
>   }
>
> -static struct watchdog_device mpc8xxx_wdt_dev;
> -static void mpc8xxx_wdt_timer_ping(unsigned long arg);
> -static DEFINE_TIMER(wdt_timer, mpc8xxx_wdt_timer_ping, 0,
> -		(unsigned long)&mpc8xxx_wdt_dev);
> -
>   static void mpc8xxx_wdt_timer_ping(unsigned long arg)
>   {
> -	struct watchdog_device *w = (struct watchdog_device *)arg;
> +	struct mpc8xxx_wdt_ddata *ddata = (void *)arg;
>
> -	mpc8xxx_wdt_keepalive();
> +	mpc8xxx_wdt_keepalive(ddata);
>   	/* We're pinging it twice faster than needed, just to be sure. */
> -	mod_timer(&wdt_timer, jiffies + HZ * w->timeout / 2);
> +	mod_timer(&ddata->timer, jiffies + HZ * ddata->wdd.timeout / 2);
>   }
>
>   static int mpc8xxx_wdt_start(struct watchdog_device *w)
>   {
> +	struct mpc8xxx_wdt_ddata *ddata =
> +		container_of(w, struct mpc8xxx_wdt_ddata, wdd);
> +
>   	u32 tmp = SWCRR_SWEN | SWCRR_SWPR;
>
>   	/* Good, fire up the show */
> @@ -102,22 +103,28 @@ static int mpc8xxx_wdt_start(struct watchdog_device *w)
>
>   	tmp |= timeout << 16;
>
> -	out_be32(&wd_base->swcrr, tmp);
> +	out_be32(&ddata->base->swcrr, tmp);
>
> -	del_timer_sync(&wdt_timer);
> +	del_timer_sync(&ddata->timer);
>
>   	return 0;
>   }
>
>   static int mpc8xxx_wdt_ping(struct watchdog_device *w)
>   {
> -	mpc8xxx_wdt_keepalive();
> +	struct mpc8xxx_wdt_ddata *ddata =
> +		container_of(w, struct mpc8xxx_wdt_ddata, wdd);
> +
> +	mpc8xxx_wdt_keepalive(ddata);
>   	return 0;
>   }
>
>   static int mpc8xxx_wdt_stop(struct watchdog_device *w)
>   {
> -	mod_timer(&wdt_timer, jiffies);
> +	struct mpc8xxx_wdt_ddata *ddata =
> +		container_of(w, struct mpc8xxx_wdt_ddata, wdd);
> +
> +	mod_timer(&ddata->timer, jiffies);
>   	return 0;
>   }
>
> @@ -134,16 +141,12 @@ static struct watchdog_ops mpc8xxx_wdt_ops = {
>   	.stop = mpc8xxx_wdt_stop,
>   };
>
> -static struct watchdog_device mpc8xxx_wdt_dev = {
> -	.info = &mpc8xxx_wdt_info,
> -	.ops = &mpc8xxx_wdt_ops,
> -};
> -
>   static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   {
>   	int ret;
>   	struct resource *res;
>   	const struct mpc8xxx_wdt_type *wdt_type;
> +	struct mpc8xxx_wdt_ddata *ddata;
>   	u32 freq = fsl_get_sys_freq();
>   	bool enabled;
>   	unsigned int timeout_sec;
> @@ -155,25 +158,36 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   	if (!freq || freq == -1)
>   		return -EINVAL;
>
> +	ddata = devm_kzalloc(&ofdev->dev, sizeof(*ddata), GFP_KERNEL);
> +	if (!ddata)
> +		return -ENOMEM;
> +
>   	res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
> -	wd_base = devm_ioremap_resource(&ofdev->dev, res);
> -	if (IS_ERR(wd_base))
> -		return PTR_ERR(wd_base);
> +	ddata->base = devm_ioremap_resource(&ofdev->dev, res);
> +	if (IS_ERR(ddata->base))
> +		return PTR_ERR(ddata->base);
>
> -	enabled = in_be32(&wd_base->swcrr) & SWCRR_SWEN;
> +	enabled = in_be32(&ddata->base->swcrr) & SWCRR_SWEN;
>   	if (!enabled && wdt_type->hw_enabled) {
>   		pr_info("could not be enabled in software\n");
>   		return -ENOSYS;
>   	}
>
> +	spin_lock_init(&ddata->lock);
> +	setup_timer(&ddata->timer, mpc8xxx_wdt_timer_ping,
> +		    (unsigned long)ddata);
> +
> +	ddata->wdd.info = &mpc8xxx_wdt_info,
> +	ddata->wdd.ops = &mpc8xxx_wdt_ops,
> +
>   	/* Calculate the timeout in seconds */
>   	timeout_sec = (timeout * wdt_type->prescaler) / freq;
>
> -	mpc8xxx_wdt_dev.timeout = timeout_sec;
> +	ddata->wdd.timeout = timeout_sec;
>
> -	watchdog_set_nowayout(&mpc8xxx_wdt_dev, nowayout);
> +	watchdog_set_nowayout(&ddata->wdd, nowayout);
>
> -	ret = watchdog_register_device(&mpc8xxx_wdt_dev);
> +	ret = watchdog_register_device(&ddata->wdd);
>   	if (ret) {
>   		pr_err("cannot register watchdog device (err=%d)\n", ret);
>   		return ret;
> @@ -188,16 +202,20 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   	 * userspace handles it.
>   	 */
>   	if (enabled)
> -		mod_timer(&wdt_timer, jiffies);
> +		mod_timer(&ddata->timer, jiffies);
> +
> +	platform_set_drvdata(ofdev, ddata);
>   	return 0;
>   }
>
>   static int mpc8xxx_wdt_remove(struct platform_device *ofdev)
>   {
> +	struct mpc8xxx_wdt_ddata *ddata = platform_get_drvdata(ofdev);
> +
>   	pr_crit("Watchdog removed, expect the %s soon!\n",
>   		reset ? "reset" : "machine check exception");
> -	del_timer_sync(&wdt_timer);
> -	watchdog_unregister_device(&mpc8xxx_wdt_dev);
> +	del_timer_sync(&ddata->timer);
> +	watchdog_unregister_device(&ddata->wdd);
>
>   	return 0;
>   }
>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 6/7] watchdog: mpc8xxx: use better error code when watchdog cannot be enabled
  2015-08-12  8:15 ` [PATCH v2 6/7] watchdog: mpc8xxx: use better error code when watchdog cannot be enabled Uwe Kleine-König
@ 2015-08-12 10:21   ` Guenter Roeck
  0 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2015-08-12 10:21 UTC (permalink / raw)
  To: Uwe Kleine-König, Wim Van Sebroeck; +Cc: kernel, linux-watchdog

On 08/12/2015 01:15 AM, Uwe Kleine-König wrote:
> checkpatch warns about ENOSYS, telling "ENOSYS means 'invalid syscall
> nr' and nothing else". So use ENODEV instead.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

> ---
>   drivers/watchdog/mpc8xxx_wdt.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/watchdog/mpc8xxx_wdt.c b/drivers/watchdog/mpc8xxx_wdt.c
> index 0b69797d3417..5f2273aac37d 100644
> --- a/drivers/watchdog/mpc8xxx_wdt.c
> +++ b/drivers/watchdog/mpc8xxx_wdt.c
> @@ -170,7 +170,7 @@ static int mpc8xxx_wdt_probe(struct platform_device *ofdev)
>   	enabled = in_be32(&ddata->base->swcrr) & SWCRR_SWEN;
>   	if (!enabled && wdt_type->hw_enabled) {
>   		pr_info("could not be enabled in software\n");
> -		return -ENOSYS;
> +		return -ENODEV;
>   	}
>
>   	spin_lock_init(&ddata->lock);
>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 7/7] watchdog: mpc8xxx: allow to compile for MPC512x
  2015-08-12  8:15 ` [PATCH v2 7/7] watchdog: mpc8xxx: allow to compile for MPC512x Uwe Kleine-König
@ 2015-08-12 10:22   ` Guenter Roeck
  0 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2015-08-12 10:22 UTC (permalink / raw)
  To: Uwe Kleine-König, Wim Van Sebroeck; +Cc: kernel, linux-watchdog

On 08/12/2015 01:15 AM, Uwe Kleine-König wrote:
> The MPC5125 processor features a watchdog device that is identical to
> the MPC8610 one. So allow to enable the driver for MPC512x kernel
> configurations.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

> ---
>   drivers/watchdog/Kconfig | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index 241fafde42cb..8c43ae9bde2b 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -1333,7 +1333,7 @@ config MPC5200_WDT
>
>   config 8xxx_WDT
>   	tristate "MPC8xxx Platform Watchdog Timer"
> -	depends on PPC_8xx || PPC_83xx || PPC_86xx
> +	depends on PPC_8xx || PPC_83xx || PPC_86xx || PPC_MPC512x
>   	select WATCHDOG_CORE
>   	help
>   	  This driver is for a SoC level watchdog that exists on some
>


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2015-08-12 10:22 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-12  8:15 [PATCH v2 0/7] watchdog: mpc8xxx: several cleanups Uwe Kleine-König
2015-08-12  8:15 ` [PATCH v2 1/7] watchdog: mpc8xxx: remove dead code Uwe Kleine-König
2015-08-12  8:15 ` [PATCH v2 2/7] watchdog: mpc8xxx: simplify registration Uwe Kleine-König
2015-08-12  8:15 ` [PATCH v2 3/7] watchdog: mpc8xxx: make use of of_device_get_match_data Uwe Kleine-König
2015-08-12 10:16   ` Guenter Roeck
2015-08-12  8:15 ` [PATCH v2 4/7] watchdog: mpc8xxx: use devm_ioremap_resource to map memory Uwe Kleine-König
2015-08-12 10:18   ` Guenter Roeck
2015-08-12  8:15 ` [PATCH v2 5/7] watchdog: mpc8xxx: use dynamic memory for device specific data Uwe Kleine-König
2015-08-12 10:21   ` Guenter Roeck
2015-08-12  8:15 ` [PATCH v2 6/7] watchdog: mpc8xxx: use better error code when watchdog cannot be enabled Uwe Kleine-König
2015-08-12 10:21   ` Guenter Roeck
2015-08-12  8:15 ` [PATCH v2 7/7] watchdog: mpc8xxx: allow to compile for MPC512x Uwe Kleine-König
2015-08-12 10:22   ` Guenter Roeck

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox