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


Groups > linux.kernel > #1164626 > unrolled thread

[PATCH v2 1/3] dt-bindings: Add Raspberry Pi compatible string for watchdog

Started byNoralf Trønnes <noralf@tronnes.org>
First post2015-06-13 13:50 +0200
Last post2015-06-13 13:50 +0200
Articles 3 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH v2 1/3] dt-bindings: Add Raspberry Pi compatible string for watchdog Noralf Trønnes <noralf@tronnes.org> - 2015-06-13 13:50 +0200
    [PATCH v2 2/3] watchdog: bcm2835: Add poweroff code for the Raspberry Pi Noralf Trønnes <noralf@tronnes.org> - 2015-06-13 13:50 +0200
    [PATCH v2 3/3] ARM: dts: bcm2835-rpi: Add "brcm,raspberrypi-pm-wdt" to wdt compatible Noralf Trønnes <noralf@tronnes.org> - 2015-06-13 13:50 +0200

#1164626 — [PATCH v2 1/3] dt-bindings: Add Raspberry Pi compatible string for watchdog

FromNoralf Trønnes <noralf@tronnes.org>
Date2015-06-13 13:50 +0200
Subject[PATCH v2 1/3] dt-bindings: Add Raspberry Pi compatible string for watchdog
Message-ID<pAS6K-3r0-9@gated-at.bofh.it>
The Raspberry Pi has changed how its firmware detects a poweroff
and needs special handling for this.

Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
---

v2: Fix typo in commit message


 Documentation/devicetree/bindings/watchdog/brcm,bcm2835-pm-wdog.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/watchdog/brcm,bcm2835-pm-wdog.txt b/Documentation/devicetree/bindings/watchdog/brcm,bcm2835-pm-wdog.txt
index f801d71..1a80931 100644
--- a/Documentation/devicetree/bindings/watchdog/brcm,bcm2835-pm-wdog.txt
+++ b/Documentation/devicetree/bindings/watchdog/brcm,bcm2835-pm-wdog.txt
@@ -2,7 +2,8 @@ BCM2835 Watchdog timer

 Required properties:

-- compatible : should be "brcm,bcm2835-pm-wdt"
+- compatible : should be "brcm,raspberrypi-pm-wdt" for the Raspberry Pi and
+	       "brcm,bcm2835-pm-wdt" for others.
 - reg : Specifies base physical address and size of the registers.

 Optional properties:
--
2.2.2

--
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]


#1164627 — [PATCH v2 2/3] watchdog: bcm2835: Add poweroff code for the Raspberry Pi

FromNoralf Trønnes <noralf@tronnes.org>
Date2015-06-13 13:50 +0200
Subject[PATCH v2 2/3] watchdog: bcm2835: Add poweroff code for the Raspberry Pi
Message-ID<pAS6K-3r0-11@gated-at.bofh.it>
In reply to#1164626
This adds a new poweroff function to the watchdog driver for the
Raspberry Pi. Currently poweroff/halt results in a reboot.

The Raspberry Pi firmware uses the RSTS register to know which
partiton to boot from. The partiton value is spread into bits
0, 2, 4, 6, 8, 10. Partiton 63 is a special partition used by
the firmware to indicate halt.

The firmware made this change in 19 Aug 2013 and was matched
by the downstream commit:
Changes for new NOOBS multi partition booting from gsh

Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
Acked-by: Guenter Roeck <linux@roeck-us.net>
---
 drivers/watchdog/bcm2835_wdt.c | 38 ++++++++++++++++++++++++++++++++++----
 1 file changed, 34 insertions(+), 4 deletions(-)

diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
index 7116968..fdf0d7d 100644
--- a/drivers/watchdog/bcm2835_wdt.c
+++ b/drivers/watchdog/bcm2835_wdt.c
@@ -36,6 +36,13 @@
 #define PM_RSTC_WRCFG_FULL_RESET	0x00000020
 #define PM_RSTC_RESET			0x00000102
 
+/*
+ * The Raspberry Pi firmware uses the RSTS register to know which partiton
+ * to boot from. The partiton value is spread into bits 0, 2, 4, 6, 8, 10.
+ * Partiton 63 is a special partition used by the firmware to indicate halt.
+ */
+#define PM_RSTS_RASPBERRYPI_HALT	0x555
+
 #define SECS_TO_WDOG_TICKS(x) ((x) << 16)
 #define WDOG_TICKS_TO_SECS(x) ((x) >> 16)
 
@@ -159,6 +166,24 @@ static void bcm2835_power_off(void)
 	bcm2835_restart(&wdt->restart_handler, REBOOT_HARD, NULL);
 }
 
+static void rpi_power_off(void)
+{
+	struct device_node *np =
+		of_find_compatible_node(NULL, NULL, "brcm,raspberrypi-pm-wdt");
+	struct platform_device *pdev = of_find_device_by_node(np);
+	struct bcm2835_wdt *wdt = platform_get_drvdata(pdev);
+	u32 val;
+
+	val = readl_relaxed(wdt->base + PM_RSTS);
+	val |= PM_PASSWORD | PM_RSTS_RASPBERRYPI_HALT;
+	writel_relaxed(val, wdt->base + PM_RSTS);
+
+	/* Continue with normal reset mechanism */
+	bcm2835_restart(&wdt->restart_handler, REBOOT_HARD, NULL);
+}
+
+static const struct of_device_id bcm2835_wdt_of_match[];
+
 static int bcm2835_wdt_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -192,8 +217,12 @@ static int bcm2835_wdt_probe(struct platform_device *pdev)
 	wdt->restart_handler.notifier_call = bcm2835_restart;
 	wdt->restart_handler.priority = 128;
 	register_restart_handler(&wdt->restart_handler);
-	if (pm_power_off == NULL)
-		pm_power_off = bcm2835_power_off;
+	if (!pm_power_off) {
+		const struct of_device_id *match;
+
+		match = of_match_node(bcm2835_wdt_of_match, pdev->dev.of_node);
+		pm_power_off = match->data;
+	}
 
 	dev_info(dev, "Broadcom BCM2835 watchdog timer");
 	return 0;
@@ -204,7 +233,7 @@ static int bcm2835_wdt_remove(struct platform_device *pdev)
 	struct bcm2835_wdt *wdt = platform_get_drvdata(pdev);
 
 	unregister_restart_handler(&wdt->restart_handler);
-	if (pm_power_off == bcm2835_power_off)
+	if (pm_power_off == bcm2835_power_off || pm_power_off == rpi_power_off)
 		pm_power_off = NULL;
 	watchdog_unregister_device(&bcm2835_wdt_wdd);
 	iounmap(wdt->base);
@@ -218,7 +247,8 @@ static void bcm2835_wdt_shutdown(struct platform_device *pdev)
 }
 
 static const struct of_device_id bcm2835_wdt_of_match[] = {
-	{ .compatible = "brcm,bcm2835-pm-wdt", },
+	{ .compatible = "brcm,bcm2835-pm-wdt", .data = bcm2835_power_off },
+	{ .compatible = "brcm,raspberrypi-pm-wdt", .data = rpi_power_off },
 	{},
 };
 MODULE_DEVICE_TABLE(of, bcm2835_wdt_of_match);
-- 
2.2.2

--
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]


#1164628 — [PATCH v2 3/3] ARM: dts: bcm2835-rpi: Add "brcm,raspberrypi-pm-wdt" to wdt compatible

FromNoralf Trønnes <noralf@tronnes.org>
Date2015-06-13 13:50 +0200
Subject[PATCH v2 3/3] ARM: dts: bcm2835-rpi: Add "brcm,raspberrypi-pm-wdt" to wdt compatible
Message-ID<pAS6K-3r0-15@gated-at.bofh.it>
In reply to#1164626
The Raspberry Pi uses a new value for halt in the PM_RSTS watchdog
register. Expand the compatible string to cover this.

Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
---
 arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 ++++
 arch/arm/boot/dts/bcm2835.dtsi     | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi
index 46780bb..feb1282 100644
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
@@ -16,6 +16,10 @@
 	};
 };
 
+&watchdog {
+	compatible = "brcm,raspberrypi-pm-wdt", "brcm,bcm2835-pm-wdt";
+};
+
 &gpio {
 	pinctrl-names = "default";
 
diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi
index 301c73f..3445bb3 100644
--- a/arch/arm/boot/dts/bcm2835.dtsi
+++ b/arch/arm/boot/dts/bcm2835.dtsi
@@ -52,7 +52,7 @@
 			#interrupt-cells = <2>;
 		};
 
-		watchdog@7e100000 {
+		watchdog: watchdog@7e100000 {
 			compatible = "brcm,bcm2835-pm-wdt";
 			reg = <0x7e100000 0x28>;
 		};
-- 
2.2.2

--
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