diff options
Diffstat (limited to 'drivers/pci/controller/pcie-brcmstb.c')
| -rw-r--r-- | drivers/pci/controller/pcie-brcmstb.c | 20 | 
1 files changed, 14 insertions, 6 deletions
| diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c index e330e6811f0b..08bc788d9422 100644 --- a/drivers/pci/controller/pcie-brcmstb.c +++ b/drivers/pci/controller/pcie-brcmstb.c @@ -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;  	} @@ -1296,6 +1303,7 @@ static int brcm_pcie_probe(struct platform_device *pdev)  	pcie->hw_rev = readl(pcie->base + PCIE_MISC_REVISION);  	if (pcie->type == BCM4908 && pcie->hw_rev >= BRCM_PCIE_HW_REV_3_20) {  		dev_err(pcie->dev, "hardware revision with unsupported PERST# setup\n"); +		ret = -ENODEV;  		goto fail;  	} | 
