提交 58dfb243 编写于 作者: S Shawn Guo 提交者: Lorenzo Pieralisi

PCI: histb: Add an optional regulator for PCIe port power control

The power supplies to PCIe port are often controlled by GPIO on some board
designs.  Let's add an optional regulator which can be backed by GPIO to
control the power.
Signed-off-by: NShawn Guo <shawn.guo@linaro.org>
Signed-off-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: NRob Herring <robh@kernel.org>
上级 db0c25f8
...@@ -34,6 +34,7 @@ Required properties ...@@ -34,6 +34,7 @@ Required properties
Optional properties: Optional properties:
- reset-gpios: The gpio to generate PCIe PERST# assert and deassert signal. - reset-gpios: The gpio to generate PCIe PERST# assert and deassert signal.
- vpcie-supply: The regulator in charge of PCIe port power.
- phys: List of phandle and phy mode specifier, should be 0. - phys: List of phandle and phy mode specifier, should be 0.
- phy-names: Must be "phy". - phy-names: Must be "phy".
......
...@@ -61,6 +61,7 @@ struct histb_pcie { ...@@ -61,6 +61,7 @@ struct histb_pcie {
struct reset_control *bus_reset; struct reset_control *bus_reset;
void __iomem *ctrl; void __iomem *ctrl;
int reset_gpio; int reset_gpio;
struct regulator *vpcie;
}; };
static u32 histb_pcie_readl(struct histb_pcie *histb_pcie, u32 reg) 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) ...@@ -227,6 +228,9 @@ static void histb_pcie_host_disable(struct histb_pcie *hipcie)
if (gpio_is_valid(hipcie->reset_gpio)) if (gpio_is_valid(hipcie->reset_gpio))
gpio_set_value_cansleep(hipcie->reset_gpio, 0); 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) static int histb_pcie_host_enable(struct pcie_port *pp)
...@@ -237,6 +241,14 @@ 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; int ret;
/* power on PCIe device if have */ /* 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)) if (gpio_is_valid(hipcie->reset_gpio))
gpio_set_value_cansleep(hipcie->reset_gpio, 1); gpio_set_value_cansleep(hipcie->reset_gpio, 1);
...@@ -282,6 +294,8 @@ static int histb_pcie_host_enable(struct pcie_port *pp) ...@@ -282,6 +294,8 @@ static int histb_pcie_host_enable(struct pcie_port *pp)
err_sys_clk: err_sys_clk:
clk_disable_unprepare(hipcie->bus_clk); clk_disable_unprepare(hipcie->bus_clk);
err_bus_clk: err_bus_clk:
if (hipcie->vpcie)
regulator_disable(hipcie->vpcie);
return ret; return ret;
} }
...@@ -331,6 +345,13 @@ static int histb_pcie_probe(struct platform_device *pdev) ...@@ -331,6 +345,13 @@ static int histb_pcie_probe(struct platform_device *pdev)
return PTR_ERR(pci->dbi_base); 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, hipcie->reset_gpio = of_get_named_gpio_flags(np,
"reset-gpios", 0, &of_flags); "reset-gpios", 0, &of_flags);
if (of_flags & OF_GPIO_ACTIVE_LOW) if (of_flags & OF_GPIO_ACTIVE_LOW)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册