Skip to content

Commit dde4b05

Browse files
committed
Merge branch 'pci/controller/mediatek-gen3'
- Add optional sys clock ready time setting to avoid sys_clk_rdy signal glitching in MT6991 and MT8196 (AngeloGioacchino Del Regno) - Add DT binding and driver support for MT6991 and MT8196 (AngeloGioacchino Del Regno) * pci/controller/mediatek-gen3: PCI: mediatek-gen3: Add support for MediaTek MT8196 SoC dt-bindings: PCI: mediatek-gen3: Add support for MT6991/MT8196 PCI: mediatek-gen3: Implement sys clock ready time setting
2 parents 836eec3 + 81fedb3 commit dde4b05

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

Documentation/devicetree/bindings/pci/mediatek-pcie-gen3.yaml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,12 @@ properties:
5252
- mediatek,mt8188-pcie
5353
- mediatek,mt8195-pcie
5454
- const: mediatek,mt8192-pcie
55+
- items:
56+
- enum:
57+
- mediatek,mt6991-pcie
58+
- const: mediatek,mt8196-pcie
5559
- const: mediatek,mt8192-pcie
60+
- const: mediatek,mt8196-pcie
5661
- const: airoha,en7581-pcie
5762

5863
reg:
@@ -212,6 +217,36 @@ allOf:
212217

213218
mediatek,pbus-csr: false
214219

220+
- if:
221+
properties:
222+
compatible:
223+
contains:
224+
enum:
225+
- mediatek,mt8196-pcie
226+
then:
227+
properties:
228+
clocks:
229+
minItems: 6
230+
231+
clock-names:
232+
items:
233+
- const: pl_250m
234+
- const: tl_26m
235+
- const: bus
236+
- const: low_power
237+
- const: peri_26m
238+
- const: peri_mem
239+
240+
resets:
241+
minItems: 2
242+
243+
reset-names:
244+
items:
245+
- const: phy
246+
- const: mac
247+
248+
mediatek,pbus-csr: false
249+
215250
- if:
216251
properties:
217252
compatible:

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@
102102
#define PCIE_MSI_SET_ADDR_HI_BASE 0xc80
103103
#define PCIE_MSI_SET_ADDR_HI_OFFSET 0x04
104104

105+
#define PCIE_RESOURCE_CTRL_REG 0xd2c
106+
#define PCIE_RSRC_SYS_CLK_RDY_TIME_MASK GENMASK(7, 0)
107+
105108
#define PCIE_ICMD_PM_REG 0x198
106109
#define PCIE_TURN_OFF_LINK BIT(4)
107110

@@ -149,6 +152,7 @@ enum mtk_gen3_pcie_flags {
149152
* struct mtk_gen3_pcie_pdata - differentiate between host generations
150153
* @power_up: pcie power_up callback
151154
* @phy_resets: phy reset lines SoC data.
155+
* @sys_clk_rdy_time_us: System clock ready time override (microseconds)
152156
* @flags: pcie device flags.
153157
*/
154158
struct mtk_gen3_pcie_pdata {
@@ -157,6 +161,7 @@ struct mtk_gen3_pcie_pdata {
157161
const char *id[MAX_NUM_PHY_RESETS];
158162
int num_resets;
159163
} phy_resets;
164+
u8 sys_clk_rdy_time_us;
160165
u32 flags;
161166
};
162167

@@ -435,6 +440,14 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
435440
writel_relaxed(val, pcie->base + PCIE_CONF_LINK2_CTL_STS);
436441
}
437442

443+
/* If parameter is present, adjust SYS_CLK_RDY_TIME to avoid glitching */
444+
if (pcie->soc->sys_clk_rdy_time_us) {
445+
val = readl_relaxed(pcie->base + PCIE_RESOURCE_CTRL_REG);
446+
FIELD_MODIFY(PCIE_RSRC_SYS_CLK_RDY_TIME_MASK, &val,
447+
pcie->soc->sys_clk_rdy_time_us);
448+
writel_relaxed(val, pcie->base + PCIE_RESOURCE_CTRL_REG);
449+
}
450+
438451
/* Set class code */
439452
val = readl_relaxed(pcie->base + PCIE_PCI_IDS_1);
440453
val &= ~GENMASK(31, 8);
@@ -1327,6 +1340,15 @@ static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8192 = {
13271340
},
13281341
};
13291342

1343+
static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8196 = {
1344+
.power_up = mtk_pcie_power_up,
1345+
.phy_resets = {
1346+
.id[0] = "phy",
1347+
.num_resets = 1,
1348+
},
1349+
.sys_clk_rdy_time_us = 10,
1350+
};
1351+
13301352
static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_en7581 = {
13311353
.power_up = mtk_pcie_en7581_power_up,
13321354
.phy_resets = {
@@ -1341,6 +1363,7 @@ static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_en7581 = {
13411363
static const struct of_device_id mtk_pcie_of_match[] = {
13421364
{ .compatible = "airoha,en7581-pcie", .data = &mtk_pcie_soc_en7581 },
13431365
{ .compatible = "mediatek,mt8192-pcie", .data = &mtk_pcie_soc_mt8192 },
1366+
{ .compatible = "mediatek,mt8196-pcie", .data = &mtk_pcie_soc_mt8196 },
13441367
{},
13451368
};
13461369
MODULE_DEVICE_TABLE(of, mtk_pcie_of_match);

0 commit comments

Comments
 (0)