1 From ee9eabbe3f0f0c7458d89840add97e54d4e0bccf Mon Sep 17 00:00:00 2001
2 From: Lorenzo Bianconi <lorenzo@kernel.org>
3 Date: Wed, 3 Jul 2024 18:12:43 +0200
4 Subject: [PATCH 2/3] PCI: mediatek-gen3: Rely on reset_bulk APIs for PHY reset
7 Content-Type: text/plain; charset=UTF-8
8 Content-Transfer-Encoding: 8bit
10 Use reset_bulk APIs to manage PHY reset lines.
12 This is a preliminary patch in order to add Airoha EN7581 PCIe support.
14 Link: https://lore.kernel.org/linux-pci/3ceb83bc0defbcf868521f8df4b9100e55ec2614.1720022580.git.lorenzo@kernel.org
15 Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
16 Signed-off-by: Krzysztof WilczyĆski <kwilczynski@kernel.org>
17 Tested-by: Zhengping Zhang <zhengping.zhang@airoha.com>
18 Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
19 Acked-by: Jianjun Wang <jianjun.wang@mediatek.com>
21 drivers/pci/controller/pcie-mediatek-gen3.c | 45 +++++++++++++++------
22 1 file changed, 33 insertions(+), 12 deletions(-)
24 --- a/drivers/pci/controller/pcie-mediatek-gen3.c
25 +++ b/drivers/pci/controller/pcie-mediatek-gen3.c
27 #define PCIE_ATR_TLP_TYPE_MEM PCIE_ATR_TLP_TYPE(0)
28 #define PCIE_ATR_TLP_TYPE_IO PCIE_ATR_TLP_TYPE(2)
30 +#define MAX_NUM_PHY_RESETS 1
35 * struct mtk_gen3_pcie_pdata - differentiate between host generations
36 * @power_up: pcie power_up callback
37 + * @phy_resets: phy reset lines SoC data.
39 struct mtk_gen3_pcie_pdata {
40 int (*power_up)(struct mtk_gen3_pcie *pcie);
42 + const char *id[MAX_NUM_PHY_RESETS];
48 @@ -128,7 +135,7 @@ struct mtk_msi_set {
49 * @base: IO mapped register base
50 * @reg_base: physical register base
51 * @mac_reset: MAC reset control
52 - * @phy_reset: PHY reset control
53 + * @phy_resets: PHY reset controllers
54 * @phy: PHY controller block
56 * @num_clks: PCIe clocks count for this port
57 @@ -148,7 +155,7 @@ struct mtk_gen3_pcie {
60 struct reset_control *mac_reset;
61 - struct reset_control *phy_reset;
62 + struct reset_control_bulk_data phy_resets[MAX_NUM_PHY_RESETS];
64 struct clk_bulk_data *clks;
66 @@ -788,10 +795,10 @@ static int mtk_pcie_setup_irq(struct mtk
68 static int mtk_pcie_parse_port(struct mtk_gen3_pcie *pcie)
70 + int i, ret, num_resets = pcie->soc->phy_resets.num_resets;
71 struct device *dev = pcie->dev;
72 struct platform_device *pdev = to_platform_device(dev);
73 struct resource *regs;
76 regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcie-mac");
78 @@ -804,12 +811,12 @@ static int mtk_pcie_parse_port(struct mt
80 pcie->reg_base = regs->start;
82 - pcie->phy_reset = devm_reset_control_get_optional_exclusive(dev, "phy");
83 - if (IS_ERR(pcie->phy_reset)) {
84 - ret = PTR_ERR(pcie->phy_reset);
85 - if (ret != -EPROBE_DEFER)
86 - dev_err(dev, "failed to get PHY reset\n");
87 + for (i = 0; i < num_resets; i++)
88 + pcie->phy_resets[i].id = pcie->soc->phy_resets.id[i];
90 + ret = devm_reset_control_bulk_get_optional_shared(dev, num_resets, pcie->phy_resets);
92 + dev_err(dev, "failed to get PHY bulk reset\n");
96 @@ -846,7 +853,11 @@ static int mtk_pcie_power_up(struct mtk_
99 /* PHY power on and enable pipe clock */
100 - reset_control_deassert(pcie->phy_reset);
101 + err = reset_control_bulk_deassert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
103 + dev_err(dev, "failed to deassert PHYs\n");
107 err = phy_init(pcie->phy);
109 @@ -882,7 +893,7 @@ err_clk_init:
113 - reset_control_assert(pcie->phy_reset);
114 + reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
118 @@ -897,7 +908,7 @@ static void mtk_pcie_power_down(struct m
120 phy_power_off(pcie->phy);
122 - reset_control_assert(pcie->phy_reset);
123 + reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
126 static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
127 @@ -909,10 +920,16 @@ static int mtk_pcie_setup(struct mtk_gen
131 + * Deassert the line in order to avoid unbalance in deassert_count
132 + * counter since the bulk is shared.
134 + reset_control_bulk_deassert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
136 * The controller may have been left out of reset by the bootloader
137 * so make sure that we get a clean start by asserting resets here.
139 - reset_control_assert(pcie->phy_reset);
140 + reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
142 reset_control_assert(pcie->mac_reset);
143 usleep_range(10, 20);
145 @@ -1090,6 +1107,10 @@ static const struct dev_pm_ops mtk_pcie_
147 static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8192 = {
148 .power_up = mtk_pcie_power_up,
155 static const struct of_device_id mtk_pcie_of_match[] = {