Commit d4aa5960 authored by Stanimir Varbanov's avatar Stanimir Varbanov Committed by Ulf Hansson
Browse files

pmdomain: bcm: bcm2835-power: Prepare to support BCM2712



BCM2712 has a PM block but lacks asb and rpivid_asb register
spaces. To avoid unwanted results add a check for asb existence
during probe and also add a new register offset for bcm2712 to
control grafx_v3d power domain. The decision to use the new
register is implicit - if asb register base is null then the
driver is probed for bcm2712 (the other supported SoCs have
asb register space).

Signed-off-by: default avatarStanimir Varbanov <svarbanov@suse.de>
Reviewed-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent b0671a5f
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@
#define PM_IMAGE			0x108
#define PM_GRAFX			0x10c
#define PM_PROC				0x110
#define PM_GRAFX_2712			0x304
#define PM_ENAB				BIT(12)
#define PM_ISPRSTN			BIT(8)
#define PM_H264RSTN			BIT(7)
@@ -381,6 +382,9 @@ static int bcm2835_power_pd_power_on(struct generic_pm_domain *domain)
		return bcm2835_power_power_on(pd, PM_GRAFX);

	case BCM2835_POWER_DOMAIN_GRAFX_V3D:
		if (!power->asb)
			return bcm2835_asb_power_on(pd, PM_GRAFX_2712,
						    0, 0, PM_V3DRSTN);
		return bcm2835_asb_power_on(pd, PM_GRAFX,
					    ASB_V3D_M_CTRL, ASB_V3D_S_CTRL,
					    PM_V3DRSTN);
@@ -447,6 +451,9 @@ static int bcm2835_power_pd_power_off(struct generic_pm_domain *domain)
		return bcm2835_power_power_off(pd, PM_GRAFX);

	case BCM2835_POWER_DOMAIN_GRAFX_V3D:
		if (!power->asb)
			return bcm2835_asb_power_off(pd, PM_GRAFX_2712,
						     0, 0, PM_V3DRSTN);
		return bcm2835_asb_power_off(pd, PM_GRAFX,
					     ASB_V3D_M_CTRL, ASB_V3D_S_CTRL,
					     PM_V3DRSTN);
@@ -635,11 +642,13 @@ static int bcm2835_power_probe(struct platform_device *pdev)
	power->asb = pm->asb;
	power->rpivid_asb = pm->rpivid_asb;

	if (power->asb) {
		id = readl(power->asb + ASB_AXI_BRDG_ID);
		if (id != BCM2835_BRDG_ID /* "BRDG" */) {
			dev_err(dev, "ASB register ID returned 0x%08x\n", id);
			return -ENODEV;
		}
	}

	if (power->rpivid_asb) {
		id = readl(power->rpivid_asb + ASB_AXI_BRDG_ID);