Commit 6797e4da authored by Wolfram Sang's avatar Wolfram Sang Committed by Krzysztof Wilczyński

PCI: rcar-host: Add support for optional regulators

The KingFisher board has regulators for miniPCIe, so enable these
optional regulators using devm. devm will automatically disable them
when the driver releases the device. Order variables in reverse-xmas
while we are here.

[kwilczynski: update style to match rest of the code]
Link: https://lore.kernel.org/linux-pci/20231105092908.3792-3-wsa+renesas@sang-engineering.comSigned-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: default avatarKrzysztof Wilczyński <kwilczynski@kernel.org>
Reviewed-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Acked-by: default avatarManivannan Sadhasivam <mani@kernel.org>
parent b952f96a
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/phy/phy.h> #include <linux/phy/phy.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/regulator/consumer.h>
#include "pcie-rcar.h" #include "pcie-rcar.h"
...@@ -953,14 +954,22 @@ static const struct of_device_id rcar_pcie_of_match[] = { ...@@ -953,14 +954,22 @@ static const struct of_device_id rcar_pcie_of_match[] = {
{}, {},
}; };
/* Design note 346 from Linear Technology says order is not important. */
static const char * const rcar_pcie_supplies[] = {
"vpcie1v5",
"vpcie3v3",
"vpcie12v",
};
static int rcar_pcie_probe(struct platform_device *pdev) static int rcar_pcie_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct pci_host_bridge *bridge;
struct rcar_pcie_host *host; struct rcar_pcie_host *host;
struct rcar_pcie *pcie; struct rcar_pcie *pcie;
unsigned int i;
u32 data; u32 data;
int err; int err;
struct pci_host_bridge *bridge;
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*host)); bridge = devm_pci_alloc_host_bridge(dev, sizeof(*host));
if (!bridge) if (!bridge)
...@@ -971,6 +980,13 @@ static int rcar_pcie_probe(struct platform_device *pdev) ...@@ -971,6 +980,13 @@ static int rcar_pcie_probe(struct platform_device *pdev)
pcie->dev = dev; pcie->dev = dev;
platform_set_drvdata(pdev, host); platform_set_drvdata(pdev, host);
for (i = 0; i < ARRAY_SIZE(rcar_pcie_supplies); i++) {
err = devm_regulator_get_enable_optional(dev, rcar_pcie_supplies[i]);
if (err < 0 && err != -ENODEV)
return dev_err_probe(dev, err, "failed to enable regulator: %s\n",
rcar_pcie_supplies[i]);
}
pm_runtime_enable(pcie->dev); pm_runtime_enable(pcie->dev);
err = pm_runtime_get_sync(pcie->dev); err = pm_runtime_get_sync(pcie->dev);
if (err < 0) { if (err < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment