brcm2708: update to latest patches from RPi Foundation
[openwrt/staging/dedeckeh.git] / target / linux / brcm2708 / patches-4.19 / 950-0486-soc-bcm-bcm2835-pm-Add-support-for-2711.patch
diff --git a/target/linux/brcm2708/patches-4.19/950-0486-soc-bcm-bcm2835-pm-Add-support-for-2711.patch b/target/linux/brcm2708/patches-4.19/950-0486-soc-bcm-bcm2835-pm-Add-support-for-2711.patch
new file mode 100644 (file)
index 0000000..4c87289
--- /dev/null
@@ -0,0 +1,102 @@
+From f3470769d4e64084fc7f3060d634aff8fdf8f75d Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 11 Jan 2019 17:31:07 -0800
+Subject: [PATCH] soc: bcm: bcm2835-pm: Add support for 2711.
+
+Without the actual power management part any more, there's a lot less
+to set up for V3D.  We just need to clear the RSTN field for the power
+domain, and expose the reset controller for toggling it again.
+
+This is definitely incomplete -- the old ISP and H264 is in the old
+bridge, but since we have no consumers of it I've just done the
+minimum to get V3D working.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/mfd/bcm2835-pm.c        | 11 +++++++++++
+ drivers/soc/bcm/bcm2835-power.c | 22 ++++++++++++++++++++++
+ include/linux/mfd/bcm2835-pm.h  |  1 +
+ 3 files changed, 34 insertions(+)
+
+--- a/drivers/mfd/bcm2835-pm.c
++++ b/drivers/mfd/bcm2835-pm.c
+@@ -50,6 +50,17 @@ static int bcm2835_pm_probe(struct platf
+       if (ret)
+               return ret;
++      /* Map the ARGON ASB regs if present. */
++      res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
++      if (res) {
++              pm->arg_asb = devm_ioremap_resource(dev, res);
++              if (IS_ERR(pm->arg_asb)) {
++                      dev_err(dev, "Failed to map ARGON ASB: %ld\n",
++                              PTR_ERR(pm->arg_asb));
++                      return PTR_ERR(pm->arg_asb);
++              }
++      }
++
+       /* We'll use the presence of the AXI ASB regs in the
+        * bcm2835-pm binding as the key for whether we can reference
+        * the full PM register range and support power domains.
+--- a/drivers/soc/bcm/bcm2835-power.c
++++ b/drivers/soc/bcm/bcm2835-power.c
+@@ -143,6 +143,8 @@ struct bcm2835_power {
+       /* AXI Async bridge registers. */
+       void __iomem            *asb;
++      bool is_2711;
++
+       struct genpd_onecell_data pd_xlate;
+       struct bcm2835_power_domain domains[BCM2835_POWER_DOMAIN_COUNT];
+       struct reset_controller_dev reset;
+@@ -192,6 +194,10 @@ static int bcm2835_power_power_off(struc
+ {
+       struct bcm2835_power *power = pd->power;
++      /* 2711 has no power domains above the reset controller. */
++      if (power->is_2711)
++              return 0;
++
+       /* Enable functional isolation */
+       PM_WRITE(pm_reg, PM_READ(pm_reg) & ~PM_ISFUNC);
+@@ -213,6 +219,10 @@ static int bcm2835_power_power_on(struct
+       int inrush;
+       bool powok;
++      /* 2711 has no power domains above the reset controller. */
++      if (power->is_2711)
++              return 0;
++
+       /* If it was already powered on by the fw, leave it that way. */
+       if (PM_READ(pm_reg) & PM_POWUP)
+               return 0;
+@@ -627,6 +637,18 @@ static int bcm2835_power_probe(struct pl
+       power->base = pm->base;
+       power->asb = pm->asb;
++      /* 2711 hack: the new ARGON ASB took over V3D, which is our
++       * only consumer of this driver so far.  The old ASB seems to
++       * still be present with ISP and H264 bits but no V3D, but I
++       * don't know if that's real or not.  The V3D is in the same
++       * place in the new ASB as the old one, so just poke the new
++       * one for now.
++       */
++      if (pm->arg_asb) {
++              power->asb = pm->arg_asb;
++              power->is_2711 = true;
++      }
++
+       id = ASB_READ(ASB_AXI_BRDG_ID);
+       if (id != 0x62726467 /* "BRDG" */) {
+               dev_err(dev, "ASB register ID returned 0x%08x\n", id);
+--- a/include/linux/mfd/bcm2835-pm.h
++++ b/include/linux/mfd/bcm2835-pm.h
+@@ -9,6 +9,7 @@ struct bcm2835_pm {
+       struct device *dev;
+       void __iomem *base;
+       void __iomem *asb;
++      void __iomem *arg_asb;
+ };
+ #endif /* BCM2835_MFD_PM_H */