Commit a147995c authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

Merge branch 'pci/brcmstb'

- 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()
parents a4ffbb7a bb610757
Loading
Loading
Loading
Loading
+23 −23
Original line number Diff line number Diff line
@@ -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 @@ static int brcm_ahci_probe(struct platform_device *pdev)
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;
}

+13 −6
Original line number Diff line number Diff line
@@ -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;
	}
+5 −0
Original line number Diff line number Diff line
@@ -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;