Merge branch 'pci/brcmstb'
authorBjorn Helgaas <bhelgaas@google.com>
Tue, 4 May 2021 15:43:31 +0000 (10:43 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 4 May 2021 15:43:31 +0000 (10:43 -0500)
- Add reset_control_rearm() stub for !CONFIG_RESET_CONTROLLER (Jim Quinlan)

- Fix use of BCM7216 reset controller (Jim Quinlan)

- Use reset/rearm for Broadcom STB pulse reset instead of deassert/assert
  (Jim Quinlan)

* pci/brcmstb:
  PCI: brcmstb: Use reset/rearm instead of deassert/assert
  ata: ahci_brcm: Fix use of BCM7216 reset controller
  reset: add missing empty function reset_control_rearm()

drivers/ata/ahci_brcm.c
drivers/pci/controller/pcie-brcmstb.c
include/linux/reset.h

index 5b32df5..6e9c5ad 100644 (file)
@@ -86,7 +86,8 @@ struct brcm_ahci_priv {
        u32 port_mask;
        u32 quirks;
        enum brcm_ahci_version version;
-       struct reset_control *rcdev;
+       struct reset_control *rcdev_rescal;
+       struct reset_control *rcdev_ahci;
 };
 
 static inline u32 brcm_sata_readreg(void __iomem *addr)
@@ -352,8 +353,8 @@ static int brcm_ahci_suspend(struct device *dev)
        else
                ret = 0;
 
-       if (priv->version != BRCM_SATA_BCM7216)
-               reset_control_assert(priv->rcdev);
+       reset_control_assert(priv->rcdev_ahci);
+       reset_control_rearm(priv->rcdev_rescal);
 
        return ret;
 }
@@ -365,10 +366,10 @@ static int __maybe_unused brcm_ahci_resume(struct device *dev)
        struct brcm_ahci_priv *priv = hpriv->plat_data;
        int ret = 0;
 
-       if (priv->version == BRCM_SATA_BCM7216)
-               ret = reset_control_reset(priv->rcdev);
-       else
-               ret = reset_control_deassert(priv->rcdev);
+       ret = reset_control_deassert(priv->rcdev_ahci);
+       if (ret)
+               return ret;
+       ret = reset_control_reset(priv->rcdev_rescal);
        if (ret)
                return ret;
 
@@ -434,7 +435,6 @@ static int brcm_ahci_probe(struct platform_device *pdev)
 {
        const struct of_device_id *of_id;
        struct device *dev = &pdev->dev;
-       const char *reset_name = NULL;
        struct brcm_ahci_priv *priv;
        struct ahci_host_priv *hpriv;
        struct resource *res;
@@ -456,15 +456,15 @@ static int brcm_ahci_probe(struct platform_device *pdev)
        if (IS_ERR(priv->top_ctrl))
                return PTR_ERR(priv->top_ctrl);
 
-       /* Reset is optional depending on platform and named differently */
-       if (priv->version == BRCM_SATA_BCM7216)
-               reset_name = "rescal";
-       else
-               reset_name = "ahci";
-
-       priv->rcdev = devm_reset_control_get_optional(&pdev->dev, reset_name);
-       if (IS_ERR(priv->rcdev))
-               return PTR_ERR(priv->rcdev);
+       if (priv->version == BRCM_SATA_BCM7216) {
+               priv->rcdev_rescal = devm_reset_control_get_optional_shared(
+                       &pdev->dev, "rescal");
+               if (IS_ERR(priv->rcdev_rescal))
+                       return PTR_ERR(priv->rcdev_rescal);
+       }
+       priv->rcdev_ahci = devm_reset_control_get_optional(&pdev->dev, "ahci");
+       if (IS_ERR(priv->rcdev_ahci))
+               return PTR_ERR(priv->rcdev_ahci);
 
        hpriv = ahci_platform_get_resources(pdev, 0);
        if (IS_ERR(hpriv))
@@ -485,10 +485,10 @@ static int brcm_ahci_probe(struct platform_device *pdev)
                break;
        }
 
-       if (priv->version == BRCM_SATA_BCM7216)
-               ret = reset_control_reset(priv->rcdev);
-       else
-               ret = reset_control_deassert(priv->rcdev);
+       ret = reset_control_reset(priv->rcdev_rescal);
+       if (ret)
+               return ret;
+       ret = reset_control_deassert(priv->rcdev_ahci);
        if (ret)
                return ret;
 
@@ -539,8 +539,8 @@ out_disable_regulators:
 out_disable_clks:
        ahci_platform_disable_clks(hpriv);
 out_reset:
-       if (priv->version != BRCM_SATA_BCM7216)
-               reset_control_assert(priv->rcdev);
+       reset_control_assert(priv->rcdev_ahci);
+       reset_control_rearm(priv->rcdev_rescal);
        return ret;
 }
 
index 69c9992..08bc788 100644 (file)
@@ -1148,6 +1148,7 @@ static int brcm_pcie_suspend(struct device *dev)
 
        brcm_pcie_turn_off(pcie);
        ret = brcm_phy_stop(pcie);
+       reset_control_rearm(pcie->rescal);
        clk_disable_unprepare(pcie->clk);
 
        return ret;
@@ -1163,9 +1164,13 @@ static int brcm_pcie_resume(struct device *dev)
        base = pcie->base;
        clk_prepare_enable(pcie->clk);
 
+       ret = reset_control_reset(pcie->rescal);
+       if (ret)
+               goto err_disable_clk;
+
        ret = brcm_phy_start(pcie);
        if (ret)
-               goto err;
+               goto err_reset;
 
        /* Take bridge out of reset so we can access the SERDES reg */
        pcie->bridge_sw_init_set(pcie, 0);
@@ -1180,14 +1185,16 @@ static int brcm_pcie_resume(struct device *dev)
 
        ret = brcm_pcie_setup(pcie);
        if (ret)
-               goto err;
+               goto err_reset;
 
        if (pcie->msi)
                brcm_msi_set_regs(pcie->msi);
 
        return 0;
 
-err:
+err_reset:
+       reset_control_rearm(pcie->rescal);
+err_disable_clk:
        clk_disable_unprepare(pcie->clk);
        return ret;
 }
@@ -1197,7 +1204,7 @@ static void __brcm_pcie_remove(struct brcm_pcie *pcie)
        brcm_msi_remove(pcie);
        brcm_pcie_turn_off(pcie);
        brcm_phy_stop(pcie);
-       reset_control_assert(pcie->rescal);
+       reset_control_rearm(pcie->rescal);
        clk_disable_unprepare(pcie->clk);
 }
 
@@ -1278,13 +1285,13 @@ static int brcm_pcie_probe(struct platform_device *pdev)
                return PTR_ERR(pcie->perst_reset);
        }
 
-       ret = reset_control_deassert(pcie->rescal);
+       ret = reset_control_reset(pcie->rescal);
        if (ret)
                dev_err(&pdev->dev, "failed to deassert 'rescal'\n");
 
        ret = brcm_phy_start(pcie);
        if (ret) {
-               reset_control_assert(pcie->rescal);
+               reset_control_rearm(pcie->rescal);
                clk_disable_unprepare(pcie->clk);
                return ret;
        }
index b9109ef..9700124 100644 (file)
@@ -47,6 +47,11 @@ static inline int reset_control_reset(struct reset_control *rstc)
        return 0;
 }
 
+static inline int reset_control_rearm(struct reset_control *rstc)
+{
+       return 0;
+}
+
 static inline int reset_control_assert(struct reset_control *rstc)
 {
        return 0;