Skip to content

Commit bb61075

Browse files
jim2101024bjorn-helgaas
authored andcommitted
PCI: brcmstb: Use reset/rearm instead of deassert/assert
The Broadcom STB PCIe RC uses a reset control "rescal" for certain chips. The "rescal" implements a "pulse reset" so using assert/deassert is wrong for this device. Instead, we use reset/rearm. We need to use rearm so that we can reset it after a suspend/resume cycle; w/o using "rearm", the "rescal" device will only ever fire once. Of course for suspend/resume to work we also need to put the reset/rearm calls in the suspend and resume routines. Fixes: 740d6c3 ("PCI: brcmstb: Add control of rescal reset") Link: https://lore.kernel.org/r/20210430152156.21162-4-jim2101024@gmail.com Signed-off-by: Jim Quinlan <jim2101024@gmail.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Florian Fainelli <f.fainelli@gmail.com>
1 parent e8d6f9e commit bb61075

1 file changed

Lines changed: 13 additions & 6 deletions

File tree

drivers/pci/controller/pcie-brcmstb.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,6 +1148,7 @@ static int brcm_pcie_suspend(struct device *dev)
11481148

11491149
brcm_pcie_turn_off(pcie);
11501150
ret = brcm_phy_stop(pcie);
1151+
reset_control_rearm(pcie->rescal);
11511152
clk_disable_unprepare(pcie->clk);
11521153

11531154
return ret;
@@ -1163,9 +1164,13 @@ static int brcm_pcie_resume(struct device *dev)
11631164
base = pcie->base;
11641165
clk_prepare_enable(pcie->clk);
11651166

1167+
ret = reset_control_reset(pcie->rescal);
1168+
if (ret)
1169+
goto err_disable_clk;
1170+
11661171
ret = brcm_phy_start(pcie);
11671172
if (ret)
1168-
goto err;
1173+
goto err_reset;
11691174

11701175
/* Take bridge out of reset so we can access the SERDES reg */
11711176
pcie->bridge_sw_init_set(pcie, 0);
@@ -1180,14 +1185,16 @@ static int brcm_pcie_resume(struct device *dev)
11801185

11811186
ret = brcm_pcie_setup(pcie);
11821187
if (ret)
1183-
goto err;
1188+
goto err_reset;
11841189

11851190
if (pcie->msi)
11861191
brcm_msi_set_regs(pcie->msi);
11871192

11881193
return 0;
11891194

1190-
err:
1195+
err_reset:
1196+
reset_control_rearm(pcie->rescal);
1197+
err_disable_clk:
11911198
clk_disable_unprepare(pcie->clk);
11921199
return ret;
11931200
}
@@ -1197,7 +1204,7 @@ static void __brcm_pcie_remove(struct brcm_pcie *pcie)
11971204
brcm_msi_remove(pcie);
11981205
brcm_pcie_turn_off(pcie);
11991206
brcm_phy_stop(pcie);
1200-
reset_control_assert(pcie->rescal);
1207+
reset_control_rearm(pcie->rescal);
12011208
clk_disable_unprepare(pcie->clk);
12021209
}
12031210

@@ -1278,13 +1285,13 @@ static int brcm_pcie_probe(struct platform_device *pdev)
12781285
return PTR_ERR(pcie->perst_reset);
12791286
}
12801287

1281-
ret = reset_control_deassert(pcie->rescal);
1288+
ret = reset_control_reset(pcie->rescal);
12821289
if (ret)
12831290
dev_err(&pdev->dev, "failed to deassert 'rescal'\n");
12841291

12851292
ret = brcm_phy_start(pcie);
12861293
if (ret) {
1287-
reset_control_assert(pcie->rescal);
1294+
reset_control_rearm(pcie->rescal);
12881295
clk_disable_unprepare(pcie->clk);
12891296
return ret;
12901297
}

0 commit comments

Comments
 (0)