|
22 | 22 | #include <linux/resource.h>
|
23 | 23 | #include <linux/of_pci.h>
|
24 | 24 | #include <linux/of_irq.h>
|
| 25 | +#include <linux/gpio/consumer.h> |
25 | 26 |
|
26 | 27 | #include "pcie-designware.h"
|
27 | 28 |
|
28 | 29 | struct armada8k_pcie {
|
29 | 30 | struct dw_pcie *pci;
|
30 | 31 | struct clk *clk;
|
31 | 32 | struct clk *clk_reg;
|
| 33 | + struct gpio_desc *reset_gpio; |
32 | 34 | };
|
33 | 35 |
|
34 | 36 | #define PCIE_VENDOR_REGS_OFFSET 0x8000
|
@@ -137,6 +139,12 @@ static int armada8k_pcie_host_init(struct pcie_port *pp)
|
137 | 139 | struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
|
138 | 140 | struct armada8k_pcie *pcie = to_armada8k_pcie(pci);
|
139 | 141 |
|
| 142 | + if (pcie->reset_gpio) { |
| 143 | + /* assert and then deassert the reset signal */ |
| 144 | + gpiod_set_value_cansleep(pcie->reset_gpio, 1); |
| 145 | + msleep(100); |
| 146 | + gpiod_set_value_cansleep(pcie->reset_gpio, 0); |
| 147 | + } |
140 | 148 | dw_pcie_setup_rc(pp);
|
141 | 149 | armada8k_pcie_establish_link(pcie);
|
142 | 150 |
|
@@ -249,6 +257,14 @@ static int armada8k_pcie_probe(struct platform_device *pdev)
|
249 | 257 | goto fail_clkreg;
|
250 | 258 | }
|
251 | 259 |
|
| 260 | + /* Get reset gpio signal and hold asserted (logically high) */ |
| 261 | + pcie->reset_gpio = devm_gpiod_get_optional(dev, "reset", |
| 262 | + GPIOD_OUT_HIGH); |
| 263 | + if (IS_ERR(pcie->reset_gpio)) { |
| 264 | + ret = PTR_ERR(pcie->reset_gpio); |
| 265 | + goto fail_clkreg; |
| 266 | + } |
| 267 | + |
252 | 268 | platform_set_drvdata(pdev, pcie);
|
253 | 269 |
|
254 | 270 | ret = armada8k_add_pcie_port(pcie, pdev);
|
|
0 commit comments