summaryrefslogtreecommitdiff
path: root/target/linux/ipq806x/patches-4.4/010-5-watchdog-qcom-add-option-for-standalone-watchdog-not-in-timer-block.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ipq806x/patches-4.4/010-5-watchdog-qcom-add-option-for-standalone-watchdog-not-in-timer-block.patch')
-rw-r--r--target/linux/ipq806x/patches-4.4/010-5-watchdog-qcom-add-option-for-standalone-watchdog-not-in-timer-block.patch162
1 files changed, 0 insertions, 162 deletions
diff --git a/target/linux/ipq806x/patches-4.4/010-5-watchdog-qcom-add-option-for-standalone-watchdog-not-in-timer-block.patch b/target/linux/ipq806x/patches-4.4/010-5-watchdog-qcom-add-option-for-standalone-watchdog-not-in-timer-block.patch
deleted file mode 100644
index 82dd875..0000000
--- a/target/linux/ipq806x/patches-4.4/010-5-watchdog-qcom-add-option-for-standalone-watchdog-not-in-timer-block.patch
+++ /dev/null
@@ -1,162 +0,0 @@
-From f0d9d0f4b44ae5503ea368e7f066b20f12ca1d37 Mon Sep 17 00:00:00 2001
-From: Matthew McClintock <mmcclint@codeaurora.org>
-Date: Wed, 29 Jun 2016 10:50:01 -0700
-Subject: watchdog: qcom: add option for standalone watchdog not in timer block
-
-Commit 0dfd582e026a ("watchdog: qcom: use timer devicetree
-binding") moved to use the watchdog as a subset timer
-register block. Some devices have the watchdog completely
-standalone with slightly different register offsets as
-well so let's account for the differences here.
-
-The existing "kpss-standalone" compatible string doesn't
-make it entirely clear exactly what the device is so
-rename to "kpss-wdt" to reflect watchdog timer
-functionality. Also update ipq4019 DTS with an SoC
-specific compatible.
-
-Signed-off-by: Matthew McClintock <mmcclint@codeaurora.org>
-Signed-off-by: Thomas Pedersen <twp@codeaurora.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>
----
- .../devicetree/bindings/watchdog/qcom-wdt.txt | 2 +
- arch/arm/boot/dts/qcom-ipq4019.dtsi | 2 +-
- drivers/watchdog/qcom-wdt.c | 64 ++++++++++++++++------
- 3 files changed, 51 insertions(+), 17 deletions(-)
-
---- a/drivers/watchdog/qcom-wdt.c
-+++ b/drivers/watchdog/qcom-wdt.c
-@@ -18,19 +18,42 @@
- #include <linux/of.h>
- #include <linux/platform_device.h>
- #include <linux/watchdog.h>
-+#include <linux/of_device.h>
-
--#define WDT_RST 0x38
--#define WDT_EN 0x40
--#define WDT_STS 0x44
--#define WDT_BITE_TIME 0x5C
-+enum wdt_reg {
-+ WDT_RST,
-+ WDT_EN,
-+ WDT_STS,
-+ WDT_BITE_TIME,
-+};
-+
-+static const u32 reg_offset_data_apcs_tmr[] = {
-+ [WDT_RST] = 0x38,
-+ [WDT_EN] = 0x40,
-+ [WDT_STS] = 0x44,
-+ [WDT_BITE_TIME] = 0x5C,
-+};
-+
-+static const u32 reg_offset_data_kpss[] = {
-+ [WDT_RST] = 0x4,
-+ [WDT_EN] = 0x8,
-+ [WDT_STS] = 0xC,
-+ [WDT_BITE_TIME] = 0x14,
-+};
-
- struct qcom_wdt {
- struct watchdog_device wdd;
- struct clk *clk;
- unsigned long rate;
- void __iomem *base;
-+ const u32 *layout;
- };
-
-+static void __iomem *wdt_addr(struct qcom_wdt *wdt, enum wdt_reg reg)
-+{
-+ return wdt->base + wdt->layout[reg];
-+}
-+
- static inline
- struct qcom_wdt *to_qcom_wdt(struct watchdog_device *wdd)
- {
-@@ -41,10 +64,10 @@ static int qcom_wdt_start(struct watchdo
- {
- struct qcom_wdt *wdt = to_qcom_wdt(wdd);
-
-- writel(0, wdt->base + WDT_EN);
-- writel(1, wdt->base + WDT_RST);
-- writel(wdd->timeout * wdt->rate, wdt->base + WDT_BITE_TIME);
-- writel(1, wdt->base + WDT_EN);
-+ writel(0, wdt_addr(wdt, WDT_EN));
-+ writel(1, wdt_addr(wdt, WDT_RST));
-+ writel(wdd->timeout * wdt->rate, wdt_addr(wdt, WDT_BITE_TIME));
-+ writel(1, wdt_addr(wdt, WDT_EN));
- return 0;
- }
-
-@@ -52,7 +75,7 @@ static int qcom_wdt_stop(struct watchdog
- {
- struct qcom_wdt *wdt = to_qcom_wdt(wdd);
-
-- writel(0, wdt->base + WDT_EN);
-+ writel(0, wdt_addr(wdt, WDT_EN));
- return 0;
- }
-
-@@ -60,7 +83,7 @@ static int qcom_wdt_ping(struct watchdog
- {
- struct qcom_wdt *wdt = to_qcom_wdt(wdd);
-
-- writel(1, wdt->base + WDT_RST);
-+ writel(1, wdt_addr(wdt, WDT_RST));
- return 0;
- }
-
-@@ -83,10 +106,10 @@ static int qcom_wdt_restart(struct watch
- */
- timeout = 128 * wdt->rate / 1000;
-
-- writel(0, wdt->base + WDT_EN);
-- writel(1, wdt->base + WDT_RST);
-- writel(timeout, wdt->base + WDT_BITE_TIME);
-- writel(1, wdt->base + WDT_EN);
-+ writel(0, wdt_addr(wdt, WDT_EN));
-+ writel(1, wdt_addr(wdt, WDT_RST));
-+ writel(timeout, wdt_addr(wdt, WDT_BITE_TIME));
-+ writel(1, wdt_addr(wdt, WDT_EN));
-
- /*
- * Actually make sure the above sequence hits hardware before sleeping.
-@@ -119,9 +142,16 @@ static int qcom_wdt_probe(struct platfor
- struct qcom_wdt *wdt;
- struct resource *res;
- struct device_node *np = pdev->dev.of_node;
-+ const u32 *regs;
- u32 percpu_offset;
- int ret;
-
-+ regs = of_device_get_match_data(&pdev->dev);
-+ if (!regs) {
-+ dev_err(&pdev->dev, "Unsupported QCOM WDT module\n");
-+ return -ENODEV;
-+ }
-+
- wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL);
- if (!wdt)
- return -ENOMEM;
-@@ -172,6 +202,7 @@ static int qcom_wdt_probe(struct platfor
- wdt->wdd.min_timeout = 1;
- wdt->wdd.max_timeout = 0x10000000U / wdt->rate;
- wdt->wdd.parent = &pdev->dev;
-+ wdt->layout = regs;
-
- if (readl(wdt->base + WDT_STS) & 1)
- wdt->wdd.bootstatus = WDIOF_CARDRESET;
-@@ -208,8 +239,9 @@ static int qcom_wdt_remove(struct platfo
- }
-
- static const struct of_device_id qcom_wdt_of_table[] = {
-- { .compatible = "qcom,kpss-timer" },
-- { .compatible = "qcom,scss-timer" },
-+ { .compatible = "qcom,kpss-timer", .data = reg_offset_data_apcs_tmr },
-+ { .compatible = "qcom,scss-timer", .data = reg_offset_data_apcs_tmr },
-+ { .compatible = "qcom,kpss-wdt", .data = reg_offset_data_kpss },
- { },
- };
- MODULE_DEVICE_TABLE(of, qcom_wdt_of_table);