imx: power-domain: Enable refcounting on imx8mp
authorMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 25 Apr 2025 06:49:33 +0000 (08:49 +0200)
committerFabio Estevam <festevam@denx.de>
Mon, 28 Apr 2025 13:41:19 +0000 (10:41 -0300)
Prevent enabling/disabling multiple times the same power domain to avoid
breakages due to the same power domains being referenced several times
by different device nodes.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/power/domain/imx8m-power-domain.c
drivers/power/domain/imx8mp-hsiomix.c
drivers/power/domain/imx8mp-mediamix.c

index e54ba5d..b44aae7 100644 (file)
@@ -506,8 +506,12 @@ static int imx8m_power_domain_bind(struct udevice *dev)
 static int imx8m_power_domain_probe(struct udevice *dev)
 {
        struct imx8m_power_domain_plat *pdata = dev_get_plat(dev);
+       struct power_domain_plat *plat = dev_get_uclass_plat(dev);
        int ret;
 
+       /* Every subdomain has its own device node */
+       plat->subdomains = 1;
+
        /* Nothing to do for non-"power-domain" driver instances. */
        if (!strstr(dev->name, "power-domain"))
                return 0;
index 455ad53..1ca4388 100644 (file)
@@ -201,8 +201,12 @@ int imx8mp_hsiomix_bind(struct udevice *dev)
 static int imx8mp_hsiomix_probe(struct udevice *dev)
 {
        struct imx8mp_hsiomix_priv *priv = dev_get_priv(dev);
+       struct power_domain_plat *plat = dev_get_uclass_plat(dev);
        int ret;
 
+       /* Definitions are in imx8mp-power.h */
+       plat->subdomains = 5;
+
        priv->base = dev_read_addr_ptr(dev);
 
        ret = clk_get_by_name(dev, "usb", &priv->clk_usb);
index 78c32ca..504c22f 100644 (file)
@@ -143,9 +143,13 @@ static int imx8mp_mediamix_bind(struct udevice *dev)
 
 static int imx8mp_mediamix_probe(struct udevice *dev)
 {
+       struct power_domain_plat *plat = dev_get_uclass_plat(dev);
        struct imx8mp_mediamix_priv *priv = dev_get_priv(dev);
        int ret;
 
+       /* Definitions are in imx8mp-power.h */
+       plat->subdomains = 9;
+
        priv->base = dev_read_addr_ptr(dev);
 
        ret = clk_get_by_name(dev, "apb", &priv->clk_apb);