Skip to content

Commit 8201360

Browse files
jamesequinlankwilczynski
authored andcommitted
PCI: brcmstb: Use swinit reset if available
The 7712 SoC adds a software init reset device for the PCIe HW. If found in the DT node, use it. Link: https://lore.kernel.org/linux-pci/20240815225731.40276-7-james.quinlan@broadcom.com Signed-off-by: Jim Quinlan <james.quinlan@broadcom.com> Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org> Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
1 parent 46cb27f commit 8201360

1 file changed

Lines changed: 24 additions & 0 deletions

File tree

drivers/pci/controller/pcie-brcmstb.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ struct brcm_pcie {
266266
struct reset_control *rescal;
267267
struct reset_control *perst_reset;
268268
struct reset_control *bridge_reset;
269+
struct reset_control *swinit_reset;
269270
int num_memc;
270271
u64 memc_size[PCIE_BRCM_MAX_MEMC];
271272
u32 hw_rev;
@@ -1635,12 +1636,35 @@ static int brcm_pcie_probe(struct platform_device *pdev)
16351636
if (IS_ERR(pcie->bridge_reset))
16361637
return PTR_ERR(pcie->bridge_reset);
16371638

1639+
pcie->swinit_reset = devm_reset_control_get_optional_exclusive(&pdev->dev, "swinit");
1640+
if (IS_ERR(pcie->swinit_reset))
1641+
return PTR_ERR(pcie->swinit_reset);
1642+
16381643
ret = clk_prepare_enable(pcie->clk);
16391644
if (ret)
16401645
return dev_err_probe(&pdev->dev, ret, "could not enable clock\n");
16411646

16421647
pcie->bridge_sw_init_set(pcie, 0);
16431648

1649+
if (pcie->swinit_reset) {
1650+
ret = reset_control_assert(pcie->swinit_reset);
1651+
if (ret) {
1652+
clk_disable_unprepare(pcie->clk);
1653+
return dev_err_probe(&pdev->dev, ret,
1654+
"could not assert reset 'swinit'\n");
1655+
}
1656+
1657+
/* HW team recommends 1us for proper sync and propagation of reset */
1658+
udelay(1);
1659+
1660+
ret = reset_control_deassert(pcie->swinit_reset);
1661+
if (ret) {
1662+
clk_disable_unprepare(pcie->clk);
1663+
return dev_err_probe(&pdev->dev, ret,
1664+
"could not de-assert reset 'swinit'\n");
1665+
}
1666+
}
1667+
16441668
ret = reset_control_reset(pcie->rescal);
16451669
if (ret) {
16461670
clk_disable_unprepare(pcie->clk);

0 commit comments

Comments
 (0)