mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 17:01:14 +00:00
7d7aa2fd92
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Despite, since subtargets range from bcm2708 to bcm2711, it seems appropriate to use bcm27xx instead of bcm2708 (again, as already done for BOARDNAME). This also renames the packages brcm2708-userland and brcm2708-gpu-fw. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
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 */
|