Armada 370/XP watchdog
Subsystems (5)
v7 cover Armada 370/XP watchdog
Yet another round. This time, addressing Guenter's comment about the nowayout parameter. So, to allow for proper nowayout behavior, we now restrict the initial watchdog stop; which is only done if the watchdog is not properly enabled.
I've dropped the clocksource patch which was previously part of the series. The patch is independent and will be merged through the subsystem maintainer, Daniel Lezcano.
Also, I've updated the multi_v7_defconfig, as per Jason Cooper request.
This series depends on Sebastian's irqchip fixes to clear the bridge irqs cause, which Jason picked here:
http://git.infradead.org/linux-mvebu.git mvebu-next/irqchip-fixes
Wim: Can we take all the watchdog changes through mvebu, with your Ack? This way, we can sort out the irqchip dependency.
Ezequiel Garcia (18):
watchdog: orion: Add clock error handling
watchdog: orion: Use atomic access for shared registers
watchdog: orion: Remove unused macros
watchdog: orion: Make sure the watchdog is initially stopped
watchdog: orion: Handle the interrupt so it's properly acked
watchdog: orion: Make RSTOUT register a separate resource
watchdog: orion: Remove unneeded BRIDGE_CAUSE clear
watchdog: orion: Introduce an orion_watchdog device structure
watchdog: orion: Introduce per-compatible of_device_id data
watchdog: orion: Add per-compatible clock initialization
watchdog: orion: Add per-compatible watchdog start implementation
watchdog: orion: Add support for Armada 370 and Armada XP SoC
ARM: mvebu: Enable Armada 370/XP watchdog in the devicetree
ARM: kirkwood: Add RSTOUT 'reg' entry to devicetree
ARM: dove: Enable Dove watchdog in the devicetree
watchdog: orion: Enable the build on ARCH_MVEBU
ARM: mvebu: Enable watchdog support in defconfig
ARM: dove: Enable watchdog support in the defconfig
.../devicetree/bindings/watchdog/marvel.txt | 11 +- arch/arm/boot/dts/armada-370-xp.dtsi | 4 + arch/arm/boot/dts/armada-370.dtsi | 5 + arch/arm/boot/dts/armada-xp.dtsi | 6 + arch/arm/boot/dts/dove.dtsi | 8 + arch/arm/boot/dts/kirkwood.dtsi | 2 +- arch/arm/configs/dove_defconfig | 2 + arch/arm/configs/multi_v7_defconfig | 2 + arch/arm/configs/mvebu_defconfig | 2 + arch/arm/mach-dove/include/mach/bridge-regs.h | 1 + arch/arm/mach-kirkwood/include/mach/bridge-regs.h | 1 + arch/arm/mach-mv78xx0/include/mach/bridge-regs.h | 1 + arch/arm/mach-orion5x/include/mach/bridge-regs.h | 1 + arch/arm/plat-orion/common.c | 10 +- drivers/watchdog/Kconfig | 2 +- drivers/watchdog/orion_wdt.c | 381 ++++++++++++++++----- 16 files changed, 352 insertions(+), 87 deletions(-)
Signature · 1 line
1.8.1.5
PATCH v7 1/18 watchdog: orion: Add clock error handling
This commit adds a check for clk_prepare_enable success and introduces an error path to disable the clock properly.
--- drivers/watchdog/orion_wdt.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-)
drivers/watchdog/orion_wdt.c +19 -10
@@ -151,17 +151,24 @@ static int orion_wdt_probe(struct platform_device *pdev) clk =devm_clk_get (&pdev->dev,NULL );if (IS_ERR (clk)) {dev_err (&pdev->dev,"Orion Watchdog missing clock\n" ); -return -ENODEV ; +return PTR_ERR (clk); } -clk_prepare_enable (clk); + ret =clk_prepare_enable (clk); +if (ret) +return ret; wdt_tclk =clk_get_rate (clk); res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); -if (!res) -return -ENODEV ; +if (!res) { + ret = -ENODEV ; + goto disable_clk; + } + wdt_reg =devm_ioremap (&pdev->dev, res->start,resource_size (res)); -if (!wdt_reg) -return -ENOMEM ; +if (!wdt_reg) { + ret = -ENOMEM ; + goto disable_clk; + } wdt_max_duration =WDT_MAX_CYCLE_COUNT / wdt_tclk;
@@ -171,14 +178,16 @@ static int orion_wdt_probe(struct platform_device *pdev)watchdog_set_nowayout (&orion_wdt, nowayout); ret =watchdog_register_device (&orion_wdt); -if (ret) { -clk_disable_unprepare (clk); -return ret; - } +if (ret) + goto disable_clk;pr_info ("Initial timeout %d sec%s\n" , orion_wdt.timeout, nowayout ?", nowayout" :"" );return 0 ; + +disable_clk: +clk_disable_unprepare (clk); +return ret; }static int orion_wdt_remove (struct platform_device *pdev)
Signature · 1 line
1.8.1.5
PATCH v7 2/18 watchdog: orion: Use atomic access for shared registers
In reply to Ezequiel GarciaSince the timer control register is shared with the clocksource driver, use the recently introduced atomic_io_clear_set() to access such register. Given the watchdog core already provides serialization for all the watchdog ops, this commit allows to remove the spinlock entirely.
--- drivers/watchdog/orion_wdt.c | 42 +++++------------------------------------- 1 file changed, 5 insertions(+), 37 deletions(-)
drivers/watchdog/orion_wdt.c +5 -37
@@ -20,7 +20,6 @@#include <linux/watchdog.h> #include <linux/init.h> #include <linux/io.h> -#include <linux/spinlock.h> #include <linux/clk.h> #include <linux/err.h> #include <linux/of.h>
@@ -46,25 +45,16 @@ static unsigned int wdt_max_duration; /* (seconds) */static struct clk *clk;static unsigned int wdt_tclk;static void __iomem *wdt_reg; -static DEFINE_SPINLOCK (wdt_lock);static int orion_wdt_ping (struct watchdog_device *wdt_dev) { -spin_lock (&wdt_lock); -/* Reload watchdog duration */ writel (wdt_tclk * wdt_dev->timeout, wdt_reg +WDT_VAL ); - -spin_unlock (&wdt_lock);return 0 ; }static int orion_wdt_start (struct watchdog_device *wdt_dev) { -u32 reg; - -spin_lock (&wdt_lock); -/* Set watchdog duration */ writel (wdt_tclk * wdt_dev->timeout, wdt_reg +WDT_VAL );
@@ -72,48 +62,26 @@ static int orion_wdt_start(struct watchdog_device *wdt_dev)writel (~WDT_INT_REQ ,BRIDGE_CAUSE );/* Enable watchdog timer */ - reg =readl (wdt_reg +TIMER_CTRL ); - reg |=WDT_EN ; -writel (reg, wdt_reg +TIMER_CTRL ); +atomic_io_modify (wdt_reg +TIMER_CTRL ,WDT_EN ,WDT_EN );/* Enable reset on watchdog */ - reg =readl (RSTOUTn_MASK); - reg |=WDT_RESET_OUT_EN ; -writel (reg, RSTOUTn_MASK); - -spin_unlock (&wdt_lock); +atomic_io_modify (RSTOUTn_MASK,WDT_RESET_OUT_EN ,WDT_RESET_OUT_EN );return 0 ; }static int orion_wdt_stop (struct watchdog_device *wdt_dev) { -u32 reg; - -spin_lock (&wdt_lock); -/* Disable reset on watchdog */ - reg =readl (RSTOUTn_MASK); - reg &= ~WDT_RESET_OUT_EN ; -writel (reg, RSTOUTn_MASK); +atomic_io_modify (RSTOUTn_MASK,WDT_RESET_OUT_EN ,0 );/* Disable watchdog timer */ - reg =readl (wdt_reg +TIMER_CTRL ); - reg &= ~WDT_EN ; -writel (reg, wdt_reg +TIMER_CTRL ); - -spin_unlock (&wdt_lock); +atomic_io_modify (wdt_reg +TIMER_CTRL ,WDT_EN ,0 );return 0 ; }static unsigned int orion_wdt_get_timeleft (struct watchdog_device *wdt_dev) { -unsigned int time_left; - -spin_lock (&wdt_lock); - time_left =readl (wdt_reg +WDT_VAL ) / wdt_tclk; -spin_unlock (&wdt_lock); - -return time_left; +return readl (wdt_reg +WDT_VAL ) / wdt_tclk; } static int orion_wdt_set_timeout(struct watchdog_device *wdt_dev,
Signature · 1 line
1.8.1.5
PATCH v7 3/18 watchdog: orion: Remove unused macros
In reply to Ezequiel GarciaThese are not used anywhere so it's safe to remove them.
--- drivers/watchdog/orion_wdt.c | 2 -- 1 file changed, 2 deletions(-)
drivers/watchdog/orion_wdt.c +0 -2
@@ -33,8 +33,6 @@#define WDT_VAL 0x0024#define WDT_MAX_CYCLE_COUNT 0xffffffff -#define WDT_IN_USE 0 -#define WDT_OK_TO_CLOSE 1#define WDT_RESET_OUT_EN BIT(1)#define WDT_INT_REQ BIT(3)
Signature · 1 line
1.8.1.5
PATCH v7 4/18 watchdog: orion: Make sure the watchdog is initially stopped
In reply to Ezequiel GarciaHaving the watchdog initially fully stopped is important to avoid any spurious watchdog triggers, in case the registers are not in its reset state.
If the watchdog rstout is enabled and the watchdog counter running, this initial stop is not performed, to comply with the 'nowayout' parameter.
--- drivers/watchdog/orion_wdt.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
drivers/watchdog/orion_wdt.c +19 -0
@@ -77,6 +77,16 @@ static int orion_wdt_stop(struct watchdog_device *wdt_dev)return 0 ; } +static int orion_wdt_enabled (void ) +{ +bool enabled, running; + + enabled =readl (RSTOUTn_MASK) &WDT_RESET_OUT_EN ; + running =readl (wdt_reg +TIMER_CTRL ) &WDT_EN ; + +return enabled && running; +} +static unsigned int orion_wdt_get_timeleft (struct watchdog_device *wdt_dev) {return readl (wdt_reg +WDT_VAL ) / wdt_tclk;
@@ -142,6 +152,15 @@ static int orion_wdt_probe(struct platform_device *pdev) orion_wdt.max_timeout = wdt_max_duration;watchdog_init_timeout (&orion_wdt, heartbeat, &pdev->dev); +/* +* Let's make sure the watchdog is fully stopped, unless it's +* explicitly enabled. This may be the case if the module was +* removed and re-insterted, or if the bootloader explicitly +* set a running watchdog before booting the kernel. +*/ +if (!orion_wdt_enabled ()) +orion_wdt_stop (&orion_wdt); +watchdog_set_nowayout (&orion_wdt, nowayout); ret =watchdog_register_device (&orion_wdt);if (ret)
Signature · 1 line
1.8.1.5
PATCH v7 5/18 watchdog: orion: Handle the interrupt so it's properly acked
In reply to Ezequiel GarciaDT-enabled plaforms, where the irqchip driver for the brigde interrupt controller is available, can handle the watchdog IRQ properly. Therefore, request the interrupt and add a dummy handler that merely calls panic().
This is done in order to have an initial 'ack' of the interruption, which clears the watchdog state.
Furthermore, since some platforms don't have such IRQ, this commit makes the interrupt specification optional.
--- .../devicetree/bindings/watchdog/marvel.txt | 2 ++ drivers/watchdog/orion_wdt.c | 24 +++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/watchdog/marvel.txt +2 -0
@@ -7,6 +7,7 @@ Required Properties: Optional properties: +- interrupts : Contains the IRQ for watchdog expiration - timeout-sec : Contains the watchdog timeout in seconds Example:
@@ -14,6 +15,7 @@ Example: wdt at 20300 { compatible = "marvell,orion-wdt"; reg = <0x20300 0x28>; + interrupts = <3>; timeout-sec = <10>; status = "okay"; };
drivers/watchdog/orion_wdt.c +23 -1
@@ -19,6 +19,7 @@#include <linux/platform_device.h> #include <linux/watchdog.h> #include <linux/init.h> +#include <linux/interrupt.h> #include <linux/io.h> #include <linux/clk.h> #include <linux/err.h>
@@ -119,10 +120,16 @@ static struct watchdog_device orion_wdt = { .min_timeout = 1, }; +static irqreturn_t orion_wdt_irq (int irq,void *devid) +{ +panic ("Watchdog Timeout" ); +return IRQ_HANDLED ; +} +static int orion_wdt_probe (struct platform_device *pdev) {struct resource *res; -int ret; +int ret, irq; clk =devm_clk_get (&pdev->dev,NULL );if (IS_ERR (clk)) {
@@ -161,6 +168,21 @@ static int orion_wdt_probe(struct platform_device *pdev)if (!orion_wdt_enabled ())orion_wdt_stop (&orion_wdt); +/* Request the IRQ only after the watchdog is disabled */ + irq =platform_get_irq (pdev,0 ); +if (irq >0 ) { +/* +* Not all supported platforms specify an interrupt for the +* watchdog, so let's make it optional. +*/ + ret =devm_request_irq (&pdev->dev, irq, orion_wdt_irq,0 , + pdev->name, &orion_wdt); +if (ret <0 ) { +dev_err (&pdev->dev,"failed to request IRQ\n" ); + goto disable_clk; + } + } +watchdog_set_nowayout (&orion_wdt, nowayout); ret =watchdog_register_device (&orion_wdt);if (ret)
Signature · 1 line
1.8.1.5
PATCH v7 6/18 watchdog: orion: Make RSTOUT register a separate resource
In reply to Ezequiel GarciaIn order to support other SoC, it's required to distinguish the 'control' timer register, from the 'rstout' register that enables system reset on watchdog expiration.
To prevent a compatibility break, this commit adds a fallback to a hardcoded RSTOUT address.
--- .../devicetree/bindings/watchdog/marvel.txt | 6 ++- arch/arm/mach-dove/include/mach/bridge-regs.h | 1 + arch/arm/mach-kirkwood/include/mach/bridge-regs.h | 1 + arch/arm/mach-mv78xx0/include/mach/bridge-regs.h | 1 + arch/arm/mach-orion5x/include/mach/bridge-regs.h | 1 + arch/arm/plat-orion/common.c | 10 +++-- drivers/watchdog/orion_wdt.c | 47 ++++++++++++++++++++-- 7 files changed, 58 insertions(+), 9 deletions(-)
Documentation/devicetree/bindings/watchdog/marvel.txt +4 -2
@@ -3,7 +3,9 @@ Required Properties: - Compatibility : "marvell,orion-wdt" -- reg : Address of the timer registers +- reg : Should contain two entries: first one with the + timer control address, second one with the + rstout enable address. Optional properties:
@@ -14,7 +16,7 @@ Example: wdt at 20300 { compatible = "marvell,orion-wdt"; - reg = <0x20300 0x28>; + reg = <0x20300 0x28>, <0x20108 0x4>; interrupts = <3>; timeout-sec = <10>; status = "okay";
arch/arm/mach-dove/include/mach/bridge-regs.h +1 -0
@@ -21,6 +21,7 @@#define CPU_CTRL_PCIE1_LINK 0x00000008#define RSTOUTn_MASK (BRIDGE_VIRT_BASE + 0x0108) +#define RSTOUTn_MASK_PHYS (BRIDGE_PHYS_BASE + 0x0108)#define SOFT_RESET_OUT_EN 0x00000004#define SYSTEM_SOFT_RESET (BRIDGE_VIRT_BASE + 0x010c)
arch/arm/mach-kirkwood/include/mach/bridge-regs.h +1 -0
@@ -21,6 +21,7 @@#define CPU_RESET 0x00000002#define RSTOUTn_MASK (BRIDGE_VIRT_BASE + 0x0108) +#define RSTOUTn_MASK_PHYS (BRIDGE_PHYS_BASE + 0x0108)#define SOFT_RESET_OUT_EN 0x00000004#define SYSTEM_SOFT_RESET (BRIDGE_VIRT_BASE + 0x010c)
arch/arm/mach-mv78xx0/include/mach/bridge-regs.h +1 -0
@@ -15,6 +15,7 @@#define L2_WRITETHROUGH 0x00020000#define RSTOUTn_MASK (BRIDGE_VIRT_BASE + 0x0108) +#define RSTOUTn_MASK_PHYS (BRIDGE_PHYS_BASE + 0x0108)#define SOFT_RESET_OUT_EN 0x00000004#define SYSTEM_SOFT_RESET (BRIDGE_VIRT_BASE + 0x010c)
arch/arm/mach-orion5x/include/mach/bridge-regs.h +1 -0
@@ -18,6 +18,7 @@#define CPU_CTRL (ORION5X_BRIDGE_VIRT_BASE + 0x104)#define RSTOUTn_MASK (ORION5X_BRIDGE_VIRT_BASE + 0x108) +#define RSTOUTn_MASK_PHYS (ORION5X_BRIDGE_PHYS_BASE + 0x108)#define CPU_SOFT_RESET (ORION5X_BRIDGE_VIRT_BASE + 0x10c)
arch/arm/plat-orion/common.c +6 -4
@@ -595,14 +595,16 @@ void __init orion_spi_1_init(unsigned long mapbase)/***************************************************************************** * Watchdog ****************************************************************************/ -static struct resource orion_wdt_resource = -DEFINE_RES_MEM (TIMER_PHYS_BASE ,0x28 ); +static struct resource orion_wdt_resource[] = { +DEFINE_RES_MEM (TIMER_PHYS_BASE ,0x04 ), +DEFINE_RES_MEM (RSTOUTn_MASK_PHYS,0x04 ), +};static struct platform_device orion_wdt_device = { .name ="orion_wdt" , .id =-1 , - .num_resources =1 , - .resource = &orion_wdt_resource, + .num_resources =ARRAY_SIZE (orion_wdt_resource), + .resource = orion_wdt_resource, };void __init orion_wdt_init (void )
drivers/watchdog/orion_wdt.c +44 -3
89 lines not on this page · raw message
Signature · 1 line
1.8.1.5
PATCH v7 7/18 watchdog: orion: Remove unneeded BRIDGE_CAUSE clear
In reply to Ezequiel GarciaAfter adding the IRQ request, the BRIDGE_CAUSE bit should be cleared by the bridge interrupt controller. There's no longer a need to do it in the watchdog driver, so we can simply remove it.
--- drivers/watchdog/orion_wdt.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/watchdog/orion_wdt.c +0 -5
@@ -24,7 +24,6 @@#include <linux/clk.h> #include <linux/err.h> #include <linux/of.h> -#include <mach/bridge-regs.h> /* RSTOUT mask register physical address for Orion5x, Kirkwood and Dove */ #define ORION_RSTOUT_MASK_OFFSET 0x20108
@@ -42,7 +41,6 @@#define WDT_MAX_CYCLE_COUNT 0xffffffff#define WDT_RESET_OUT_EN BIT(1) -#define WDT_INT_REQ BIT(3)static bool nowayout =WATCHDOG_NOWAYOUT ;static int heartbeat =-1 ;/* module parameter (seconds) */
@@ -64,9 +62,6 @@ static int orion_wdt_start(struct watchdog_device *wdt_dev)/* Set watchdog duration */ writel (wdt_tclk * wdt_dev->timeout, wdt_reg +WDT_VAL ); -/* Clear watchdog timer interrupt */ -writel (~WDT_INT_REQ ,BRIDGE_CAUSE ); -/* Enable watchdog timer */ atomic_io_modify (wdt_reg +TIMER_CTRL ,WDT_EN ,WDT_EN );
Signature · 1 line
1.8.1.5
PATCH v7 8/18 watchdog: orion: Introduce an orion_watchdog device structure
In reply to Ezequiel GarciaIn order to prepare to support multiple compatible-strings, this commit adds a device structure to hold the driver's state.
--- drivers/watchdog/orion_wdt.c | 114 ++++++++++++++++++++++++++----------------- 1 file changed, 69 insertions(+), 45 deletions(-)
drivers/watchdog/orion_wdt.c +69 -45
@@ -44,55 +44,66 @@static bool nowayout =WATCHDOG_NOWAYOUT ;static int heartbeat =-1 ;/* module parameter (seconds) */ -static unsigned int wdt_max_duration;/* (seconds) */ -static struct clk *clk; -static unsigned int wdt_tclk; -static void __iomem *wdt_reg; -static void __iomem *wdt_rstout; + +struct orion_watchdog { +struct watchdog_device wdt; +void __iomem *reg; +void __iomem *rstout; +unsigned long clk_rate; +struct clk *clk; +};static int orion_wdt_ping (struct watchdog_device *wdt_dev) { +struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev);/* Reload watchdog duration */ -writel (wdt_tclk * wdt_dev->timeout, wdt_reg +WDT_VAL ); +writel (dev->clk_rate * wdt_dev->timeout, dev->reg +WDT_VAL );return 0 ; }static int orion_wdt_start (struct watchdog_device *wdt_dev) { +struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev); +/* Set watchdog duration */ -writel (wdt_tclk * wdt_dev->timeout, wdt_reg +WDT_VAL ); +writel (dev->clk_rate * wdt_dev->timeout, dev->reg +WDT_VAL );/* Enable watchdog timer */ -atomic_io_modify (wdt_reg +TIMER_CTRL ,WDT_EN ,WDT_EN ); +atomic_io_modify (dev->reg +TIMER_CTRL ,WDT_EN ,WDT_EN );/* Enable reset on watchdog */ -atomic_io_modify (wdt_rstout,WDT_RESET_OUT_EN ,WDT_RESET_OUT_EN ); +atomic_io_modify (dev->rstout,WDT_RESET_OUT_EN ,WDT_RESET_OUT_EN ); +return 0 ; }static int orion_wdt_stop (struct watchdog_device *wdt_dev) { +struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev); +/* Disable reset on watchdog */ -atomic_io_modify (wdt_rstout,WDT_RESET_OUT_EN ,0 ); +atomic_io_modify (dev->rstout,WDT_RESET_OUT_EN ,0 );/* Disable watchdog timer */ -atomic_io_modify (wdt_reg +TIMER_CTRL ,WDT_EN ,0 ); +atomic_io_modify (dev->reg +TIMER_CTRL ,WDT_EN ,0 ); +return 0 ; } -static int orion_wdt_enabled (void ) +static int orion_wdt_enabled (struct orion_watchdog *dev) {bool enabled, running; - enabled =readl (wdt_rstout) &WDT_RESET_OUT_EN ; - running =readl (wdt_reg +TIMER_CTRL ) &WDT_EN ; + enabled =readl (dev->rstout) &WDT_RESET_OUT_EN ; + running =readl (dev->reg +TIMER_CTRL ) &WDT_EN ;return enabled && running; }static unsigned int orion_wdt_get_timeleft (struct watchdog_device *wdt_dev) { -return readl (wdt_reg +WDT_VAL ) / wdt_tclk; +struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev); +return readl (dev->reg +WDT_VAL ) / dev->clk_rate; } static int orion_wdt_set_timeout(struct watchdog_device *wdt_dev,
@@ -116,12 +127,6 @@ static const struct watchdog_ops orion_wdt_ops = { .get_timeleft = orion_wdt_get_timeleft, }; -static struct watchdog_device orion_wdt = { - .info = &orion_wdt_info, - .ops = &orion_wdt_ops, - .min_timeout =1 , -}; -static irqreturn_t orion_wdt_irq (int irq,void *devid) {panic ("Watchdog Timeout" );
@@ -157,18 +162,29 @@ static void __iomem *orion_wdt_ioremap_rstout(struct platform_device *pdev,static int orion_wdt_probe (struct platform_device *pdev) { +struct orion_watchdog *dev; +unsigned int wdt_max_duration;/* (seconds) */ struct resource *res;int ret, irq; - clk =devm_clk_get (&pdev->dev,NULL ); -if (IS_ERR (clk)) { + dev =devm_kzalloc (&pdev->dev,sizeof (struct orion_watchdog ), +GFP_KERNEL ); +if (!dev) +return -ENOMEM ; + + dev->wdt.info = &orion_wdt_info; + dev->wdt.ops = &orion_wdt_ops; + dev->wdt.min_timeout =1 ; + + dev->clk =devm_clk_get (&pdev->dev,NULL ); +if (IS_ERR (dev->clk)) {dev_err (&pdev->dev,"Orion Watchdog missing clock\n" ); -return PTR_ERR (clk); +return PTR_ERR (dev->clk); } - ret =clk_prepare_enable (clk); + ret =clk_prepare_enable (dev->clk);if (ret)return ret; - wdt_tclk =clk_get_rate (clk); + dev->clk_rate =clk_get_rate (dev->clk); res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );if (!res) {
@@ -176,24 +192,28 @@ static int orion_wdt_probe(struct platform_device *pdev) goto disable_clk; } - wdt_reg =devm_ioremap (&pdev->dev, res->start,resource_size (res)); -if (!wdt_reg) { + dev->reg =devm_ioremap (&pdev->dev, res->start, +resource_size (res)); +if (!dev->reg) { ret = -ENOMEM ; goto disable_clk; } - wdt_rstout =orion_wdt_ioremap_rstout (pdev, res->start & -INTERNAL_REGS_MASK ); -if (!wdt_rstout) { + dev->rstout =orion_wdt_ioremap_rstout (pdev, res->start & +INTERNAL_REGS_MASK ); +if (!dev->rstout) { ret = -ENODEV ; goto disable_clk; } - wdt_max_duration =WDT_MAX_CYCLE_COUNT / wdt_tclk; + wdt_max_duration =WDT_MAX_CYCLE_COUNT / dev->clk_rate; + + dev->wdt.timeout = wdt_max_duration; + dev->wdt.max_timeout = wdt_max_duration; +watchdog_init_timeout (&dev->wdt, heartbeat, &pdev->dev); - orion_wdt.timeout = wdt_max_duration; - orion_wdt.max_timeout = wdt_max_duration; -watchdog_init_timeout (&orion_wdt, heartbeat, &pdev->dev); +platform_set_drvdata (pdev, &dev->wdt); +watchdog_set_drvdata (&dev->wdt, dev);/* * Let's make sure the watchdog is fully stopped, unless it's
@@ -201,8 +221,8 @@ static int orion_wdt_probe(struct platform_device *pdev)* removed and re-insterted, or if the bootloader explicitly * set a running watchdog before booting the kernel. */ -if (!orion_wdt_enabled ()) -orion_wdt_stop (&orion_wdt); +if (!orion_wdt_enabled (dev)) +orion_wdt_stop (&dev->wdt);/* Request the IRQ only after the watchdog is disabled */ irq =platform_get_irq (pdev,0 );
@@ -212,37 +232,41 @@ static int orion_wdt_probe(struct platform_device *pdev)* watchdog, so let's make it optional. */ ret =devm_request_irq (&pdev->dev, irq, orion_wdt_irq,0 , - pdev->name, &orion_wdt); + pdev->name, dev);if (ret <0 ) {dev_err (&pdev->dev,"failed to request IRQ\n" ); goto disable_clk; } } -watchdog_set_nowayout (&orion_wdt, nowayout); - ret =watchdog_register_device (&orion_wdt); +watchdog_set_nowayout (&dev->wdt, nowayout); + ret =watchdog_register_device (&dev->wdt);if (ret) goto disable_clk;pr_info ("Initial timeout %d sec%s\n" , - orion_wdt.timeout, nowayout ?", nowayout" :"" ); + dev->wdt.timeout, nowayout ?", nowayout" :"" );return 0 ; disable_clk: -clk_disable_unprepare (clk); +clk_disable_unprepare (dev->clk);return ret; }static int orion_wdt_remove (struct platform_device *pdev) { -watchdog_unregister_device (&orion_wdt); -clk_disable_unprepare (clk); +struct watchdog_device *wdt_dev =platform_get_drvdata (pdev); +struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev); + +watchdog_unregister_device (wdt_dev); +clk_disable_unprepare (dev->clk);return 0 ; }static void orion_wdt_shutdown (struct platform_device *pdev) { -orion_wdt_stop (&orion_wdt); +struct watchdog_device *wdt_dev =platform_get_drvdata (pdev); +orion_wdt_stop (wdt_dev); }static const struct of_device_id orion_wdt_of_match_table[] = {
Signature · 1 line
1.8.1.5
PATCH v7 9/18 watchdog: orion: Introduce per-compatible of_device_id data
In reply to Ezequiel GarciaThis commit adds an orion_watchdog_data structure to hold compatible-data information. This allows to remove the driver-wide definition and to be able to add support for multiple compatible-strings in the future.
--- drivers/watchdog/orion_wdt.c | 62 ++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 19 deletions(-)
drivers/watchdog/orion_wdt.c +43 -19
@@ -24,6 +24,7 @@#include <linux/clk.h> #include <linux/err.h> #include <linux/of.h> +#include <linux/of_device.h> /* RSTOUT mask register physical address for Orion5x, Kirkwood and Dove */ #define ORION_RSTOUT_MASK_OFFSET 0x20108
@@ -35,29 +36,33 @@* Watchdog timer block registers. */ #define TIMER_CTRL 0x0000 -#define WDT_EN 0x0010 -#define WDT_VAL 0x0024#define WDT_MAX_CYCLE_COUNT 0xffffffff -#define WDT_RESET_OUT_EN BIT(1) -static bool nowayout =WATCHDOG_NOWAYOUT ;static int heartbeat =-1 ;/* module parameter (seconds) */ +struct orion_watchdog_data { +int wdt_counter_offset; +int wdt_enable_bit; +int rstout_enable_bit; +}; +struct orion_watchdog {struct watchdog_device wdt;void __iomem *reg;void __iomem *rstout;unsigned long clk_rate;struct clk *clk; +const struct orion_watchdog_data *data; };static int orion_wdt_ping (struct watchdog_device *wdt_dev) {struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev);/* Reload watchdog duration */ -writel (dev->clk_rate * wdt_dev->timeout, dev->reg +WDT_VAL ); +writel (dev->clk_rate * wdt_dev->timeout, + dev->reg + dev->data->wdt_counter_offset);return 0 ; }
@@ -66,13 +71,16 @@ static int orion_wdt_start(struct watchdog_device *wdt_dev)struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev);/* Set watchdog duration */ -writel (dev->clk_rate * wdt_dev->timeout, dev->reg +WDT_VAL ); +writel (dev->clk_rate * wdt_dev->timeout, + dev->reg + dev->data->wdt_counter_offset);/* Enable watchdog timer */ -atomic_io_modify (dev->reg +TIMER_CTRL ,WDT_EN ,WDT_EN ); +atomic_io_modify (dev->reg +TIMER_CTRL , dev->data->wdt_enable_bit, + dev->data->wdt_enable_bit);/* Enable reset on watchdog */ -atomic_io_modify (dev->rstout,WDT_RESET_OUT_EN ,WDT_RESET_OUT_EN ); +atomic_io_modify (dev->rstout, dev->data->rstout_enable_bit, + dev->data->rstout_enable_bit);return 0 ; }
@@ -82,10 +90,10 @@ static int orion_wdt_stop(struct watchdog_device *wdt_dev)struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev);/* Disable reset on watchdog */ -atomic_io_modify (dev->rstout,WDT_RESET_OUT_EN ,0 ); +atomic_io_modify (dev->rstout, dev->data->rstout_enable_bit,0 );/* Disable watchdog timer */ -atomic_io_modify (dev->reg +TIMER_CTRL ,WDT_EN ,0 ); +atomic_io_modify (dev->reg +TIMER_CTRL , dev->data->wdt_enable_bit,0 );return 0 ; }
@@ -94,8 +102,8 @@ static int orion_wdt_enabled(struct orion_watchdog *dev) {bool enabled, running; - enabled =readl (dev->rstout) &WDT_RESET_OUT_EN ; - running =readl (dev->reg +TIMER_CTRL ) &WDT_EN ; + enabled =readl (dev->rstout) & dev->data->rstout_enable_bit; + running =readl (dev->reg +TIMER_CTRL ) & dev->data->wdt_enable_bit;return enabled && running; }
@@ -103,7 +111,7 @@ static int orion_wdt_enabled(struct orion_watchdog *dev)static unsigned int orion_wdt_get_timeleft (struct watchdog_device *wdt_dev) {struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev); -return readl (dev->reg +WDT_VAL ) / dev->clk_rate; +return readl (dev->reg + dev->data->wdt_counter_offset) / dev->clk_rate; } static int orion_wdt_set_timeout(struct watchdog_device *wdt_dev,
@@ -160,9 +168,25 @@ static void __iomem *orion_wdt_ioremap_rstout(struct platform_device *pdev,return devm_ioremap (&pdev->dev, rstout,0x4 ); } +static const struct orion_watchdog_data orion_data = { + .rstout_enable_bit =BIT (1 ), + .wdt_enable_bit =BIT (4 ), + .wdt_counter_offset =0x24 , +}; + +static const struct of_device_id orion_wdt_of_match_table[] = { + { + .compatible ="marvell,orion-wdt" , + .data = &orion_data, + }, + {}, +}; +MODULE_DEVICE_TABLE (of, orion_wdt_of_match_table); +static int orion_wdt_probe (struct platform_device *pdev) {struct orion_watchdog *dev; +const struct of_device_id *match;unsigned int wdt_max_duration;/* (seconds) */ struct resource *res;int ret, irq;
@@ -172,9 +196,15 @@ static int orion_wdt_probe(struct platform_device *pdev)if (!dev)return -ENOMEM ; + match =of_match_device (orion_wdt_of_match_table, &pdev->dev); +if (!match) +/* Default legacy match */ + match = &orion_wdt_of_match_table[0 ]; + dev->wdt.info = &orion_wdt_info; dev->wdt.ops = &orion_wdt_ops; dev->wdt.min_timeout =1 ; + dev->data = match->data; dev->clk =devm_clk_get (&pdev->dev,NULL );if (IS_ERR (dev->clk)) {
@@ -269,12 +299,6 @@ static void orion_wdt_shutdown(struct platform_device *pdev)orion_wdt_stop (wdt_dev); } -static const struct of_device_id orion_wdt_of_match_table[] = { - { .compatible ="marvell,orion-wdt" , }, - {}, -}; -MODULE_DEVICE_TABLE (of, orion_wdt_of_match_table); -static struct platform_driver orion_wdt_driver = { .probe = orion_wdt_probe, .remove = orion_wdt_remove,
Signature · 1 line
1.8.1.5
PATCH v7 10/18 watchdog: orion: Add per-compatible clock initialization
In reply to Ezequiel GarciaFollowing the introduction of the compatible-data field, it's now possible to further abstract the clock initialization. This will allow to support SoC with a different clock setup.
--- drivers/watchdog/orion_wdt.c | 53 ++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 21 deletions(-)
drivers/watchdog/orion_wdt.c +32 -21
@@ -42,10 +42,14 @@static bool nowayout =WATCHDOG_NOWAYOUT ;static int heartbeat =-1 ;/* module parameter (seconds) */ +struct orion_watchdog ; +struct orion_watchdog_data {int wdt_counter_offset;int wdt_enable_bit;int rstout_enable_bit; +int (*clock_init)(struct platform_device *, +struct orion_watchdog *); };struct orion_watchdog {
@@ -57,6 +61,22 @@ struct orion_watchdog {const struct orion_watchdog_data *data; }; +static int orion_wdt_clock_init (struct platform_device *pdev, +struct orion_watchdog *dev) +{ +int ret; + + dev->clk =devm_clk_get (&pdev->dev,NULL ); +if (IS_ERR (dev->clk)) +return PTR_ERR (dev->clk); + ret =clk_prepare_enable (dev->clk); +if (ret) +return ret; + + dev->clk_rate =clk_get_rate (dev->clk); +return 0 ; +} +static int orion_wdt_ping (struct watchdog_device *wdt_dev) {struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev);
@@ -172,6 +192,7 @@ static const struct orion_watchdog_data orion_data = { .rstout_enable_bit = BIT(1), .wdt_enable_bit = BIT(4), .wdt_counter_offset = 0x24, + .clock_init = orion_wdt_clock_init, };static const struct of_device_id orion_wdt_of_match_table[] = {
@@ -206,34 +227,24 @@ static int orion_wdt_probe(struct platform_device *pdev) dev->wdt.min_timeout =1 ; dev->data = match->data; - dev->clk =devm_clk_get (&pdev->dev,NULL ); -if (IS_ERR (dev->clk)) { -dev_err (&pdev->dev,"Orion Watchdog missing clock\n" ); -return PTR_ERR (dev->clk); - } - ret =clk_prepare_enable (dev->clk); -if (ret) -return ret; - dev->clk_rate =clk_get_rate (dev->clk); - res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); -if (!res) { - ret = -ENODEV ; - goto disable_clk; - } +if (!res) +return -ENODEV ; dev->reg =devm_ioremap (&pdev->dev, res->start,resource_size (res)); -if (!dev->reg) { - ret = -ENOMEM ; - goto disable_clk; - } +if (!dev->reg) +return -ENOMEM ; dev->rstout =orion_wdt_ioremap_rstout (pdev, res->start &INTERNAL_REGS_MASK ); -if (!dev->rstout) { - ret = -ENODEV ; - goto disable_clk; +if (!dev->rstout) +return -ENODEV ; + + ret = dev->data->clock_init (pdev, dev); +if (ret) { +dev_err (&pdev->dev,"cannot initialize clock\n" ); +return ret; } wdt_max_duration =WDT_MAX_CYCLE_COUNT / dev->clk_rate;
Signature · 1 line
1.8.1.5
PATCH v7 11/18 watchdog: orion: Add per-compatible watchdog start implementation
In reply to Ezequiel GarciaTo handle differences between SoCs this commit adds per-compatible string start() function for the watchdog kick-off. This is preparation work and makes no functionality changes to the current driver.
--- drivers/watchdog/orion_wdt.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/watchdog/orion_wdt.c +11 -1
@@ -50,6 +50,7 @@ struct orion_watchdog_data {int rstout_enable_bit;int (*clock_init)(struct platform_device *,struct orion_watchdog *); +int (*start)(struct watchdog_device *); };struct orion_watchdog {
@@ -86,7 +87,7 @@ static int orion_wdt_ping(struct watchdog_device *wdt_dev)return 0 ; } -static int orion_wdt_start (struct watchdog_device *wdt_dev) +static int orion_start (struct watchdog_device *wdt_dev) {struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev);
@@ -105,6 +106,14 @@ static int orion_wdt_start(struct watchdog_device *wdt_dev)return 0 ; } +static int orion_wdt_start (struct watchdog_device *wdt_dev) +{ +struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev); + +/* There are some per-SoC quirks to handle */ +return dev->data->start (wdt_dev); +} +static int orion_wdt_stop (struct watchdog_device *wdt_dev) {struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev);
@@ -193,6 +202,7 @@ static const struct orion_watchdog_data orion_data = { .wdt_enable_bit = BIT(4), .wdt_counter_offset = 0x24, .clock_init = orion_wdt_clock_init, + .start = orion_start, };static const struct of_device_id orion_wdt_of_match_table[] = {
Signature · 1 line
1.8.1.5
PATCH v7 11/18 watchdog: orion: Add per-compatible watchdog start implementation
Quoted 17 lines · Ezequiel Garcia
To handle differences between SoCs this commit adds per-compatible string
start()function for the watchdog kick-off. This is preparation work and makes no functionality changes to the current driver.Reviewed-by Guenter Roeck <[email protected]>Tested-by Willy Tarreau <[email protected]>Signed-off-by Ezequiel Garcia <[email protected]>--- drivers/watchdog/orion_wdt.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)drivers/watchdog/orion_wdt.c +0
-0
drivers/watchdog/orion_wdt.c struct orion_watchdog_data { · line 54
Quoted 5 lines
drivers/watchdog/orion_wdt.c +0
-0@@ -50,6 +50,7 @@ struct orion_watchdog_data {int rstout_enable_bit;int (*clock_init)(struct platform_device *,struct orion_watchdog *);
this...
Quoted 4 lines
drivers/watchdog/orion_wdt.c +1
-0+int (*start)(struct watchdog_device *); };struct
orion_watchdog{
...
drivers/watchdog/orion_wdt.c static const struct orion_watchdog_data orion_data = { · line 206
Quoted 6 lines
drivers/watchdog/orion_wdt.c +0
-0@@ -193,6 +202,7 @@ static const struct orion_watchdog_data orion_data = { .wdt_enable_bit = BIT(4), .wdt_counter_offset = 0x24, .clock_init = orion_wdt_clock_init,
and this...
drivers/watchdog/orion_wdt.c static const struct orion_watchdog_data orion_data = { · line 208
Quoted 2 lines
drivers/watchdog/orion_wdt.c +1
-0+ .start = orion_start, };
cause a failure to apply the patch. I hand-jammed it (attached), please let me know what is going on here (missed dep?)
thx,
Jason.
-----------8<-----------------
commit 14181fe244605b53829ec87f9f6af85d5ec2f8ce
Author: Ezequiel Garcia <[email protected]> Date: Mon Feb 10 20:00:30 2014 -0300
watchdog: orion: Add per-compatible watchdog start implementation
To handle differences between SoCs this commit adds per-compatible string start() function for the watchdog kick-off. This is preparation work and makes no functionality changes to the current driver.
drivers/watchdog/orion_wdt.c +11 -1
@@ -46,6 +46,7 @@ struct orion_watchdog_data {int wdt_counter_offset;int wdt_enable_bit;int rstout_enable_bit; +int (*start)(struct watchdog_device *); };struct orion_watchdog {
@@ -66,7 +67,7 @@ static int orion_wdt_ping(struct watchdog_device *wdt_dev)return 0 ; } -static int orion_wdt_start (struct watchdog_device *wdt_dev) +static int orion_start (struct watchdog_device *wdt_dev) {struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev);
@@ -85,6 +86,14 @@ static int orion_wdt_start(struct watchdog_device *wdt_dev)return 0 ; } +static int orion_wdt_start (struct watchdog_device *wdt_dev) +{ +struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev); + +/* There are some per-SoC quirks to handle */ +return dev->data->start (wdt_dev); +} +static int orion_wdt_stop (struct watchdog_device *wdt_dev) {struct orion_watchdog *dev =watchdog_get_drvdata (wdt_dev);
@@ -172,6 +181,7 @@ static const struct orion_watchdog_data orion_data = { .rstout_enable_bit = BIT(1), .wdt_enable_bit = BIT(4), .wdt_counter_offset = 0x24, + .start = orion_start, };static const struct of_device_id orion_wdt_of_match_table[] = {
PATCH v7 11/18 watchdog: orion: Add per-compatible watchdog start implementation
Quoted 38 lines · Jason Cooper
Quoted 17 lines · Ezequiel Garcia
To handle differences between SoCs this commit adds per-compatible string
start()function for the watchdog kick-off. This is preparation work and makes no functionality changes to the current driver.Reviewed-by Guenter Roeck <[email protected]>Tested-by Willy Tarreau <[email protected]>Signed-off-by Ezequiel Garcia <[email protected]>--- drivers/watchdog/orion_wdt.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)drivers/watchdog/orion_wdt.c +0
-0drivers/watchdog/orion_wdt.c struct orion_watchdog_data { · line 54
Quoted 5 lines
drivers/watchdog/orion_wdt.c +0
-0@@ -50,6 +50,7 @@ struct orion_watchdog_data {int rstout_enable_bit;int (*clock_init)(struct platform_device *,struct orion_watchdog *);this...
Quoted 4 lines
drivers/watchdog/orion_wdt.c +1
-0+int (*start)(struct watchdog_device *); };struct
orion_watchdog{...
drivers/watchdog/orion_wdt.c static const struct orion_watchdog_data orion_data = { · line 206
Quoted 6 lines
drivers/watchdog/orion_wdt.c +0
-0@@ -193,6 +202,7 @@ static const struct orion_watchdog_data orion_data = { .wdt_enable_bit = BIT(4), .wdt_counter_offset = 0x24, .clock_init = orion_wdt_clock_init,
Quoted 7 lines
and this...
drivers/watchdog/orion_wdt.c static const struct orion_watchdog_data orion_data = { · line 185
Quoted 2 lines
drivers/watchdog/orion_wdt.c +1
-0+ .start = orion_start, };cause a failure to apply the patch. I hand-jammed it (attached), please let me know what is going on here (missed dep?)
disregard. I missed patch 10. It helps. :)
thx,
Jason.
PATCH v7 11/18 watchdog: orion: Add per-compatible watchdog start implementation
Quoted 41 lines · Jason Cooper
Quoted 40 lines · Jason Cooper
Quoted 17 lines · Ezequiel Garcia
To handle differences between SoCs this commit adds per-compatible string
start()function for the watchdog kick-off. This is preparation work and makes no functionality changes to the current driver.Reviewed-by Guenter Roeck <[email protected]>Tested-by Willy Tarreau <[email protected]>Signed-off-by Ezequiel Garcia <[email protected]>--- drivers/watchdog/orion_wdt.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)drivers/watchdog/orion_wdt.c +0
-0drivers/watchdog/orion_wdt.c struct orion_watchdog_data { · line 54
Quoted 5 lines
drivers/watchdog/orion_wdt.c +0
-0@@ -50,6 +50,7 @@ struct orion_watchdog_data {int rstout_enable_bit;int (*clock_init)(struct platform_device *,struct orion_watchdog *);this...
Quoted 4 lines
drivers/watchdog/orion_wdt.c +1
-0+int (*start)(struct watchdog_device *); };struct
orion_watchdog{...
drivers/watchdog/orion_wdt.c static const struct orion_watchdog_data orion_data = { · line 206
Quoted 6 lines
drivers/watchdog/orion_wdt.c +0
-0@@ -193,6 +202,7 @@ static const struct orion_watchdog_data orion_data = { .wdt_enable_bit = BIT(4), .wdt_counter_offset = 0x24, .clock_init = orion_wdt_clock_init,and this...
Quoted 8 lines
Quoted 5 lines
drivers/watchdog/orion_wdt.c static const struct orion_watchdog_data orion_data = { · line 185
Quoted 2 lines
drivers/watchdog/orion_wdt.c +1
-0+ .start = orion_start, };cause a failure to apply the patch. I hand-jammed it (attached), please let me know what is going on here (missed dep?)
disregard. I missed patch 10. It helps. :)
Phhheeew... my heart stopped for a minute ;-)
Signature · 3 lines
Ezequiel Garc?a, Free Electrons Embedded Linux, Kernel and Android Engineering http://free-electrons.com
PATCH v7 12/18 watchdog: orion: Add support for Armada 370 and Armada XP SoC
In reply to Ezequiel GarciaUsing the added infrastructure for handling SoC differences, this commit adds support for the watchdog controller available in Armada 370 and Armada XP SoCs.
Also, and because the AXP clock initialization uses of_clk_get_by_name, this commit changes the orion clock initialization to use clk_get() and adds a proper clk_put() on the common exit/error paths.
--- .../devicetree/bindings/watchdog/marvel.txt | 3 + drivers/watchdog/orion_wdt.c | 106 ++++++++++++++++++++- 2 files changed, 107 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/watchdog/marvel.txt +3 -0
@@ -3,6 +3,9 @@ Required Properties: - Compatibility : "marvell,orion-wdt" + "marvell,armada-370-wdt" + "marvell,armada-xp-wdt" + - reg : Should contain two entries: first one with the timer control address, second one with the rstout enable address.
drivers/watchdog/orion_wdt.c +104 -2
154 lines not on this page · raw message
Signature · 1 line
1.8.1.5
PATCH v7 13/18 ARM: mvebu: Enable Armada 370/XP watchdog in the devicetree
In reply to Ezequiel GarciaAdd the DT nodes to enable watchdog support available in Armada 370 and Armada XP SoCs.
--- arch/arm/boot/dts/armada-370-xp.dtsi | 4 ++++ arch/arm/boot/dts/armada-370.dtsi | 5 +++++ arch/arm/boot/dts/armada-xp.dtsi | 6 ++++++ 3 files changed, 15 insertions(+)
arch/arm/boot/dts/armada-370-xp.dtsi +4 -0
@@ -199,6 +199,10 @@ interrupts = <37>, <38>, <39>, <40>, <5>, <6>; }; + watchdog at 20300 { + reg = <0x20300 0x34>, <0x20704 0x4>; + }; + usb at 50000 { compatible = "marvell,orion-ehci"; reg = <0x50000 0x500>;
arch/arm/boot/dts/armada-370.dtsi +5 -0
@@ -196,6 +196,11 @@ clocks = <&coreclk 2>; }; + watchdog at 20300 { + compatible = "marvell,armada-370-wdt"; + clocks = <&coreclk 2>; + }; + usb at 50000 { clocks = <&coreclk 0>; };
arch/arm/boot/dts/armada-xp.dtsi +6 -0
@@ -111,6 +111,12 @@ clock-names = "nbclk", "fixed"; }; + watchdog at 20300 { + compatible = "marvell,armada-xp-wdt"; + clocks = <&coreclk 2>, <&refclk>; + clock-names = "nbclk", "fixed"; + }; + armada-370-xp-pmsu at 22000 { compatible = "marvell,armada-370-xp-pmsu"; reg = <0x22100 0x400>, <0x20800 0x20>;
Signature · 1 line
1.8.1.5
PATCH v7 14/18 ARM: kirkwood: Add RSTOUT 'reg' entry to devicetree
In reply to Ezequiel GarciaIn order to support multiplatform builds the watchdog devicetree binding was modified and now the 'reg' property is specified to need two entries. This commit adds the second entry as-per the new specification.
--- arch/arm/boot/dts/kirkwood.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/kirkwood.dtsi +1 -1
@@ -178,7 +178,7 @@ wdt: watchdog-timer at 20300 { compatible = "marvell,orion-wdt"; - reg = <0x20300 0x28>; + reg = <0x20300 0x28>, <0x20108 0x4>; interrupt-parent = <&bridge_intc>; interrupts = <3>; clocks = <&gate_clk 7>;
Signature · 1 line
1.8.1.5
PATCH v7 15/18 ARM: dove: Enable Dove watchdog in the devicetree
In reply to Ezequiel GarciaAdd the devicetree node to enable watchdog support available in Dove SoCs.
--- arch/arm/boot/dts/dove.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm/boot/dts/dove.dtsi +8 -0
@@ -210,6 +210,14 @@ clocks = <&core_clk 0>; }; + watchdog at 20300 { + compatible = "marvell,orion-wdt"; + reg = <0x20300 0x28>, <0x20108 0x4>; + interrupt-parent = <&bridge_intc>; + interrupts = <3>; + clocks = <&core_clk 0>; + }; + crypto: crypto-engine at 30000 { compatible = "marvell,orion-crypto"; reg = <0x30000 0x10000>,
Signature · 1 line
1.8.1.5
PATCH v7 16/18 watchdog: orion: Enable the build on ARCH_MVEBU
In reply to Ezequiel GarciaAfter adding support for Armada 370/XP SoC let's enable the build on these platforms.
--- drivers/watchdog/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/watchdog/Kconfig +1 -1
@@ -291,7 +291,7 @@ config DAVINCI_WATCHDOG config ORION_WATCHDOG tristate "Orion watchdog" - depends on ARCH_ORION5X || ARCH_KIRKWOOD || ARCH_DOVE + depends on ARCH_ORION5X || ARCH_KIRKWOOD || ARCH_DOVE || ARCH_MVEBU select WATCHDOG_CORE help Say Y here if to include support for the watchdog timer
Signature · 1 line
1.8.1.5
PATCH v7 17/18 ARM: mvebu: Enable watchdog support in defconfig
In reply to Ezequiel GarciaNow that we have proper support for Armada 370/XP watchdog let's enable it in mvebu_defconfig and multi_v7_defconfig.
--- arch/arm/configs/multi_v7_defconfig | 2 ++ arch/arm/configs/mvebu_defconfig | 2 ++ 2 files changed, 4 insertions(+)
arch/arm/configs/multi_v7_defconfig +2 -0
@@ -187,6 +187,8 @@ CONFIG_POWER_RESET_GPIO=y CONFIG_SENSORS_LM90=y CONFIG_THERMAL=y CONFIG_ARMADA_THERMAL=y +CONFIG_WATCHDOG=y +CONFIG_ORION_WATCHDOG=y CONFIG_MFD_AS3722=y CONFIG_MFD_CROS_EC=y CONFIG_MFD_CROS_EC_SPI=y
arch/arm/configs/mvebu_defconfig +2 -0
@@ -62,6 +62,8 @@ CONFIG_GPIOLIB=y CONFIG_GPIO_SYSFS=y CONFIG_THERMAL=y CONFIG_ARMADA_THERMAL=y +CONFIG_WATCHDOG=y +CONFIG_ORION_WATCHDOG=y CONFIG_USB_SUPPORT=y CONFIG_USB=y CONFIG_USB_EHCI_HCD=y
Signature · 1 line
1.8.1.5
PATCH v7 18/18 ARM: dove: Enable watchdog support in the defconfig
In reply to Ezequiel GarciaNow that we have watchdog support, let's add it to the defconfig.
--- arch/arm/configs/dove_defconfig | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/configs/dove_defconfig +2 -0
@@ -80,6 +80,8 @@ CONFIG_SPI_ORION=y # CONFIG_HWMON is not set CONFIG_THERMAL=y CONFIG_DOVE_THERMAL=y +CONFIG_WATCHDOG=y +CONFIG_ORION_WATCHDOG=y CONFIG_USB=y CONFIG_USB_XHCI_HCD=y CONFIG_USB_EHCI_HCD=y
Signature · 1 line
1.8.1.5
v7 cover Armada 370/XP watchdog
In reply to Ezequiel GarciaQuoted 11 lines · Ezequiel Garcia
Yet another round. This time, addressing Guenter's comment about the nowayout parameter. So, to allow for proper nowayout behavior, we now restrict the initial watchdog stop; which is only done if the watchdog is not properly enabled.
I've dropped the clocksource patch which was previously part of the series. The patch is independent and will be merged through the subsystem maintainer, Daniel Lezcano.
Also, I've updated the
multi_v7_defconfig, as per Jason Cooper request.
Quoted 8 lines
This series depends on Sebastian's irqchip fixes to clear the bridge irqs cause, which Jason picked here:
http://git.infradead.org/linux-mvebu.git mvebu-next/irqchip-fixes
Wim: Can we take all the watchdog changes through mvebu, with your Ack? This way, we can sort out the irqchip dependency.
Wim: Do you have any comments about these patches?
Signature · 3 lines
Ezequiel Garc?a, Free Electrons Embedded Linux, Kernel and Android Engineering http://free-electrons.com
Hi Ezequiel,
Quoted 15 lines · Ezequiel Garcia
Quoted 14 lines
Yet another round. This time, addressing Guenter's comment about the nowayout parameter. So, to allow for proper nowayout behavior, we now restrict the initial watchdog stop; which is only done if the watchdog is not properly enabled.
I've dropped the clocksource patch which was previously part of the series. The patch is independent and will be merged through the subsystem maintainer, Daniel Lezcano.
Also, I've updated the
multi_v7_defconfig, as per Jason Cooper request.This series depends on Sebastian's irqchip fixes to clear the bridge irqs cause, which Jason picked here:
Quoted 7 lines
Quoted 5 lines
http://git.infradead.org/linux-mvebu.git mvebu-next/irqchip-fixes
Wim: Can we take all the watchdog changes through mvebu, with your Ack? This way, we can sort out the irqchip dependency.
Wim: Do you have any comments about these patches?
Will review on monday. But agree that if patches are OK that they should go via mvebu.
Kind regards,
Wim.
v7 cover Armada 370/XP watchdog
In reply to Ezequiel GarciaQuoted 11 lines · Ezequiel Garcia
Yet another round. This time, addressing Guenter's comment about the nowayout parameter. So, to allow for proper nowayout behavior, we now restrict the initial watchdog stop; which is only done if the watchdog is not properly enabled.
I've dropped the clocksource patch which was previously part of the series. The patch is independent and will be merged through the subsystem maintainer, Daniel Lezcano.
Also, I've updated the
multi_v7_defconfig, as per Jason Cooper request.
Quoted 8 lines
This series depends on Sebastian's irqchip fixes to clear the bridge irqs cause, which Jason picked here:
http://git.infradead.org/linux-mvebu.git mvebu-next/irqchip-fixes
Wim: Can we take all the watchdog changes through mvebu, with your Ack? This way, we can sort out the irqchip dependency.
Whole series applied as follows (with Wim's Acks):
Quoted 5 lines
Ezequiel Garcia (18):
watchdog: orion: Add clock error handling
watchdog: orion: Use atomic access for shared registers
watchdog: orion: Remove unused macros
watchdog: orion: Make sure the watchdog is initially stopped
Quoted 8 lines
watchdog: orion: Handle the interrupt so it's properly acked
watchdog: orion: Make RSTOUT register a separate resource
watchdog: orion: Remove unneededBRIDGE_CAUSEclear
watchdog: orion: Introduce anorion_watchdogdevice structure
watchdog: orion: Introduce per-compatibleof_device_iddata
watchdog: orion: Add per-compatible clock initialization
watchdog: orion: Add per-compatible watchdog start implementation
watchdog: orion: Add support for Armada 370 and Armada XP SoC
to mvebu/watchdog (deps on mvebu/irqchip-fixes (renamed))
Quoted 3 lines
ARM: mvebu: Enable Armada 370/XP watchdog in the devicetree
ARM: kirkwood: Add RSTOUT 'reg' entry to devicetree
ARM: dove: Enable Dove watchdog in the devicetree
to mvebu/dt
Quoted 1 line
watchdog: orion: Enable the build on
ARCH_MVEBU
to mvebu/watchdog
Quoted 2 lines
ARM: mvebu: Enable watchdog support in defconfig
ARM: dove: Enable watchdog support in the defconfig
to mvebu/defconfig
Quoted 9 lines
.../devicetree/bindings/watchdog/marvel.txt | 11 +- arch/arm/boot/dts/armada-370-xp.dtsi | 4 + arch/arm/boot/dts/armada-370.dtsi | 5 + arch/arm/boot/dts/armada-xp.dtsi | 6 + arch/arm/boot/dts/dove.dtsi | 8 + arch/arm/boot/dts/kirkwood.dtsi | 2 +- arch/arm/configs/dove_defconfig | 2 + arch/arm/configs/multi_v7_defconfig | 2 + arch/arm/configs/mvebu_defconfig | 2 +
Quoted 8 lines
arch/arm/mach-dove/include/mach/bridge-regs.h | 1 + arch/arm/mach-kirkwood/include/mach/bridge-regs.h | 1 + arch/arm/mach-mv78xx0/include/mach/bridge-regs.h | 1 + arch/arm/mach-orion5x/include/mach/bridge-regs.h | 1 + arch/arm/plat-orion/common.c | 10 +- drivers/watchdog/Kconfig | 2 +- drivers/watchdog/orion_wdt.c | 381 ++++++++++++++++----- 16 files changed, 352 insertions(+), 87 deletions(-)
Great work, Ezequiel!
thx,
Jason.