diff options
Diffstat (limited to 'target/linux/gemini/patches-4.14/0018-watchdog-gemini-ftwdt010-rename-driver-and-symbols.patch')
-rw-r--r-- | target/linux/gemini/patches-4.14/0018-watchdog-gemini-ftwdt010-rename-driver-and-symbols.patch | 527 |
1 files changed, 0 insertions, 527 deletions
diff --git a/target/linux/gemini/patches-4.14/0018-watchdog-gemini-ftwdt010-rename-driver-and-symbols.patch b/target/linux/gemini/patches-4.14/0018-watchdog-gemini-ftwdt010-rename-driver-and-symbols.patch deleted file mode 100644 index 23c1989357..0000000000 --- a/target/linux/gemini/patches-4.14/0018-watchdog-gemini-ftwdt010-rename-driver-and-symbols.patch +++ /dev/null @@ -1,527 +0,0 @@ -From c197a5a04d658da490de08636066a6bdbebf16c5 Mon Sep 17 00:00:00 2001 -From: Linus Walleij <linus.walleij@linaro.org> -Date: Mon, 16 Oct 2017 22:54:24 +0200 -Subject: [PATCH 18/31] watchdog: gemini/ftwdt010: rename driver and symbols - -This renames all the driver files and symbols for the Gemini -watchdog to FTWDT010 as it has been revealed that this IP block -is a generic watchdog timer from Faraday Technology used in -several SoC designs. - -Select this driver by default for the Gemini, it is a sensible -driver to always have enabled. - -Signed-off-by: Linus Walleij <linus.walleij@linaro.org> -Reviewed-by: Guenter Roeck <linux@roeck-us.net> -Signed-off-by: Guenter Roeck <linux@roeck-us.net> -Signed-off-by: Wim Van Sebroeck <wim@iguana.be> ---- - drivers/watchdog/Kconfig | 14 +-- - drivers/watchdog/Makefile | 2 +- - drivers/watchdog/{gemini_wdt.c => ftwdt010_wdt.c} | 117 +++++++++++----------- - 3 files changed, 68 insertions(+), 65 deletions(-) - rename drivers/watchdog/{gemini_wdt.c => ftwdt010_wdt.c} (50%) - ---- a/drivers/watchdog/Kconfig -+++ b/drivers/watchdog/Kconfig -@@ -321,16 +321,18 @@ config 977_WATCHDOG - - Not sure? It's safe to say N. - --config GEMINI_WATCHDOG -- tristate "Gemini watchdog" -- depends on ARCH_GEMINI -+config FTWDT010_WATCHDOG -+ tristate "Faraday Technology FTWDT010 watchdog" -+ depends on ARM || COMPILE_TEST - select WATCHDOG_CORE -+ default ARCH_GEMINI - help -- Say Y here if to include support for the watchdog timer -- embedded in the Cortina Systems Gemini family of devices. -+ Say Y here if to include support for the Faraday Technology -+ FTWDT010 watchdog timer embedded in the Cortina Systems Gemini -+ family of devices. - - To compile this driver as a module, choose M here: the -- module will be called gemini_wdt. -+ module will be called ftwdt010_wdt. - - config IXP4XX_WATCHDOG - tristate "IXP4xx Watchdog" ---- a/drivers/watchdog/Makefile -+++ b/drivers/watchdog/Makefile -@@ -46,7 +46,7 @@ obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt. - obj-$(CONFIG_TWL4030_WATCHDOG) += twl4030_wdt.o - obj-$(CONFIG_21285_WATCHDOG) += wdt285.o - obj-$(CONFIG_977_WATCHDOG) += wdt977.o --obj-$(CONFIG_GEMINI_WATCHDOG) += gemini_wdt.o -+obj-$(CONFIG_FTWDT010_WATCHDOG) += ftwdt010_wdt.o - obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o - obj-$(CONFIG_KS8695_WATCHDOG) += ks8695_wdt.o - obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o ---- a/drivers/watchdog/gemini_wdt.c -+++ /dev/null -@@ -1,229 +0,0 @@ --/* -- * Watchdog driver for Cortina Systems Gemini SoC -- * -- * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org> -- * -- * Inspired by the out-of-tree drivers from OpenWRT: -- * Copyright (C) 2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt> -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License version 2 as -- * published by the Free Software Foundation. -- */ -- --#include <linux/bitops.h> --#include <linux/init.h> --#include <linux/interrupt.h> --#include <linux/io.h> --#include <linux/kernel.h> --#include <linux/module.h> --#include <linux/of_device.h> --#include <linux/platform_device.h> --#include <linux/slab.h> --#include <linux/watchdog.h> -- --#define GEMINI_WDCOUNTER 0x0 --#define GEMINI_WDLOAD 0x4 --#define GEMINI_WDRESTART 0x8 --#define GEMINI_WDCR 0xC -- --#define WDRESTART_MAGIC 0x5AB9 -- --#define WDCR_CLOCK_5MHZ BIT(4) --#define WDCR_SYS_RST BIT(1) --#define WDCR_ENABLE BIT(0) -- --#define WDT_CLOCK 5000000 /* 5 MHz */ -- --struct gemini_wdt { -- struct watchdog_device wdd; -- struct device *dev; -- void __iomem *base; --}; -- --static inline --struct gemini_wdt *to_gemini_wdt(struct watchdog_device *wdd) --{ -- return container_of(wdd, struct gemini_wdt, wdd); --} -- --static int gemini_wdt_start(struct watchdog_device *wdd) --{ -- struct gemini_wdt *gwdt = to_gemini_wdt(wdd); -- -- writel(wdd->timeout * WDT_CLOCK, gwdt->base + GEMINI_WDLOAD); -- writel(WDRESTART_MAGIC, gwdt->base + GEMINI_WDRESTART); -- /* set clock before enabling */ -- writel(WDCR_CLOCK_5MHZ | WDCR_SYS_RST, -- gwdt->base + GEMINI_WDCR); -- writel(WDCR_CLOCK_5MHZ | WDCR_SYS_RST | WDCR_ENABLE, -- gwdt->base + GEMINI_WDCR); -- -- return 0; --} -- --static int gemini_wdt_stop(struct watchdog_device *wdd) --{ -- struct gemini_wdt *gwdt = to_gemini_wdt(wdd); -- -- writel(0, gwdt->base + GEMINI_WDCR); -- -- return 0; --} -- --static int gemini_wdt_ping(struct watchdog_device *wdd) --{ -- struct gemini_wdt *gwdt = to_gemini_wdt(wdd); -- -- writel(WDRESTART_MAGIC, gwdt->base + GEMINI_WDRESTART); -- -- return 0; --} -- --static int gemini_wdt_set_timeout(struct watchdog_device *wdd, -- unsigned int timeout) --{ -- wdd->timeout = timeout; -- if (watchdog_active(wdd)) -- gemini_wdt_start(wdd); -- -- return 0; --} -- --static irqreturn_t gemini_wdt_interrupt(int irq, void *data) --{ -- struct gemini_wdt *gwdt = data; -- -- watchdog_notify_pretimeout(&gwdt->wdd); -- -- return IRQ_HANDLED; --} -- --static const struct watchdog_ops gemini_wdt_ops = { -- .start = gemini_wdt_start, -- .stop = gemini_wdt_stop, -- .ping = gemini_wdt_ping, -- .set_timeout = gemini_wdt_set_timeout, -- .owner = THIS_MODULE, --}; -- --static const struct watchdog_info gemini_wdt_info = { -- .options = WDIOF_KEEPALIVEPING -- | WDIOF_MAGICCLOSE -- | WDIOF_SETTIMEOUT, -- .identity = KBUILD_MODNAME, --}; -- -- --static int gemini_wdt_probe(struct platform_device *pdev) --{ -- struct device *dev = &pdev->dev; -- struct resource *res; -- struct gemini_wdt *gwdt; -- unsigned int reg; -- int irq; -- int ret; -- -- gwdt = devm_kzalloc(dev, sizeof(*gwdt), GFP_KERNEL); -- if (!gwdt) -- return -ENOMEM; -- -- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- gwdt->base = devm_ioremap_resource(dev, res); -- if (IS_ERR(gwdt->base)) -- return PTR_ERR(gwdt->base); -- -- irq = platform_get_irq(pdev, 0); -- if (!irq) -- return -EINVAL; -- -- gwdt->dev = dev; -- gwdt->wdd.info = &gemini_wdt_info; -- gwdt->wdd.ops = &gemini_wdt_ops; -- gwdt->wdd.min_timeout = 1; -- gwdt->wdd.max_timeout = 0xFFFFFFFF / WDT_CLOCK; -- gwdt->wdd.parent = dev; -- -- /* -- * If 'timeout-sec' unspecified in devicetree, assume a 13 second -- * default. -- */ -- gwdt->wdd.timeout = 13U; -- watchdog_init_timeout(&gwdt->wdd, 0, dev); -- -- reg = readw(gwdt->base + GEMINI_WDCR); -- if (reg & WDCR_ENABLE) { -- /* Watchdog was enabled by the bootloader, disable it. */ -- reg &= ~WDCR_ENABLE; -- writel(reg, gwdt->base + GEMINI_WDCR); -- } -- -- ret = devm_request_irq(dev, irq, gemini_wdt_interrupt, 0, -- "watchdog bark", gwdt); -- if (ret) -- return ret; -- -- ret = devm_watchdog_register_device(dev, &gwdt->wdd); -- if (ret) { -- dev_err(&pdev->dev, "failed to register watchdog\n"); -- return ret; -- } -- -- /* Set up platform driver data */ -- platform_set_drvdata(pdev, gwdt); -- dev_info(dev, "Gemini watchdog driver enabled\n"); -- -- return 0; --} -- --static int __maybe_unused gemini_wdt_suspend(struct device *dev) --{ -- struct gemini_wdt *gwdt = dev_get_drvdata(dev); -- unsigned int reg; -- -- reg = readw(gwdt->base + GEMINI_WDCR); -- reg &= ~WDCR_ENABLE; -- writel(reg, gwdt->base + GEMINI_WDCR); -- -- return 0; --} -- --static int __maybe_unused gemini_wdt_resume(struct device *dev) --{ -- struct gemini_wdt *gwdt = dev_get_drvdata(dev); -- unsigned int reg; -- -- if (watchdog_active(&gwdt->wdd)) { -- reg = readw(gwdt->base + GEMINI_WDCR); -- reg |= WDCR_ENABLE; -- writel(reg, gwdt->base + GEMINI_WDCR); -- } -- -- return 0; --} -- --static const struct dev_pm_ops gemini_wdt_dev_pm_ops = { -- SET_SYSTEM_SLEEP_PM_OPS(gemini_wdt_suspend, -- gemini_wdt_resume) --}; -- --#ifdef CONFIG_OF --static const struct of_device_id gemini_wdt_match[] = { -- { .compatible = "cortina,gemini-watchdog" }, -- {}, --}; --MODULE_DEVICE_TABLE(of, gemini_wdt_match); --#endif -- --static struct platform_driver gemini_wdt_driver = { -- .probe = gemini_wdt_probe, -- .driver = { -- .name = "gemini-wdt", -- .of_match_table = of_match_ptr(gemini_wdt_match), -- .pm = &gemini_wdt_dev_pm_ops, -- }, --}; --module_platform_driver(gemini_wdt_driver); --MODULE_AUTHOR("Linus Walleij"); --MODULE_DESCRIPTION("Watchdog driver for Gemini"); --MODULE_LICENSE("GPL"); ---- /dev/null -+++ b/drivers/watchdog/ftwdt010_wdt.c -@@ -0,0 +1,230 @@ -+/* -+ * Watchdog driver for Faraday Technology FTWDT010 -+ * -+ * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org> -+ * -+ * Inspired by the out-of-tree drivers from OpenWRT: -+ * Copyright (C) 2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt> -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#include <linux/bitops.h> -+#include <linux/init.h> -+#include <linux/interrupt.h> -+#include <linux/io.h> -+#include <linux/kernel.h> -+#include <linux/module.h> -+#include <linux/of_device.h> -+#include <linux/platform_device.h> -+#include <linux/slab.h> -+#include <linux/watchdog.h> -+ -+#define FTWDT010_WDCOUNTER 0x0 -+#define FTWDT010_WDLOAD 0x4 -+#define FTWDT010_WDRESTART 0x8 -+#define FTWDT010_WDCR 0xC -+ -+#define WDRESTART_MAGIC 0x5AB9 -+ -+#define WDCR_CLOCK_5MHZ BIT(4) -+#define WDCR_SYS_RST BIT(1) -+#define WDCR_ENABLE BIT(0) -+ -+#define WDT_CLOCK 5000000 /* 5 MHz */ -+ -+struct ftwdt010_wdt { -+ struct watchdog_device wdd; -+ struct device *dev; -+ void __iomem *base; -+}; -+ -+static inline -+struct ftwdt010_wdt *to_ftwdt010_wdt(struct watchdog_device *wdd) -+{ -+ return container_of(wdd, struct ftwdt010_wdt, wdd); -+} -+ -+static int ftwdt010_wdt_start(struct watchdog_device *wdd) -+{ -+ struct ftwdt010_wdt *gwdt = to_ftwdt010_wdt(wdd); -+ -+ writel(wdd->timeout * WDT_CLOCK, gwdt->base + FTWDT010_WDLOAD); -+ writel(WDRESTART_MAGIC, gwdt->base + FTWDT010_WDRESTART); -+ /* set clock before enabling */ -+ writel(WDCR_CLOCK_5MHZ | WDCR_SYS_RST, -+ gwdt->base + FTWDT010_WDCR); -+ writel(WDCR_CLOCK_5MHZ | WDCR_SYS_RST | WDCR_ENABLE, -+ gwdt->base + FTWDT010_WDCR); -+ -+ return 0; -+} -+ -+static int ftwdt010_wdt_stop(struct watchdog_device *wdd) -+{ -+ struct ftwdt010_wdt *gwdt = to_ftwdt010_wdt(wdd); -+ -+ writel(0, gwdt->base + FTWDT010_WDCR); -+ -+ return 0; -+} -+ -+static int ftwdt010_wdt_ping(struct watchdog_device *wdd) -+{ -+ struct ftwdt010_wdt *gwdt = to_ftwdt010_wdt(wdd); -+ -+ writel(WDRESTART_MAGIC, gwdt->base + FTWDT010_WDRESTART); -+ -+ return 0; -+} -+ -+static int ftwdt010_wdt_set_timeout(struct watchdog_device *wdd, -+ unsigned int timeout) -+{ -+ wdd->timeout = timeout; -+ if (watchdog_active(wdd)) -+ ftwdt010_wdt_start(wdd); -+ -+ return 0; -+} -+ -+static irqreturn_t ftwdt010_wdt_interrupt(int irq, void *data) -+{ -+ struct ftwdt010_wdt *gwdt = data; -+ -+ watchdog_notify_pretimeout(&gwdt->wdd); -+ -+ return IRQ_HANDLED; -+} -+ -+static const struct watchdog_ops ftwdt010_wdt_ops = { -+ .start = ftwdt010_wdt_start, -+ .stop = ftwdt010_wdt_stop, -+ .ping = ftwdt010_wdt_ping, -+ .set_timeout = ftwdt010_wdt_set_timeout, -+ .owner = THIS_MODULE, -+}; -+ -+static const struct watchdog_info ftwdt010_wdt_info = { -+ .options = WDIOF_KEEPALIVEPING -+ | WDIOF_MAGICCLOSE -+ | WDIOF_SETTIMEOUT, -+ .identity = KBUILD_MODNAME, -+}; -+ -+ -+static int ftwdt010_wdt_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct resource *res; -+ struct ftwdt010_wdt *gwdt; -+ unsigned int reg; -+ int irq; -+ int ret; -+ -+ gwdt = devm_kzalloc(dev, sizeof(*gwdt), GFP_KERNEL); -+ if (!gwdt) -+ return -ENOMEM; -+ -+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ gwdt->base = devm_ioremap_resource(dev, res); -+ if (IS_ERR(gwdt->base)) -+ return PTR_ERR(gwdt->base); -+ -+ irq = platform_get_irq(pdev, 0); -+ if (!irq) -+ return -EINVAL; -+ -+ gwdt->dev = dev; -+ gwdt->wdd.info = &ftwdt010_wdt_info; -+ gwdt->wdd.ops = &ftwdt010_wdt_ops; -+ gwdt->wdd.min_timeout = 1; -+ gwdt->wdd.max_timeout = 0xFFFFFFFF / WDT_CLOCK; -+ gwdt->wdd.parent = dev; -+ -+ /* -+ * If 'timeout-sec' unspecified in devicetree, assume a 13 second -+ * default. -+ */ -+ gwdt->wdd.timeout = 13U; -+ watchdog_init_timeout(&gwdt->wdd, 0, dev); -+ -+ reg = readw(gwdt->base + FTWDT010_WDCR); -+ if (reg & WDCR_ENABLE) { -+ /* Watchdog was enabled by the bootloader, disable it. */ -+ reg &= ~WDCR_ENABLE; -+ writel(reg, gwdt->base + FTWDT010_WDCR); -+ } -+ -+ ret = devm_request_irq(dev, irq, ftwdt010_wdt_interrupt, 0, -+ "watchdog bark", gwdt); -+ if (ret) -+ return ret; -+ -+ ret = devm_watchdog_register_device(dev, &gwdt->wdd); -+ if (ret) { -+ dev_err(&pdev->dev, "failed to register watchdog\n"); -+ return ret; -+ } -+ -+ /* Set up platform driver data */ -+ platform_set_drvdata(pdev, gwdt); -+ dev_info(dev, "FTWDT010 watchdog driver enabled\n"); -+ -+ return 0; -+} -+ -+static int __maybe_unused ftwdt010_wdt_suspend(struct device *dev) -+{ -+ struct ftwdt010_wdt *gwdt = dev_get_drvdata(dev); -+ unsigned int reg; -+ -+ reg = readw(gwdt->base + FTWDT010_WDCR); -+ reg &= ~WDCR_ENABLE; -+ writel(reg, gwdt->base + FTWDT010_WDCR); -+ -+ return 0; -+} -+ -+static int __maybe_unused ftwdt010_wdt_resume(struct device *dev) -+{ -+ struct ftwdt010_wdt *gwdt = dev_get_drvdata(dev); -+ unsigned int reg; -+ -+ if (watchdog_active(&gwdt->wdd)) { -+ reg = readw(gwdt->base + FTWDT010_WDCR); -+ reg |= WDCR_ENABLE; -+ writel(reg, gwdt->base + FTWDT010_WDCR); -+ } -+ -+ return 0; -+} -+ -+static const struct dev_pm_ops ftwdt010_wdt_dev_pm_ops = { -+ SET_SYSTEM_SLEEP_PM_OPS(ftwdt010_wdt_suspend, -+ ftwdt010_wdt_resume) -+}; -+ -+#ifdef CONFIG_OF -+static const struct of_device_id ftwdt010_wdt_match[] = { -+ { .compatible = "faraday,ftwdt010" }, -+ { .compatible = "cortina,gemini-watchdog" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, ftwdt010_wdt_match); -+#endif -+ -+static struct platform_driver ftwdt010_wdt_driver = { -+ .probe = ftwdt010_wdt_probe, -+ .driver = { -+ .name = "ftwdt010-wdt", -+ .of_match_table = of_match_ptr(ftwdt010_wdt_match), -+ .pm = &ftwdt010_wdt_dev_pm_ops, -+ }, -+}; -+module_platform_driver(ftwdt010_wdt_driver); -+MODULE_AUTHOR("Linus Walleij"); -+MODULE_DESCRIPTION("Watchdog driver for Faraday Technology FTWDT010"); -+MODULE_LICENSE("GPL"); |