From ea2d284082b5fdea1c398d846dbc83b3fd2d398d Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Sat, 21 Mar 2020 14:05:53 +0100 Subject: [PATCH] gemini: Add v5.4 kernel patches This adds the kernel patches needed for the Gemini. Just 7 patches, 5 of them are already upstream. Notably we incorperate the temperature sensor on the hard drive to drive temperature control of the NAS chassis. This is required for the DIR-685 which has no external temperature sensor. Signed-off-by: Linus Walleij [use the drivetemp package over the backport] Signed-off-by: Christian Lamparter --- ...t-fotg2-add-Gemini-specific-handling.patch | 131 ++++++++++++++++++ ...-DIR-685-partition-table-for-OpenWrt.patch | 37 +++++ ...0003-ARM-dts-gemini-Rename-IDE-nodes.patch | 117 ++++++++++++++++ ...s-gemini-Add-thermal-zone-to-DIR-685.patch | 101 ++++++++++++++ 4 files changed, 386 insertions(+) create mode 100644 target/linux/gemini/patches-5.4/0001-usb-host-fotg2-add-Gemini-specific-handling.patch create mode 100644 target/linux/gemini/patches-5.4/0002-ARM-dts-Augment-DIR-685-partition-table-for-OpenWrt.patch create mode 100644 target/linux/gemini/patches-5.4/0003-ARM-dts-gemini-Rename-IDE-nodes.patch create mode 100644 target/linux/gemini/patches-5.4/0004-ARM-dts-gemini-Add-thermal-zone-to-DIR-685.patch diff --git a/target/linux/gemini/patches-5.4/0001-usb-host-fotg2-add-Gemini-specific-handling.patch b/target/linux/gemini/patches-5.4/0001-usb-host-fotg2-add-Gemini-specific-handling.patch new file mode 100644 index 0000000000..4a6a804ca4 --- /dev/null +++ b/target/linux/gemini/patches-5.4/0001-usb-host-fotg2-add-Gemini-specific-handling.patch @@ -0,0 +1,131 @@ +From 3aaff88a0f5e154aa5a489d59fd4015a2a937c23 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Fri, 21 Apr 2017 22:19:00 +0200 +Subject: [PATCH 1/7] usb: host: fotg2: add Gemini-specific handling + +The Cortina Systems Gemini has bolted on a PHY inside the +silicon that can be handled by six bits in a MISC register in +the system controller. + +If we are running on Gemini, look up a syscon regmap through +a phandle and enable VBUS and optionally the Mini-B connector. + +If the device is flagged as "wakeup-source" using the standard +DT bindings, we also enable this in the global controller for +respective port. + +Signed-off-by: Linus Walleij +--- + drivers/usb/host/Kconfig | 1 + + drivers/usb/host/fotg210-hcd.c | 76 ++++++++++++++++++++++++++++++++++ + 2 files changed, 77 insertions(+) + +--- a/drivers/usb/host/Kconfig ++++ b/drivers/usb/host/Kconfig +@@ -363,6 +363,7 @@ config USB_ISP1362_HCD + config USB_FOTG210_HCD + tristate "FOTG210 HCD support" + depends on USB && HAS_DMA && HAS_IOMEM ++ select MFD_SYSCON + ---help--- + Faraday FOTG210 is an OTG controller which can be configured as + an USB2.0 host. It is designed to meet USB2.0 EHCI specification +--- a/drivers/usb/host/fotg210-hcd.c ++++ b/drivers/usb/host/fotg210-hcd.c +@@ -33,6 +33,10 @@ + #include + #include + #include ++#include ++/* For Cortina Gemini */ ++#include ++#include + + #include + #include +@@ -5558,6 +5562,72 @@ static void fotg210_init(struct fotg210_ + iowrite32(value, &fotg210->regs->otgcsr); + } + ++/* ++ * Gemini-specific initialization function, only executed on the ++ * Gemini SoC using the global misc control register. ++ */ ++#define GEMINI_GLOBAL_MISC_CTRL 0x30 ++#define GEMINI_MISC_USB0_WAKEUP BIT(14) ++#define GEMINI_MISC_USB1_WAKEUP BIT(15) ++#define GEMINI_MISC_USB0_VBUS_ON BIT(22) ++#define GEMINI_MISC_USB1_VBUS_ON BIT(23) ++#define GEMINI_MISC_USB0_MINI_B BIT(29) ++#define GEMINI_MISC_USB1_MINI_B BIT(30) ++ ++static int fotg210_gemini_init(struct device *dev, struct usb_hcd *hcd) ++{ ++ struct device_node *np = dev->of_node; ++ struct regmap *map; ++ bool mini_b; ++ bool wakeup; ++ u32 mask, val; ++ int ret; ++ ++ map = syscon_regmap_lookup_by_phandle(np, "syscon"); ++ if (IS_ERR(map)) { ++ dev_err(dev, "no syscon\n"); ++ return PTR_ERR(map); ++ } ++ mini_b = of_property_read_bool(np, "cortina,gemini-mini-b"); ++ wakeup = of_property_read_bool(np, "wakeup-source"); ++ ++ /* ++ * Figure out if this is USB0 or USB1 by simply checking the ++ * physical base address. ++ */ ++ mask = 0; ++ if (hcd->rsrc_start == 0x69000000) { ++ val = GEMINI_MISC_USB1_VBUS_ON; ++ if (mini_b) ++ val |= GEMINI_MISC_USB1_MINI_B; ++ else ++ mask |= GEMINI_MISC_USB1_MINI_B; ++ if (wakeup) ++ val |= GEMINI_MISC_USB1_WAKEUP; ++ else ++ mask |= GEMINI_MISC_USB1_WAKEUP; ++ } else { ++ val = GEMINI_MISC_USB0_VBUS_ON; ++ if (mini_b) ++ val |= GEMINI_MISC_USB0_MINI_B; ++ else ++ mask |= GEMINI_MISC_USB0_MINI_B; ++ if (wakeup) ++ val |= GEMINI_MISC_USB0_WAKEUP; ++ else ++ mask |= GEMINI_MISC_USB0_WAKEUP; ++ } ++ ++ ret = regmap_update_bits(map, GEMINI_GLOBAL_MISC_CTRL, mask, val); ++ if (ret) { ++ dev_err(dev, "failed to initialize Gemini PHY\n"); ++ return ret; ++ } ++ ++ dev_info(dev, "initialized Gemini PHY\n"); ++ return 0; ++} ++ + /** + * fotg210_hcd_probe - initialize faraday FOTG210 HCDs + * +@@ -5635,6 +5705,12 @@ static int fotg210_hcd_probe(struct plat + + fotg210_init(fotg210); + ++ if (of_device_is_compatible(dev->of_node, "cortina,gemini-usb")) { ++ retval = fotg210_gemini_init(dev, hcd); ++ if (retval) ++ goto failed_dis_clk; ++ } ++ + retval = usb_add_hcd(hcd, irq, IRQF_SHARED); + if (retval) { + dev_err(dev, "failed to add hcd with err %d\n", retval); diff --git a/target/linux/gemini/patches-5.4/0002-ARM-dts-Augment-DIR-685-partition-table-for-OpenWrt.patch b/target/linux/gemini/patches-5.4/0002-ARM-dts-Augment-DIR-685-partition-table-for-OpenWrt.patch new file mode 100644 index 0000000000..39dfd3d535 --- /dev/null +++ b/target/linux/gemini/patches-5.4/0002-ARM-dts-Augment-DIR-685-partition-table-for-OpenWrt.patch @@ -0,0 +1,37 @@ +From a2de8560885469f3d76c80207a669029e4fc8a45 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Mon, 11 Mar 2019 15:44:29 +0100 +Subject: [PATCH 2/7] ARM: dts: Augment DIR-685 partition table for OpenWrt + +Rename the firmware partition so that the firmware MTD +splitter will do its job, drop the rootfs arguments as +the MTD splitter will set this up automatically. + +Signed-off-by: Linus Walleij +--- + arch/arm/boot/dts/gemini-dlink-dir-685.dts | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/arch/arm/boot/dts/gemini-dlink-dir-685.dts ++++ b/arch/arm/boot/dts/gemini-dlink-dir-685.dts +@@ -20,7 +20,7 @@ + }; + + chosen { +- bootargs = "console=ttyS0,19200n8 root=/dev/sda1 rw rootwait consoleblank=300"; ++ bootargs = "console=ttyS0,19200n8 consoleblank=300"; + stdout-path = "uart0:19200n8"; + }; + +@@ -285,9 +285,9 @@ + * this is called "upgrade" on the vendor system. + */ + partition@40000 { +- label = "upgrade"; ++ compatible = "wrg"; ++ label = "firmware"; + reg = <0x00040000 0x01f40000>; +- read-only; + }; + /* RGDB, Residental Gateway Database? */ + partition@1f80000 { diff --git a/target/linux/gemini/patches-5.4/0003-ARM-dts-gemini-Rename-IDE-nodes.patch b/target/linux/gemini/patches-5.4/0003-ARM-dts-gemini-Rename-IDE-nodes.patch new file mode 100644 index 0000000000..6477b2d2a4 --- /dev/null +++ b/target/linux/gemini/patches-5.4/0003-ARM-dts-gemini-Rename-IDE-nodes.patch @@ -0,0 +1,117 @@ +From 9b95b301b219df19c20f4a563f1da6338b09b0d0 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Tue, 31 Dec 2019 18:14:28 +0100 +Subject: [PATCH 3/7] ARM: dts: gemini: Rename IDE nodes + +By renaming the ATA drive nodes to "ide@" we activate the +semantic checks to the DT schema for the controller and use +the correct notation for PATA drives. + +Signed-off-by: Linus Walleij +--- + arch/arm/boot/dts/gemini-dlink-dir-685.dts | 2 +- + arch/arm/boot/dts/gemini-dlink-dns-313.dts | 2 +- + arch/arm/boot/dts/gemini-nas4220b.dts | 4 ++-- + arch/arm/boot/dts/gemini-sl93512r.dts | 4 ++-- + arch/arm/boot/dts/gemini-sq201.dts | 2 +- + arch/arm/boot/dts/gemini.dtsi | 8 ++++++-- + 6 files changed, 13 insertions(+), 9 deletions(-) + +--- a/arch/arm/boot/dts/gemini-dlink-dir-685.dts ++++ b/arch/arm/boot/dts/gemini-dlink-dir-685.dts +@@ -443,7 +443,7 @@ + }; + }; + +- ata@63000000 { ++ ide@63000000 { + status = "okay"; + }; + +--- a/arch/arm/boot/dts/gemini-dlink-dns-313.dts ++++ b/arch/arm/boot/dts/gemini-dlink-dns-313.dts +@@ -297,7 +297,7 @@ + }; + }; + +- ata@63000000 { ++ ide@63000000 { + status = "okay"; + }; + }; +--- a/arch/arm/boot/dts/gemini-nas4220b.dts ++++ b/arch/arm/boot/dts/gemini-nas4220b.dts +@@ -170,11 +170,11 @@ + }; + }; + +- ata@63000000 { ++ ide@63000000 { + status = "okay"; + }; + +- ata@63400000 { ++ ide@63400000 { + status = "okay"; + }; + +--- a/arch/arm/boot/dts/gemini-sl93512r.dts ++++ b/arch/arm/boot/dts/gemini-sl93512r.dts +@@ -293,11 +293,11 @@ + }; + }; + +- ata@63000000 { ++ ide@63000000 { + status = "okay"; + }; + +- ata@63400000 { ++ ide@63400000 { + status = "okay"; + }; + +--- a/arch/arm/boot/dts/gemini-sq201.dts ++++ b/arch/arm/boot/dts/gemini-sq201.dts +@@ -289,7 +289,7 @@ + }; + }; + +- ata@63000000 { ++ ide@63000000 { + status = "okay"; + }; + +--- a/arch/arm/boot/dts/gemini.dtsi ++++ b/arch/arm/boot/dts/gemini.dtsi +@@ -356,7 +356,7 @@ + }; + }; + +- ata@63000000 { ++ ide@63000000 { + compatible = "cortina,gemini-pata", "faraday,ftide010"; + reg = <0x63000000 0x1000>; + interrupts = <4 IRQ_TYPE_EDGE_RISING>; +@@ -365,9 +365,11 @@ + clock-names = "PCLK"; + sata = <&sata>; + status = "disabled"; ++ #address-cells = <1>; ++ #size-cells = <0>; + }; + +- ata@63400000 { ++ ide@63400000 { + compatible = "cortina,gemini-pata", "faraday,ftide010"; + reg = <0x63400000 0x1000>; + interrupts = <5 IRQ_TYPE_EDGE_RISING>; +@@ -376,6 +378,8 @@ + clock-names = "PCLK"; + sata = <&sata>; + status = "disabled"; ++ #address-cells = <1>; ++ #size-cells = <0>; + }; + + dma-controller@67000000 { diff --git a/target/linux/gemini/patches-5.4/0004-ARM-dts-gemini-Add-thermal-zone-to-DIR-685.patch b/target/linux/gemini/patches-5.4/0004-ARM-dts-gemini-Add-thermal-zone-to-DIR-685.patch new file mode 100644 index 0000000000..5949b92be1 --- /dev/null +++ b/target/linux/gemini/patches-5.4/0004-ARM-dts-gemini-Add-thermal-zone-to-DIR-685.patch @@ -0,0 +1,101 @@ +From 2b2e9d0e1ee4765b21c648235489028c6dc7e336 Mon Sep 17 00:00:00 2001 +From: Linus Walleij +Date: Tue, 31 Dec 2019 18:18:08 +0100 +Subject: [PATCH 4/7] ARM: dts: gemini: Add thermal zone to DIR-685 + +The DIR-685 can now exploit the thermal zone added by the +drive temperature sensor inside the hard drive. We have +patched the libata subsystem to assign the device nodes +properly to the SCSI devices and this is what the drivetemp +driver will use to populate the sensor and the thermal +zone, so pick that up into the thermal zone and let this +control the fan. + +The hardware lacks an embedded temperature sensor so the +D-Link vendor firmware uses this method to control the +temperature of the NAS enclosure using the thermal sensor +inside the hard drive. + +The drive temperature trigger points to be used comes from +the vendor firmware. + +Signed-off-by: Linus Walleij +--- + arch/arm/boot/dts/gemini-dlink-dir-685.dts | 48 ++++++++++++++++++++-- + 1 file changed, 45 insertions(+), 3 deletions(-) + +--- a/arch/arm/boot/dts/gemini-dlink-dir-685.dts ++++ b/arch/arm/boot/dts/gemini-dlink-dir-685.dts +@@ -119,13 +119,11 @@ + + /* + * This is a Sunon Maglev GM0502PFV2-8 cooling fan @10000 RPM. +- * Since the platform has no temperature sensor, this is controlled +- * from userspace by using the hard disks S.M.A.R.T. temperature + * sensor. It is turned on when the temperature exceeds 46 degrees + * and turned off when the temperatures goes below 41 degrees + * (celsius). + */ +- gpio-fan { ++ fan0: gpio-fan { + compatible = "gpio-fan"; + /* Collides with IDE */ + gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>; +@@ -133,6 +131,40 @@ + #cooling-cells = <2>; + }; + ++ thermal-zones { ++ chassis-thermal { ++ /* Poll every 20 seconds */ ++ polling-delay = <20000>; ++ /* Poll every 2nd second when cooling */ ++ polling-delay-passive = <2000>; ++ /* Use the thermal sensor in the hard drive */ ++ thermal-sensors = <&drive0>; ++ ++ /* Tripping points from the fan.script in the rootfs */ ++ trips { ++ alert: chassis-alert { ++ /* At 43 degrees turn on the fan */ ++ temperature = <43000>; ++ hysteresis = <3000>; ++ type = "active"; ++ }; ++ crit: chassis-crit { ++ /* Just shut down at 60 degrees */ ++ temperature = <60000>; ++ hysteresis = <2000>; ++ type = "critical"; ++ }; ++ }; ++ ++ cooling-maps { ++ map0 { ++ trip = <&alert>; ++ cooling-device = <&fan0 1 1>; ++ }; ++ }; ++ }; ++ }; ++ + /* + * The touchpad input is connected to a GPIO bit-banged + * I2C bus. +@@ -445,6 +477,16 @@ + + ide@63000000 { + status = "okay"; ++ ++ /* ++ * This drive may have a temperature sensor with a ++ * thermal zone we can use for thermal control of the ++ * chassis temperature using the fan. ++ */ ++ drive0: ide-port@0 { ++ reg = <0>; ++ #thermal-sensor-cells = <0>; ++ }; + }; + + display-controller@6a000000 {