Skip to content

Commit

Permalink
clk: tegra: Add missing reset deassertion
Browse files Browse the repository at this point in the history
Commit 4782c0a ("clk: tegra: Don't deassert reset on enabling
clocks") removed deassertion of reset lines when enabling peripheral
clocks. This breaks the initialization of the DFLL driver which relied
on this behaviour.

Fix this problem by adding explicit deassert/assert requests to the
driver. Tested on Google Pixel C.

Cc: stable@vger.kernel.org
Fixes: 4782c0a ("clk: tegra: Don't deassert reset on enabling clocks")
Signed-off-by: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
Signed-off-by: Thierry Reding <treding@nvidia.com>
  • Loading branch information
Diogo Ivo authored and Thierry Reding committed May 4, 2022
1 parent 3123109 commit 23a43cc
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions drivers/clk/tegra/clk-dfll.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ struct tegra_dfll {
struct clk *ref_clk;
struct clk *i2c_clk;
struct clk *dfll_clk;
struct reset_control *dfll_rst;
struct reset_control *dvco_rst;
unsigned long ref_rate;
unsigned long i2c_clk_rate;
Expand Down Expand Up @@ -1464,6 +1465,7 @@ static int dfll_init(struct tegra_dfll *td)
return -EINVAL;
}

reset_control_deassert(td->dfll_rst);
reset_control_deassert(td->dvco_rst);

ret = clk_prepare(td->ref_clk);
Expand Down Expand Up @@ -1509,6 +1511,7 @@ static int dfll_init(struct tegra_dfll *td)
clk_unprepare(td->ref_clk);

reset_control_assert(td->dvco_rst);
reset_control_assert(td->dfll_rst);

return ret;
}
Expand All @@ -1530,6 +1533,7 @@ int tegra_dfll_suspend(struct device *dev)
}

reset_control_assert(td->dvco_rst);
reset_control_assert(td->dfll_rst);

return 0;
}
Expand All @@ -1548,6 +1552,7 @@ int tegra_dfll_resume(struct device *dev)
{
struct tegra_dfll *td = dev_get_drvdata(dev);

reset_control_deassert(td->dfll_rst);
reset_control_deassert(td->dvco_rst);

pm_runtime_get_sync(td->dev);
Expand Down Expand Up @@ -1951,6 +1956,12 @@ int tegra_dfll_register(struct platform_device *pdev,

td->soc = soc;

td->dfll_rst = devm_reset_control_get_optional(td->dev, "dfll");
if (IS_ERR(td->dfll_rst)) {
dev_err(td->dev, "couldn't get dfll reset\n");
return PTR_ERR(td->dfll_rst);
}

td->dvco_rst = devm_reset_control_get(td->dev, "dvco");
if (IS_ERR(td->dvco_rst)) {
dev_err(td->dev, "couldn't get dvco reset\n");
Expand Down Expand Up @@ -2087,6 +2098,7 @@ struct tegra_dfll_soc_data *tegra_dfll_unregister(struct platform_device *pdev)
clk_unprepare(td->i2c_clk);

reset_control_assert(td->dvco_rst);
reset_control_assert(td->dfll_rst);

return td->soc;
}
Expand Down

0 comments on commit 23a43cc

Please sign in to comment.