Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1201586 > unrolled thread
| Started by | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| First post | 2015-08-06 10:50 +0200 |
| Last post | 2015-08-06 12:30 +0200 |
| Articles | 4 — 3 participants |
Back to article view | Back to linux.kernel
[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
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2015-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]
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2015-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]
| From | Guenter Roeck <linux@roeck-us.net> |
|---|---|
| Date | 2015-08-06 12:10 +0200 |
| Subject | Re: [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]
| From | "Yang, Wenyou" <Wenyou.Yang@atmel.com> |
|---|---|
| Date | 2015-08-06 12:30 +0200 |
| Subject | RE: [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