Skip to content

Commit

Permalink
phy: tegra: xusb: Add support for power supplies
Browse files Browse the repository at this point in the history
Support enabling various supplies needed to provide power to the PLLs
and logic used to drive the USB, PCI and SATA pads.

Reviewed-by: JC Kuo <jckuo@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
  • Loading branch information
Thierry Reding authored and Kishon Vijay Abraham I committed Apr 17, 2019
1 parent 5311a7b commit a630d54
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
34 changes: 33 additions & 1 deletion drivers/phy/tegra/xusb.c
Original file line number Diff line number Diff line change
Expand Up @@ -864,6 +864,7 @@ static int tegra_xusb_padctl_probe(struct platform_device *pdev)
struct tegra_xusb_padctl *padctl;
const struct of_device_id *match;
struct resource *res;
unsigned int i;
int err;

/* for backwards compatibility with old device trees */
Expand Down Expand Up @@ -901,14 +902,38 @@ static int tegra_xusb_padctl_probe(struct platform_device *pdev)
goto remove;
}

padctl->supplies = devm_kcalloc(&pdev->dev, padctl->soc->num_supplies,
sizeof(*padctl->supplies), GFP_KERNEL);
if (!padctl->supplies) {
err = -ENOMEM;
goto remove;
}

for (i = 0; i < padctl->soc->num_supplies; i++)
padctl->supplies[i].supply = padctl->soc->supply_names[i];

err = devm_regulator_bulk_get(&pdev->dev, padctl->soc->num_supplies,
padctl->supplies);
if (err < 0) {
dev_err(&pdev->dev, "failed to get regulators: %d\n", err);
goto remove;
}

err = reset_control_deassert(padctl->rst);
if (err < 0)
goto remove;

err = regulator_bulk_enable(padctl->soc->num_supplies,
padctl->supplies);
if (err < 0) {
dev_err(&pdev->dev, "failed to enable supplies: %d\n", err);
goto reset;
}

err = tegra_xusb_setup_pads(padctl);
if (err < 0) {
dev_err(&pdev->dev, "failed to setup pads: %d\n", err);
goto reset;
goto power_down;
}

err = tegra_xusb_setup_ports(padctl);
Expand All @@ -921,6 +946,8 @@ static int tegra_xusb_padctl_probe(struct platform_device *pdev)

remove_pads:
tegra_xusb_remove_pads(padctl);
power_down:
regulator_bulk_disable(padctl->soc->num_supplies, padctl->supplies);
reset:
reset_control_assert(padctl->rst);
remove:
Expand All @@ -936,6 +963,11 @@ static int tegra_xusb_padctl_remove(struct platform_device *pdev)
tegra_xusb_remove_ports(padctl);
tegra_xusb_remove_pads(padctl);

err = regulator_bulk_disable(padctl->soc->num_supplies,
padctl->supplies);
if (err < 0)
dev_err(&pdev->dev, "failed to disable supplies: %d\n", err);

err = reset_control_assert(padctl->rst);
if (err < 0)
dev_err(&pdev->dev, "failed to assert reset: %d\n", err);
Expand Down
5 changes: 5 additions & 0 deletions drivers/phy/tegra/xusb.h
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,9 @@ struct tegra_xusb_padctl_soc {
} ports;

const struct tegra_xusb_padctl_ops *ops;

const char * const *supply_names;
unsigned int num_supplies;
};

struct tegra_xusb_padctl {
Expand All @@ -393,6 +396,8 @@ struct tegra_xusb_padctl {
unsigned int enable;

struct clk *clk;

struct regulator_bulk_data *supplies;
};

static inline void padctl_writel(struct tegra_xusb_padctl *padctl, u32 value,
Expand Down

0 comments on commit a630d54

Please sign in to comment.