This repository has been archived by the owner on Jun 28, 2021. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bcm2835: add patches from https://github.com/hackerspace/rpi-linux/co…
- Loading branch information
Showing
19 changed files
with
15,513 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
277 changes: 277 additions & 0 deletions
277
patches/bcm2835/20_watchdog__Add_Broadcom_BCM2835_watchdog_timer_driver.patch.already_there
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,277 @@ | ||
From 8e112dc718cdc933d5ce0ea9ce29ba73c5ef3041 Mon Sep 17 00:00:00 2001 | ||
From: Lubomir Rintel <lkundrak@v3.sk> | ||
Date: Sat, 23 Mar 2013 05:07:49 +0100 | ||
Subject: [PATCH] watchdog: Add Broadcom BCM2835 watchdog timer driver | ||
|
||
This adds a driver for watchdog timer hardware present on Broadcom BCM2835 SoC, | ||
used in Raspberry Pi and Roku 2 devices. | ||
|
||
Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> | ||
Signed-off-by: Dom Cobley <popcornmix@gmail.com> | ||
Tested-by: Stephen Warren <swarren@wwwdotorg.org> | ||
Cc: Stephen Warren <swarren@wwwdotorg.org> | ||
Cc: Wim Van Sebroeck <wim@iguana.be> | ||
Cc: Guenter Roeck <linux@roeck-us.net> | ||
Cc: linux-rpi-kernel@lists.infradead.org | ||
Cc: linux-watchdog@vger.kernel.org | ||
Cc: devicetree-discuss@lists.ozlabs.org | ||
--- | ||
.../bindings/watchdog/brcm,bcm2835-pm-wdog.txt | 5 + | ||
drivers/watchdog/Kconfig | 11 ++ | ||
drivers/watchdog/Makefile | 1 + | ||
drivers/watchdog/bcm2835_wdt.c | 190 +++++++++++++++++++++ | ||
4 files changed, 207 insertions(+) | ||
create mode 100644 drivers/watchdog/bcm2835_wdt.c | ||
|
||
diff --git a/Documentation/devicetree/bindings/watchdog/brcm,bcm2835-pm-wdog.txt b/Documentation/devicetree/bindings/watchdog/brcm,bcm2835-pm-wdog.txt | ||
index d209366..f801d71 100644 | ||
--- a/Documentation/devicetree/bindings/watchdog/brcm,bcm2835-pm-wdog.txt | ||
+++ b/Documentation/devicetree/bindings/watchdog/brcm,bcm2835-pm-wdog.txt | ||
@@ -5,9 +5,14 @@ Required properties: | ||
- compatible : should be "brcm,bcm2835-pm-wdt" | ||
- reg : Specifies base physical address and size of the registers. | ||
|
||
+Optional properties: | ||
+ | ||
+- timeout-sec : Contains the watchdog timeout in seconds | ||
+ | ||
Example: | ||
|
||
watchdog { | ||
compatible = "brcm,bcm2835-pm-wdt"; | ||
reg = <0x7e100000 0x28>; | ||
+ timeout-sec = <10>; | ||
}; | ||
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig | ||
index e89fc31..c3d3b16 100644 | ||
--- a/drivers/watchdog/Kconfig | ||
+++ b/drivers/watchdog/Kconfig | ||
@@ -1098,6 +1098,17 @@ config BCM63XX_WDT | ||
To compile this driver as a loadable module, choose M here. | ||
The module will be called bcm63xx_wdt. | ||
|
||
+config BCM2835_WDT | ||
+ tristate "Broadcom BCM2835 hardware watchdog" | ||
+ depends on ARCH_BCM2835 | ||
+ select WATCHDOG_CORE | ||
+ help | ||
+ Watchdog driver for the built in watchdog hardware in Broadcom | ||
+ BCM2835 SoC. | ||
+ | ||
+ To compile this driver as a loadable module, choose M here. | ||
+ The module will be called bcm2835_wdt. | ||
+ | ||
config LANTIQ_WDT | ||
tristate "Lantiq SoC watchdog" | ||
depends on LANTIQ | ||
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile | ||
index a300b94..1bf5675 100644 | ||
--- a/drivers/watchdog/Makefile | ||
+++ b/drivers/watchdog/Makefile | ||
@@ -54,6 +54,7 @@ obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o | ||
obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o | ||
obj-$(CONFIG_UX500_WATCHDOG) += ux500_wdt.o | ||
obj-$(CONFIG_RETU_WATCHDOG) += retu_wdt.o | ||
+obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o | ||
|
||
# AVR32 Architecture | ||
obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o | ||
diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c | ||
new file mode 100644 | ||
index 0000000..a039d18 | ||
--- /dev/null | ||
+++ b/drivers/watchdog/bcm2835_wdt.c | ||
@@ -0,0 +1,190 @@ | ||
+/* | ||
+ * Watchdog driver for Broadcom BCM2835 | ||
+ * | ||
+ * Interface to the Broadcom BCM2835 watchdog timer hardware is based on | ||
+ * "bcm2708_wdog" driver written by Luke Diamand that was obtained from branch | ||
+ * "rpi-3.6.y" of git://github.com/raspberrypi/linux.git | ||
+ * | ||
+ * (c) Copyright 2010 Broadcom Europe Ltd | ||
+ * Copyright (C) 2013 Lubomir Rintel <lkundrak@v3.sk> | ||
+ * | ||
+ * This program is free software; you can redistribute it and/or | ||
+ * modify it under the terms of the GNU General Public License | ||
+ * as published by the Free Software Foundation; either version | ||
+ * 2 of the License, or (at your option) any later version. | ||
+ */ | ||
+ | ||
+#include <linux/types.h> | ||
+#include <linux/module.h> | ||
+#include <linux/io.h> | ||
+#include <linux/watchdog.h> | ||
+#include <linux/platform_device.h> | ||
+#include <linux/of_address.h> | ||
+#include <linux/miscdevice.h> | ||
+ | ||
+#define PM_RSTC 0x1c | ||
+#define PM_WDOG 0x24 | ||
+ | ||
+#define PM_PASSWORD 0x5a000000 | ||
+ | ||
+#define PM_WDOG_TIME_SET 0x000fffff | ||
+#define PM_RSTC_WRCFG_CLR 0xffffffcf | ||
+#define PM_RSTC_WRCFG_SET 0x00000030 | ||
+#define PM_RSTC_WRCFG_FULL_RESET 0x00000020 | ||
+#define PM_RSTC_RESET 0x00000102 | ||
+ | ||
+#define SECS_TO_WDOG_TICKS(x) ((x) << 16) | ||
+#define WDOG_TICKS_TO_SECS(x) ((x) >> 16) | ||
+ | ||
+struct bcm2835_wdt { | ||
+ void __iomem *base; | ||
+ spinlock_t lock; | ||
+}; | ||
+ | ||
+static unsigned int heartbeat; | ||
+static bool nowayout = WATCHDOG_NOWAYOUT; | ||
+ | ||
+static int bcm2835_wdt_start(struct watchdog_device *wdog) | ||
+{ | ||
+ struct bcm2835_wdt *wdt = watchdog_get_drvdata(wdog); | ||
+ uint32_t cur; | ||
+ unsigned long flags; | ||
+ | ||
+ spin_lock_irqsave(&wdt->lock, flags); | ||
+ | ||
+ writel_relaxed(PM_PASSWORD | (SECS_TO_WDOG_TICKS(wdog->timeout) & | ||
+ PM_WDOG_TIME_SET), wdt->base + PM_WDOG); | ||
+ cur = readl_relaxed(wdt->base + PM_RSTC); | ||
+ writel_relaxed(PM_PASSWORD | (cur & PM_RSTC_WRCFG_CLR) | | ||
+ PM_RSTC_WRCFG_FULL_RESET, wdt->base + PM_RSTC); | ||
+ | ||
+ spin_unlock_irqrestore(&wdt->lock, flags); | ||
+ | ||
+ return 0; | ||
+} | ||
+ | ||
+static int bcm2835_wdt_stop(struct watchdog_device *wdog) | ||
+{ | ||
+ struct bcm2835_wdt *wdt = watchdog_get_drvdata(wdog); | ||
+ | ||
+ writel_relaxed(PM_PASSWORD | PM_RSTC_RESET, wdt->base + PM_RSTC); | ||
+ dev_info(wdog->dev, "Watchdog timer stopped"); | ||
+ return 0; | ||
+} | ||
+ | ||
+static int bcm2835_wdt_set_timeout(struct watchdog_device *wdog, unsigned int t) | ||
+{ | ||
+ wdog->timeout = t; | ||
+ return 0; | ||
+} | ||
+ | ||
+static unsigned int bcm2835_wdt_get_timeleft(struct watchdog_device *wdog) | ||
+{ | ||
+ struct bcm2835_wdt *wdt = watchdog_get_drvdata(wdog); | ||
+ | ||
+ uint32_t ret = readl_relaxed(wdt->base + PM_WDOG); | ||
+ return WDOG_TICKS_TO_SECS(ret & PM_WDOG_TIME_SET); | ||
+} | ||
+ | ||
+static struct watchdog_ops bcm2835_wdt_ops = { | ||
+ .owner = THIS_MODULE, | ||
+ .start = bcm2835_wdt_start, | ||
+ .stop = bcm2835_wdt_stop, | ||
+ .set_timeout = bcm2835_wdt_set_timeout, | ||
+ .get_timeleft = bcm2835_wdt_get_timeleft, | ||
+}; | ||
+ | ||
+static struct watchdog_info bcm2835_wdt_info = { | ||
+ .options = WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE | | ||
+ WDIOF_KEEPALIVEPING, | ||
+ .identity = "Broadcom BCM2835 Watchdog timer", | ||
+}; | ||
+ | ||
+static struct watchdog_device bcm2835_wdt_wdd = { | ||
+ .info = &bcm2835_wdt_info, | ||
+ .ops = &bcm2835_wdt_ops, | ||
+ .min_timeout = 1, | ||
+ .max_timeout = WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET), | ||
+ .timeout = WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET), | ||
+}; | ||
+ | ||
+static int bcm2835_wdt_probe(struct platform_device *pdev) | ||
+{ | ||
+ struct device *dev = &pdev->dev; | ||
+ struct device_node *np = dev->of_node; | ||
+ struct bcm2835_wdt *wdt; | ||
+ int err; | ||
+ | ||
+ wdt = devm_kzalloc(dev, sizeof(struct bcm2835_wdt), GFP_KERNEL); | ||
+ if (!wdt) { | ||
+ dev_err(dev, "Failed to allocate memory for watchdog device"); | ||
+ return -ENOMEM; | ||
+ } | ||
+ platform_set_drvdata(pdev, wdt); | ||
+ | ||
+ spin_lock_init(&wdt->lock); | ||
+ | ||
+ wdt->base = of_iomap(np, 0); | ||
+ if (!wdt->base) { | ||
+ dev_err(dev, "Failed to remap watchdog regs"); | ||
+ return -ENODEV; | ||
+ } | ||
+ | ||
+ watchdog_set_drvdata(&bcm2835_wdt_wdd, wdt); | ||
+ watchdog_init_timeout(&bcm2835_wdt_wdd, heartbeat, dev); | ||
+ watchdog_set_nowayout(&bcm2835_wdt_wdd, nowayout); | ||
+ err = watchdog_register_device(&bcm2835_wdt_wdd); | ||
+ if (err) { | ||
+ dev_err(dev, "Failed to register watchdog device"); | ||
+ iounmap(wdt->base); | ||
+ return err; | ||
+ } | ||
+ | ||
+ dev_info(dev, "Broadcom BCM2835 watchdog timer"); | ||
+ return 0; | ||
+} | ||
+ | ||
+static int bcm2835_wdt_remove(struct platform_device *pdev) | ||
+{ | ||
+ struct bcm2835_wdt *wdt = platform_get_drvdata(pdev); | ||
+ | ||
+ watchdog_unregister_device(&bcm2835_wdt_wdd); | ||
+ iounmap(wdt->base); | ||
+ | ||
+ return 0; | ||
+} | ||
+ | ||
+static void bcm2835_wdt_shutdown(struct platform_device *pdev) | ||
+{ | ||
+ bcm2835_wdt_stop(&bcm2835_wdt_wdd); | ||
+} | ||
+ | ||
+static const struct of_device_id bcm2835_wdt_of_match[] = { | ||
+ { .compatible = "brcm,bcm2835-pm-wdt", }, | ||
+ {}, | ||
+}; | ||
+MODULE_DEVICE_TABLE(of, bcm2835_wdt_of_match); | ||
+ | ||
+static struct platform_driver bcm2835_wdt_driver = { | ||
+ .probe = bcm2835_wdt_probe, | ||
+ .remove = bcm2835_wdt_remove, | ||
+ .shutdown = bcm2835_wdt_shutdown, | ||
+ .driver = { | ||
+ .name = "bcm2835-wdt", | ||
+ .owner = THIS_MODULE, | ||
+ .of_match_table = bcm2835_wdt_of_match, | ||
+ }, | ||
+}; | ||
+module_platform_driver(bcm2835_wdt_driver); | ||
+ | ||
+module_param(heartbeat, uint, 0); | ||
+MODULE_PARM_DESC(heartbeat, "Initial watchdog heartbeat in seconds"); | ||
+ | ||
+module_param(nowayout, bool, 0); | ||
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" | ||
+ __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | ||
+ | ||
+MODULE_AUTHOR("Lubomir Rintel <lkundrak@v3.sk>"); | ||
+MODULE_DESCRIPTION("Driver for Broadcom BCM2835 watchdog timer"); | ||
+MODULE_LICENSE("GPL"); | ||
+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | ||
-- | ||
1.8.4 | ||
|
32 changes: 32 additions & 0 deletions
32
patches/bcm2835/21_arm__Add_Broadcom_BCM2835_watchdog_timer_driver_to.patch.already_there
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
From e66e0c36f7a225a72cb258d0593d2fcb8ec1cc03 Mon Sep 17 00:00:00 2001 | ||
From: Lubomir Rintel <lkundrak@v3.sk> | ||
Date: Sat, 23 Mar 2013 05:11:28 +0100 | ||
Subject: [PATCH] arm: Add Broadcom BCM2835 watchdog timer driver to | ||
bcm2835_defconfig | ||
|
||
This enables a driver for watchdog timer hardware present on Broadcom BCM2835 SoC, | ||
used in Raspberry Pi and Roku 2 devices. | ||
|
||
Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> | ||
Cc: Stephen Warren <swarren@wwwdotorg.org> | ||
Cc: linux-rpi-kernel@lists.infradead.org | ||
--- | ||
arch/arm/configs/bcm2835_defconfig | 2 ++ | ||
1 file changed, 2 insertions(+) | ||
|
||
diff --git a/arch/arm/configs/bcm2835_defconfig b/arch/arm/configs/bcm2835_defconfig | ||
index ce98721..0347cbb 100644 | ||
--- a/arch/arm/configs/bcm2835_defconfig | ||
+++ b/arch/arm/configs/bcm2835_defconfig | ||
@@ -70,6 +70,8 @@ CONFIG_SPI=y | ||
CONFIG_SPI_BCM2835=y | ||
CONFIG_GPIO_SYSFS=y | ||
# CONFIG_HWMON is not set | ||
+CONFIG_WATCHDOG=y | ||
+CONFIG_BCM2835_WDT=y | ||
# CONFIG_USB_SUPPORT is not set | ||
CONFIG_MMC=y | ||
CONFIG_MMC_SDHCI=y | ||
-- | ||
1.8.4 | ||
|
38 changes: 38 additions & 0 deletions
38
patches/bcm2835/30_WIP__bcm2835__Add_Broadcom_BCM2835_mailbox_to_the_device_tree.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
From e9449e7fa704c96b3281fdc5ef055e9afa04e9d4 Mon Sep 17 00:00:00 2001 | ||
From: Lubomir Rintel <lkundrak@v3.sk> | ||
Date: Wed, 27 Mar 2013 17:48:44 +0100 | ||
Subject: [PATCH] WIP: bcm2835: Add Broadcom BCM2835 mailbox to the device tree | ||
|
||
This adds a device tree binding for mailbox IPC mechanism present on Broadcom | ||
BCM2835 SoC, used in Raspberry Pi and Roku 2 devices. | ||
|
||
Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> | ||
Signed-off-by: Dom Cobley <popcornmix@gmail.com> | ||
Cc: Stephen Warren <swarren@wwwdotorg.org> | ||
Cc: linux-rpi-kernel@lists.infradead.org | ||
Cc: devicetree-discuss@lists.ozlabs.org | ||
Cc: linux-arm-kernel@lists.infradead.org | ||
--- | ||
arch/arm/boot/dts/bcm2835.dtsi | 6 ++++++ | ||
1 file changed, 6 insertions(+) | ||
|
||
diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi | ||
index 1e12aef..7b58e0e 100644 | ||
--- a/arch/arm/boot/dts/bcm2835.dtsi | ||
+++ b/arch/arm/boot/dts/bcm2835.dtsi | ||
@@ -29,6 +29,12 @@ | ||
#interrupt-cells = <2>; | ||
}; | ||
|
||
+ mailbox: mailbox { | ||
+ compatible = "brcm,bcm2835-mbox"; | ||
+ reg = <0x7e00b880 0x40>; | ||
+ interrupts = <0 1>; | ||
+ }; | ||
+ | ||
watchdog { | ||
compatible = "brcm,bcm2835-pm-wdt"; | ||
reg = <0x7e100000 0x28>; | ||
-- | ||
1.8.4 | ||
|
31 changes: 31 additions & 0 deletions
31
...hes/bcm2835/31__fixed__WIP__arm__Add_Broadcom_BCM2835_mailbox_to__bcm2835_defconfig.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
From 5daa02bf6e05f573fc0565ccad9fe0ebf29f3bfb Mon Sep 17 00:00:00 2001 | ||
From: Lubomir Rintel <lkundrak@v3.sk> | ||
Date: Sun, 7 Apr 2013 19:25:39 +0200 | ||
Subject: [PATCH] WIP: arm: Add Broadcom BCM2835 mailbox to bcm2835_defconfig | ||
|
||
This enables a driver for mailbox IPC mechanism present on Broadcom BCM2835 | ||
SoC, used in Raspberry Pi and Roku 2 devices. | ||
|
||
Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> | ||
Cc: Stephen Warren <swarren@wwwdotorg.org> | ||
Cc: linux-rpi-kernel@lists.infradead.org | ||
--- | ||
arch/arm/configs/bcm2835_defconfig | 2 ++ | ||
1 file changed, 2 insertions(+) | ||
|
||
diff --git a/arch/arm/configs/bcm2835_defconfig b/arch/arm/configs/bcm2835_defconfig | ||
index 0347cbb..c5be2ab 100644 | ||
--- a/arch/arm/configs/bcm2835_defconfig | ||
+++ b/arch/arm/configs/bcm2835_defconfig | ||
@@ -77,6 +77,8 @@ CONFIG_MMC=y | ||
CONFIG_MMC_SDHCI=y | ||
CONFIG_MMC_SDHCI_PLTFM=y | ||
CONFIG_MMC_SDHCI_BCM2835=y | ||
+CONFIG_MAILBOX=y | ||
+CONFIG_BCM2835_MBOX=y | ||
CONFIG_NEW_LEDS=y | ||
CONFIG_LEDS_CLASS=y | ||
CONFIG_LEDS_GPIO=y | ||
-- | ||
1.8.4 | ||
|
Oops, something went wrong.