mirror of https://github.com/hak5/openwrt.git
103 lines
3.2 KiB
Diff
103 lines
3.2 KiB
Diff
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 */
|