All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] watchdog: bcm281xx: Debugfs support
@ 2013-12-31 21:22 Markus Mayer
  2013-12-31 21:22 ` [PATCH 1/2] " Markus Mayer
  2013-12-31 21:22 ` [PATCH 2/2] watchdog: bcm281xx: Turn on debugfs support for watchdog driver Markus Mayer
  0 siblings, 2 replies; 4+ messages in thread
From: Markus Mayer @ 2013-12-31 21:22 UTC (permalink / raw)
  To: Wim Van Sebroeck, Guenter Roeck, Christian Daudt
  Cc: Linaro Patches, Linux Watchdog List, Linux Kernel Mailing List,
	Markus Mayer

This series adds debugfs support to the bcm281xx watchdog driver. Most
of the code submitted here was already included as part of v5 of the
original driver submission. See
http://www.spinics.net/lists/linux-watchdog/msg03328.html

However, the debugfs code has since been broken out of the original
driver submission and the following changes have been made over what
was submitted earlier:

- The global variable busy_count is now, instead, part of struct
  bcm_kona_wdt.
- As a result secure_register_read() now needs to take a struct
  bcm_kona_wdt * and a register offset as its arguments.
- debugfs setup and teardown is now performed by
  bcm_kona_wdt_debug_init() and bcm_kona_wdt_debug_exit() rather than
  by using #ifdefs in bcm_kona_wdt_probe() and
  bcm_kona_wdt_debug_exit().

This series is dependent on commit
bd90ccd42c5d6317979c62919ba1c79fd34fa785 in linux-watchdog-next.

Markus Mayer (2):
  watchdog: bcm281xx: Debugfs support
  watchdog: bcm281xx: Turn on debugfs support for watchdog driver

 arch/arm/configs/bcm_defconfig  |    1 +
 drivers/watchdog/Kconfig        |   10 ++++
 drivers/watchdog/bcm_kona_wdt.c |  116 +++++++++++++++++++++++++++++++++++++--
 3 files changed, 123 insertions(+), 4 deletions(-)

-- 
1.7.9.5


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

* [PATCH 1/2] watchdog: bcm281xx: Debugfs support
  2013-12-31 21:22 [PATCH 0/2] watchdog: bcm281xx: Debugfs support Markus Mayer
@ 2013-12-31 21:22 ` Markus Mayer
  2014-01-04 17:42   ` Guenter Roeck
  2013-12-31 21:22 ` [PATCH 2/2] watchdog: bcm281xx: Turn on debugfs support for watchdog driver Markus Mayer
  1 sibling, 1 reply; 4+ messages in thread
From: Markus Mayer @ 2013-12-31 21:22 UTC (permalink / raw)
  To: Wim Van Sebroeck, Guenter Roeck, Christian Daudt
  Cc: Linaro Patches, Linux Watchdog List, Linux Kernel Mailing List,
	Markus Mayer

This change introduces debugfs support for the BCM281xx watchdog driver.

Signed-off-by: Markus Mayer <markus.mayer@linaro.org>
---
 drivers/watchdog/Kconfig        |   10 ++++
 drivers/watchdog/bcm_kona_wdt.c |  116 +++++++++++++++++++++++++++++++++++++--
 2 files changed, 122 insertions(+), 4 deletions(-)

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index 10d188a..9b8b96d 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -1152,6 +1152,16 @@ config BCM_KONA_WDT
 	  Say 'Y' or 'M' here to enable the driver. The module will be called
 	  bcm_kona_wdt.
 
+config BCM_KONA_WDT_DEBUG
+	bool "DEBUGFS support for BCM Kona Watchdog"
+	depends on BCM_KONA_WDT
+	help
+	  If enabled, adds /sys/kernel/debug/bcm-kona-wdt/info which provides
+	  access to the driver's internal data structures as well as watchdog
+	  timer hardware registres.
+
+	  If in doubt, say 'N'.
+
 config LANTIQ_WDT
 	tristate "Lantiq SoC watchdog"
 	depends on LANTIQ
diff --git a/drivers/watchdog/bcm_kona_wdt.c b/drivers/watchdog/bcm_kona_wdt.c
index 7e41a83..d3aa473 100644
--- a/drivers/watchdog/bcm_kona_wdt.c
+++ b/drivers/watchdog/bcm_kona_wdt.c
@@ -11,6 +11,7 @@
  * GNU General Public License for more details.
  */
 
+#include <linux/debugfs.h>
 #include <linux/delay.h>
 #include <linux/err.h>
 #include <linux/io.h>
@@ -55,9 +56,13 @@ struct bcm_kona_wdt {
 	 */
 	int resolution;
 	spinlock_t lock;
+#ifdef CONFIG_BCM_KONA_WDT_DEBUG
+	unsigned long busy_count;
+	struct dentry *debugfs;
+#endif
 };
 
-static int secure_register_read(void __iomem *addr)
+static int secure_register_read(struct bcm_kona_wdt *wdt, uint32_t offset)
 {
 	uint32_t val;
 	unsigned count = 0;
@@ -70,10 +75,16 @@ static int secure_register_read(void __iomem *addr)
 	do {
 		if (unlikely(count > 1))
 			udelay(5);
-		val = readl_relaxed(addr);
+		val = readl_relaxed(wdt->base + offset);
 		count++;
 	} while ((val & SECWDOG_WD_LOAD_FLAG) && count < SECWDOG_MAX_TRY);
 
+#ifdef CONFIG_BCM_KONA_WDT_DEBUG
+	/* Remember the maximum number iterations due to WD_LOAD_FLAG */
+	if (count > wdt->busy_count)
+		wdt->busy_count = count;
+#endif
+
 	/* This is the only place we return a negative value. */
 	if (val & SECWDOG_WD_LOAD_FLAG)
 		return -ETIMEDOUT;
@@ -84,6 +95,80 @@ static int secure_register_read(void __iomem *addr)
 	return val;
 }
 
+#ifdef CONFIG_BCM_KONA_WDT_DEBUG
+
+static int bcm_kona_wdt_dbg_show(struct seq_file *s, void *data)
+{
+	int ctl_val, cur_val, ret;
+	unsigned long flags;
+	struct bcm_kona_wdt *wdt = s->private;
+
+	if (!wdt)
+		return seq_puts(s, "No device pointer\n");
+
+	spin_lock_irqsave(&wdt->lock, flags);
+	ctl_val = secure_register_read(wdt, SECWDOG_CTRL_REG);
+	cur_val = secure_register_read(wdt, SECWDOG_COUNT_REG);
+	spin_unlock_irqrestore(&wdt->lock, flags);
+
+	if (ctl_val < 0 || cur_val < 0) {
+		ret = seq_puts(s, "Error accessing hardware\n");
+	} else {
+		int ctl, cur, ctl_sec, cur_sec, res;
+
+		ctl = ctl_val & SECWDOG_COUNT_MASK;
+		res = (ctl_val & SECWDOG_RES_MASK) >> SECWDOG_CLKS_SHIFT;
+		cur = cur_val & SECWDOG_COUNT_MASK;
+		ctl_sec = TICKS_TO_SECS(ctl, wdt);
+		cur_sec = TICKS_TO_SECS(cur, wdt);
+		ret = seq_printf(s, "Resolution: %d / %d\n"
+				"Control: %d s / %d (%#x) ticks\n"
+				"Current: %d s / %d (%#x) ticks\n"
+				"Busy count: %lu\n", res,
+				wdt->resolution, ctl_sec, ctl, ctl, cur_sec,
+				cur, cur, wdt->busy_count);
+	}
+
+	return ret;
+}
+
+static int bcm_kona_dbg_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, bcm_kona_wdt_dbg_show, inode->i_private);
+}
+
+static const struct file_operations bcm_kona_dbg_operations = {
+	.open		= bcm_kona_dbg_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
+
+static struct dentry *bcm_kona_wdt_debugfs_init(struct bcm_kona_wdt *wdt,
+	struct watchdog_device *wdd)
+{
+	struct dentry *dir;
+
+	dir = debugfs_create_dir(BCM_KONA_WDT_NAME, NULL);
+	if (IS_ERR_OR_NULL(dir))
+		return NULL;
+
+	if (debugfs_create_file("info", S_IFREG | S_IRUGO, dir, wdt,
+				&bcm_kona_dbg_operations))
+		return dir;
+
+	/* Clean up */
+	debugfs_remove_recursive(dir);
+	return NULL;
+}
+
+static void bcm_kona_debugfs_exit(struct dentry *dir)
+{
+	debugfs_remove_recursive(dir);
+}
+
+#endif /* CONFIG_BCM_KONA_WDT_DEBUG */
+
 static int bcm_kona_wdt_ctrl_reg_modify(struct bcm_kona_wdt *wdt,
 					unsigned mask, unsigned newval)
 {
@@ -93,7 +178,7 @@ static int bcm_kona_wdt_ctrl_reg_modify(struct bcm_kona_wdt *wdt,
 
 	spin_lock_irqsave(&wdt->lock, flags);
 
-	val = secure_register_read(wdt->base + SECWDOG_CTRL_REG);
+	val = secure_register_read(wdt, SECWDOG_CTRL_REG);
 	if (val < 0) {
 		ret = val;
 	} else {
@@ -140,7 +225,7 @@ static unsigned int bcm_kona_wdt_get_timeleft(struct watchdog_device *wdog)
 	unsigned long flags;
 
 	spin_lock_irqsave(&wdt->lock, flags);
-	val = secure_register_read(wdt->base + SECWDOG_COUNT_REG);
+	val = secure_register_read(wdt, SECWDOG_COUNT_REG);
 	spin_unlock_irqrestore(&wdt->lock, flags);
 
 	if (val < 0)
@@ -190,6 +275,27 @@ static void bcm_kona_wdt_shutdown(struct platform_device *pdev)
 	bcm_kona_wdt_stop(&bcm_kona_wdt_wdd);
 }
 
+#ifdef CONFIG_BCM_KONA_WDT_DEBUG
+static void bcm_kona_wdt_debug_init(struct platform_device *pdev)
+{
+	struct bcm_kona_wdt *wdt = platform_get_drvdata(pdev);
+
+	wdt->debugfs = bcm_kona_wdt_debugfs_init(wdt, &bcm_kona_wdt_wdd);
+}
+
+static void bcm_kona_wdt_debug_exit(struct platform_device *pdev)
+{
+	struct bcm_kona_wdt *wdt = platform_get_drvdata(pdev);
+
+	if (wdt->debugfs)
+		bcm_kona_debugfs_exit(wdt->debugfs);
+}
+
+#else
+static void bcm_kona_wdt_debug_init(struct platform_device *pdev) {}
+static void bcm_kona_wdt_debug_exit(struct platform_device *pdev) {}
+#endif
+
 static int bcm_kona_wdt_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -229,6 +335,7 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	bcm_kona_wdt_debug_init(pdev);
 	dev_dbg(dev, "Broadcom Kona Watchdog Timer");
 
 	return 0;
@@ -236,6 +343,7 @@ static int bcm_kona_wdt_probe(struct platform_device *pdev)
 
 static int bcm_kona_wdt_remove(struct platform_device *pdev)
 {
+	bcm_kona_wdt_debug_exit(pdev);
 	bcm_kona_wdt_shutdown(pdev);
 	watchdog_unregister_device(&bcm_kona_wdt_wdd);
 	dev_dbg(&pdev->dev, "Watchdog driver disabled");
-- 
1.7.9.5


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

* [PATCH 2/2] watchdog: bcm281xx: Turn on debugfs support for watchdog driver
  2013-12-31 21:22 [PATCH 0/2] watchdog: bcm281xx: Debugfs support Markus Mayer
  2013-12-31 21:22 ` [PATCH 1/2] " Markus Mayer
@ 2013-12-31 21:22 ` Markus Mayer
  1 sibling, 0 replies; 4+ messages in thread
From: Markus Mayer @ 2013-12-31 21:22 UTC (permalink / raw)
  To: Wim Van Sebroeck, Guenter Roeck, Christian Daudt
  Cc: Linaro Patches, Linux Watchdog List, Linux Kernel Mailing List,
	Markus Mayer

This change turns on debugfs support for the BCM281xx watchdog driver.

Signed-off-by: Markus Mayer <markus.mayer@linaro.org>
---
 arch/arm/configs/bcm_defconfig |    1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm/configs/bcm_defconfig b/arch/arm/configs/bcm_defconfig
index 10d1392..d4d0083 100644
--- a/arch/arm/configs/bcm_defconfig
+++ b/arch/arm/configs/bcm_defconfig
@@ -128,3 +128,4 @@ CONFIG_XZ_DEC=y
 CONFIG_AVERAGE=y
 CONFIG_WATCHDOG=y
 CONFIG_BCM_KONA_WDT=y
+CONFIG_BCM_KONA_WDT_DEBUG=y
-- 
1.7.9.5


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

* Re: [PATCH 1/2] watchdog: bcm281xx: Debugfs support
  2013-12-31 21:22 ` [PATCH 1/2] " Markus Mayer
@ 2014-01-04 17:42   ` Guenter Roeck
  0 siblings, 0 replies; 4+ messages in thread
From: Guenter Roeck @ 2014-01-04 17:42 UTC (permalink / raw)
  To: Markus Mayer, Wim Van Sebroeck, Christian Daudt
  Cc: Linaro Patches, Linux Watchdog List, Linux Kernel Mailing List

On 12/31/2013 01:22 PM, Markus Mayer wrote:
> This change introduces debugfs support for the BCM281xx watchdog driver.
>
> Signed-off-by: Markus Mayer <markus.mayer@linaro.org>
> ---
>   drivers/watchdog/Kconfig        |   10 ++++
>   drivers/watchdog/bcm_kona_wdt.c |  116 +++++++++++++++++++++++++++++++++++++--
>   2 files changed, 122 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index 10d188a..9b8b96d 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -1152,6 +1152,16 @@ config BCM_KONA_WDT
>   	  Say 'Y' or 'M' here to enable the driver. The module will be called
>   	  bcm_kona_wdt.
>
> +config BCM_KONA_WDT_DEBUG
> +	bool "DEBUGFS support for BCM Kona Watchdog"
> +	depends on BCM_KONA_WDT
> +	help
> +	  If enabled, adds /sys/kernel/debug/bcm-kona-wdt/info which provides
> +	  access to the driver's internal data structures as well as watchdog
> +	  timer hardware registres.
> +
Unless Wim already applied this patch, I would suggest to merge the followup patch
with this one.

> +	  If in doubt, say 'N'.
> +
>   config LANTIQ_WDT
>   	tristate "Lantiq SoC watchdog"
>   	depends on LANTIQ
> diff --git a/drivers/watchdog/bcm_kona_wdt.c b/drivers/watchdog/bcm_kona_wdt.c
> index 7e41a83..d3aa473 100644
> --- a/drivers/watchdog/bcm_kona_wdt.c
> +++ b/drivers/watchdog/bcm_kona_wdt.c
> @@ -11,6 +11,7 @@
>    * GNU General Public License for more details.
>    */
>
> +#include <linux/debugfs.h>
>   #include <linux/delay.h>
>   #include <linux/err.h>
>   #include <linux/io.h>
> @@ -55,9 +56,13 @@ struct bcm_kona_wdt {
>   	 */
>   	int resolution;
>   	spinlock_t lock;
> +#ifdef CONFIG_BCM_KONA_WDT_DEBUG
> +	unsigned long busy_count;
> +	struct dentry *debugfs;
> +#endif
>   };
>
> -static int secure_register_read(void __iomem *addr)
> +static int secure_register_read(struct bcm_kona_wdt *wdt, uint32_t offset)
>   {
>   	uint32_t val;
>   	unsigned count = 0;
> @@ -70,10 +75,16 @@ static int secure_register_read(void __iomem *addr)
>   	do {
>   		if (unlikely(count > 1))
>   			udelay(5);
> -		val = readl_relaxed(addr);
> +		val = readl_relaxed(wdt->base + offset);
>   		count++;
>   	} while ((val & SECWDOG_WD_LOAD_FLAG) && count < SECWDOG_MAX_TRY);
>
> +#ifdef CONFIG_BCM_KONA_WDT_DEBUG
> +	/* Remember the maximum number iterations due to WD_LOAD_FLAG */
> +	if (count > wdt->busy_count)
> +		wdt->busy_count = count;
> +#endif
> +
>   	/* This is the only place we return a negative value. */
>   	if (val & SECWDOG_WD_LOAD_FLAG)
>   		return -ETIMEDOUT;
> @@ -84,6 +95,80 @@ static int secure_register_read(void __iomem *addr)
>   	return val;
>   }
>
> +#ifdef CONFIG_BCM_KONA_WDT_DEBUG
> +
> +static int bcm_kona_wdt_dbg_show(struct seq_file *s, void *data)
> +{
> +	int ctl_val, cur_val, ret;
> +	unsigned long flags;
> +	struct bcm_kona_wdt *wdt = s->private;
> +
> +	if (!wdt)
> +		return seq_puts(s, "No device pointer\n");
> +
> +	spin_lock_irqsave(&wdt->lock, flags);
> +	ctl_val = secure_register_read(wdt, SECWDOG_CTRL_REG);
> +	cur_val = secure_register_read(wdt, SECWDOG_COUNT_REG);
> +	spin_unlock_irqrestore(&wdt->lock, flags);
> +
> +	if (ctl_val < 0 || cur_val < 0) {
> +		ret = seq_puts(s, "Error accessing hardware\n");
> +	} else {
> +		int ctl, cur, ctl_sec, cur_sec, res;
> +
> +		ctl = ctl_val & SECWDOG_COUNT_MASK;
> +		res = (ctl_val & SECWDOG_RES_MASK) >> SECWDOG_CLKS_SHIFT;
> +		cur = cur_val & SECWDOG_COUNT_MASK;
> +		ctl_sec = TICKS_TO_SECS(ctl, wdt);
> +		cur_sec = TICKS_TO_SECS(cur, wdt);
> +		ret = seq_printf(s, "Resolution: %d / %d\n"
> +				"Control: %d s / %d (%#x) ticks\n"
> +				"Current: %d s / %d (%#x) ticks\n"
> +				"Busy count: %lu\n", res,
> +				wdt->resolution, ctl_sec, ctl, ctl, cur_sec,
> +				cur, cur, wdt->busy_count);
> +	}
> +
> +	return ret;
> +}
> +
> +static int bcm_kona_dbg_open(struct inode *inode, struct file *file)
> +{
> +	return single_open(file, bcm_kona_wdt_dbg_show, inode->i_private);
> +}
> +
> +static const struct file_operations bcm_kona_dbg_operations = {
> +	.open		= bcm_kona_dbg_open,
> +	.read		= seq_read,
> +	.llseek		= seq_lseek,
> +	.release	= single_release,
> +};
> +
> +static struct dentry *bcm_kona_wdt_debugfs_init(struct bcm_kona_wdt *wdt,
> +	struct watchdog_device *wdd)
> +{
> +	struct dentry *dir;
> +
> +	dir = debugfs_create_dir(BCM_KONA_WDT_NAME, NULL);
> +	if (IS_ERR_OR_NULL(dir))
> +		return NULL;
> +
> +	if (debugfs_create_file("info", S_IFREG | S_IRUGO, dir, wdt,
> +				&bcm_kona_dbg_operations))
> +		return dir;
> +
> +	/* Clean up */
> +	debugfs_remove_recursive(dir);
> +	return NULL;
> +}
> +
> +static void bcm_kona_debugfs_exit(struct dentry *dir)
> +{
> +	debugfs_remove_recursive(dir);
> +}
> +
> +#endif /* CONFIG_BCM_KONA_WDT_DEBUG */
> +
>   static int bcm_kona_wdt_ctrl_reg_modify(struct bcm_kona_wdt *wdt,
>   					unsigned mask, unsigned newval)
>   {
> @@ -93,7 +178,7 @@ static int bcm_kona_wdt_ctrl_reg_modify(struct bcm_kona_wdt *wdt,
>
>   	spin_lock_irqsave(&wdt->lock, flags);
>
> -	val = secure_register_read(wdt->base + SECWDOG_CTRL_REG);
> +	val = secure_register_read(wdt, SECWDOG_CTRL_REG);
>   	if (val < 0) {
>   		ret = val;
>   	} else {
> @@ -140,7 +225,7 @@ static unsigned int bcm_kona_wdt_get_timeleft(struct watchdog_device *wdog)
>   	unsigned long flags;
>
>   	spin_lock_irqsave(&wdt->lock, flags);
> -	val = secure_register_read(wdt->base + SECWDOG_COUNT_REG);
> +	val = secure_register_read(wdt, SECWDOG_COUNT_REG);
>   	spin_unlock_irqrestore(&wdt->lock, flags);
>
>   	if (val < 0)
> @@ -190,6 +275,27 @@ static void bcm_kona_wdt_shutdown(struct platform_device *pdev)
>   	bcm_kona_wdt_stop(&bcm_kona_wdt_wdd);
>   }
>
> +#ifdef CONFIG_BCM_KONA_WDT_DEBUG
> +static void bcm_kona_wdt_debug_init(struct platform_device *pdev)
> +{
> +	struct bcm_kona_wdt *wdt = platform_get_drvdata(pdev);
> +
> +	wdt->debugfs = bcm_kona_wdt_debugfs_init(wdt, &bcm_kona_wdt_wdd);
> +}
> +
> +static void bcm_kona_wdt_debug_exit(struct platform_device *pdev)
> +{
> +	struct bcm_kona_wdt *wdt = platform_get_drvdata(pdev);
> +
> +	if (wdt->debugfs)
> +		bcm_kona_debugfs_exit(wdt->debugfs);
> +}
> +
> +#else
> +static void bcm_kona_wdt_debug_init(struct platform_device *pdev) {}
> +static void bcm_kona_wdt_debug_exit(struct platform_device *pdev) {}
> +#endif
> +

Can you fold those functions into bcm_kona_wdt_debugfs_init() and bcm_kona_debugfs_exit() ?
Then you only need a sinfle #ifdef / #else combination. Only functional change would be to
set wdt->debugfs in bcm_kona_wdt_debugfs_init() and to check it in bcm_kona_debugfs_exit().

Thanks,
Guenter


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

end of thread, other threads:[~2014-01-04 17:42 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-31 21:22 [PATCH 0/2] watchdog: bcm281xx: Debugfs support Markus Mayer
2013-12-31 21:22 ` [PATCH 1/2] " Markus Mayer
2014-01-04 17:42   ` Guenter Roeck
2013-12-31 21:22 ` [PATCH 2/2] watchdog: bcm281xx: Turn on debugfs support for watchdog driver Markus Mayer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.