gemini: Add v5.4 kernel patches
authorLinus Walleij <linus.walleij@linaro.org>
Sat, 21 Mar 2020 13:05:53 +0000 (14:05 +0100)
committerChristian Lamparter <chunkeey@gmail.com>
Sat, 21 Mar 2020 16:50:43 +0000 (17:50 +0100)
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 <linus.walleij@linaro.org>
[use the drivetemp package over the backport]
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
target/linux/gemini/patches-5.4/0001-usb-host-fotg2-add-Gemini-specific-handling.patch [new file with mode: 0644]
target/linux/gemini/patches-5.4/0002-ARM-dts-Augment-DIR-685-partition-table-for-OpenWrt.patch [new file with mode: 0644]
target/linux/gemini/patches-5.4/0003-ARM-dts-gemini-Rename-IDE-nodes.patch [new file with mode: 0644]
target/linux/gemini/patches-5.4/0004-ARM-dts-gemini-Add-thermal-zone-to-DIR-685.patch [new file with mode: 0644]

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 (file)
index 0000000..4a6a804
--- /dev/null
@@ -0,0 +1,131 @@
+From 3aaff88a0f5e154aa5a489d59fd4015a2a937c23 Mon Sep 17 00:00:00 2001
+From: Linus Walleij <linus.walleij@linaro.org>
+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 <linus.walleij@linaro.org>
+---
+ 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 <linux/platform_device.h>
+ #include <linux/io.h>
+ #include <linux/clk.h>
++#include <linux/bitops.h>
++/* For Cortina Gemini */
++#include <linux/mfd/syscon.h>
++#include <linux/regmap.h>
+ #include <asm/byteorder.h>
+ #include <asm/irq.h>
+@@ -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 (file)
index 0000000..39dfd3d
--- /dev/null
@@ -0,0 +1,37 @@
+From a2de8560885469f3d76c80207a669029e4fc8a45 Mon Sep 17 00:00:00 2001
+From: Linus Walleij <linus.walleij@linaro.org>
+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 <linus.walleij@linaro.org>
+---
+ 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 (file)
index 0000000..6477b2d
--- /dev/null
@@ -0,0 +1,117 @@
+From 9b95b301b219df19c20f4a563f1da6338b09b0d0 Mon Sep 17 00:00:00 2001
+From: Linus Walleij <linus.walleij@linaro.org>
+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 <linus.walleij@linaro.org>
+---
+ 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 (file)
index 0000000..5949b92
--- /dev/null
@@ -0,0 +1,101 @@
+From 2b2e9d0e1ee4765b21c648235489028c6dc7e336 Mon Sep 17 00:00:00 2001
+From: Linus Walleij <linus.walleij@linaro.org>
+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 <linus.walleij@linaro.org>
+---
+ 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 {