Message ID | 20220213225646.67761-8-pbrobinson@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Raspberry PI 4 V3D enablement | expand |
Am 13.02.22 um 23:56 schrieb Peter Robinson: > From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> > > In BCM2711 the new RPiVid ASB took over V3D. The old ASB is still present > with the ISP and H264 bits, and V3D is in the same place in the new ASB > as the old one. > > As per the devicetree bindings, BCM2711 will provide both the old and > new ASB resources, so get both of them and pass them into > 'bcm2835-power,' which will take care of selecting which one to use > accordingly. > > Since the RPiVid ASB's resources were being provided prior to formalizing > the bindings[1], also support the old firmwares that didn't use > 'reg-names.' > > Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> > Signed-off-by: Peter Robinson <pbrobinson@gmail.com> > > [1] See: 7dbe8c62ceeb ("ARM: dts: Add minimal Raspberry Pi 4 support") > > --- > Changes since v2: > - Correct names again! > > Changes since v1: > - Use reg-names > - Correct ASB names > > drivers/mfd/bcm2835-pm.c | 25 +++++++++++++++++++++++-- > include/linux/mfd/bcm2835-pm.h | 1 + > 2 files changed, 24 insertions(+), 2 deletions(-) > > diff --git a/drivers/mfd/bcm2835-pm.c b/drivers/mfd/bcm2835-pm.c > index 36fede92775c..a06e9cf19b64 100644 > --- a/drivers/mfd/bcm2835-pm.c > +++ b/drivers/mfd/bcm2835-pm.c > @@ -6,6 +6,7 @@ > * the WDT and power drivers. > */ > > +#include <linux/bits.h> > #include <linux/delay.h> > #include <linux/io.h> > #include <linux/mfd/bcm2835-pm.h> > @@ -17,6 +18,9 @@ > #include <linux/types.h> > #include <linux/watchdog.h> > > +#define BCM2835 BIT(1) > +#define BCM2711 BIT(2) > + Unfortunately, i don't remember the decision to use bits here. It's just unexpected, no strong opinion.
diff --git a/drivers/mfd/bcm2835-pm.c b/drivers/mfd/bcm2835-pm.c index 36fede92775c..a06e9cf19b64 100644 --- a/drivers/mfd/bcm2835-pm.c +++ b/drivers/mfd/bcm2835-pm.c @@ -6,6 +6,7 @@ * the WDT and power drivers. */ +#include <linux/bits.h> #include <linux/delay.h> #include <linux/io.h> #include <linux/mfd/bcm2835-pm.h> @@ -17,6 +18,9 @@ #include <linux/types.h> #include <linux/watchdog.h> +#define BCM2835 BIT(1) +#define BCM2711 BIT(2) + static const struct mfd_cell bcm2835_pm_devs[] = { { .name = "bcm2835-wdt" }, }; @@ -28,6 +32,8 @@ static const struct mfd_cell bcm2835_power_devs[] = { static int bcm2835_pm_get_pdata(struct platform_device *pdev, struct bcm2835_pm *pm) { + bool is_bcm2711 = (uintptr_t)device_get_match_data(pm->dev) & BCM2711; + /* If no 'reg-names' property is found we can assume we're using old * firmware. */ @@ -41,6 +47,10 @@ static int bcm2835_pm_get_pdata(struct platform_device *pdev, pm->asb = devm_platform_ioremap_resource(pdev, 1); if (IS_ERR(pm->asb)) pm->asb = NULL; + + pm->rpivid_asb = devm_platform_ioremap_resource(pdev, 2); + if (IS_ERR(pm->rpivid_asb)) + pm->rpivid_asb = NULL; } else { pm->base = devm_platform_ioremap_resource_byname(pdev, "pm"); if (IS_ERR(pm->base)) @@ -49,6 +59,16 @@ static int bcm2835_pm_get_pdata(struct platform_device *pdev, pm->asb = devm_platform_ioremap_resource_byname(pdev, "asb"); if (IS_ERR(pm->base)) pm->asb = NULL; + + pm->rpivid_asb = devm_platform_ioremap_resource_byname(pdev, + "rpivid_asb"); + if (IS_ERR(pm->base)) + pm->rpivid_asb = NULL; + + if (pm->rpivid_asb && !is_bcm2711) { + dev_err(pm->dev, "RPiVid ASB support only present in BCM2711\n"); + return -EINVAL; + } } return 0; @@ -89,8 +109,9 @@ static int bcm2835_pm_probe(struct platform_device *pdev) } static const struct of_device_id bcm2835_pm_of_match[] = { - { .compatible = "brcm,bcm2835-pm-wdt", }, - { .compatible = "brcm,bcm2835-pm", }, + { .compatible = "brcm,bcm2835-pm-wdt", .data = (void *)BCM2835}, + { .compatible = "brcm,bcm2835-pm", .data = (void *)BCM2835}, + { .compatible = "brcm,bcm2711-pm", .data = (void *)BCM2711}, {}, }; MODULE_DEVICE_TABLE(of, bcm2835_pm_of_match); diff --git a/include/linux/mfd/bcm2835-pm.h b/include/linux/mfd/bcm2835-pm.h index ed37dc40e82a..f70a810c55f7 100644 --- 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 *rpivid_asb; }; #endif /* BCM2835_MFD_PM_H */