Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1201586 > unrolled thread

[PATCH v5 0/2] add a new driver to support SAMA5D4 watchdog timer

Started byWenyou Yang <wenyou.yang@atmel.com>
First post2015-08-06 10:50 +0200
Last post2015-08-06 12:30 +0200
Articles 4 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v5 0/2] add a new driver to support SAMA5D4 watchdog timer Wenyou Yang <wenyou.yang@atmel.com> - 2015-08-06 10:50 +0200
    [PATCH v5 1/2] drivers: watchdog: add a driver to support SAMA5D4 watchdog timer Wenyou Yang <wenyou.yang@atmel.com> - 2015-08-06 10:50 +0200
      Re: [PATCH v5 1/2] drivers: watchdog: add a driver to support SAMA5D4  watchdog timer Guenter Roeck <linux@roeck-us.net> - 2015-08-06 12:10 +0200
        RE: [PATCH v5 1/2] drivers: watchdog: add a driver to support  SAMA5D4 watchdog timer "Yang, Wenyou" <Wenyou.Yang@atmel.com> - 2015-08-06 12:30 +0200

#1201586 — [PATCH v5 0/2] add a new driver to support SAMA5D4 watchdog timer

FromWenyou Yang <wenyou.yang@atmel.com>
Date2015-08-06 10:50 +0200
Subject[PATCH v5 0/2] add a new driver to support SAMA5D4 watchdog timer
Message-ID<pUp2a-3HO-13@gated-at.bofh.it>
Hello,

Because the watchdog WDT_MR register can be written more than once,
its work mechanism is different from the at91sam9260 watchdog driver.
Open the device file to enable the watchdog hardware, close to disable it,
and ping it from the user space directly to keep it alive.

Changes from v4.0
 1./ Fix interrupt register function flags argument.
 2./ Replace the tabs after #define with spaces.

Changes from v3.0
 1./ Change the driver name to 'sama5d4_wdt' for more acceptable.
 2./ Change the prefix of function name and struct name
     from 'atmel_' to 'sama5d4_', and others.

Changes from v2.0
 1./ Use a specific driver name, at91_sama5d4_wdt.c.
 2./ Remove '-' at the end of macro name and unnecessary check.
 3./ Use alphabetic order for include files.

Wenyou Yang (2):
  drivers: watchdog: add a driver to support SAMA5D4 watchdog timer
  Documentation: dt: binding: atmel-sama5d4-wdt: for SAMA5D4 watchdog
    driver

 .../bindings/watchdog/atmel-sama5d4-wdt.txt        |   35 +++
 drivers/watchdog/Kconfig                           |    9 +
 drivers/watchdog/Makefile                          |    1 +
 drivers/watchdog/at91sam9_wdt.h                    |    2 +
 drivers/watchdog/sama5d4_wdt.c                     |  280 ++++++++++++++++++++
 5 files changed, 327 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/watchdog/atmel-sama5d4-wdt.txt
 create mode 100644 drivers/watchdog/sama5d4_wdt.c

-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1201588 — [PATCH v5 1/2] drivers: watchdog: add a driver to support SAMA5D4 watchdog timer

FromWenyou Yang <wenyou.yang@atmel.com>
Date2015-08-06 10:50 +0200
Subject[PATCH v5 1/2] drivers: watchdog: add a driver to support SAMA5D4 watchdog timer
Message-ID<pUp2a-3HO-31@gated-at.bofh.it>
In reply to#1201586
From SAMA5D4, the watchdog timer is upgrated with a new feature,
which is describled as in the datasheet, "WDT_MR can be written
until a LOCKMR command is issued in WDT_CR".
That is to say, as long as the bootstrap and u-boot don't issue
a LOCKMR command, WDT_MR can be written more than once in the driver.

So the SAMA5D4 watchdog driver's implementation is different from
the at91sam9260 watchdog driver implemented in file at91sam9_wdt.c.
The user application open the device file to enable the watchdog timer
hardware, and close to disable it, and set the watchdog timer timeout
by seting WDV and WDD fields of WDT_MR register, and ping the watchdog
by issuing WDRSTT command to WDT_CR register with hard-coded key.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---
 drivers/watchdog/Kconfig        |    9 ++
 drivers/watchdog/Makefile       |    1 +
 drivers/watchdog/at91sam9_wdt.h |    2 +
 drivers/watchdog/sama5d4_wdt.c  |  280 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 292 insertions(+)
 create mode 100644 drivers/watchdog/sama5d4_wdt.c

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index e5e7c55..47ad39a 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -167,6 +167,15 @@ config AT91SAM9X_WATCHDOG
 	  Watchdog timer embedded into AT91SAM9X and AT91CAP9 chips. This will
 	  reboot your system when the timeout is reached.
 
+config SAMA5D4_WATCHDOG
+	tristate "Atmel SAMA5D4 Watchdog Timer"
+	depends on ARCH_AT91
+	select WATCHDOG_CORE
+	help
+	  Atmel SAMA5D4 watchdog timer is embedded into SAMA5D4 chips.
+	  Its Watchdog Timer Mode Register can be written more than once.
+	  This will reboot your system when the timeout is reached.
+
 config CADENCE_WATCHDOG
 	tristate "Cadence Watchdog Timer"
 	select WATCHDOG_CORE
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index 5c19294..f24b820 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -41,6 +41,7 @@ obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o
 obj-$(CONFIG_KS8695_WATCHDOG) += ks8695_wdt.o
 obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o
 obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o
+obj-$(CONFIG_SAMA5D4_WATCHDOG) += sama5d4_wdt.o
 obj-$(CONFIG_DW_WATCHDOG) += dw_wdt.o
 obj-$(CONFIG_EP93XX_WATCHDOG) += ep93xx_wdt.o
 obj-$(CONFIG_PNX4008_WATCHDOG) += pnx4008_wdt.o
diff --git a/drivers/watchdog/at91sam9_wdt.h b/drivers/watchdog/at91sam9_wdt.h
index c6fbb2e6..b79a83b 100644
--- a/drivers/watchdog/at91sam9_wdt.h
+++ b/drivers/watchdog/at91sam9_wdt.h
@@ -22,11 +22,13 @@
 
 #define AT91_WDT_MR		0x04			/* Watchdog Mode Register */
 #define		AT91_WDT_WDV		(0xfff << 0)		/* Counter Value */
+#define			AT91_WDT_SET_WDV(x)	((x) & AT91_WDT_WDV)
 #define		AT91_WDT_WDFIEN		(1     << 12)		/* Fault Interrupt Enable */
 #define		AT91_WDT_WDRSTEN	(1     << 13)		/* Reset Processor */
 #define		AT91_WDT_WDRPROC	(1     << 14)		/* Timer Restart */
 #define		AT91_WDT_WDDIS		(1     << 15)		/* Watchdog Disable */
 #define		AT91_WDT_WDD		(0xfff << 16)		/* Delta Value */
+#define			AT91_WDT_SET_WDD(x)	(((x) << 16) & AT91_WDT_WDD)
 #define		AT91_WDT_WDDBGHLT	(1     << 28)		/* Debug Halt */
 #define		AT91_WDT_WDIDLEHLT	(1     << 29)		/* Idle Halt */
 
diff --git a/drivers/watchdog/sama5d4_wdt.c b/drivers/watchdog/sama5d4_wdt.c
new file mode 100644
index 0000000..a412215
--- /dev/null
+++ b/drivers/watchdog/sama5d4_wdt.c
@@ -0,0 +1,280 @@
+/*
+ * Driver for Atmel SAMA5D4 Watchdog Timer
+ *
+ * Copyright (C) 2015 Atmel Corporation
+ *
+ * Licensed under GPLv2.
+ */
+
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/reboot.h>
+#include <linux/watchdog.h>
+
+#include "at91sam9_wdt.h"
+
+/* minimum and maximum watchdog timeout, in seconds */
+#define MIN_WDT_TIMEOUT		1
+#define MAX_WDT_TIMEOUT		16
+#define WDT_DEFAULT_TIMEOUT	MAX_WDT_TIMEOUT
+
+#define WDT_SEC2TICKS(s)	((s) ? (((s) << 8) - 1) : 0)
+
+struct sama5d4_wdt {
+	struct watchdog_device	wdd;
+	void __iomem		*reg_base;
+	u32	config;
+};
+
+static int wdt_timeout = WDT_DEFAULT_TIMEOUT;
+static bool nowayout = WATCHDOG_NOWAYOUT;
+
+module_param(wdt_timeout, int, 0);
+MODULE_PARM_DESC(wdt_timeout,
+	"Watchdog timeout in seconds. (default = "
+	__MODULE_STRING(WDT_DEFAULT_TIMEOUT) ")");
+
+module_param(nowayout, bool, 0);
+MODULE_PARM_DESC(nowayout,
+	"Watchdog cannot be stopped once started (default="
+	__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+
+#define wdt_read(wdt, field) \
+	readl_relaxed((wdt)->reg_base + (field))
+
+#define wdt_write(wtd, field, val) \
+	writel_relaxed((val), (wdt)->reg_base + (field))
+
+static int sama5d4_wdt_start(struct watchdog_device *wdd)
+{
+	struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd);
+	u32 reg;
+
+	reg = wdt_read(wdt, AT91_WDT_MR);
+	reg &= ~AT91_WDT_WDDIS;
+	wdt_write(wdt, AT91_WDT_MR, reg);
+
+	return 0;
+}
+
+static int sama5d4_wdt_stop(struct watchdog_device *wdd)
+{
+	struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd);
+	u32 reg;
+
+	reg = wdt_read(wdt, AT91_WDT_MR);
+	reg |= AT91_WDT_WDDIS;
+	wdt_write(wdt, AT91_WDT_MR, reg);
+
+	return 0;
+}
+
+static int sama5d4_wdt_ping(struct watchdog_device *wdd)
+{
+	struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd);
+
+	wdt_write(wdt, AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT);
+
+	return 0;
+}
+
+static int sama5d4_wdt_set_timeout(struct watchdog_device *wdd,
+				 unsigned int timeout)
+{
+	struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd);
+	u32 value = WDT_SEC2TICKS(timeout);
+	u32 reg;
+
+	reg = wdt_read(wdt, AT91_WDT_MR);
+	reg &= ~AT91_WDT_WDV;
+	reg &= ~AT91_WDT_WDD;
+	reg |= AT91_WDT_SET_WDV(value);
+	reg |= AT91_WDT_SET_WDD(value);
+	wdt_write(wdt, AT91_WDT_MR, reg);
+
+	wdd->timeout = timeout;
+
+	return 0;
+}
+
+static const struct watchdog_info sama5d4_wdt_info = {
+	.options = WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING,
+	.identity = "Atmel SAMA5D4 Watchdog"
+};
+
+static struct watchdog_ops sama5d4_wdt_ops = {
+	.owner = THIS_MODULE,
+	.start = sama5d4_wdt_start,
+	.stop = sama5d4_wdt_stop,
+	.ping = sama5d4_wdt_ping,
+	.set_timeout = sama5d4_wdt_set_timeout
+};
+
+static irqreturn_t sama5d4_wdt_irq_handler(int irq, void *dev_id)
+{
+	struct sama5d4_wdt *wdt = platform_get_drvdata(dev_id);
+
+	if (wdt_read(wdt, AT91_WDT_SR)) {
+		pr_crit("Atmel Watchdog Software Reset\n");
+		emergency_restart();
+		pr_crit("Reboot didn't succeed\n");
+	}
+
+	return IRQ_HANDLED;
+}
+
+static int of_sama5d4_wdt_init(struct device_node *np, struct sama5d4_wdt *wdt)
+{
+	const char *tmp;
+
+	wdt->config = AT91_WDT_WDDIS;
+
+	if (!of_property_read_string(np, "atmel,watchdog-type", &tmp) &&
+	    !strcmp(tmp, "software"))
+		wdt->config |= AT91_WDT_WDFIEN;
+	else
+		wdt->config |= AT91_WDT_WDRSTEN;
+
+	if (of_property_read_bool(np, "atmel,idle-halt"))
+		wdt->config |= AT91_WDT_WDIDLEHLT;
+
+	if (of_property_read_bool(np, "atmel,dbg-halt"))
+		wdt->config |= AT91_WDT_WDDBGHLT;
+
+	return 0;
+}
+
+static int sama5d4_wdt_init(struct sama5d4_wdt *wdt)
+{
+	struct watchdog_device *wdd = &wdt->wdd;
+	u32 value = WDT_SEC2TICKS(wdd->timeout);
+	u32 reg;
+
+	/*
+	 * Because the fields WDV and WDD must not be modified when the WDDIS
+	 * bit is set, so clear the WDDIS bit before writing the WDT_MR.
+	 */
+	reg = wdt_read(wdt, AT91_WDT_MR);
+	reg &= ~AT91_WDT_WDDIS;
+	wdt_write(wdt, AT91_WDT_MR, reg);
+
+	reg = wdt->config;
+	reg |= AT91_WDT_SET_WDD(value);
+	reg |= AT91_WDT_SET_WDV(value);
+
+	wdt_write(wdt, AT91_WDT_MR, reg);
+
+	return 0;
+}
+
+static int sama5d4_wdt_probe(struct platform_device *pdev)
+{
+	struct watchdog_device *wdd;
+	struct sama5d4_wdt *wdt;
+	struct resource *res;
+	void __iomem *regs;
+	u32 irq = 0;
+	int ret;
+
+	wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL);
+	if (!wdt)
+		return -ENOMEM;
+
+	wdd = &wdt->wdd;
+	wdd->timeout = wdt_timeout;
+	wdd->info = &sama5d4_wdt_info;
+	wdd->ops = &sama5d4_wdt_ops;
+	wdd->min_timeout = MIN_WDT_TIMEOUT;
+	wdd->max_timeout = MAX_WDT_TIMEOUT;
+
+	watchdog_set_drvdata(wdd, wdt);
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	regs = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(regs))
+		return PTR_ERR(regs);
+
+	wdt->reg_base = regs;
+
+	if (pdev->dev.of_node) {
+		irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
+		if (!irq)
+			dev_warn(&pdev->dev, "failed to get IRQ from DT\n");
+
+		ret = of_sama5d4_wdt_init(pdev->dev.of_node, wdt);
+		if (ret)
+			return ret;
+	}
+
+	if ((wdt->config & AT91_WDT_WDFIEN) && irq) {
+		ret = devm_request_irq(&pdev->dev, irq, sama5d4_wdt_irq_handler,
+				       IRQF_SHARED | IRQF_IRQPOLL |
+				       IRQF_NO_SUSPEND, pdev->name, pdev);
+		if (ret) {
+			dev_err(&pdev->dev,
+				"cannot register interrupt handler\n");
+			return ret;
+		}
+	}
+
+	ret = watchdog_init_timeout(wdd, wdt_timeout, &pdev->dev);
+	if (ret) {
+		dev_err(&pdev->dev, "unable to set timeout value\n");
+		return ret;
+	}
+
+	ret = sama5d4_wdt_init(wdt);
+	if (ret)
+		return ret;
+
+	watchdog_set_nowayout(wdd, nowayout);
+
+	ret = watchdog_register_device(wdd);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to register watchdog device\n");
+		return ret;
+	}
+
+	platform_set_drvdata(pdev, wdt);
+
+	dev_info(&pdev->dev, "initialized (timeout = %d sec, nowayout = %d)\n",
+		 wdt_timeout, nowayout);
+
+	return 0;
+}
+
+static int sama5d4_wdt_remove(struct platform_device *pdev)
+{
+	struct sama5d4_wdt *wdt = platform_get_drvdata(pdev);
+
+	sama5d4_wdt_stop(&wdt->wdd);
+
+	watchdog_unregister_device(&wdt->wdd);
+
+	return 0;
+}
+
+static const struct of_device_id sama5d4_wdt_of_match[] = {
+	{ .compatible = "atmel,sama5d4-wdt", },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, sama5d4_wdt_of_match);
+
+static struct platform_driver sama5d4_wdt_driver = {
+	.probe		= sama5d4_wdt_probe,
+	.remove		= sama5d4_wdt_remove,
+	.driver		= {
+		.name	= "sama5d4_wdt",
+		.of_match_table = sama5d4_wdt_of_match,
+	}
+};
+module_platform_driver(sama5d4_wdt_driver);
+
+MODULE_AUTHOR("Atmel Corporation");
+MODULE_DESCRIPTION("Atmel SAMA5D4 Watchdog Timer driver");
+MODULE_LICENSE("GPL v2");
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1201619 — Re: [PATCH v5 1/2] drivers: watchdog: add a driver to support SAMA5D4 watchdog timer

FromGuenter Roeck <linux@roeck-us.net>
Date2015-08-06 12:10 +0200
SubjectRe: [PATCH v5 1/2] drivers: watchdog: add a driver to support SAMA5D4 watchdog timer
Message-ID<pUqhA-5Mv-23@gated-at.bofh.it>
In reply to#1201588
Hi,

On 08/06/2015 01:34 AM, Wenyou Yang wrote:
>>From SAMA5D4, the watchdog timer is upgrated with a new feature,

Where does the additional ">" come from ?

> which is describled as in the datasheet, "WDT_MR can be written
> until a LOCKMR command is issued in WDT_CR".
> That is to say, as long as the bootstrap and u-boot don't issue
> a LOCKMR command, WDT_MR can be written more than once in the driver.
>
> So the SAMA5D4 watchdog driver's implementation is different from
> the at91sam9260 watchdog driver implemented in file at91sam9_wdt.c.
> The user application open the device file to enable the watchdog timer
> hardware, and close to disable it, and set the watchdog timer timeout
> by seting WDV and WDD fields of WDT_MR register, and ping the watchdog
> by issuing WDRSTT command to WDT_CR register with hard-coded key.
>
> Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
> ---
>   drivers/watchdog/Kconfig        |    9 ++
>   drivers/watchdog/Makefile       |    1 +
>   drivers/watchdog/at91sam9_wdt.h |    2 +
>   drivers/watchdog/sama5d4_wdt.c  |  280 +++++++++++++++++++++++++++++++++++++++
>   4 files changed, 292 insertions(+)
>   create mode 100644 drivers/watchdog/sama5d4_wdt.c
>
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index e5e7c55..47ad39a 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -167,6 +167,15 @@ config AT91SAM9X_WATCHDOG
>   	  Watchdog timer embedded into AT91SAM9X and AT91CAP9 chips. This will
>   	  reboot your system when the timeout is reached.
>
> +config SAMA5D4_WATCHDOG
> +	tristate "Atmel SAMA5D4 Watchdog Timer"
> +	depends on ARCH_AT91
> +	select WATCHDOG_CORE
> +	help
> +	  Atmel SAMA5D4 watchdog timer is embedded into SAMA5D4 chips.
> +	  Its Watchdog Timer Mode Register can be written more than once.
> +	  This will reboot your system when the timeout is reached.
> +
>   config CADENCE_WATCHDOG
>   	tristate "Cadence Watchdog Timer"
>   	select WATCHDOG_CORE
> diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
> index 5c19294..f24b820 100644
> --- a/drivers/watchdog/Makefile
> +++ b/drivers/watchdog/Makefile
> @@ -41,6 +41,7 @@ obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o
>   obj-$(CONFIG_KS8695_WATCHDOG) += ks8695_wdt.o
>   obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o
>   obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o
> +obj-$(CONFIG_SAMA5D4_WATCHDOG) += sama5d4_wdt.o
>   obj-$(CONFIG_DW_WATCHDOG) += dw_wdt.o
>   obj-$(CONFIG_EP93XX_WATCHDOG) += ep93xx_wdt.o
>   obj-$(CONFIG_PNX4008_WATCHDOG) += pnx4008_wdt.o
> diff --git a/drivers/watchdog/at91sam9_wdt.h b/drivers/watchdog/at91sam9_wdt.h
> index c6fbb2e6..b79a83b 100644
> --- a/drivers/watchdog/at91sam9_wdt.h
> +++ b/drivers/watchdog/at91sam9_wdt.h
> @@ -22,11 +22,13 @@
>
>   #define AT91_WDT_MR		0x04			/* Watchdog Mode Register */
>   #define		AT91_WDT_WDV		(0xfff << 0)		/* Counter Value */
> +#define			AT91_WDT_SET_WDV(x)	((x) & AT91_WDT_WDV)
>   #define		AT91_WDT_WDFIEN		(1     << 12)		/* Fault Interrupt Enable */
>   #define		AT91_WDT_WDRSTEN	(1     << 13)		/* Reset Processor */
>   #define		AT91_WDT_WDRPROC	(1     << 14)		/* Timer Restart */
>   #define		AT91_WDT_WDDIS		(1     << 15)		/* Watchdog Disable */
>   #define		AT91_WDT_WDD		(0xfff << 16)		/* Delta Value */
> +#define			AT91_WDT_SET_WDD(x)	(((x) << 16) & AT91_WDT_WDD)
>   #define		AT91_WDT_WDDBGHLT	(1     << 28)		/* Debug Halt */
>   #define		AT91_WDT_WDIDLEHLT	(1     << 29)		/* Idle Halt */
>
> diff --git a/drivers/watchdog/sama5d4_wdt.c b/drivers/watchdog/sama5d4_wdt.c
> new file mode 100644
> index 0000000..a412215
> --- /dev/null
> +++ b/drivers/watchdog/sama5d4_wdt.c
> @@ -0,0 +1,280 @@
> +/*
> + * Driver for Atmel SAMA5D4 Watchdog Timer
> + *
> + * Copyright (C) 2015 Atmel Corporation
> + *
> + * Licensed under GPLv2.
> + */
> +
> +#include <linux/interrupt.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/of_irq.h>
> +#include <linux/platform_device.h>
> +#include <linux/reboot.h>
> +#include <linux/watchdog.h>
> +
> +#include "at91sam9_wdt.h"
> +
> +/* minimum and maximum watchdog timeout, in seconds */
> +#define MIN_WDT_TIMEOUT		1
> +#define MAX_WDT_TIMEOUT		16
> +#define WDT_DEFAULT_TIMEOUT	MAX_WDT_TIMEOUT
> +
> +#define WDT_SEC2TICKS(s)	((s) ? (((s) << 8) - 1) : 0)
> +
> +struct sama5d4_wdt {
> +	struct watchdog_device	wdd;
> +	void __iomem		*reg_base;
> +	u32	config;
> +};
> +
> +static int wdt_timeout = WDT_DEFAULT_TIMEOUT;
> +static bool nowayout = WATCHDOG_NOWAYOUT;
> +
> +module_param(wdt_timeout, int, 0);
> +MODULE_PARM_DESC(wdt_timeout,
> +	"Watchdog timeout in seconds. (default = "
> +	__MODULE_STRING(WDT_DEFAULT_TIMEOUT) ")");
> +
> +module_param(nowayout, bool, 0);
> +MODULE_PARM_DESC(nowayout,
> +	"Watchdog cannot be stopped once started (default="
> +	__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
> +
> +#define wdt_read(wdt, field) \
> +	readl_relaxed((wdt)->reg_base + (field))
> +
> +#define wdt_write(wtd, field, val) \
> +	writel_relaxed((val), (wdt)->reg_base + (field))
> +
> +static int sama5d4_wdt_start(struct watchdog_device *wdd)
> +{
> +	struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd);
> +	u32 reg;
> +
> +	reg = wdt_read(wdt, AT91_WDT_MR);
> +	reg &= ~AT91_WDT_WDDIS;
> +	wdt_write(wdt, AT91_WDT_MR, reg);
> +
> +	return 0;
> +}
> +
> +static int sama5d4_wdt_stop(struct watchdog_device *wdd)
> +{
> +	struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd);
> +	u32 reg;
> +
> +	reg = wdt_read(wdt, AT91_WDT_MR);
> +	reg |= AT91_WDT_WDDIS;
> +	wdt_write(wdt, AT91_WDT_MR, reg);
> +
> +	return 0;
> +}
> +
> +static int sama5d4_wdt_ping(struct watchdog_device *wdd)
> +{
> +	struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd);
> +
> +	wdt_write(wdt, AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT);
> +
> +	return 0;
> +}
> +
> +static int sama5d4_wdt_set_timeout(struct watchdog_device *wdd,
> +				 unsigned int timeout)
> +{
> +	struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd);
> +	u32 value = WDT_SEC2TICKS(timeout);
> +	u32 reg;
> +
> +	reg = wdt_read(wdt, AT91_WDT_MR);
> +	reg &= ~AT91_WDT_WDV;
> +	reg &= ~AT91_WDT_WDD;
> +	reg |= AT91_WDT_SET_WDV(value);
> +	reg |= AT91_WDT_SET_WDD(value);
> +	wdt_write(wdt, AT91_WDT_MR, reg);
> +
> +	wdd->timeout = timeout;
> +
> +	return 0;
> +}
> +
> +static const struct watchdog_info sama5d4_wdt_info = {
> +	.options = WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING,
> +	.identity = "Atmel SAMA5D4 Watchdog"
> +};
> +
> +static struct watchdog_ops sama5d4_wdt_ops = {
> +	.owner = THIS_MODULE,
> +	.start = sama5d4_wdt_start,
> +	.stop = sama5d4_wdt_stop,
> +	.ping = sama5d4_wdt_ping,
> +	.set_timeout = sama5d4_wdt_set_timeout

You made another silent change in v4: You dropped the comma here,
and above after .identity. Now, while it makes sense to have no comma
after "{ }", it does make sense to have the comma here, because it
avoids unnecessary conflicts and build errors later on if a member
is added at the end of the list. Please add those commas back in.

Also, please stop making silent changes like this. You are making
it really hard to review your code - now I'll have to go through
it line by line again and compare it with your earlier patches to see
if you made any other unannounced changes.

Thanks,
Guenter

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1201631 — RE: [PATCH v5 1/2] drivers: watchdog: add a driver to support SAMA5D4 watchdog timer

From"Yang, Wenyou" <Wenyou.Yang@atmel.com>
Date2015-08-06 12:30 +0200
SubjectRE: [PATCH v5 1/2] drivers: watchdog: add a driver to support SAMA5D4 watchdog timer
Message-ID<pUqAW-69b-1@gated-at.bofh.it>
In reply to#1201619
SGkgR3VlbnRlciwNCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBHdWVu
dGVyIFJvZWNrIFttYWlsdG86bGludXhAcm9lY2stdXMubmV0XQ0KPiBTZW50OiAyMDE1xOo41MI2
yNUgMTg6MDANCj4gVG86IFlhbmcsIFdlbnlvdTsgd2ltQGlndWFuYS5iZTsgcm9iaCtkdEBrZXJu
ZWwub3JnOyBwYXdlbC5tb2xsQGFybS5jb207DQo+IG1hcmsucnV0bGFuZEBhcm0uY29tOyBpamMr
ZGV2aWNldHJlZUBoZWxsaW9uLm9yZy51azsgZ2FsYWtAY29kZWF1cm9yYS5vcmcNCj4gQ2M6IHN5
bHZhaW4ucm9jaGV0QGZpbnNlY3VyLmNvbTsgRmVycmUsIE5pY29sYXM7IGJvcmlzLmJyZXppbGxv
bkBmcmVlLQ0KPiBlbGVjdHJvbnMuY29tOyBkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZzsgbGlu
dXgta2VybmVsQHZnZXIua2VybmVsLm9yZzsgbGludXgtDQo+IHdhdGNoZG9nQHZnZXIua2VybmVs
Lm9yZzsgbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnDQo+IFN1YmplY3Q6IFJl
OiBbUEFUQ0ggdjUgMS8yXSBkcml2ZXJzOiB3YXRjaGRvZzogYWRkIGEgZHJpdmVyIHRvIHN1cHBv
cnQgU0FNQTVENA0KPiB3YXRjaGRvZyB0aW1lcg0KPiANCj4gSGksDQo+IA0KPiBPbiAwOC8wNi8y
MDE1IDAxOjM0IEFNLCBXZW55b3UgWWFuZyB3cm90ZToNCj4gPj5Gcm9tIFNBTUE1RDQsIHRoZSB3
YXRjaGRvZyB0aW1lciBpcyB1cGdyYXRlZCB3aXRoIGEgbmV3IGZlYXR1cmUsDQo+IA0KPiBXaGVy
ZSBkb2VzIHRoZSBhZGRpdGlvbmFsICI+IiBjb21lIGZyb20gPw0KSSBkb24ndCBrbm93IHdoeSwg
YnV0IGl0IGlzbid0IGluY2x1c2l2ZSBpbiBteSByZWNlaXZlZCBtYWlsLg0KDQo+IA0KPiA+IHdo
aWNoIGlzIGRlc2NyaWJsZWQgYXMgaW4gdGhlIGRhdGFzaGVldCwgIldEVF9NUiBjYW4gYmUgd3Jp
dHRlbiB1bnRpbA0KPiA+IGEgTE9DS01SIGNvbW1hbmQgaXMgaXNzdWVkIGluIFdEVF9DUiIuDQo+
ID4gVGhhdCBpcyB0byBzYXksIGFzIGxvbmcgYXMgdGhlIGJvb3RzdHJhcCBhbmQgdS1ib290IGRv
bid0IGlzc3VlIGENCj4gPiBMT0NLTVIgY29tbWFuZCwgV0RUX01SIGNhbiBiZSB3cml0dGVuIG1v
cmUgdGhhbiBvbmNlIGluIHRoZSBkcml2ZXIuDQo+ID4NCj4gPiBTbyB0aGUgU0FNQTVENCB3YXRj
aGRvZyBkcml2ZXIncyBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSB0aGUNCj4gPiBh
dDkxc2FtOTI2MCB3YXRjaGRvZyBkcml2ZXIgaW1wbGVtZW50ZWQgaW4gZmlsZSBhdDkxc2FtOV93
ZHQuYy4NCj4gPiBUaGUgdXNlciBhcHBsaWNhdGlvbiBvcGVuIHRoZSBkZXZpY2UgZmlsZSB0byBl
bmFibGUgdGhlIHdhdGNoZG9nIHRpbWVyDQo+ID4gaGFyZHdhcmUsIGFuZCBjbG9zZSB0byBkaXNh
YmxlIGl0LCBhbmQgc2V0IHRoZSB3YXRjaGRvZyB0aW1lciB0aW1lb3V0DQo+ID4gYnkgc2V0aW5n
IFdEViBhbmQgV0REIGZpZWxkcyBvZiBXRFRfTVIgcmVnaXN0ZXIsIGFuZCBwaW5nIHRoZSB3YXRj
aGRvZw0KPiA+IGJ5IGlzc3VpbmcgV0RSU1RUIGNvbW1hbmQgdG8gV0RUX0NSIHJlZ2lzdGVyIHdp
dGggaGFyZC1jb2RlZCBrZXkuDQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBXZW55b3UgWWFuZyA8
d2VueW91LnlhbmdAYXRtZWwuY29tPg0KPiA+IC0tLQ0KPiA+ICAgZHJpdmVycy93YXRjaGRvZy9L
Y29uZmlnICAgICAgICB8ICAgIDkgKysNCj4gPiAgIGRyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUg
ICAgICAgfCAgICAxICsNCj4gPiAgIGRyaXZlcnMvd2F0Y2hkb2cvYXQ5MXNhbTlfd2R0LmggfCAg
ICAyICsNCj4gPiAgIGRyaXZlcnMvd2F0Y2hkb2cvc2FtYTVkNF93ZHQuYyAgfCAgMjgwDQo+ICsr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPiA+ICAgNCBmaWxlcyBjaGFu
Z2VkLCAyOTIgaW5zZXJ0aW9ucygrKQ0KPiA+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv
d2F0Y2hkb2cvc2FtYTVkNF93ZHQuYw0KPiA+DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0
Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZyBpbmRleA0KPiA+IGU1ZTdj
NTUuLjQ3YWQzOWEgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnDQo+
ID4gKysrIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnDQo+ID4gQEAgLTE2Nyw2ICsxNjcsMTUg
QEAgY29uZmlnIEFUOTFTQU05WF9XQVRDSERPRw0KPiA+ICAgCSAgV2F0Y2hkb2cgdGltZXIgZW1i
ZWRkZWQgaW50byBBVDkxU0FNOVggYW5kIEFUOTFDQVA5IGNoaXBzLiBUaGlzDQo+IHdpbGwNCj4g
PiAgIAkgIHJlYm9vdCB5b3VyIHN5c3RlbSB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuDQo+
ID4NCj4gPiArY29uZmlnIFNBTUE1RDRfV0FUQ0hET0cNCj4gPiArCXRyaXN0YXRlICJBdG1lbCBT
QU1BNUQ0IFdhdGNoZG9nIFRpbWVyIg0KPiA+ICsJZGVwZW5kcyBvbiBBUkNIX0FUOTENCj4gPiAr
CXNlbGVjdCBXQVRDSERPR19DT1JFDQo+ID4gKwloZWxwDQo+ID4gKwkgIEF0bWVsIFNBTUE1RDQg
d2F0Y2hkb2cgdGltZXIgaXMgZW1iZWRkZWQgaW50byBTQU1BNUQ0IGNoaXBzLg0KPiA+ICsJICBJ
dHMgV2F0Y2hkb2cgVGltZXIgTW9kZSBSZWdpc3RlciBjYW4gYmUgd3JpdHRlbiBtb3JlIHRoYW4g
b25jZS4NCj4gPiArCSAgVGhpcyB3aWxsIHJlYm9vdCB5b3VyIHN5c3RlbSB3aGVuIHRoZSB0aW1l
b3V0IGlzIHJlYWNoZWQuDQo+ID4gKw0KPiA+ICAgY29uZmlnIENBREVOQ0VfV0FUQ0hET0cNCj4g
PiAgIAl0cmlzdGF0ZSAiQ2FkZW5jZSBXYXRjaGRvZyBUaW1lciINCj4gPiAgIAlzZWxlY3QgV0FU
Q0hET0dfQ09SRQ0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlIGIv
ZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQ0KPiA+IGluZGV4IDVjMTkyOTQuLmYyNGI4MjAgMTAw
NjQ0DQo+ID4gLS0tIGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZl
cnMvd2F0Y2hkb2cvTWFrZWZpbGUNCj4gPiBAQCAtNDEsNiArNDEsNyBAQCBvYmotJChDT05GSUdf
SVhQNFhYX1dBVENIRE9HKSArPSBpeHA0eHhfd2R0Lm8NCj4gPiAgIG9iai0kKENPTkZJR19LUzg2
OTVfV0FUQ0hET0cpICs9IGtzODY5NV93ZHQubw0KPiA+ICAgb2JqLSQoQ09ORklHX1MzQzI0MTBf
V0FUQ0hET0cpICs9IHMzYzI0MTBfd2R0Lm8NCj4gPiAgIG9iai0kKENPTkZJR19TQTExMDBfV0FU
Q0hET0cpICs9IHNhMTEwMF93ZHQubw0KPiA+ICtvYmotJChDT05GSUdfU0FNQTVENF9XQVRDSERP
RykgKz0gc2FtYTVkNF93ZHQubw0KPiA+ICAgb2JqLSQoQ09ORklHX0RXX1dBVENIRE9HKSArPSBk
d193ZHQubw0KPiA+ICAgb2JqLSQoQ09ORklHX0VQOTNYWF9XQVRDSERPRykgKz0gZXA5M3h4X3dk
dC5vDQo+ID4gICBvYmotJChDT05GSUdfUE5YNDAwOF9XQVRDSERPRykgKz0gcG54NDAwOF93ZHQu
byBkaWZmIC0tZ2l0DQo+ID4gYS9kcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5oIGIvZHJp
dmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuaA0KPiA+IGluZGV4IGM2ZmJiMmU2Li5iNzlhODNi
IDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYXQ5MXNhbTlfd2R0LmgNCj4gPiAr
KysgYi9kcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5oDQo+ID4gQEAgLTIyLDExICsyMiwx
MyBAQA0KPiA+DQo+ID4gICAjZGVmaW5lIEFUOTFfV0RUX01SCQkweDA0CQkJLyogV2F0Y2hkb2cN
Cj4gTW9kZSBSZWdpc3RlciAqLw0KPiA+ICAgI2RlZmluZQkJQVQ5MV9XRFRfV0RWCQkoMHhmZmYg
PDwgMCkJCS8qDQo+IENvdW50ZXIgVmFsdWUgKi8NCj4gPiArI2RlZmluZQkJCUFUOTFfV0RUX1NF
VF9XRFYoeCkJKCh4KSAmDQo+IEFUOTFfV0RUX1dEVikNCj4gPiAgICNkZWZpbmUJCUFUOTFfV0RU
X1dERklFTgkJKDEgICAgIDw8IDEyKQkJLyoNCj4gRmF1bHQgSW50ZXJydXB0IEVuYWJsZSAqLw0K
PiA+ICAgI2RlZmluZQkJQVQ5MV9XRFRfV0RSU1RFTgkoMSAgICAgPDwgMTMpCQkvKg0KPiBSZXNl
dCBQcm9jZXNzb3IgKi8NCj4gPiAgICNkZWZpbmUJCUFUOTFfV0RUX1dEUlBST0MJKDEgICAgIDw8
IDE0KQkJLyoNCj4gVGltZXIgUmVzdGFydCAqLw0KPiA+ICAgI2RlZmluZQkJQVQ5MV9XRFRfV0RE
SVMJCSgxICAgICA8PCAxNSkJCS8qDQo+IFdhdGNoZG9nIERpc2FibGUgKi8NCj4gPiAgICNkZWZp
bmUJCUFUOTFfV0RUX1dERAkJKDB4ZmZmIDw8IDE2KQkJLyoNCj4gRGVsdGEgVmFsdWUgKi8NCj4g
PiArI2RlZmluZQkJCUFUOTFfV0RUX1NFVF9XREQoeCkJKCgoeCkgPDwgMTYpICYNCj4gQVQ5MV9X
RFRfV0REKQ0KPiA+ICAgI2RlZmluZQkJQVQ5MV9XRFRfV0REQkdITFQJKDEgICAgIDw8IDI4KQkJ
LyoNCj4gRGVidWcgSGFsdCAqLw0KPiA+ICAgI2RlZmluZQkJQVQ5MV9XRFRfV0RJRExFSExUCSgx
ICAgICA8PCAyOSkJCS8qDQo+IElkbGUgSGFsdCAqLw0KPiA+DQo+ID4gZGlmZiAtLWdpdCBhL2Ry
aXZlcnMvd2F0Y2hkb2cvc2FtYTVkNF93ZHQuYw0KPiA+IGIvZHJpdmVycy93YXRjaGRvZy9zYW1h
NWQ0X3dkdC5jIG5ldyBmaWxlIG1vZGUgMTAwNjQ0IGluZGV4DQo+ID4gMDAwMDAwMC4uYTQxMjIx
NQ0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL3dhdGNoZG9nL3NhbWE1ZDRf
d2R0LmMNCj4gPiBAQCAtMCwwICsxLDI4MCBAQA0KPiA+ICsvKg0KPiA+ICsgKiBEcml2ZXIgZm9y
IEF0bWVsIFNBTUE1RDQgV2F0Y2hkb2cgVGltZXINCj4gPiArICoNCj4gPiArICogQ29weXJpZ2h0
IChDKSAyMDE1IEF0bWVsIENvcnBvcmF0aW9uDQo+ID4gKyAqDQo+ID4gKyAqIExpY2Vuc2VkIHVu
ZGVyIEdQTHYyLg0KPiA+ICsgKi8NCj4gPiArDQo+ID4gKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1
cHQuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2lvLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9r
ZXJuZWwuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KPiA+ICsjaW5jbHVkZSA8
bGludXgvb2YuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPg0KPiA+ICsjaW5jbHVk
ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9yZWJvb3Qu
aD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+DQo+ID4gKw0KPiA+ICsjaW5jbHVk
ZSAiYXQ5MXNhbTlfd2R0LmgiDQo+ID4gKw0KPiA+ICsvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHdh
dGNoZG9nIHRpbWVvdXQsIGluIHNlY29uZHMgKi8NCj4gPiArI2RlZmluZSBNSU5fV0RUX1RJTUVP
VVQJCTENCj4gPiArI2RlZmluZSBNQVhfV0RUX1RJTUVPVVQJCTE2DQo+ID4gKyNkZWZpbmUgV0RU
X0RFRkFVTFRfVElNRU9VVAlNQVhfV0RUX1RJTUVPVVQNCj4gPiArDQo+ID4gKyNkZWZpbmUgV0RU
X1NFQzJUSUNLUyhzKQkoKHMpID8gKCgocykgPDwgOCkgLSAxKSA6IDApDQo+ID4gKw0KPiA+ICtz
dHJ1Y3Qgc2FtYTVkNF93ZHQgew0KPiA+ICsJc3RydWN0IHdhdGNoZG9nX2RldmljZQl3ZGQ7DQo+
ID4gKwl2b2lkIF9faW9tZW0JCSpyZWdfYmFzZTsNCj4gPiArCXUzMgljb25maWc7DQo+ID4gK307
DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IHdkdF90aW1lb3V0ID0gV0RUX0RFRkFVTFRfVElNRU9V
VDsgc3RhdGljIGJvb2wgbm93YXlvdXQgPQ0KPiA+ICtXQVRDSERPR19OT1dBWU9VVDsNCj4gPiAr
DQo+ID4gK21vZHVsZV9wYXJhbSh3ZHRfdGltZW91dCwgaW50LCAwKTsNCj4gPiArTU9EVUxFX1BB
Uk1fREVTQyh3ZHRfdGltZW91dCwNCj4gPiArCSJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMu
IChkZWZhdWx0ID0gIg0KPiA+ICsJX19NT0RVTEVfU1RSSU5HKFdEVF9ERUZBVUxUX1RJTUVPVVQp
ICIpIik7DQo+ID4gKw0KPiA+ICttb2R1bGVfcGFyYW0obm93YXlvdXQsIGJvb2wsIDApOw0KPiA+
ICtNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LA0KPiA+ICsJIldhdGNoZG9nIGNhbm5vdCBiZSBz
dG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD0iDQo+ID4gKwlfX01PRFVMRV9TVFJJTkcoV0FU
Q0hET0dfTk9XQVlPVVQpICIpIik7DQo+ID4gKw0KPiA+ICsjZGVmaW5lIHdkdF9yZWFkKHdkdCwg
ZmllbGQpIFwNCj4gPiArCXJlYWRsX3JlbGF4ZWQoKHdkdCktPnJlZ19iYXNlICsgKGZpZWxkKSkN
Cj4gPiArDQo+ID4gKyNkZWZpbmUgd2R0X3dyaXRlKHd0ZCwgZmllbGQsIHZhbCkgXA0KPiA+ICsJ
d3JpdGVsX3JlbGF4ZWQoKHZhbCksICh3ZHQpLT5yZWdfYmFzZSArIChmaWVsZCkpDQo+ID4gKw0K
PiA+ICtzdGF0aWMgaW50IHNhbWE1ZDRfd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2Ug
KndkZCkgew0KPiA+ICsJc3RydWN0IHNhbWE1ZDRfd2R0ICp3ZHQgPSB3YXRjaGRvZ19nZXRfZHJ2
ZGF0YSh3ZGQpOw0KPiA+ICsJdTMyIHJlZzsNCj4gPiArDQo+ID4gKwlyZWcgPSB3ZHRfcmVhZCh3
ZHQsIEFUOTFfV0RUX01SKTsNCj4gPiArCXJlZyAmPSB+QVQ5MV9XRFRfV0RESVM7DQo+ID4gKwl3
ZHRfd3JpdGUod2R0LCBBVDkxX1dEVF9NUiwgcmVnKTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gMDsN
Cj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBzYW1hNWQ0X3dkdF9zdG9wKHN0cnVjdCB3
YXRjaGRvZ19kZXZpY2UgKndkZCkgew0KPiA+ICsJc3RydWN0IHNhbWE1ZDRfd2R0ICp3ZHQgPSB3
YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZGQpOw0KPiA+ICsJdTMyIHJlZzsNCj4gPiArDQo+ID4gKwly
ZWcgPSB3ZHRfcmVhZCh3ZHQsIEFUOTFfV0RUX01SKTsNCj4gPiArCXJlZyB8PSBBVDkxX1dEVF9X
RERJUzsNCj4gPiArCXdkdF93cml0ZSh3ZHQsIEFUOTFfV0RUX01SLCByZWcpOw0KPiA+ICsNCj4g
PiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IHNhbWE1ZDRfd2R0
X3Bpbmcoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKSB7DQo+ID4gKwlzdHJ1Y3Qgc2FtYTVk
NF93ZHQgKndkdCA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7DQo+ID4gKw0KPiA+ICsJd2R0
X3dyaXRlKHdkdCwgQVQ5MV9XRFRfQ1IsIEFUOTFfV0RUX0tFWSB8DQo+IEFUOTFfV0RUX1dEUlNU
VCk7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBp
bnQgc2FtYTVkNF93ZHRfc2V0X3RpbWVvdXQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkLA0K
PiA+ICsJCQkJIHVuc2lnbmVkIGludCB0aW1lb3V0KQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3Qgc2Ft
YTVkNF93ZHQgKndkdCA9IHdhdGNoZG9nX2dldF9kcnZkYXRhKHdkZCk7DQo+ID4gKwl1MzIgdmFs
dWUgPSBXRFRfU0VDMlRJQ0tTKHRpbWVvdXQpOw0KPiA+ICsJdTMyIHJlZzsNCj4gPiArDQo+ID4g
KwlyZWcgPSB3ZHRfcmVhZCh3ZHQsIEFUOTFfV0RUX01SKTsNCj4gPiArCXJlZyAmPSB+QVQ5MV9X
RFRfV0RWOw0KPiA+ICsJcmVnICY9IH5BVDkxX1dEVF9XREQ7DQo+ID4gKwlyZWcgfD0gQVQ5MV9X
RFRfU0VUX1dEVih2YWx1ZSk7DQo+ID4gKwlyZWcgfD0gQVQ5MV9XRFRfU0VUX1dERCh2YWx1ZSk7
DQo+ID4gKwl3ZHRfd3JpdGUod2R0LCBBVDkxX1dEVF9NUiwgcmVnKTsNCj4gPiArDQo+ID4gKwl3
ZGQtPnRpbWVvdXQgPSB0aW1lb3V0Ow0KPiA+ICsNCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+
ID4gKw0KPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gc2FtYTVkNF93ZHRf
aW5mbyA9IHsNCj4gPiArCS5vcHRpb25zID0gV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lD
Q0xPU0UgfA0KPiBXRElPRl9LRUVQQUxJVkVQSU5HLA0KPiA+ICsJLmlkZW50aXR5ID0gIkF0bWVs
IFNBTUE1RDQgV2F0Y2hkb2ciDQo+ID4gK307DQo+ID4gKw0KPiA+ICtzdGF0aWMgc3RydWN0IHdh
dGNoZG9nX29wcyBzYW1hNWQ0X3dkdF9vcHMgPSB7DQo+ID4gKwkub3duZXIgPSBUSElTX01PRFVM
RSwNCj4gPiArCS5zdGFydCA9IHNhbWE1ZDRfd2R0X3N0YXJ0LA0KPiA+ICsJLnN0b3AgPSBzYW1h
NWQ0X3dkdF9zdG9wLA0KPiA+ICsJLnBpbmcgPSBzYW1hNWQ0X3dkdF9waW5nLA0KPiA+ICsJLnNl
dF90aW1lb3V0ID0gc2FtYTVkNF93ZHRfc2V0X3RpbWVvdXQNCj4gDQo+IFlvdSBtYWRlIGFub3Ro
ZXIgc2lsZW50IGNoYW5nZSBpbiB2NDogWW91IGRyb3BwZWQgdGhlIGNvbW1hIGhlcmUsIGFuZCBh
Ym92ZQ0KPiBhZnRlciAuaWRlbnRpdHkuIE5vdywgd2hpbGUgaXQgbWFrZXMgc2Vuc2UgdG8gaGF2
ZSBubyBjb21tYSBhZnRlciAieyB9IiwgaXQgZG9lcw0KPiBtYWtlIHNlbnNlIHRvIGhhdmUgdGhl
IGNvbW1hIGhlcmUsIGJlY2F1c2UgaXQgYXZvaWRzIHVubmVjZXNzYXJ5IGNvbmZsaWN0cw0KPiBh
bmQgYnVpbGQgZXJyb3JzIGxhdGVyIG9uIGlmIGEgbWVtYmVyIGlzIGFkZGVkIGF0IHRoZSBlbmQg
b2YgdGhlIGxpc3QuIFBsZWFzZSBhZGQNCj4gdGhvc2UgY29tbWFzIGJhY2sgaW4uDQpJIHdpbGwg
YWRkIHRob3NlIGNvbW1hcyBiYWNrIGluLg0KDQo+IA0KPiBBbHNvLCBwbGVhc2Ugc3RvcCBtYWtp
bmcgc2lsZW50IGNoYW5nZXMgbGlrZSB0aGlzLiBZb3UgYXJlIG1ha2luZyBpdCByZWFsbHkgaGFy
ZCB0bw0KPiByZXZpZXcgeW91ciBjb2RlIC0gbm93IEknbGwgaGF2ZSB0byBnbyB0aHJvdWdoIGl0
IGxpbmUgYnkgbGluZSBhZ2FpbiBhbmQgY29tcGFyZSBpdA0KPiB3aXRoIHlvdXIgZWFybGllciBw
YXRjaGVzIHRvIHNlZSBpZiB5b3UgbWFkZSBhbnkgb3RoZXIgdW5hbm5vdW5jZWQgY2hhbmdlcy4N
ClNvcnJ5IGZvciBzaWxlbnQgY2hhbmdlcy4gDQpJIHdpbGwgZG91YmxlIGNoZWNrIGl0IG1vcmUg
Y2FyZWZ1bCBiZWZvcmUgc3VibWl0dGluZyB0aGUgcGF0Y2guIA0KDQo+IA0KPiBUaGFua3MsDQo+
IEd1ZW50ZXINCg0KQmVzdCBSZWdhcmRzLA0KV2VueW91IFlhbmcNCg==
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web