]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
ata: ahci_brcm: Add back regulators management
authorFlorian Fainelli <f.fainelli@gmail.com>
Fri, 29 Jan 2021 18:28:45 +0000 (10:28 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Mar 2021 17:22:43 +0000 (18:22 +0100)
[ Upstream commit 10340f8d7b6dd54e616339c8ccb2f397133ebea0 ]

While reworking the resources management and departing from using
ahci_platform_enable_resources() which did not allow a proper step
separation like we need, we unfortunately lost the ability to control
AHCI regulators. This broke some Broadcom STB systems that do expect
regulators to be turned on to link up with attached hard drives.

Fixes: c0cdf2ac4b5b ("ata: ahci_brcm: Fix AHCI resources management")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/ata/ahci_brcm.c

index 8beb81b24f142729fb0c10362be7000ac4c5baf1..52a242e99b043c8c2d2849bff7d98acededcd8d9 100644 (file)
@@ -280,6 +280,10 @@ static int brcm_ahci_resume(struct device *dev)
        if (ret)
                return ret;
 
+       ret = ahci_platform_enable_regulators(hpriv);
+       if (ret)
+               goto out_disable_clks;
+
        brcm_sata_init(priv);
        brcm_sata_phys_enable(priv);
        brcm_sata_alpm_init(hpriv);
@@ -309,6 +313,8 @@ out_disable_platform_phys:
        ahci_platform_disable_phys(hpriv);
 out_disable_phys:
        brcm_sata_phys_disable(priv);
+       ahci_platform_disable_regulators(hpriv);
+out_disable_clks:
        ahci_platform_disable_clks(hpriv);
        return ret;
 }
@@ -372,6 +378,10 @@ static int brcm_ahci_probe(struct platform_device *pdev)
        if (ret)
                goto out_reset;
 
+       ret = ahci_platform_enable_regulators(hpriv);
+       if (ret)
+               goto out_disable_clks;
+
        /* Must be first so as to configure endianness including that
         * of the standard AHCI register space.
         */
@@ -381,7 +391,7 @@ static int brcm_ahci_probe(struct platform_device *pdev)
        priv->port_mask = brcm_ahci_get_portmask(hpriv, priv);
        if (!priv->port_mask) {
                ret = -ENODEV;
-               goto out_disable_clks;
+               goto out_disable_regulators;
        }
 
        /* Must be done before ahci_platform_enable_phys() */
@@ -413,6 +423,8 @@ out_disable_platform_phys:
        ahci_platform_disable_phys(hpriv);
 out_disable_phys:
        brcm_sata_phys_disable(priv);
+out_disable_regulators:
+       ahci_platform_disable_regulators(hpriv);
 out_disable_clks:
        ahci_platform_disable_clks(hpriv);
 out_reset: