Skip to content

Commit 8e7bd52

Browse files
clamor-sthierryreding
authored andcommitted
clk: tegra: Add DFLL DVCO reset control for Tegra114
The DVCO present in the DFLL IP block has a separate reset line, exposed via the CAR IP block. This reset line is asserted upon SoC reset. Unless something (such as the DFLL driver) deasserts this line, the DVCO will not oscillate, although reads and writes to the DFLL IP block will complete. Based on a3c83ff ("clk: tegra: Add DFLL DVCO reset control for Tegra124") Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com> Reviewed-by: Mikko Perttunen <mperttunen@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
1 parent c4d7901 commit 8e7bd52

2 files changed

Lines changed: 26 additions & 6 deletions

File tree

drivers/clk/tegra/clk-tegra114.c

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/export.h>
1212
#include <linux/clk/tegra.h>
1313
#include <dt-bindings/clock/tegra114-car.h>
14+
#include <dt-bindings/reset/nvidia,tegra114-car.h>
1415

1516
#include "clk.h"
1617
#include "clk-id.h"
@@ -1272,7 +1273,7 @@ EXPORT_SYMBOL(tegra114_clock_tune_cpu_trimmers_init);
12721273
*
12731274
* Assert the reset line of the DFLL's DVCO. No return value.
12741275
*/
1275-
void tegra114_clock_assert_dfll_dvco_reset(void)
1276+
static void tegra114_clock_assert_dfll_dvco_reset(void)
12761277
{
12771278
u32 v;
12781279

@@ -1281,15 +1282,14 @@ void tegra114_clock_assert_dfll_dvco_reset(void)
12811282
writel_relaxed(v, clk_base + RST_DFLL_DVCO);
12821283
tegra114_car_barrier();
12831284
}
1284-
EXPORT_SYMBOL(tegra114_clock_assert_dfll_dvco_reset);
12851285

12861286
/**
12871287
* tegra114_clock_deassert_dfll_dvco_reset - deassert the DFLL's DVCO reset
12881288
*
12891289
* Deassert the reset line of the DFLL's DVCO, allowing the DVCO to
12901290
* operate. No return value.
12911291
*/
1292-
void tegra114_clock_deassert_dfll_dvco_reset(void)
1292+
static void tegra114_clock_deassert_dfll_dvco_reset(void)
12931293
{
12941294
u32 v;
12951295

@@ -1298,7 +1298,26 @@ void tegra114_clock_deassert_dfll_dvco_reset(void)
12981298
writel_relaxed(v, clk_base + RST_DFLL_DVCO);
12991299
tegra114_car_barrier();
13001300
}
1301-
EXPORT_SYMBOL(tegra114_clock_deassert_dfll_dvco_reset);
1301+
1302+
static int tegra114_reset_assert(unsigned long id)
1303+
{
1304+
if (id == TEGRA114_RST_DFLL_DVCO)
1305+
tegra114_clock_assert_dfll_dvco_reset();
1306+
else
1307+
return -EINVAL;
1308+
1309+
return 0;
1310+
}
1311+
1312+
static int tegra114_reset_deassert(unsigned long id)
1313+
{
1314+
if (id == TEGRA114_RST_DFLL_DVCO)
1315+
tegra114_clock_deassert_dfll_dvco_reset();
1316+
else
1317+
return -EINVAL;
1318+
1319+
return 0;
1320+
}
13021321

13031322
static void __init tegra114_clock_init(struct device_node *np)
13041323
{
@@ -1344,6 +1363,9 @@ static void __init tegra114_clock_init(struct device_node *np)
13441363
tegra_super_clk_gen4_init(clk_base, pmc_base, tegra114_clks,
13451364
&pll_x_params);
13461365

1366+
tegra_init_special_resets(1, tegra114_reset_assert,
1367+
tegra114_reset_deassert);
1368+
13471369
tegra_add_of_provider(np, of_clk_src_onecell_get);
13481370
tegra_register_devclks(devclks, ARRAY_SIZE(devclks));
13491371

drivers/clk/tegra/clk.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -897,8 +897,6 @@ static inline bool tegra124_clk_emc_driver_available(struct clk_hw *emc_hw)
897897
void tegra114_clock_tune_cpu_trimmers_high(void);
898898
void tegra114_clock_tune_cpu_trimmers_low(void);
899899
void tegra114_clock_tune_cpu_trimmers_init(void);
900-
void tegra114_clock_assert_dfll_dvco_reset(void);
901-
void tegra114_clock_deassert_dfll_dvco_reset(void);
902900

903901
typedef void (*tegra_clk_apply_init_table_func)(void);
904902
extern tegra_clk_apply_init_table_func tegra_clk_apply_init_table;

0 commit comments

Comments
 (0)