From: Felix Fietkau Date: Sat, 11 Feb 2017 13:26:36 +0000 (+0100) Subject: cns3xxx: add back watchdog support X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=73ea3c3f9c45d28b2309342ad358ab6b46365aa6;p=lede.git cns3xxx: add back watchdog support Signed-off-by: Felix Fietkau --- diff --git a/target/linux/cns3xxx/config-4.9 b/target/linux/cns3xxx/config-4.9 index e7a03c32aa..ff2f28f17b 100644 --- a/target/linux/cns3xxx/config-4.9 +++ b/target/linux/cns3xxx/config-4.9 @@ -1,5 +1,4 @@ CONFIG_ALIGNMENT_TRAP=y -# CONFIG_ARCH_ASPEED is not set CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_ARCH_CNS3XXX=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y @@ -14,7 +13,6 @@ CONFIG_ARCH_MULTIPLATFORM=y CONFIG_ARCH_MULTI_V6=y CONFIG_ARCH_MULTI_V6_V7=y CONFIG_ARCH_NR_GPIO=0 -# CONFIG_ARCH_OMAP2 is not set # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y @@ -24,7 +22,6 @@ CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y -# CONFIG_ARCH_WM8750 is not set CONFIG_ARM=y # CONFIG_ARM_CPU_SUSPEND is not set CONFIG_ARM_GIC=y @@ -86,7 +83,6 @@ CONFIG_DTC=y CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y CONFIG_EEPROM_AT24=y -# CONFIG_EFI is not set CONFIG_FIQ=y CONFIG_FIXED_PHY=y CONFIG_FIX_EARLYCON_MEM=y @@ -109,7 +105,6 @@ CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GLOB=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_IRQCHIP=y -# CONFIG_GPIO_MPC8XXX is not set CONFIG_GPIO_PCA953X=y CONFIG_GPIO_PCA953X_IRQ=y CONFIG_GPIO_SYSFS=y @@ -160,7 +155,6 @@ CONFIG_HAVE_SMP=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_UID16=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y -# CONFIG_HISI_FEMAC is not set CONFIG_HWMON=y CONFIG_HZ_FIXED=0 CONFIG_HZ_PERIODIC=y @@ -175,7 +169,6 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_IRQ_WORK=y -CONFIG_LCD_DOGM132=y CONFIG_LEDS_GPIO=y # CONFIG_LEDS_TRIGGER_MTD is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set @@ -186,8 +179,6 @@ CONFIG_LZO_DECOMPRESS=y # CONFIG_MACH_CNS3420VB is not set CONFIG_MACH_GW2388=y CONFIG_MDIO_BOARDINFO=y -# CONFIG_MDIO_HISI_FEMAC is not set -# CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_MAX77620 is not set CONFIG_MIGHT_HAVE_CACHE_L2X0=y CONFIG_MIGHT_HAVE_PCI=y @@ -199,6 +190,7 @@ CONFIG_MMC_SDHCI_CNS3XXX=y CONFIG_MMC_SDHCI_PLTFM=y # CONFIG_MMC_TIFM_SD is not set CONFIG_MODULES_USE_ELF_REL=y +CONFIG_MPCORE_WATCHDOG=y CONFIG_MTD_M25P80=y # CONFIG_MTD_OF_PARTS is not set CONFIG_MTD_PHYSMAP=y @@ -246,8 +238,6 @@ CONFIG_PL310_ERRATA_753970=y CONFIG_PL310_ERRATA_769419=y CONFIG_PPS=y CONFIG_PPS_CLIENT_GPIO=y -CONFIG_PWRSEQ_EMMC=y -CONFIG_PWRSEQ_SIMPLE=y CONFIG_RAID_ATTRS=y CONFIG_RATIONAL=y CONFIG_RCU_STALL_COMMON=y @@ -308,6 +298,7 @@ CONFIG_USB_SUPPORT=y CONFIG_USE_OF=y CONFIG_VECTORS_BASE=0xffff0000 CONFIG_VFP=y +CONFIG_WATCHDOG_CORE=y CONFIG_WATCHDOG_NOWAYOUT=y CONFIG_XPS=y CONFIG_XZ_DEC_ARM=y diff --git a/target/linux/cns3xxx/patches-4.9/020-watchdog_support.patch b/target/linux/cns3xxx/patches-4.9/020-watchdog_support.patch index 74ffcc34bf..8707bf9b6c 100644 --- a/target/linux/cns3xxx/patches-4.9/020-watchdog_support.patch +++ b/target/linux/cns3xxx/patches-4.9/020-watchdog_support.patch @@ -1,59 +1,150 @@ -1. Made the connection between CNS3xxx SOCs(ARCH_CNS3xxx) and MPcore watchdog - since the CNS3xxx SOCs have ARM11 MPcore CPU. -2. Enable mpcore_watchdog option as module to default configuration at - arch/arm/configs/cns3420vb_defconfig. - -Signed-off-by: Tommy Lin +Add a watchdog driver for ARM MPcore processors. +Signed-off-by: Felix Fietkau --- -arch/arm/Kconfig | 1 + - arch/arm/configs/cns3420vb_defconfig | 2 ++ - arch/arm/mach-cns3xxx/cns3420vb.c | 22 ++++++++++++++++++++++ - 3 files changed, 25 insertions(+), 0 deletions(-) - ---- a/arch/arm/configs/cns3420vb_defconfig -+++ b/arch/arm/configs/cns3420vb_defconfig -@@ -56,6 +56,8 @@ CONFIG_LEGACY_PTY_COUNT=16 - # CONFIG_HW_RANDOM is not set - # CONFIG_HWMON is not set - # CONFIG_VGA_CONSOLE is not set -+CONFIG_WATCHDOG=y -+CONFIG_MPCORE_WATCHDOG=m - # CONFIG_HID_SUPPORT is not set - # CONFIG_USB_SUPPORT is not set - CONFIG_MMC=y ---- a/arch/arm/mach-cns3xxx/cns3420vb.c -+++ b/arch/arm/mach-cns3xxx/cns3420vb.c -@@ -206,10 +206,32 @@ static struct platform_device cns3xxx_us - }, - }; +--- a/drivers/watchdog/Kconfig ++++ b/drivers/watchdog/Kconfig +@@ -324,6 +324,13 @@ config KS8695_WATCHDOG + Watchdog timer embedded into KS8695 processor. This will reboot your + system when the timeout is reached. -+/* Watchdog */ -+static struct resource cns3xxx_watchdog_resources[] = { -+ [0] = { -+ .start = CNS3XXX_TC11MP_TWD_BASE, -+ .end = CNS3XXX_TC11MP_TWD_BASE + PAGE_SIZE - 1, -+ .flags = IORESOURCE_MEM, -+ }, -+ [1] = { -+ .start = IRQ_LOCALWDOG, -+ .end = IRQ_LOCALWDOG, -+ .flags = IORESOURCE_IRQ, -+ } ++config MPCORE_WATCHDOG ++ tristate "MPcore watchdog" ++ depends on HAVE_ARM_TWD ++ select WATCHDOG_CORE ++ help ++ Watchdog timer embedded into the MPcore system ++ + config HAVE_S3C2410_WATCHDOG + bool + help +--- a/drivers/watchdog/Makefile ++++ b/drivers/watchdog/Makefile +@@ -47,6 +47,7 @@ obj-$(CONFIG_21285_WATCHDOG) += wdt285.o + obj-$(CONFIG_977_WATCHDOG) += wdt977.o + obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o + obj-$(CONFIG_KS8695_WATCHDOG) += ks8695_wdt.o ++obj-$(CONFIG_MPCORE_WATCHDOG) += mpcore_wdt.o + obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o + obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o + obj-$(CONFIG_SAMA5D4_WATCHDOG) += sama5d4_wdt.o +--- /dev/null ++++ b/drivers/watchdog/mpcore_wdt.c +@@ -0,0 +1,117 @@ ++/* ++ * Watchdog driver for ARM MPcore ++ * ++ * Copyright (C) 2017 Felix Fietkau ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static void __iomem *wdt_base; ++static int wdt_timeout = 60; ++ ++static int mpcore_wdt_keepalive(struct watchdog_device *wdd) ++{ ++ static int perturb; ++ u32 count; ++ ++ count = ioread32(wdt_base + TWD_WDOG_COUNTER); ++ count = (~0U - count) * HZ / 5; ++ count /= 256; /* prescale */ ++ count *= wdt_timeout; ++ ++ /* Reload register needs a different value on each refresh */ ++ count += perturb; ++ perturb = !perturb; ++ ++ iowrite32(count, wdt_base + TWD_WDOG_LOAD); ++ ++ return 0; ++} ++ ++static int mpcore_wdt_start(struct watchdog_device *wdd) ++{ ++ mpcore_wdt_keepalive(wdd); ++ ++ /* prescale = 256, mode = 1, enable = 1 */ ++ iowrite32(0x0000FF09, wdt_base + TWD_WDOG_CONTROL); ++ ++ return 0; ++} ++ ++static int mpcore_wdt_stop(struct watchdog_device *wdd) ++{ ++ iowrite32(0x12345678, wdt_base + TWD_WDOG_DISABLE); ++ iowrite32(0x87654321, wdt_base + TWD_WDOG_DISABLE); ++ iowrite32(0x0, wdt_base + TWD_WDOG_CONTROL); ++ ++ return 0; ++} ++ ++static int mpcore_wdt_set_timeout(struct watchdog_device *wdd, ++ unsigned int timeout) ++{ ++ mpcore_wdt_stop(wdd); ++ wdt_timeout = timeout; ++ mpcore_wdt_start(wdd); ++ ++ return 0; ++} ++ ++static const struct watchdog_info mpcore_wdt_info = { ++ .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, ++ .identity = "MPcore Watchdog", ++}; ++ ++static const struct watchdog_ops mpcore_wdt_ops = { ++ .owner = THIS_MODULE, ++ .start = mpcore_wdt_start, ++ .stop = mpcore_wdt_stop, ++ .ping = mpcore_wdt_keepalive, ++ .set_timeout = mpcore_wdt_set_timeout, ++}; ++ ++static struct watchdog_device mpcore_wdt = { ++ .info = &mpcore_wdt_info, ++ .ops = &mpcore_wdt_ops, ++ .min_timeout = 1, ++ .max_timeout = 65535, +}; + -+static struct platform_device cns3xxx_watchdog_device = { -+ .name = "mpcore_wdt", -+ .id = -1, -+ .num_resources = ARRAY_SIZE(cns3xxx_watchdog_resources), -+ .resource = cns3xxx_watchdog_resources, ++static int mpcore_wdt_probe(struct platform_device *pdev) ++{ ++ struct resource *res; ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) ++ return -ENODEV; ++ ++ wdt_base = devm_ioremap_resource(&pdev->dev, res); ++ if (IS_ERR(wdt_base)) ++ return PTR_ERR(wdt_base); ++ ++ watchdog_register_device(&mpcore_wdt); ++ return 0; ++} ++ ++static int mpcore_wdt_remove(struct platform_device *dev) ++{ ++ watchdog_unregister_device(&mpcore_wdt); ++ return 0; ++} ++ ++static struct platform_driver mpcore_wdt_driver = { ++ .probe = mpcore_wdt_probe, ++ .remove = mpcore_wdt_remove, ++ .driver = { ++ .name = "mpcore_wdt", ++ }, +}; + - /* - * Initialization - */ - static struct platform_device *cns3420_pdevs[] __initdata = { -+ &cns3xxx_watchdog_device, - &cns3420_nor_pdev, - &cns3xxx_usb_ehci_device, - &cns3xxx_usb_ohci_device, ++module_platform_driver(mpcore_wdt_driver); ++MODULE_AUTHOR("Felix Fietkau "); ++MODULE_LICENSE("GPL"); diff --git a/target/linux/cns3xxx/patches-4.9/095-gpio_support.patch b/target/linux/cns3xxx/patches-4.9/095-gpio_support.patch index bf896b48c8..76eb7f64c2 100644 --- a/target/linux/cns3xxx/patches-4.9/095-gpio_support.patch +++ b/target/linux/cns3xxx/patches-4.9/095-gpio_support.patch @@ -1,6 +1,6 @@ --- a/arch/arm/mach-cns3xxx/cns3420vb.c +++ b/arch/arm/mach-cns3xxx/cns3420vb.c -@@ -245,6 +245,10 @@ static void __init cns3420_init(void) +@@ -223,6 +223,10 @@ static void __init cns3420_init(void) cns3xxx_ahci_init(); cns3xxx_sdhci_init(); diff --git a/target/linux/cns3xxx/patches-4.9/097-l2x0_cmdline_disable.patch b/target/linux/cns3xxx/patches-4.9/097-l2x0_cmdline_disable.patch index 25d3005f00..3227840935 100644 --- a/target/linux/cns3xxx/patches-4.9/097-l2x0_cmdline_disable.patch +++ b/target/linux/cns3xxx/patches-4.9/097-l2x0_cmdline_disable.patch @@ -8,15 +8,15 @@ +static int cns3xxx_l2x0_enable = 1; + +static int __init cns3xxx_l2x0_disable(char *s) -+{ + { +- void __iomem *base = ioremap(CNS3XXX_L2C_BASE, SZ_4K); + cns3xxx_l2x0_enable = 0; + return 1; +} +__setup("nol2x0", cns3xxx_l2x0_disable); + +static int __init cns3xxx_l2x0_init(void) - { -- void __iomem *base = ioremap(CNS3XXX_L2C_BASE, SZ_4K); ++{ + void __iomem *base; u32 val; @@ -43,7 +43,7 @@ --- a/arch/arm/mach-cns3xxx/cns3420vb.c +++ b/arch/arm/mach-cns3xxx/cns3420vb.c -@@ -239,8 +239,6 @@ static struct platform_device *cns3420_p +@@ -217,8 +217,6 @@ static struct platform_device *cns3420_p static void __init cns3420_init(void) {