Skip to content

Commit

Permalink
pci: tegra: use reset framework
Browse files Browse the repository at this point in the history
Tegra's clock driver now provides an implementation of the common
reset API (include/linux/reset.h). Use this instead of the old Tegra-
specific API; that will soon be removed.

The old Tegra-specific API used a struct clock to represent the module
to reset. Some of the clocks retrieved during probe() were only used for
reset purposes, and indeed aren't even true clocks. So, there's no need
to get() them any more.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Thierry Reding <treding@nvidia.com>
Acked-by: Thierry Reding <treding@nvidia.com>
  • Loading branch information
Stephen Warren committed Dec 11, 2013
1 parent 6d5b988 commit 3127a6b
Showing 1 changed file with 36 additions and 14 deletions.
50 changes: 36 additions & 14 deletions drivers/pci/host/pci-tegra.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
*/

#include <linux/clk.h>
#include <linux/clk/tegra.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/interrupt.h>
Expand All @@ -39,6 +38,7 @@
#include <linux/of_platform.h>
#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/reset.h>
#include <linux/sizes.h>
#include <linux/slab.h>
#include <linux/tegra-cpuidle.h>
Expand Down Expand Up @@ -259,10 +259,13 @@ struct tegra_pcie {

struct clk *pex_clk;
struct clk *afi_clk;
struct clk *pcie_xclk;
struct clk *pll_e;
struct clk *cml_clk;

struct reset_control *pex_rst;
struct reset_control *afi_rst;
struct reset_control *pcie_xrst;

struct tegra_msi msi;

struct list_head ports;
Expand Down Expand Up @@ -858,7 +861,7 @@ static int tegra_pcie_enable_controller(struct tegra_pcie *pcie)
pads_writel(pcie, value, PADS_CTL);

/* take the PCIe interface module out of reset */
tegra_periph_reset_deassert(pcie->pcie_xclk);
reset_control_deassert(pcie->pcie_xrst);

/* finally enable PCIe */
value = afi_readl(pcie, AFI_CONFIGURATION);
Expand Down Expand Up @@ -891,9 +894,9 @@ static void tegra_pcie_power_off(struct tegra_pcie *pcie)

/* TODO: disable and unprepare clocks? */

tegra_periph_reset_assert(pcie->pcie_xclk);
tegra_periph_reset_assert(pcie->afi_clk);
tegra_periph_reset_assert(pcie->pex_clk);
reset_control_assert(pcie->pcie_xrst);
reset_control_assert(pcie->afi_rst);
reset_control_assert(pcie->pex_rst);

tegra_powergate_power_off(TEGRA_POWERGATE_PCIE);

Expand Down Expand Up @@ -921,9 +924,9 @@ static int tegra_pcie_power_on(struct tegra_pcie *pcie)
const struct tegra_pcie_soc_data *soc = pcie->soc_data;
int err;

tegra_periph_reset_assert(pcie->pcie_xclk);
tegra_periph_reset_assert(pcie->afi_clk);
tegra_periph_reset_assert(pcie->pex_clk);
reset_control_assert(pcie->pcie_xrst);
reset_control_assert(pcie->afi_rst);
reset_control_assert(pcie->pex_rst);

tegra_powergate_power_off(TEGRA_POWERGATE_PCIE);

Expand Down Expand Up @@ -958,7 +961,7 @@ static int tegra_pcie_power_on(struct tegra_pcie *pcie)
return err;
}

tegra_periph_reset_deassert(pcie->afi_clk);
reset_control_deassert(pcie->afi_rst);

err = clk_prepare_enable(pcie->afi_clk);
if (err < 0) {
Expand Down Expand Up @@ -996,10 +999,6 @@ static int tegra_pcie_clocks_get(struct tegra_pcie *pcie)
if (IS_ERR(pcie->afi_clk))
return PTR_ERR(pcie->afi_clk);

pcie->pcie_xclk = devm_clk_get(pcie->dev, "pcie_xclk");
if (IS_ERR(pcie->pcie_xclk))
return PTR_ERR(pcie->pcie_xclk);

pcie->pll_e = devm_clk_get(pcie->dev, "pll_e");
if (IS_ERR(pcie->pll_e))
return PTR_ERR(pcie->pll_e);
Expand All @@ -1013,6 +1012,23 @@ static int tegra_pcie_clocks_get(struct tegra_pcie *pcie)
return 0;
}

static int tegra_pcie_resets_get(struct tegra_pcie *pcie)
{
pcie->pex_rst = devm_reset_control_get(pcie->dev, "pex");
if (IS_ERR(pcie->pex_rst))
return PTR_ERR(pcie->pex_rst);

pcie->afi_rst = devm_reset_control_get(pcie->dev, "afi");
if (IS_ERR(pcie->afi_rst))
return PTR_ERR(pcie->afi_rst);

pcie->pcie_xrst = devm_reset_control_get(pcie->dev, "pcie_x");
if (IS_ERR(pcie->pcie_xrst))
return PTR_ERR(pcie->pcie_xrst);

return 0;
}

static int tegra_pcie_get_resources(struct tegra_pcie *pcie)
{
struct platform_device *pdev = to_platform_device(pcie->dev);
Expand All @@ -1025,6 +1041,12 @@ static int tegra_pcie_get_resources(struct tegra_pcie *pcie)
return err;
}

err = tegra_pcie_resets_get(pcie);
if (err) {
dev_err(&pdev->dev, "failed to get resets: %d\n", err);
return err;
}

err = tegra_pcie_power_on(pcie);
if (err) {
dev_err(&pdev->dev, "failed to power up: %d\n", err);
Expand Down

0 comments on commit 3127a6b

Please sign in to comment.