1 /* SPDX-License-Identifier: GPL-2.0-only OR MIT */
3 #include <device/mmio.h>
4 #include <device/resource.h>
6 #include <soc/addressmap.h>
7 #include <soc/early_init.h>
9 #include <soc/pcie_common.h>
11 #define PCIE_REG_BASE_PORT0 0x112f0000
12 #define PCIE_RST_CTRL_REG (PCIE_REG_BASE_PORT0 + 0x148)
13 #define PCIE_MAC_RSTB BIT(0)
14 #define PCIE_PHY_RSTB BIT(1)
15 #define PCIE_BRG_RSTB BIT(2)
16 #define PCIE_PE_RSTB BIT(3)
23 #define PAD_FUNC(name, func) {GPIO(name), PAD_##name##_FUNC_##func}
25 static const struct pad_func pcie_pins
[2][3] = {
27 PAD_FUNC(PCIE_WAKE_N
, WAKEN
),
28 PAD_FUNC(PCIE_PERESET_N
, PERSTN
),
29 PAD_FUNC(PCIE_CLKREQ_N
, CLKREQN
),
32 PAD_FUNC(CMMCLK0
, PERSTN_1
),
33 PAD_FUNC(CMMCLK1
, CLKREQN_1
),
34 PAD_FUNC(CMMCLK2
, WAKEN_1
),
38 static void mtk_pcie_set_pinmux(uint8_t port
)
40 const struct pad_func
*pins
= pcie_pins
[port
];
43 for (i
= 0; i
< ARRAY_SIZE(pcie_pins
[port
]); i
++) {
44 gpio_set_mode(pins
[i
].gpio
, pins
[i
].func
);
45 gpio_set_pull(pins
[i
].gpio
, GPIO_PULL_ENABLE
, GPIO_PULL_UP
);
49 void mtk_pcie_reset(uintptr_t reg
, bool enable
)
56 val
|= PCIE_MAC_RSTB
| PCIE_PHY_RSTB
| PCIE_BRG_RSTB
|
59 val
&= ~(PCIE_MAC_RSTB
| PCIE_PHY_RSTB
| PCIE_BRG_RSTB
|
65 void mtk_pcie_pre_init(void)
67 mtk_pcie_set_pinmux(0);
69 /* Assert all reset signals at early stage */
70 mtk_pcie_reset(PCIE_RST_CTRL_REG
, true);
72 early_init_save_time(EARLY_INIT_PCIE
);