|
@@ -61,6 +61,7 @@ struct histb_pcie {
|
|
|
struct reset_control *bus_reset;
|
|
|
void __iomem *ctrl;
|
|
|
int reset_gpio;
|
|
|
+ struct regulator *vpcie;
|
|
|
};
|
|
|
|
|
|
static u32 histb_pcie_readl(struct histb_pcie *histb_pcie, u32 reg)
|
|
@@ -227,6 +228,9 @@ static void histb_pcie_host_disable(struct histb_pcie *hipcie)
|
|
|
|
|
|
if (gpio_is_valid(hipcie->reset_gpio))
|
|
|
gpio_set_value_cansleep(hipcie->reset_gpio, 0);
|
|
|
+
|
|
|
+ if (hipcie->vpcie)
|
|
|
+ regulator_disable(hipcie->vpcie);
|
|
|
}
|
|
|
|
|
|
static int histb_pcie_host_enable(struct pcie_port *pp)
|
|
@@ -237,6 +241,14 @@ static int histb_pcie_host_enable(struct pcie_port *pp)
|
|
|
int ret;
|
|
|
|
|
|
/* power on PCIe device if have */
|
|
|
+ if (hipcie->vpcie) {
|
|
|
+ ret = regulator_enable(hipcie->vpcie);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "failed to enable regulator: %d\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (gpio_is_valid(hipcie->reset_gpio))
|
|
|
gpio_set_value_cansleep(hipcie->reset_gpio, 1);
|
|
|
|
|
@@ -282,6 +294,8 @@ err_pipe_clk:
|
|
|
err_sys_clk:
|
|
|
clk_disable_unprepare(hipcie->bus_clk);
|
|
|
err_bus_clk:
|
|
|
+ if (hipcie->vpcie)
|
|
|
+ regulator_disable(hipcie->vpcie);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -331,6 +345,13 @@ static int histb_pcie_probe(struct platform_device *pdev)
|
|
|
return PTR_ERR(pci->dbi_base);
|
|
|
}
|
|
|
|
|
|
+ hipcie->vpcie = devm_regulator_get_optional(dev, "vpcie");
|
|
|
+ if (IS_ERR(hipcie->vpcie)) {
|
|
|
+ if (PTR_ERR(hipcie->vpcie) == -EPROBE_DEFER)
|
|
|
+ return -EPROBE_DEFER;
|
|
|
+ hipcie->vpcie = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
hipcie->reset_gpio = of_get_named_gpio_flags(np,
|
|
|
"reset-gpios", 0, &of_flags);
|
|
|
if (of_flags & OF_GPIO_ACTIVE_LOW)
|