Skip to content

Commit ee9eabb

Browse files
LorenzoBianconikwilczynski
authored andcommitted
PCI: mediatek-gen3: Rely on reset_bulk APIs for PHY reset lines
Use reset_bulk APIs to manage PHY reset lines. This is a preliminary patch in order to add Airoha EN7581 PCIe support. Link: https://lore.kernel.org/linux-pci/3ceb83bc0defbcf868521f8df4b9100e55ec2614.1720022580.git.lorenzo@kernel.org Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Krzysztof Wilczyński <[email protected]> Tested-by: Zhengping Zhang <[email protected]> Reviewed-by: AngeloGioacchino Del Regno <[email protected]> Acked-by: Jianjun Wang <[email protected]>
1 parent dc869a4 commit ee9eabb

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

drivers/pci/controller/pcie-mediatek-gen3.c

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,21 @@
100100
#define PCIE_ATR_TLP_TYPE_MEM PCIE_ATR_TLP_TYPE(0)
101101
#define PCIE_ATR_TLP_TYPE_IO PCIE_ATR_TLP_TYPE(2)
102102

103+
#define MAX_NUM_PHY_RESETS 1
104+
103105
struct mtk_gen3_pcie;
104106

105107
/**
106108
* struct mtk_gen3_pcie_pdata - differentiate between host generations
107109
* @power_up: pcie power_up callback
110+
* @phy_resets: phy reset lines SoC data.
108111
*/
109112
struct mtk_gen3_pcie_pdata {
110113
int (*power_up)(struct mtk_gen3_pcie *pcie);
114+
struct {
115+
const char *id[MAX_NUM_PHY_RESETS];
116+
int num_resets;
117+
} phy_resets;
111118
};
112119

113120
/**
@@ -128,7 +135,7 @@ struct mtk_msi_set {
128135
* @base: IO mapped register base
129136
* @reg_base: physical register base
130137
* @mac_reset: MAC reset control
131-
* @phy_reset: PHY reset control
138+
* @phy_resets: PHY reset controllers
132139
* @phy: PHY controller block
133140
* @clks: PCIe clocks
134141
* @num_clks: PCIe clocks count for this port
@@ -148,7 +155,7 @@ struct mtk_gen3_pcie {
148155
void __iomem *base;
149156
phys_addr_t reg_base;
150157
struct reset_control *mac_reset;
151-
struct reset_control *phy_reset;
158+
struct reset_control_bulk_data phy_resets[MAX_NUM_PHY_RESETS];
152159
struct phy *phy;
153160
struct clk_bulk_data *clks;
154161
int num_clks;
@@ -788,10 +795,10 @@ static int mtk_pcie_setup_irq(struct mtk_gen3_pcie *pcie)
788795

789796
static int mtk_pcie_parse_port(struct mtk_gen3_pcie *pcie)
790797
{
798+
int i, ret, num_resets = pcie->soc->phy_resets.num_resets;
791799
struct device *dev = pcie->dev;
792800
struct platform_device *pdev = to_platform_device(dev);
793801
struct resource *regs;
794-
int ret;
795802

796803
regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcie-mac");
797804
if (!regs)
@@ -804,12 +811,12 @@ static int mtk_pcie_parse_port(struct mtk_gen3_pcie *pcie)
804811

805812
pcie->reg_base = regs->start;
806813

807-
pcie->phy_reset = devm_reset_control_get_optional_exclusive(dev, "phy");
808-
if (IS_ERR(pcie->phy_reset)) {
809-
ret = PTR_ERR(pcie->phy_reset);
810-
if (ret != -EPROBE_DEFER)
811-
dev_err(dev, "failed to get PHY reset\n");
814+
for (i = 0; i < num_resets; i++)
815+
pcie->phy_resets[i].id = pcie->soc->phy_resets.id[i];
812816

817+
ret = devm_reset_control_bulk_get_optional_shared(dev, num_resets, pcie->phy_resets);
818+
if (ret) {
819+
dev_err(dev, "failed to get PHY bulk reset\n");
813820
return ret;
814821
}
815822

@@ -846,7 +853,11 @@ static int mtk_pcie_power_up(struct mtk_gen3_pcie *pcie)
846853
int err;
847854

848855
/* PHY power on and enable pipe clock */
849-
reset_control_deassert(pcie->phy_reset);
856+
err = reset_control_bulk_deassert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
857+
if (err) {
858+
dev_err(dev, "failed to deassert PHYs\n");
859+
return err;
860+
}
850861

851862
err = phy_init(pcie->phy);
852863
if (err) {
@@ -882,7 +893,7 @@ static int mtk_pcie_power_up(struct mtk_gen3_pcie *pcie)
882893
err_phy_on:
883894
phy_exit(pcie->phy);
884895
err_phy_init:
885-
reset_control_assert(pcie->phy_reset);
896+
reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
886897

887898
return err;
888899
}
@@ -897,7 +908,7 @@ static void mtk_pcie_power_down(struct mtk_gen3_pcie *pcie)
897908

898909
phy_power_off(pcie->phy);
899910
phy_exit(pcie->phy);
900-
reset_control_assert(pcie->phy_reset);
911+
reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
901912
}
902913

903914
static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
@@ -908,11 +919,17 @@ static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
908919
if (err)
909920
return err;
910921

922+
/*
923+
* Deassert the line in order to avoid unbalance in deassert_count
924+
* counter since the bulk is shared.
925+
*/
926+
reset_control_bulk_deassert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
911927
/*
912928
* The controller may have been left out of reset by the bootloader
913929
* so make sure that we get a clean start by asserting resets here.
914930
*/
915-
reset_control_assert(pcie->phy_reset);
931+
reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
932+
916933
reset_control_assert(pcie->mac_reset);
917934
usleep_range(10, 20);
918935

@@ -1090,6 +1107,10 @@ static const struct dev_pm_ops mtk_pcie_pm_ops = {
10901107

10911108
static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8192 = {
10921109
.power_up = mtk_pcie_power_up,
1110+
.phy_resets = {
1111+
.id[0] = "phy",
1112+
.num_resets = 1,
1113+
},
10931114
};
10941115

10951116
static const struct of_device_id mtk_pcie_of_match[] = {

0 commit comments

Comments
 (0)