clk: tegra: Changes for v4.12-rc1
This contains a bunch of fixes and cleanups, mostly to the Tegra210 clock driver. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEiOrDCAFJzPfAjcif3SOs138+s6EFAljmyG4THHRyZWRpbmdA bnZpZGlhLmNvbQAKCRDdI6zXfz6zof0WD/wIcN4MZ0oOQ3GzCc0Ou0o4NIsyb6xK rETS84l0hNvzuHvaII9NNdnnqONtJfj1J9bqire16zulNmEmtbwgxsvL25DPcLh1 SaYwEyfE44u3TFnx24bAPP31dn9BhPBZOq/Xvs2prjGnmaCDMF/9vY5H4ej6lIuV 6JZYGzqmDy930DBrJ/13nUDzQuhdXky/f7iFHevFHK/yWOVNLPsA6bOrUVJU/1O4 3vAsKJOpbKIYFAR6EltpgB+WhI++0VOnwGCLMwB8eEjQWPIr38qz2kkkLJYy77DC xS58/T4akY/5Hi+gtHK1WyjMxeQsck4fMFCZkl0KqyHRHAHZKmmoIQc+DBVg+FeM AwplwmgW4Mxlk2D3oaO64Vuuu7tVdTmhJSPAtrl5TJLDgx/FTJjIOauWTLmvp9sl wYNHQ7QS/0kkmr+jgo3HxyQfxgm8PHsSzDoDB6VYPCNad0pFMSQATXD9rrppHudh RtHVtgGv2uX/fg4VJzYK/WdkkvCUG/UQQt+eEzZlGqCGj3t28NTqZPSM7YVwggGW nG/SVqV4wlQpSZuUgdKjANmnDaBiksA5/txhTmly37Sv3woI/aWV0THTFjZhsM4o FYGcv6d1tlX57pfC1WboYNVHg7mC6c2R+Ibvjmrrnt8WgfOQTzrNmK8UsqaLiV9h Fonu4UOyF0yX2Q== =fDsq -----END PGP SIGNATURE----- Merge tag 'tegra-for-4.12-clk' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into clk-next Pull Tegra clk driver updates from Thierry Reding: This contains a bunch of fixes and cleanups, mostly to the Tegra210 clock driver. * tag 'tegra-for-4.12-clk' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux: (24 commits) clk: tegra: Don't reset PLL-CX if it is already enabled clk: tegra: Add missing Tegra210 clocks clk: tegra: Propagate clk_out_x rate to parent clk: tegra: Fix build warnings on Tegra20/Tegra30 clk: tegra: Mark TEGRA210_CLK_DBGAPB as always on clk: tegra: Add SATA seq input control clk: tegra: Add Tegra210 special resets clk: tegra: Rework pll_u clk: tegra: Implement reset control reset clk: tegra: Fix disable unused for clocks sharing enable bit clk: tegra: Handle UTMIPLL IDDQ clk: tegra: Add aclk clk: tegra: Add super clock mux/divider clk: tegra: Define Tegra210 DMIC clocks clk: tegra: Fix constness for peripheral clocks clk: tegra: Define Tegra210 DMIC sync clocks clk: tegra: Add CEC clock clk: tegra: Fix type for m field clk: tegra: Correct tegra210_pll_fixed_mdiv_cfg rate calculation clk: tegra: Don't warn for PLL defaults unnecessarily ...
This commit is contained in:
commit
72be2d5f4a
@ -307,6 +307,23 @@ enum clk_id {
|
||||
tegra_clk_xusb_ssp_src,
|
||||
tegra_clk_sclk_mux,
|
||||
tegra_clk_sor_safe,
|
||||
tegra_clk_cec,
|
||||
tegra_clk_ispa,
|
||||
tegra_clk_dmic1,
|
||||
tegra_clk_dmic2,
|
||||
tegra_clk_dmic3,
|
||||
tegra_clk_dmic1_sync_clk,
|
||||
tegra_clk_dmic2_sync_clk,
|
||||
tegra_clk_dmic3_sync_clk,
|
||||
tegra_clk_dmic1_sync_clk_mux,
|
||||
tegra_clk_dmic2_sync_clk_mux,
|
||||
tegra_clk_dmic3_sync_clk_mux,
|
||||
tegra_clk_iqc1,
|
||||
tegra_clk_iqc2,
|
||||
tegra_clk_pll_a_out_adsp,
|
||||
tegra_clk_pll_a_out0_out_adsp,
|
||||
tegra_clk_adsp,
|
||||
tegra_clk_adsp_neon,
|
||||
tegra_clk_max,
|
||||
};
|
||||
|
||||
|
@ -159,6 +159,9 @@ struct clk *tegra_clk_register_periph_gate(const char *name,
|
||||
gate->enable_refcnt = enable_refcnt;
|
||||
gate->regs = pregs;
|
||||
|
||||
if (read_enb(gate) & periph_clk_to_bit(gate))
|
||||
enable_refcnt[clk_num]++;
|
||||
|
||||
/* Data in .init is copied by clk_register(), so stack variable OK */
|
||||
gate->hw.init = &init;
|
||||
|
||||
|
@ -138,7 +138,7 @@ static const struct clk_ops tegra_clk_periph_no_gate_ops = {
|
||||
};
|
||||
|
||||
static struct clk *_tegra_clk_register_periph(const char *name,
|
||||
const char **parent_names, int num_parents,
|
||||
const char * const *parent_names, int num_parents,
|
||||
struct tegra_clk_periph *periph,
|
||||
void __iomem *clk_base, u32 offset,
|
||||
unsigned long flags)
|
||||
@ -186,7 +186,7 @@ static struct clk *_tegra_clk_register_periph(const char *name,
|
||||
}
|
||||
|
||||
struct clk *tegra_clk_register_periph(const char *name,
|
||||
const char **parent_names, int num_parents,
|
||||
const char * const *parent_names, int num_parents,
|
||||
struct tegra_clk_periph *periph, void __iomem *clk_base,
|
||||
u32 offset, unsigned long flags)
|
||||
{
|
||||
@ -195,7 +195,7 @@ struct clk *tegra_clk_register_periph(const char *name,
|
||||
}
|
||||
|
||||
struct clk *tegra_clk_register_periph_nodiv(const char *name,
|
||||
const char **parent_names, int num_parents,
|
||||
const char * const *parent_names, int num_parents,
|
||||
struct tegra_clk_periph *periph, void __iomem *clk_base,
|
||||
u32 offset)
|
||||
{
|
||||
|
@ -2517,152 +2517,6 @@ static int clk_plle_tegra210_is_enabled(struct clk_hw *hw)
|
||||
return val & PLLE_BASE_ENABLE ? 1 : 0;
|
||||
}
|
||||
|
||||
static int clk_pllu_tegra210_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_clk_pll *pll = to_clk_pll(hw);
|
||||
struct clk_hw *pll_ref = clk_hw_get_parent(hw);
|
||||
struct clk_hw *osc = clk_hw_get_parent(pll_ref);
|
||||
const struct utmi_clk_param *params = NULL;
|
||||
unsigned long flags = 0, input_rate;
|
||||
unsigned int i;
|
||||
int ret = 0;
|
||||
u32 value;
|
||||
|
||||
if (!osc) {
|
||||
pr_err("%s: failed to get OSC clock\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
input_rate = clk_hw_get_rate(osc);
|
||||
|
||||
if (pll->lock)
|
||||
spin_lock_irqsave(pll->lock, flags);
|
||||
|
||||
_clk_pll_enable(hw);
|
||||
|
||||
ret = clk_pll_wait_for_lock(pll);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
|
||||
if (input_rate == utmi_parameters[i].osc_frequency) {
|
||||
params = &utmi_parameters[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!params) {
|
||||
pr_err("%s: unexpected input rate %lu Hz\n", __func__,
|
||||
input_rate);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
value = pll_readl_base(pll);
|
||||
value &= ~PLLU_BASE_OVERRIDE;
|
||||
pll_writel_base(value, pll);
|
||||
|
||||
/* Put PLLU under HW control */
|
||||
value = readl_relaxed(pll->clk_base + PLLU_HW_PWRDN_CFG0);
|
||||
value |= PLLU_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE |
|
||||
PLLU_HW_PWRDN_CFG0_USE_SWITCH_DETECT |
|
||||
PLLU_HW_PWRDN_CFG0_USE_LOCKDET;
|
||||
value &= ~(PLLU_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL |
|
||||
PLLU_HW_PWRDN_CFG0_CLK_SWITCH_SWCTL);
|
||||
writel_relaxed(value, pll->clk_base + PLLU_HW_PWRDN_CFG0);
|
||||
|
||||
value = readl_relaxed(pll->clk_base + XUSB_PLL_CFG0);
|
||||
value &= ~XUSB_PLL_CFG0_PLLU_LOCK_DLY;
|
||||
writel_relaxed(value, pll->clk_base + XUSB_PLL_CFG0);
|
||||
|
||||
udelay(1);
|
||||
|
||||
value = readl_relaxed(pll->clk_base + PLLU_HW_PWRDN_CFG0);
|
||||
value |= PLLU_HW_PWRDN_CFG0_SEQ_ENABLE;
|
||||
writel_relaxed(value, pll->clk_base + PLLU_HW_PWRDN_CFG0);
|
||||
|
||||
udelay(1);
|
||||
|
||||
/* Disable PLLU clock branch to UTMIPLL since it uses OSC */
|
||||
value = pll_readl_base(pll);
|
||||
value &= ~PLLU_BASE_CLKENABLE_USB;
|
||||
pll_writel_base(value, pll);
|
||||
|
||||
value = readl_relaxed(pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
if (value & UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE) {
|
||||
pr_debug("UTMIPLL already enabled\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
value &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
|
||||
writel_relaxed(value, pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
|
||||
/* Program UTMIP PLL stable and active counts */
|
||||
value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG2);
|
||||
value &= ~UTMIP_PLL_CFG2_STABLE_COUNT(~0);
|
||||
value |= UTMIP_PLL_CFG2_STABLE_COUNT(params->stable_count);
|
||||
value &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0);
|
||||
value |= UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(params->active_delay_count);
|
||||
value |= UTMIP_PLL_CFG2_PHY_XTAL_CLOCKEN;
|
||||
writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG2);
|
||||
|
||||
/* Program UTMIP PLL delay and oscillator frequency counts */
|
||||
value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG1);
|
||||
value &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
|
||||
value |= UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(params->enable_delay_count);
|
||||
value &= ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0);
|
||||
value |= UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(params->xtal_freq_count);
|
||||
writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG1);
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
value |= UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
|
||||
writel(value, pll->clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
udelay(1);
|
||||
|
||||
/* Enable samplers for SNPS, XUSB_HOST, XUSB_DEV */
|
||||
value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG2);
|
||||
value |= UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERUP;
|
||||
value |= UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERUP;
|
||||
value |= UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERUP;
|
||||
value &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN;
|
||||
value &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN;
|
||||
value &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERDOWN;
|
||||
writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG2);
|
||||
|
||||
/* Setup HW control of UTMIPLL */
|
||||
value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG1);
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
value = readl_relaxed(pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
value |= UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET;
|
||||
value &= ~UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL;
|
||||
writel_relaxed(value, pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
|
||||
udelay(1);
|
||||
|
||||
value = readl_relaxed(pll->clk_base + XUSB_PLL_CFG0);
|
||||
value &= ~XUSB_PLL_CFG0_UTMIPLL_LOCK_DLY;
|
||||
writel_relaxed(value, pll->clk_base + XUSB_PLL_CFG0);
|
||||
|
||||
udelay(1);
|
||||
|
||||
/* Enable HW control of UTMIPLL */
|
||||
value = readl_relaxed(pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
value |= UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE;
|
||||
writel_relaxed(value, pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
|
||||
out:
|
||||
if (pll->lock)
|
||||
spin_unlock_irqrestore(pll->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct clk_ops tegra_clk_plle_tegra210_ops = {
|
||||
.is_enabled = clk_plle_tegra210_is_enabled,
|
||||
.enable = clk_plle_tegra210_enable,
|
||||
@ -2670,13 +2524,6 @@ static const struct clk_ops tegra_clk_plle_tegra210_ops = {
|
||||
.recalc_rate = clk_pll_recalc_rate,
|
||||
};
|
||||
|
||||
static const struct clk_ops tegra_clk_pllu_tegra210_ops = {
|
||||
.is_enabled = clk_pll_is_enabled,
|
||||
.enable = clk_pllu_tegra210_enable,
|
||||
.disable = clk_pll_disable,
|
||||
.recalc_rate = clk_pllre_recalc_rate,
|
||||
};
|
||||
|
||||
struct clk *tegra_clk_register_plle_tegra210(const char *name,
|
||||
const char *parent_name,
|
||||
void __iomem *clk_base, unsigned long flags,
|
||||
@ -2918,25 +2765,4 @@ struct clk *tegra_clk_register_pllmb(const char *name, const char *parent_name,
|
||||
return clk;
|
||||
}
|
||||
|
||||
struct clk *tegra_clk_register_pllu_tegra210(const char *name,
|
||||
const char *parent_name, void __iomem *clk_base,
|
||||
unsigned long flags, struct tegra_clk_pll_params *pll_params,
|
||||
spinlock_t *lock)
|
||||
{
|
||||
struct tegra_clk_pll *pll;
|
||||
struct clk *clk;
|
||||
|
||||
pll_params->flags |= TEGRA_PLLU;
|
||||
|
||||
pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
|
||||
if (IS_ERR(pll))
|
||||
return ERR_CAST(pll);
|
||||
|
||||
clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
|
||||
&tegra_clk_pllu_tegra210_ops);
|
||||
if (IS_ERR(clk))
|
||||
kfree(pll);
|
||||
|
||||
return clk;
|
||||
}
|
||||
#endif
|
||||
|
@ -121,9 +121,50 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
const struct clk_ops tegra_clk_super_mux_ops = {
|
||||
.get_parent = clk_super_get_parent,
|
||||
.set_parent = clk_super_set_parent,
|
||||
};
|
||||
|
||||
static long clk_super_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *parent_rate)
|
||||
{
|
||||
struct tegra_clk_super_mux *super = to_clk_super_mux(hw);
|
||||
struct clk_hw *div_hw = &super->frac_div.hw;
|
||||
|
||||
__clk_hw_set_clk(div_hw, hw);
|
||||
|
||||
return super->div_ops->round_rate(div_hw, rate, parent_rate);
|
||||
}
|
||||
|
||||
static unsigned long clk_super_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct tegra_clk_super_mux *super = to_clk_super_mux(hw);
|
||||
struct clk_hw *div_hw = &super->frac_div.hw;
|
||||
|
||||
__clk_hw_set_clk(div_hw, hw);
|
||||
|
||||
return super->div_ops->recalc_rate(div_hw, parent_rate);
|
||||
}
|
||||
|
||||
static int clk_super_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct tegra_clk_super_mux *super = to_clk_super_mux(hw);
|
||||
struct clk_hw *div_hw = &super->frac_div.hw;
|
||||
|
||||
__clk_hw_set_clk(div_hw, hw);
|
||||
|
||||
return super->div_ops->set_rate(div_hw, rate, parent_rate);
|
||||
}
|
||||
|
||||
const struct clk_ops tegra_clk_super_ops = {
|
||||
.get_parent = clk_super_get_parent,
|
||||
.set_parent = clk_super_set_parent,
|
||||
.set_rate = clk_super_set_rate,
|
||||
.round_rate = clk_super_round_rate,
|
||||
.recalc_rate = clk_super_recalc_rate,
|
||||
};
|
||||
|
||||
struct clk *tegra_clk_register_super_mux(const char *name,
|
||||
@ -136,13 +177,11 @@ struct clk *tegra_clk_register_super_mux(const char *name,
|
||||
struct clk_init_data init;
|
||||
|
||||
super = kzalloc(sizeof(*super), GFP_KERNEL);
|
||||
if (!super) {
|
||||
pr_err("%s: could not allocate super clk\n", __func__);
|
||||
if (!super)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
init.name = name;
|
||||
init.ops = &tegra_clk_super_ops;
|
||||
init.ops = &tegra_clk_super_mux_ops;
|
||||
init.flags = flags;
|
||||
init.parent_names = parent_names;
|
||||
init.num_parents = num_parents;
|
||||
@ -163,3 +202,43 @@ struct clk *tegra_clk_register_super_mux(const char *name,
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
||||
struct clk *tegra_clk_register_super_clk(const char *name,
|
||||
const char * const *parent_names, u8 num_parents,
|
||||
unsigned long flags, void __iomem *reg, u8 clk_super_flags,
|
||||
spinlock_t *lock)
|
||||
{
|
||||
struct tegra_clk_super_mux *super;
|
||||
struct clk *clk;
|
||||
struct clk_init_data init;
|
||||
|
||||
super = kzalloc(sizeof(*super), GFP_KERNEL);
|
||||
if (!super)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
init.name = name;
|
||||
init.ops = &tegra_clk_super_ops;
|
||||
init.flags = flags;
|
||||
init.parent_names = parent_names;
|
||||
init.num_parents = num_parents;
|
||||
|
||||
super->reg = reg;
|
||||
super->lock = lock;
|
||||
super->width = 4;
|
||||
super->flags = clk_super_flags;
|
||||
super->frac_div.reg = reg + 4;
|
||||
super->frac_div.shift = 16;
|
||||
super->frac_div.width = 8;
|
||||
super->frac_div.frac_width = 1;
|
||||
super->frac_div.lock = lock;
|
||||
super->div_ops = &tegra_clk_frac_div_ops;
|
||||
|
||||
/* Data in .init is copied by clk_register(), so stack variable OK */
|
||||
super->hw.init = &init;
|
||||
|
||||
clk = clk_register(NULL, &super->hw);
|
||||
if (IS_ERR(clk))
|
||||
kfree(super);
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
@ -31,6 +31,9 @@
|
||||
#define AUDIO_SYNC_CLK_I2S3 0x4ac
|
||||
#define AUDIO_SYNC_CLK_I2S4 0x4b0
|
||||
#define AUDIO_SYNC_CLK_SPDIF 0x4b4
|
||||
#define AUDIO_SYNC_CLK_DMIC1 0x560
|
||||
#define AUDIO_SYNC_CLK_DMIC2 0x564
|
||||
#define AUDIO_SYNC_CLK_DMIC3 0x6b8
|
||||
|
||||
#define AUDIO_SYNC_DOUBLER 0x49c
|
||||
|
||||
@ -91,8 +94,14 @@ struct tegra_audio2x_clk_initdata {
|
||||
|
||||
static DEFINE_SPINLOCK(clk_doubler_lock);
|
||||
|
||||
static const char *mux_audio_sync_clk[] = { "spdif_in_sync", "i2s0_sync",
|
||||
"i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync",
|
||||
static const char * const mux_audio_sync_clk[] = { "spdif_in_sync",
|
||||
"i2s0_sync", "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync",
|
||||
"pll_a_out0", "vimclk_sync",
|
||||
};
|
||||
|
||||
static const char * const mux_dmic_sync_clk[] = { "unused", "i2s0_sync",
|
||||
"i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "pll_a_out0",
|
||||
"vimclk_sync",
|
||||
};
|
||||
|
||||
static struct tegra_sync_source_initdata sync_source_clks[] __initdata = {
|
||||
@ -114,6 +123,12 @@ static struct tegra_audio_clk_initdata audio_clks[] = {
|
||||
AUDIO(spdif, AUDIO_SYNC_CLK_SPDIF),
|
||||
};
|
||||
|
||||
static struct tegra_audio_clk_initdata dmic_clks[] = {
|
||||
AUDIO(dmic1_sync_clk, AUDIO_SYNC_CLK_DMIC1),
|
||||
AUDIO(dmic2_sync_clk, AUDIO_SYNC_CLK_DMIC2),
|
||||
AUDIO(dmic3_sync_clk, AUDIO_SYNC_CLK_DMIC3),
|
||||
};
|
||||
|
||||
static struct tegra_audio2x_clk_initdata audio2x_clks[] = {
|
||||
AUDIO2X(audio0, 113, 24),
|
||||
AUDIO2X(audio1, 114, 25),
|
||||
@ -123,6 +138,41 @@ static struct tegra_audio2x_clk_initdata audio2x_clks[] = {
|
||||
AUDIO2X(spdif, 118, 29),
|
||||
};
|
||||
|
||||
static void __init tegra_audio_sync_clk_init(void __iomem *clk_base,
|
||||
struct tegra_clk *tegra_clks,
|
||||
struct tegra_audio_clk_initdata *sync,
|
||||
int num_sync_clks,
|
||||
const char * const *mux_names,
|
||||
int num_mux_inputs)
|
||||
{
|
||||
struct clk *clk;
|
||||
struct clk **dt_clk;
|
||||
struct tegra_audio_clk_initdata *data;
|
||||
int i;
|
||||
|
||||
for (i = 0, data = sync; i < num_sync_clks; i++, data++) {
|
||||
dt_clk = tegra_lookup_dt_id(data->mux_clk_id, tegra_clks);
|
||||
if (!dt_clk)
|
||||
continue;
|
||||
|
||||
clk = clk_register_mux(NULL, data->mux_name, mux_names,
|
||||
num_mux_inputs,
|
||||
CLK_SET_RATE_NO_REPARENT,
|
||||
clk_base + data->offset, 0, 3, 0,
|
||||
NULL);
|
||||
*dt_clk = clk;
|
||||
|
||||
dt_clk = tegra_lookup_dt_id(data->gate_clk_id, tegra_clks);
|
||||
if (!dt_clk)
|
||||
continue;
|
||||
|
||||
clk = clk_register_gate(NULL, data->gate_name, data->mux_name,
|
||||
0, clk_base + data->offset, 4,
|
||||
CLK_GATE_SET_TO_DISABLE, NULL);
|
||||
*dt_clk = clk;
|
||||
}
|
||||
}
|
||||
|
||||
void __init tegra_audio_clk_init(void __iomem *clk_base,
|
||||
void __iomem *pmc_base, struct tegra_clk *tegra_clks,
|
||||
struct tegra_audio_clk_info *audio_info,
|
||||
@ -176,30 +226,17 @@ void __init tegra_audio_clk_init(void __iomem *clk_base,
|
||||
*dt_clk = clk;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(audio_clks); i++) {
|
||||
struct tegra_audio_clk_initdata *data;
|
||||
tegra_audio_sync_clk_init(clk_base, tegra_clks, audio_clks,
|
||||
ARRAY_SIZE(audio_clks), mux_audio_sync_clk,
|
||||
ARRAY_SIZE(mux_audio_sync_clk));
|
||||
|
||||
data = &audio_clks[i];
|
||||
dt_clk = tegra_lookup_dt_id(data->mux_clk_id, tegra_clks);
|
||||
/* make sure the DMIC sync clocks have a valid parent */
|
||||
for (i = 0; i < ARRAY_SIZE(dmic_clks); i++)
|
||||
writel_relaxed(1, clk_base + dmic_clks[i].offset);
|
||||
|
||||
if (!dt_clk)
|
||||
continue;
|
||||
clk = clk_register_mux(NULL, data->mux_name, mux_audio_sync_clk,
|
||||
ARRAY_SIZE(mux_audio_sync_clk),
|
||||
CLK_SET_RATE_NO_REPARENT,
|
||||
clk_base + data->offset, 0, 3, 0,
|
||||
NULL);
|
||||
*dt_clk = clk;
|
||||
|
||||
dt_clk = tegra_lookup_dt_id(data->gate_clk_id, tegra_clks);
|
||||
if (!dt_clk)
|
||||
continue;
|
||||
|
||||
clk = clk_register_gate(NULL, data->gate_name, data->mux_name,
|
||||
0, clk_base + data->offset, 4,
|
||||
CLK_GATE_SET_TO_DISABLE, NULL);
|
||||
*dt_clk = clk;
|
||||
}
|
||||
tegra_audio_sync_clk_init(clk_base, tegra_clks, dmic_clks,
|
||||
ARRAY_SIZE(dmic_clks), mux_dmic_sync_clk,
|
||||
ARRAY_SIZE(mux_dmic_sync_clk));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(audio2x_clks); i++) {
|
||||
struct tegra_audio2x_clk_initdata *data;
|
||||
|
@ -138,6 +138,9 @@
|
||||
#define CLK_SOURCE_TSECB 0x6d8
|
||||
#define CLK_SOURCE_MAUD 0x6d4
|
||||
#define CLK_SOURCE_USB2_HSIC_TRK 0x6cc
|
||||
#define CLK_SOURCE_DMIC1 0x64c
|
||||
#define CLK_SOURCE_DMIC2 0x650
|
||||
#define CLK_SOURCE_DMIC3 0x6bc
|
||||
|
||||
#define MASK(x) (BIT(x) - 1)
|
||||
|
||||
@ -168,6 +171,12 @@
|
||||
0, TEGRA_PERIPH_NO_GATE, _clk_id,\
|
||||
_parents##_idx, 0, _lock)
|
||||
|
||||
#define MUX8_NOGATE(_name, _parents, _offset, _clk_id) \
|
||||
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset, \
|
||||
29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\
|
||||
0, TEGRA_PERIPH_NO_GATE, _clk_id,\
|
||||
_parents##_idx, 0, NULL)
|
||||
|
||||
#define INT(_name, _parents, _offset, \
|
||||
_clk_num, _gate_flags, _clk_id) \
|
||||
TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\
|
||||
@ -619,6 +628,21 @@ static const char *mux_clkm_plldp_sor0lvds[] = {
|
||||
};
|
||||
#define mux_clkm_plldp_sor0lvds_idx NULL
|
||||
|
||||
static const char * const mux_dmic1[] = {
|
||||
"pll_a_out0", "dmic1_sync_clk", "pll_p", "clk_m"
|
||||
};
|
||||
#define mux_dmic1_idx NULL
|
||||
|
||||
static const char * const mux_dmic2[] = {
|
||||
"pll_a_out0", "dmic2_sync_clk", "pll_p", "clk_m"
|
||||
};
|
||||
#define mux_dmic2_idx NULL
|
||||
|
||||
static const char * const mux_dmic3[] = {
|
||||
"pll_a_out0", "dmic3_sync_clk", "pll_p", "clk_m"
|
||||
};
|
||||
#define mux_dmic3_idx NULL
|
||||
|
||||
static struct tegra_periph_init_data periph_clks[] = {
|
||||
AUDIO("d_audio", CLK_SOURCE_D_AUDIO, 106, TEGRA_PERIPH_ON_APB, tegra_clk_d_audio),
|
||||
AUDIO("dam0", CLK_SOURCE_DAM0, 108, TEGRA_PERIPH_ON_APB, tegra_clk_dam0),
|
||||
@ -739,7 +763,7 @@ static struct tegra_periph_init_data periph_clks[] = {
|
||||
MUX8("soc_therm", mux_clkm_pllc_pllp_plla, CLK_SOURCE_SOC_THERM, 78, TEGRA_PERIPH_ON_APB, tegra_clk_soc_therm_8),
|
||||
MUX8("vi_sensor", mux_pllm_pllc2_c_c3_pllp_plla, CLK_SOURCE_VI_SENSOR, 164, TEGRA_PERIPH_NO_RESET, tegra_clk_vi_sensor_8),
|
||||
MUX8("isp", mux_pllm_pllc_pllp_plla_clkm_pllc4, CLK_SOURCE_ISP, 23, TEGRA_PERIPH_ON_APB, tegra_clk_isp_8),
|
||||
MUX8("isp", mux_pllc_pllp_plla1_pllc2_c3_clkm_pllc4, CLK_SOURCE_ISP, 23, TEGRA_PERIPH_ON_APB, tegra_clk_isp_9),
|
||||
MUX8_NOGATE("isp", mux_pllc_pllp_plla1_pllc2_c3_clkm_pllc4, CLK_SOURCE_ISP, tegra_clk_isp_9),
|
||||
MUX8("entropy", mux_pllp_clkm1, CLK_SOURCE_ENTROPY, 149, 0, tegra_clk_entropy),
|
||||
MUX8("entropy", mux_pllp_clkm_clk32_plle, CLK_SOURCE_ENTROPY, 149, 0, tegra_clk_entropy_8),
|
||||
MUX8("hdmi_audio", mux_pllp3_pllc_clkm, CLK_SOURCE_HDMI_AUDIO, 176, TEGRA_PERIPH_NO_RESET, tegra_clk_hdmi_audio),
|
||||
@ -788,6 +812,9 @@ static struct tegra_periph_init_data periph_clks[] = {
|
||||
MUX("uartape", mux_pllp_pllc_clkm, CLK_SOURCE_UARTAPE, 212, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_uartape),
|
||||
MUX8("tsecb", mux_pllp_pllc2_c_c3_clkm, CLK_SOURCE_TSECB, 206, 0, tegra_clk_tsecb),
|
||||
MUX8("maud", mux_pllp_pllp_out3_clkm_clk32k_plla, CLK_SOURCE_MAUD, 202, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_maud),
|
||||
MUX8("dmic1", mux_dmic1, CLK_SOURCE_DMIC1, 161, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_dmic1),
|
||||
MUX8("dmic2", mux_dmic2, CLK_SOURCE_DMIC2, 162, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_dmic2),
|
||||
MUX8("dmic3", mux_dmic3, CLK_SOURCE_DMIC3, 197, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_dmic3),
|
||||
};
|
||||
|
||||
static struct tegra_periph_init_data gate_clks[] = {
|
||||
@ -809,7 +836,7 @@ static struct tegra_periph_init_data gate_clks[] = {
|
||||
GATE("usb2", "clk_m", 58, 0, tegra_clk_usb2, 0),
|
||||
GATE("usb3", "clk_m", 59, 0, tegra_clk_usb3, 0),
|
||||
GATE("csi", "pll_p_out3", 52, 0, tegra_clk_csi, 0),
|
||||
GATE("afi", "clk_m", 72, 0, tegra_clk_afi, 0),
|
||||
GATE("afi", "mselect", 72, 0, tegra_clk_afi, 0),
|
||||
GATE("csus", "clk_m", 92, TEGRA_PERIPH_NO_RESET, tegra_clk_csus, 0),
|
||||
GATE("dds", "clk_m", 150, TEGRA_PERIPH_ON_APB, tegra_clk_dds, 0),
|
||||
GATE("dp2", "clk_m", 152, TEGRA_PERIPH_ON_APB, tegra_clk_dp2, 0),
|
||||
@ -819,7 +846,8 @@ static struct tegra_periph_init_data gate_clks[] = {
|
||||
GATE("xusb_dev", "xusb_dev_src", 95, 0, tegra_clk_xusb_dev, 0),
|
||||
GATE("emc", "emc_mux", 57, 0, tegra_clk_emc, CLK_IGNORE_UNUSED),
|
||||
GATE("sata_cold", "clk_m", 129, TEGRA_PERIPH_ON_APB, tegra_clk_sata_cold, 0),
|
||||
GATE("ispb", "clk_m", 3, 0, tegra_clk_ispb, 0),
|
||||
GATE("ispa", "isp", 23, 0, tegra_clk_ispa, 0),
|
||||
GATE("ispb", "isp", 3, 0, tegra_clk_ispb, 0),
|
||||
GATE("vim2_clk", "clk_m", 11, 0, tegra_clk_vim2_clk, 0),
|
||||
GATE("pcie", "clk_m", 70, 0, tegra_clk_pcie, 0),
|
||||
GATE("gpu", "pll_ref", 184, 0, tegra_clk_gpu, 0),
|
||||
@ -830,6 +858,13 @@ static struct tegra_periph_init_data gate_clks[] = {
|
||||
GATE("pll_p_out_cpu", "pll_p", 223, 0, tegra_clk_pll_p_out_cpu, 0),
|
||||
GATE("pll_p_out_adsp", "pll_p", 187, 0, tegra_clk_pll_p_out_adsp, 0),
|
||||
GATE("apb2ape", "clk_m", 107, 0, tegra_clk_apb2ape, 0),
|
||||
GATE("cec", "pclk", 136, 0, tegra_clk_cec, 0),
|
||||
GATE("iqc1", "clk_m", 221, 0, tegra_clk_iqc1, 0),
|
||||
GATE("iqc2", "clk_m", 220, 0, tegra_clk_iqc1, 0),
|
||||
GATE("pll_a_out_adsp", "pll_a", 188, 0, tegra_clk_pll_a_out_adsp, 0),
|
||||
GATE("pll_a_out0_out_adsp", "pll_a", 188, 0, tegra_clk_pll_a_out0_out_adsp, 0),
|
||||
GATE("adsp", "aclk", 199, 0, tegra_clk_adsp, 0),
|
||||
GATE("adsp_neon", "aclk", 218, 0, tegra_clk_adsp_neon, 0),
|
||||
};
|
||||
|
||||
static struct tegra_periph_init_data div_clks[] = {
|
||||
|
@ -95,7 +95,8 @@ void __init tegra_pmc_clk_init(void __iomem *pmc_base,
|
||||
continue;
|
||||
|
||||
clk = clk_register_mux(NULL, data->mux_name, data->parents,
|
||||
data->num_parents, CLK_SET_RATE_NO_REPARENT,
|
||||
data->num_parents,
|
||||
CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
|
||||
pmc_base + PMC_CLK_OUT_CNTRL, data->mux_shift,
|
||||
3, 0, &clk_out_lock);
|
||||
*dt_clk = clk;
|
||||
@ -106,7 +107,8 @@ void __init tegra_pmc_clk_init(void __iomem *pmc_base,
|
||||
continue;
|
||||
|
||||
clk = clk_register_gate(NULL, data->gate_name, data->mux_name,
|
||||
0, pmc_base + PMC_CLK_OUT_CNTRL,
|
||||
CLK_SET_RATE_PARENT,
|
||||
pmc_base + PMC_CLK_OUT_CNTRL,
|
||||
data->gate_shift, 0, &clk_out_lock);
|
||||
*dt_clk = clk;
|
||||
clk_register_clkdev(clk, data->dev_name, data->gate_name);
|
||||
|
@ -819,6 +819,7 @@ static struct tegra_clk tegra114_clks[tegra_clk_max] __initdata = {
|
||||
[tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA114_CLK_CLK_OUT_3_MUX, .present = true },
|
||||
[tegra_clk_dsia_mux] = { .dt_id = TEGRA114_CLK_DSIA_MUX, .present = true },
|
||||
[tegra_clk_dsib_mux] = { .dt_id = TEGRA114_CLK_DSIB_MUX, .present = true },
|
||||
[tegra_clk_cec] = { .dt_id = TEGRA114_CLK_CEC, .present = true },
|
||||
};
|
||||
|
||||
static struct tegra_devclk devclks[] __initdata = {
|
||||
|
@ -928,6 +928,7 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = {
|
||||
[tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_1_MUX, .present = true },
|
||||
[tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_2_MUX, .present = true },
|
||||
[tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_3_MUX, .present = true },
|
||||
[tegra_clk_cec] = { .dt_id = TEGRA124_CLK_CEC, .present = true },
|
||||
};
|
||||
|
||||
static struct tegra_devclk devclks[] __initdata = {
|
||||
|
@ -24,6 +24,8 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/clk/tegra.h>
|
||||
#include <dt-bindings/clock/tegra210-car.h>
|
||||
#include <dt-bindings/reset/tegra210-car.h>
|
||||
#include <linux/iopoll.h>
|
||||
|
||||
#include "clk.h"
|
||||
#include "clk-id.h"
|
||||
@ -155,9 +157,35 @@
|
||||
#define PMC_PLLM_WB0_OVERRIDE 0x1dc
|
||||
#define PMC_PLLM_WB0_OVERRIDE_2 0x2b0
|
||||
|
||||
#define UTMIP_PLL_CFG2 0x488
|
||||
#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xfff) << 6)
|
||||
#define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x) (((x) & 0x3f) << 18)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN BIT(0)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERUP BIT(1)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN BIT(2)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERUP BIT(3)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERUP BIT(5)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERDOWN BIT(24)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERUP BIT(25)
|
||||
|
||||
#define UTMIP_PLL_CFG1 0x484
|
||||
#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 27)
|
||||
#define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP BIT(17)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP BIT(15)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12)
|
||||
|
||||
#define SATA_PLL_CFG0 0x490
|
||||
#define SATA_PLL_CFG0_PADPLL_RESET_SWCTL BIT(0)
|
||||
#define SATA_PLL_CFG0_PADPLL_USE_LOCKDET BIT(2)
|
||||
#define SATA_PLL_CFG0_SATA_SEQ_IN_SWCTL BIT(4)
|
||||
#define SATA_PLL_CFG0_SATA_SEQ_RESET_INPUT_VALUE BIT(5)
|
||||
#define SATA_PLL_CFG0_SATA_SEQ_LANE_PD_INPUT_VALUE BIT(6)
|
||||
#define SATA_PLL_CFG0_SATA_SEQ_PADPLL_PD_INPUT_VALUE BIT(7)
|
||||
|
||||
#define SATA_PLL_CFG0_PADPLL_SLEEP_IDDQ BIT(13)
|
||||
#define SATA_PLL_CFG0_SEQ_ENABLE BIT(24)
|
||||
|
||||
@ -196,6 +224,12 @@
|
||||
#define CLK_M_DIVISOR_SHIFT 2
|
||||
#define CLK_M_DIVISOR_MASK 0x3
|
||||
|
||||
#define RST_DFLL_DVCO 0x2f4
|
||||
#define DVFS_DFLL_RESET_SHIFT 0
|
||||
|
||||
#define CLK_RST_CONTROLLER_RST_DEV_Y_SET 0x2a8
|
||||
#define CLK_RST_CONTROLLER_RST_DEV_Y_CLR 0x2ac
|
||||
|
||||
/*
|
||||
* SDM fractional divisor is 16-bit 2's complement signed number within
|
||||
* (-2^12 ... 2^12-1) range. Represented in PLL data structure as unsigned
|
||||
@ -454,6 +488,26 @@ void tegra210_sata_pll_hw_sequence_start(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tegra210_sata_pll_hw_sequence_start);
|
||||
|
||||
void tegra210_set_sata_pll_seq_sw(bool state)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = readl_relaxed(clk_base + SATA_PLL_CFG0);
|
||||
if (state) {
|
||||
val |= SATA_PLL_CFG0_SATA_SEQ_IN_SWCTL;
|
||||
val |= SATA_PLL_CFG0_SATA_SEQ_RESET_INPUT_VALUE;
|
||||
val |= SATA_PLL_CFG0_SATA_SEQ_LANE_PD_INPUT_VALUE;
|
||||
val |= SATA_PLL_CFG0_SATA_SEQ_PADPLL_PD_INPUT_VALUE;
|
||||
} else {
|
||||
val &= ~SATA_PLL_CFG0_SATA_SEQ_IN_SWCTL;
|
||||
val &= ~SATA_PLL_CFG0_SATA_SEQ_RESET_INPUT_VALUE;
|
||||
val &= ~SATA_PLL_CFG0_SATA_SEQ_LANE_PD_INPUT_VALUE;
|
||||
val &= ~SATA_PLL_CFG0_SATA_SEQ_PADPLL_PD_INPUT_VALUE;
|
||||
}
|
||||
writel_relaxed(val, clk_base + SATA_PLL_CFG0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tegra210_set_sata_pll_seq_sw);
|
||||
|
||||
static inline void _pll_misc_chk_default(void __iomem *base,
|
||||
struct tegra_clk_pll_params *params,
|
||||
u8 misc_num, u32 default_val, u32 mask)
|
||||
@ -501,12 +555,12 @@ static void tegra210_pllcx_set_defaults(const char *name,
|
||||
{
|
||||
pllcx->params->defaults_set = true;
|
||||
|
||||
if (readl_relaxed(clk_base + pllcx->params->base_reg) &
|
||||
PLL_ENABLE) {
|
||||
if (readl_relaxed(clk_base + pllcx->params->base_reg) & PLL_ENABLE) {
|
||||
/* PLL is ON: only check if defaults already set */
|
||||
pllcx_check_defaults(pllcx->params);
|
||||
pr_warn("%s already enabled. Postponing set full defaults\n",
|
||||
name);
|
||||
if (!pllcx->params->defaults_set)
|
||||
pr_warn("%s already enabled. Postponing set full defaults\n",
|
||||
name);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -608,7 +662,6 @@ static void tegra210_plld_set_defaults(struct tegra_clk_pll *plld)
|
||||
|
||||
if (readl_relaxed(clk_base + plld->params->base_reg) &
|
||||
PLL_ENABLE) {
|
||||
pr_warn("PLL_D already enabled. Postponing set full defaults\n");
|
||||
|
||||
/*
|
||||
* PLL is ON: check if defaults already set, then set those
|
||||
@ -625,6 +678,9 @@ static void tegra210_plld_set_defaults(struct tegra_clk_pll *plld)
|
||||
_pll_misc_chk_default(clk_base, plld->params, 0, val,
|
||||
~mask & PLLD_MISC0_WRITE_MASK);
|
||||
|
||||
if (!plld->params->defaults_set)
|
||||
pr_warn("PLL_D already enabled. Postponing set full defaults\n");
|
||||
|
||||
/* Enable lock detect */
|
||||
mask = PLLD_MISC0_LOCK_ENABLE | PLLD_MISC0_LOCK_OVERRIDE;
|
||||
val = readl_relaxed(clk_base + plld->params->ext_misc_reg[0]);
|
||||
@ -896,7 +952,6 @@ static void tegra210_pllx_set_defaults(struct tegra_clk_pll *pllx)
|
||||
val |= step_b << PLLX_MISC2_DYNRAMP_STEPB_SHIFT;
|
||||
|
||||
if (readl_relaxed(clk_base + pllx->params->base_reg) & PLL_ENABLE) {
|
||||
pr_warn("PLL_X already enabled. Postponing set full defaults\n");
|
||||
|
||||
/*
|
||||
* PLL is ON: check if defaults already set, then set those
|
||||
@ -904,6 +959,8 @@ static void tegra210_pllx_set_defaults(struct tegra_clk_pll *pllx)
|
||||
*/
|
||||
pllx_check_defaults(pllx);
|
||||
|
||||
if (!pllx->params->defaults_set)
|
||||
pr_warn("PLL_X already enabled. Postponing set full defaults\n");
|
||||
/* Configure dyn ramp, disable lock override */
|
||||
writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
|
||||
|
||||
@ -948,7 +1005,6 @@ static void tegra210_pllmb_set_defaults(struct tegra_clk_pll *pllmb)
|
||||
pllmb->params->defaults_set = true;
|
||||
|
||||
if (val & PLL_ENABLE) {
|
||||
pr_warn("PLL_MB already enabled. Postponing set full defaults\n");
|
||||
|
||||
/*
|
||||
* PLL is ON: check if defaults already set, then set those
|
||||
@ -959,6 +1015,8 @@ static void tegra210_pllmb_set_defaults(struct tegra_clk_pll *pllmb)
|
||||
_pll_misc_chk_default(clk_base, pllmb->params, 0, val,
|
||||
~mask & PLLMB_MISC1_WRITE_MASK);
|
||||
|
||||
if (!pllmb->params->defaults_set)
|
||||
pr_warn("PLL_MB already enabled. Postponing set full defaults\n");
|
||||
/* Enable lock detect */
|
||||
val = readl_relaxed(clk_base + pllmb->params->ext_misc_reg[0]);
|
||||
val &= ~mask;
|
||||
@ -1008,13 +1066,14 @@ static void tegra210_pllp_set_defaults(struct tegra_clk_pll *pllp)
|
||||
pllp->params->defaults_set = true;
|
||||
|
||||
if (val & PLL_ENABLE) {
|
||||
pr_warn("PLL_P already enabled. Postponing set full defaults\n");
|
||||
|
||||
/*
|
||||
* PLL is ON: check if defaults already set, then set those
|
||||
* that can be updated in flight.
|
||||
*/
|
||||
pllp_check_defaults(pllp, true);
|
||||
if (!pllp->params->defaults_set)
|
||||
pr_warn("PLL_P already enabled. Postponing set full defaults\n");
|
||||
|
||||
/* Enable lock detect */
|
||||
val = readl_relaxed(clk_base + pllp->params->ext_misc_reg[0]);
|
||||
@ -1046,47 +1105,49 @@ static void tegra210_pllp_set_defaults(struct tegra_clk_pll *pllp)
|
||||
* Both VCO and post-divider output rates are fixed at 480MHz and 240MHz,
|
||||
* respectively.
|
||||
*/
|
||||
static void pllu_check_defaults(struct tegra_clk_pll *pll, bool hw_control)
|
||||
static void pllu_check_defaults(struct tegra_clk_pll_params *params,
|
||||
bool hw_control)
|
||||
{
|
||||
u32 val, mask;
|
||||
|
||||
/* Ignore lock enable (will be set) and IDDQ if under h/w control */
|
||||
val = PLLU_MISC0_DEFAULT_VALUE & (~PLLU_MISC0_IDDQ);
|
||||
mask = PLLU_MISC0_LOCK_ENABLE | (hw_control ? PLLU_MISC0_IDDQ : 0);
|
||||
_pll_misc_chk_default(clk_base, pll->params, 0, val,
|
||||
_pll_misc_chk_default(clk_base, params, 0, val,
|
||||
~mask & PLLU_MISC0_WRITE_MASK);
|
||||
|
||||
val = PLLU_MISC1_DEFAULT_VALUE;
|
||||
mask = PLLU_MISC1_LOCK_OVERRIDE;
|
||||
_pll_misc_chk_default(clk_base, pll->params, 1, val,
|
||||
_pll_misc_chk_default(clk_base, params, 1, val,
|
||||
~mask & PLLU_MISC1_WRITE_MASK);
|
||||
}
|
||||
|
||||
static void tegra210_pllu_set_defaults(struct tegra_clk_pll *pllu)
|
||||
static void tegra210_pllu_set_defaults(struct tegra_clk_pll_params *pllu)
|
||||
{
|
||||
u32 val = readl_relaxed(clk_base + pllu->params->base_reg);
|
||||
u32 val = readl_relaxed(clk_base + pllu->base_reg);
|
||||
|
||||
pllu->params->defaults_set = true;
|
||||
pllu->defaults_set = true;
|
||||
|
||||
if (val & PLL_ENABLE) {
|
||||
pr_warn("PLL_U already enabled. Postponing set full defaults\n");
|
||||
|
||||
/*
|
||||
* PLL is ON: check if defaults already set, then set those
|
||||
* that can be updated in flight.
|
||||
*/
|
||||
pllu_check_defaults(pllu, false);
|
||||
if (!pllu->defaults_set)
|
||||
pr_warn("PLL_U already enabled. Postponing set full defaults\n");
|
||||
|
||||
/* Enable lock detect */
|
||||
val = readl_relaxed(clk_base + pllu->params->ext_misc_reg[0]);
|
||||
val = readl_relaxed(clk_base + pllu->ext_misc_reg[0]);
|
||||
val &= ~PLLU_MISC0_LOCK_ENABLE;
|
||||
val |= PLLU_MISC0_DEFAULT_VALUE & PLLU_MISC0_LOCK_ENABLE;
|
||||
writel_relaxed(val, clk_base + pllu->params->ext_misc_reg[0]);
|
||||
writel_relaxed(val, clk_base + pllu->ext_misc_reg[0]);
|
||||
|
||||
val = readl_relaxed(clk_base + pllu->params->ext_misc_reg[1]);
|
||||
val = readl_relaxed(clk_base + pllu->ext_misc_reg[1]);
|
||||
val &= ~PLLU_MISC1_LOCK_OVERRIDE;
|
||||
val |= PLLU_MISC1_DEFAULT_VALUE & PLLU_MISC1_LOCK_OVERRIDE;
|
||||
writel_relaxed(val, clk_base + pllu->params->ext_misc_reg[1]);
|
||||
writel_relaxed(val, clk_base + pllu->ext_misc_reg[1]);
|
||||
udelay(1);
|
||||
|
||||
return;
|
||||
@ -1094,9 +1155,9 @@ static void tegra210_pllu_set_defaults(struct tegra_clk_pll *pllu)
|
||||
|
||||
/* set IDDQ, enable lock detect */
|
||||
writel_relaxed(PLLU_MISC0_DEFAULT_VALUE,
|
||||
clk_base + pllu->params->ext_misc_reg[0]);
|
||||
clk_base + pllu->ext_misc_reg[0]);
|
||||
writel_relaxed(PLLU_MISC1_DEFAULT_VALUE,
|
||||
clk_base + pllu->params->ext_misc_reg[1]);
|
||||
clk_base + pllu->ext_misc_reg[1]);
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
@ -1216,6 +1277,7 @@ static int tegra210_pll_fixed_mdiv_cfg(struct clk_hw *hw,
|
||||
cfg->n = p_rate / cf;
|
||||
|
||||
cfg->sdm_data = 0;
|
||||
cfg->output_rate = input_rate;
|
||||
if (params->sdm_ctrl_reg) {
|
||||
unsigned long rem = p_rate - cf * cfg->n;
|
||||
/* If ssc is enabled SDM enabled as well, even for integer n */
|
||||
@ -1226,10 +1288,15 @@ static int tegra210_pll_fixed_mdiv_cfg(struct clk_hw *hw,
|
||||
s -= PLL_SDM_COEFF / 2;
|
||||
cfg->sdm_data = sdin_din_to_data(s);
|
||||
}
|
||||
cfg->output_rate *= cfg->n * PLL_SDM_COEFF + PLL_SDM_COEFF/2 +
|
||||
sdin_data_to_din(cfg->sdm_data);
|
||||
cfg->output_rate /= p * cfg->m * PLL_SDM_COEFF;
|
||||
} else {
|
||||
cfg->output_rate *= cfg->n;
|
||||
cfg->output_rate /= p * cfg->m;
|
||||
}
|
||||
|
||||
cfg->input_rate = input_rate;
|
||||
cfg->output_rate = rate;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1772,7 +1839,7 @@ static struct tegra_clk_pll_params pll_a1_params = {
|
||||
.misc_reg = PLLA1_MISC0,
|
||||
.lock_mask = PLLCX_BASE_LOCK,
|
||||
.lock_delay = 300,
|
||||
.iddq_reg = PLLA1_MISC0,
|
||||
.iddq_reg = PLLA1_MISC1,
|
||||
.iddq_bit_idx = PLLCX_IDDQ_BIT,
|
||||
.reset_reg = PLLA1_MISC0,
|
||||
.reset_bit_idx = PLLCX_RESET_BIT,
|
||||
@ -1987,9 +2054,9 @@ static struct div_nmp pllu_nmp = {
|
||||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
|
||||
{ 12000000, 480000000, 40, 1, 1, 0 },
|
||||
{ 13000000, 480000000, 36, 1, 1, 0 }, /* actual: 468.0 MHz */
|
||||
{ 38400000, 480000000, 25, 2, 1, 0 },
|
||||
{ 12000000, 480000000, 40, 1, 0, 0 },
|
||||
{ 13000000, 480000000, 36, 1, 0, 0 }, /* actual: 468.0 MHz */
|
||||
{ 38400000, 480000000, 25, 2, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
@ -2013,8 +2080,47 @@ static struct tegra_clk_pll_params pll_u_vco_params = {
|
||||
.div_nmp = &pllu_nmp,
|
||||
.freq_table = pll_u_freq_table,
|
||||
.flags = TEGRA_PLLU | TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
|
||||
.set_defaults = tegra210_pllu_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
|
||||
struct utmi_clk_param {
|
||||
/* Oscillator Frequency in KHz */
|
||||
u32 osc_frequency;
|
||||
/* UTMIP PLL Enable Delay Count */
|
||||
u8 enable_delay_count;
|
||||
/* UTMIP PLL Stable count */
|
||||
u16 stable_count;
|
||||
/* UTMIP PLL Active delay count */
|
||||
u8 active_delay_count;
|
||||
/* UTMIP PLL Xtal frequency count */
|
||||
u16 xtal_freq_count;
|
||||
};
|
||||
|
||||
static const struct utmi_clk_param utmi_parameters[] = {
|
||||
{
|
||||
.osc_frequency = 38400000, .enable_delay_count = 0x0,
|
||||
.stable_count = 0x0, .active_delay_count = 0x6,
|
||||
.xtal_freq_count = 0x80
|
||||
}, {
|
||||
.osc_frequency = 13000000, .enable_delay_count = 0x02,
|
||||
.stable_count = 0x33, .active_delay_count = 0x05,
|
||||
.xtal_freq_count = 0x7f
|
||||
}, {
|
||||
.osc_frequency = 19200000, .enable_delay_count = 0x03,
|
||||
.stable_count = 0x4b, .active_delay_count = 0x06,
|
||||
.xtal_freq_count = 0xbb
|
||||
}, {
|
||||
.osc_frequency = 12000000, .enable_delay_count = 0x02,
|
||||
.stable_count = 0x2f, .active_delay_count = 0x08,
|
||||
.xtal_freq_count = 0x76
|
||||
}, {
|
||||
.osc_frequency = 26000000, .enable_delay_count = 0x04,
|
||||
.stable_count = 0x66, .active_delay_count = 0x09,
|
||||
.xtal_freq_count = 0xfe
|
||||
}, {
|
||||
.osc_frequency = 16800000, .enable_delay_count = 0x03,
|
||||
.stable_count = 0x41, .active_delay_count = 0x0a,
|
||||
.xtal_freq_count = 0xa4
|
||||
},
|
||||
};
|
||||
|
||||
static struct tegra_clk tegra210_clks[tegra_clk_max] __initdata = {
|
||||
@ -2115,7 +2221,6 @@ static struct tegra_clk tegra210_clks[tegra_clk_max] __initdata = {
|
||||
[tegra_clk_pll_c2] = { .dt_id = TEGRA210_CLK_PLL_C2, .present = true },
|
||||
[tegra_clk_pll_c3] = { .dt_id = TEGRA210_CLK_PLL_C3, .present = true },
|
||||
[tegra_clk_pll_m] = { .dt_id = TEGRA210_CLK_PLL_M, .present = true },
|
||||
[tegra_clk_pll_m_out1] = { .dt_id = TEGRA210_CLK_PLL_M_OUT1, .present = true },
|
||||
[tegra_clk_pll_p] = { .dt_id = TEGRA210_CLK_PLL_P, .present = true },
|
||||
[tegra_clk_pll_p_out1] = { .dt_id = TEGRA210_CLK_PLL_P_OUT1, .present = true },
|
||||
[tegra_clk_pll_p_out3] = { .dt_id = TEGRA210_CLK_PLL_P_OUT3, .present = true },
|
||||
@ -2209,6 +2314,25 @@ static struct tegra_clk tegra210_clks[tegra_clk_max] __initdata = {
|
||||
[tegra_clk_pll_c4_out2] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT2, .present = true },
|
||||
[tegra_clk_pll_c4_out3] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT3, .present = true },
|
||||
[tegra_clk_apb2ape] = { .dt_id = TEGRA210_CLK_APB2APE, .present = true },
|
||||
[tegra_clk_pll_a1] = { .dt_id = TEGRA210_CLK_PLL_A1, .present = true },
|
||||
[tegra_clk_ispa] = { .dt_id = TEGRA210_CLK_ISPA, .present = true },
|
||||
[tegra_clk_cec] = { .dt_id = TEGRA210_CLK_CEC, .present = true },
|
||||
[tegra_clk_dmic1] = { .dt_id = TEGRA210_CLK_DMIC1, .present = true },
|
||||
[tegra_clk_dmic2] = { .dt_id = TEGRA210_CLK_DMIC2, .present = true },
|
||||
[tegra_clk_dmic3] = { .dt_id = TEGRA210_CLK_DMIC3, .present = true },
|
||||
[tegra_clk_dmic1_sync_clk] = { .dt_id = TEGRA210_CLK_DMIC1_SYNC_CLK, .present = true },
|
||||
[tegra_clk_dmic2_sync_clk] = { .dt_id = TEGRA210_CLK_DMIC2_SYNC_CLK, .present = true },
|
||||
[tegra_clk_dmic3_sync_clk] = { .dt_id = TEGRA210_CLK_DMIC3_SYNC_CLK, .present = true },
|
||||
[tegra_clk_dmic1_sync_clk_mux] = { .dt_id = TEGRA210_CLK_DMIC1_SYNC_CLK_MUX, .present = true },
|
||||
[tegra_clk_dmic2_sync_clk_mux] = { .dt_id = TEGRA210_CLK_DMIC2_SYNC_CLK_MUX, .present = true },
|
||||
[tegra_clk_dmic3_sync_clk_mux] = { .dt_id = TEGRA210_CLK_DMIC3_SYNC_CLK_MUX, .present = true },
|
||||
[tegra_clk_dp2] = { .dt_id = TEGRA210_CLK_DP2, .present = true },
|
||||
[tegra_clk_iqc1] = { .dt_id = TEGRA210_CLK_IQC1, .present = true },
|
||||
[tegra_clk_iqc2] = { .dt_id = TEGRA210_CLK_IQC2, .present = true },
|
||||
[tegra_clk_pll_a_out_adsp] = { .dt_id = TEGRA210_CLK_PLL_A_OUT_ADSP, .present = true },
|
||||
[tegra_clk_pll_a_out0_out_adsp] = { .dt_id = TEGRA210_CLK_PLL_A_OUT0_OUT_ADSP, .present = true },
|
||||
[tegra_clk_adsp] = { .dt_id = TEGRA210_CLK_ADSP, .present = true },
|
||||
[tegra_clk_adsp_neon] = { .dt_id = TEGRA210_CLK_ADSP_NEON, .present = true },
|
||||
};
|
||||
|
||||
static struct tegra_devclk devclks[] __initdata = {
|
||||
@ -2227,7 +2351,6 @@ static struct tegra_devclk devclks[] __initdata = {
|
||||
{ .con_id = "pll_p_out3", .dt_id = TEGRA210_CLK_PLL_P_OUT3 },
|
||||
{ .con_id = "pll_p_out4", .dt_id = TEGRA210_CLK_PLL_P_OUT4 },
|
||||
{ .con_id = "pll_m", .dt_id = TEGRA210_CLK_PLL_M },
|
||||
{ .con_id = "pll_m_out1", .dt_id = TEGRA210_CLK_PLL_M_OUT1 },
|
||||
{ .con_id = "pll_x", .dt_id = TEGRA210_CLK_PLL_X },
|
||||
{ .con_id = "pll_x_out0", .dt_id = TEGRA210_CLK_PLL_X_OUT0 },
|
||||
{ .con_id = "pll_u", .dt_id = TEGRA210_CLK_PLL_U },
|
||||
@ -2286,6 +2409,221 @@ static struct tegra_audio_clk_info tegra210_audio_plls[] = {
|
||||
|
||||
static struct clk **clks;
|
||||
|
||||
static const char * const aclk_parents[] = {
|
||||
"pll_a1", "pll_c", "pll_p", "pll_a_out0", "pll_c2", "pll_c3",
|
||||
"clk_m"
|
||||
};
|
||||
|
||||
void tegra210_put_utmipll_in_iddq(void)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
|
||||
if (reg & UTMIPLL_HW_PWRDN_CFG0_UTMIPLL_LOCK) {
|
||||
pr_err("trying to assert IDDQ while UTMIPLL is locked\n");
|
||||
return;
|
||||
}
|
||||
|
||||
reg |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
|
||||
writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tegra210_put_utmipll_in_iddq);
|
||||
|
||||
void tegra210_put_utmipll_out_iddq(void)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
reg &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
|
||||
writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tegra210_put_utmipll_out_iddq);
|
||||
|
||||
static void tegra210_utmi_param_configure(void)
|
||||
{
|
||||
u32 reg;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
|
||||
if (osc_freq == utmi_parameters[i].osc_frequency)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= ARRAY_SIZE(utmi_parameters)) {
|
||||
pr_err("%s: Unexpected oscillator freq %lu\n", __func__,
|
||||
osc_freq);
|
||||
return;
|
||||
}
|
||||
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
reg &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
|
||||
writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
|
||||
udelay(10);
|
||||
|
||||
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG2);
|
||||
|
||||
/* Program UTMIP PLL stable and active counts */
|
||||
/* [FIXME] arclk_rst.h says WRONG! This should be 1ms -> 0x50 Check! */
|
||||
reg &= ~UTMIP_PLL_CFG2_STABLE_COUNT(~0);
|
||||
reg |= UTMIP_PLL_CFG2_STABLE_COUNT(utmi_parameters[i].stable_count);
|
||||
|
||||
reg &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0);
|
||||
|
||||
reg |=
|
||||
UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(utmi_parameters[i].active_delay_count);
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2);
|
||||
|
||||
/* Program UTMIP PLL delay and oscillator frequency counts */
|
||||
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
|
||||
reg &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
|
||||
|
||||
reg |=
|
||||
UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(utmi_parameters[i].enable_delay_count);
|
||||
|
||||
reg &= ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0);
|
||||
reg |=
|
||||
UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(utmi_parameters[i].xtal_freq_count);
|
||||
|
||||
reg |= UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
reg |= UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
|
||||
udelay(1);
|
||||
|
||||
/* Enable samplers for SNPS, XUSB_HOST, XUSB_DEV */
|
||||
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG2);
|
||||
reg |= UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERUP;
|
||||
reg |= UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERUP;
|
||||
reg |= UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERUP;
|
||||
reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN;
|
||||
reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN;
|
||||
reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERDOWN;
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2);
|
||||
|
||||
/* Setup HW control of UTMIPLL */
|
||||
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
reg |= UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET;
|
||||
reg &= ~UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL;
|
||||
writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
|
||||
udelay(1);
|
||||
|
||||
reg = readl_relaxed(clk_base + XUSB_PLL_CFG0);
|
||||
reg &= ~XUSB_PLL_CFG0_UTMIPLL_LOCK_DLY;
|
||||
writel_relaxed(reg, clk_base + XUSB_PLL_CFG0);
|
||||
|
||||
udelay(1);
|
||||
|
||||
/* Enable HW control UTMIPLL */
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
reg |= UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE;
|
||||
writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
}
|
||||
|
||||
static int tegra210_enable_pllu(void)
|
||||
{
|
||||
struct tegra_clk_pll_freq_table *fentry;
|
||||
struct tegra_clk_pll pllu;
|
||||
u32 reg;
|
||||
|
||||
for (fentry = pll_u_freq_table; fentry->input_rate; fentry++) {
|
||||
if (fentry->input_rate == pll_ref_freq)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!fentry->input_rate) {
|
||||
pr_err("Unknown PLL_U reference frequency %lu\n", pll_ref_freq);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* clear IDDQ bit */
|
||||
pllu.params = &pll_u_vco_params;
|
||||
reg = readl_relaxed(clk_base + pllu.params->ext_misc_reg[0]);
|
||||
reg &= ~BIT(pllu.params->iddq_bit_idx);
|
||||
writel_relaxed(reg, clk_base + pllu.params->ext_misc_reg[0]);
|
||||
|
||||
reg = readl_relaxed(clk_base + PLLU_BASE);
|
||||
reg &= ~GENMASK(20, 0);
|
||||
reg |= fentry->m;
|
||||
reg |= fentry->n << 8;
|
||||
reg |= fentry->p << 16;
|
||||
writel(reg, clk_base + PLLU_BASE);
|
||||
reg |= PLL_ENABLE;
|
||||
writel(reg, clk_base + PLLU_BASE);
|
||||
|
||||
readl_relaxed_poll_timeout(clk_base + PLLU_BASE, reg,
|
||||
reg & PLL_BASE_LOCK, 2, 1000);
|
||||
if (!(reg & PLL_BASE_LOCK)) {
|
||||
pr_err("Timed out waiting for PLL_U to lock\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra210_init_pllu(void)
|
||||
{
|
||||
u32 reg;
|
||||
int err;
|
||||
|
||||
tegra210_pllu_set_defaults(&pll_u_vco_params);
|
||||
/* skip initialization when pllu is in hw controlled mode */
|
||||
reg = readl_relaxed(clk_base + PLLU_BASE);
|
||||
if (reg & PLLU_BASE_OVERRIDE) {
|
||||
if (!(reg & PLL_ENABLE)) {
|
||||
err = tegra210_enable_pllu();
|
||||
if (err < 0) {
|
||||
WARN_ON(1);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
/* enable hw controlled mode */
|
||||
reg = readl_relaxed(clk_base + PLLU_BASE);
|
||||
reg &= ~PLLU_BASE_OVERRIDE;
|
||||
writel(reg, clk_base + PLLU_BASE);
|
||||
|
||||
reg = readl_relaxed(clk_base + PLLU_HW_PWRDN_CFG0);
|
||||
reg |= PLLU_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE |
|
||||
PLLU_HW_PWRDN_CFG0_USE_SWITCH_DETECT |
|
||||
PLLU_HW_PWRDN_CFG0_USE_LOCKDET;
|
||||
reg &= ~(PLLU_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL |
|
||||
PLLU_HW_PWRDN_CFG0_CLK_SWITCH_SWCTL);
|
||||
writel_relaxed(reg, clk_base + PLLU_HW_PWRDN_CFG0);
|
||||
|
||||
reg = readl_relaxed(clk_base + XUSB_PLL_CFG0);
|
||||
reg &= ~XUSB_PLL_CFG0_PLLU_LOCK_DLY_MASK;
|
||||
writel_relaxed(reg, clk_base + XUSB_PLL_CFG0);
|
||||
udelay(1);
|
||||
|
||||
reg = readl_relaxed(clk_base + PLLU_HW_PWRDN_CFG0);
|
||||
reg |= PLLU_HW_PWRDN_CFG0_SEQ_ENABLE;
|
||||
writel_relaxed(reg, clk_base + PLLU_HW_PWRDN_CFG0);
|
||||
udelay(1);
|
||||
|
||||
reg = readl_relaxed(clk_base + PLLU_BASE);
|
||||
reg &= ~PLLU_BASE_CLKENABLE_USB;
|
||||
writel_relaxed(reg, clk_base + PLLU_BASE);
|
||||
}
|
||||
|
||||
/* enable UTMIPLL hw control if not yet done by the bootloader */
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
if (!(reg & UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE))
|
||||
tegra210_utmi_param_configure();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init void tegra210_periph_clk_init(void __iomem *clk_base,
|
||||
void __iomem *pmc_base)
|
||||
{
|
||||
@ -2347,6 +2685,11 @@ static __init void tegra210_periph_clk_init(void __iomem *clk_base,
|
||||
clk_register_clkdev(clk, "cml1", NULL);
|
||||
clks[TEGRA210_CLK_CML1] = clk;
|
||||
|
||||
clk = tegra_clk_register_super_clk("aclk", aclk_parents,
|
||||
ARRAY_SIZE(aclk_parents), 0, clk_base + 0x6e0,
|
||||
0, NULL);
|
||||
clks[TEGRA210_CLK_ACLK] = clk;
|
||||
|
||||
tegra_periph_clk_init(clk_base, pmc_base, tegra210_clks, &pll_p_params);
|
||||
}
|
||||
|
||||
@ -2402,9 +2745,6 @@ static void __init tegra210_pll_init(void __iomem *clk_base,
|
||||
clk_register_clkdev(clk, "pll_mb", NULL);
|
||||
clks[TEGRA210_CLK_PLL_MB] = clk;
|
||||
|
||||
clk_register_clkdev(clk, "pll_m_out1", NULL);
|
||||
clks[TEGRA210_CLK_PLL_M_OUT1] = clk;
|
||||
|
||||
/* PLLM_UD */
|
||||
clk = clk_register_fixed_factor(NULL, "pll_m_ud", "pll_m",
|
||||
CLK_SET_RATE_PARENT, 1, 1);
|
||||
@ -2412,11 +2752,12 @@ static void __init tegra210_pll_init(void __iomem *clk_base,
|
||||
clks[TEGRA210_CLK_PLL_M_UD] = clk;
|
||||
|
||||
/* PLLU_VCO */
|
||||
clk = tegra_clk_register_pllu_tegra210("pll_u_vco", "pll_ref",
|
||||
clk_base, 0, &pll_u_vco_params,
|
||||
&pll_u_lock);
|
||||
clk_register_clkdev(clk, "pll_u_vco", NULL);
|
||||
clks[TEGRA210_CLK_PLL_U] = clk;
|
||||
if (!tegra210_init_pllu()) {
|
||||
clk = clk_register_fixed_rate(NULL, "pll_u_vco", "pll_ref", 0,
|
||||
480*1000*1000);
|
||||
clk_register_clkdev(clk, "pll_u_vco", NULL);
|
||||
clks[TEGRA210_CLK_PLL_U] = clk;
|
||||
}
|
||||
|
||||
/* PLLU_OUT */
|
||||
clk = clk_register_divider_table(NULL, "pll_u_out", "pll_u_vco", 0,
|
||||
@ -2651,6 +2992,8 @@ static struct tegra_clk_init_table init_table[] __initdata = {
|
||||
{ TEGRA210_CLK_EMC, TEGRA210_CLK_CLK_MAX, 0, 1 },
|
||||
{ TEGRA210_CLK_MSELECT, TEGRA210_CLK_CLK_MAX, 0, 1 },
|
||||
{ TEGRA210_CLK_CSITE, TEGRA210_CLK_CLK_MAX, 0, 1 },
|
||||
/* TODO find a way to enable this on-demand */
|
||||
{ TEGRA210_CLK_DBGAPB, TEGRA210_CLK_CLK_MAX, 0, 1 },
|
||||
{ TEGRA210_CLK_TSENSOR, TEGRA210_CLK_CLK_M, 400000, 0 },
|
||||
{ TEGRA210_CLK_I2C1, TEGRA210_CLK_PLL_P, 0, 0 },
|
||||
{ TEGRA210_CLK_I2C2, TEGRA210_CLK_PLL_P, 0, 0 },
|
||||
@ -2661,6 +3004,8 @@ static struct tegra_clk_init_table init_table[] __initdata = {
|
||||
{ TEGRA210_CLK_PLL_DP, TEGRA210_CLK_CLK_MAX, 270000000, 0 },
|
||||
{ TEGRA210_CLK_SOC_THERM, TEGRA210_CLK_PLL_P, 51000000, 0 },
|
||||
{ TEGRA210_CLK_CCLK_G, TEGRA210_CLK_CLK_MAX, 0, 1 },
|
||||
{ TEGRA210_CLK_PLL_U_OUT1, TEGRA210_CLK_CLK_MAX, 48000000, 1 },
|
||||
{ TEGRA210_CLK_PLL_U_OUT2, TEGRA210_CLK_CLK_MAX, 60000000, 1 },
|
||||
/* This MUST be the last entry. */
|
||||
{ TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 },
|
||||
};
|
||||
@ -2678,6 +3023,81 @@ static void __init tegra210_clock_apply_init_table(void)
|
||||
tegra_init_from_table(init_table, clks, TEGRA210_CLK_CLK_MAX);
|
||||
}
|
||||
|
||||
/**
|
||||
* tegra210_car_barrier - wait for pending writes to the CAR to complete
|
||||
*
|
||||
* Wait for any outstanding writes to the CAR MMIO space from this CPU
|
||||
* to complete before continuing execution. No return value.
|
||||
*/
|
||||
static void tegra210_car_barrier(void)
|
||||
{
|
||||
readl_relaxed(clk_base + RST_DFLL_DVCO);
|
||||
}
|
||||
|
||||
/**
|
||||
* tegra210_clock_assert_dfll_dvco_reset - assert the DFLL's DVCO reset
|
||||
*
|
||||
* Assert the reset line of the DFLL's DVCO. No return value.
|
||||
*/
|
||||
static void tegra210_clock_assert_dfll_dvco_reset(void)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
v = readl_relaxed(clk_base + RST_DFLL_DVCO);
|
||||
v |= (1 << DVFS_DFLL_RESET_SHIFT);
|
||||
writel_relaxed(v, clk_base + RST_DFLL_DVCO);
|
||||
tegra210_car_barrier();
|
||||
}
|
||||
|
||||
/**
|
||||
* tegra210_clock_deassert_dfll_dvco_reset - deassert the DFLL's DVCO reset
|
||||
*
|
||||
* Deassert the reset line of the DFLL's DVCO, allowing the DVCO to
|
||||
* operate. No return value.
|
||||
*/
|
||||
static void tegra210_clock_deassert_dfll_dvco_reset(void)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
v = readl_relaxed(clk_base + RST_DFLL_DVCO);
|
||||
v &= ~(1 << DVFS_DFLL_RESET_SHIFT);
|
||||
writel_relaxed(v, clk_base + RST_DFLL_DVCO);
|
||||
tegra210_car_barrier();
|
||||
}
|
||||
|
||||
static int tegra210_reset_assert(unsigned long id)
|
||||
{
|
||||
if (id == TEGRA210_RST_DFLL_DVCO)
|
||||
tegra210_clock_assert_dfll_dvco_reset();
|
||||
else if (id == TEGRA210_RST_ADSP)
|
||||
writel(GENMASK(26, 21) | BIT(7),
|
||||
clk_base + CLK_RST_CONTROLLER_RST_DEV_Y_SET);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra210_reset_deassert(unsigned long id)
|
||||
{
|
||||
if (id == TEGRA210_RST_DFLL_DVCO)
|
||||
tegra210_clock_deassert_dfll_dvco_reset();
|
||||
else if (id == TEGRA210_RST_ADSP) {
|
||||
writel(BIT(21), clk_base + CLK_RST_CONTROLLER_RST_DEV_Y_CLR);
|
||||
/*
|
||||
* Considering adsp cpu clock (min: 12.5MHZ, max: 1GHz)
|
||||
* a delay of 5us ensures that it's at least
|
||||
* 6 * adsp_cpu_cycle_period long.
|
||||
*/
|
||||
udelay(5);
|
||||
writel(GENMASK(26, 22) | BIT(7),
|
||||
clk_base + CLK_RST_CONTROLLER_RST_DEV_Y_CLR);
|
||||
} else
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* tegra210_clock_init - Tegra210-specific clock initialization
|
||||
* @np: struct device_node * of the DT node for the SoC CAR IP block
|
||||
@ -2742,6 +3162,9 @@ static void __init tegra210_clock_init(struct device_node *np)
|
||||
|
||||
tegra_super_clk_gen5_init(clk_base, pmc_base, tegra210_clks,
|
||||
&pll_x_params);
|
||||
tegra_init_special_resets(2, tegra210_reset_assert,
|
||||
tegra210_reset_deassert);
|
||||
|
||||
tegra_add_of_provider(np);
|
||||
tegra_register_devclks(devclks, ARRAY_SIZE(devclks));
|
||||
|
||||
|
@ -817,6 +817,7 @@ static struct tegra_clk tegra30_clks[tegra_clk_max] __initdata = {
|
||||
[tegra_clk_pll_p_out4] = { .dt_id = TEGRA30_CLK_PLL_P_OUT4, .present = true },
|
||||
[tegra_clk_pll_a] = { .dt_id = TEGRA30_CLK_PLL_A, .present = true },
|
||||
[tegra_clk_pll_a_out0] = { .dt_id = TEGRA30_CLK_PLL_A_OUT0, .present = true },
|
||||
[tegra_clk_cec] = { .dt_id = TEGRA30_CLK_CEC, .present = true },
|
||||
};
|
||||
|
||||
static const char *pll_e_parents[] = { "pll_ref", "pll_p" };
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <linux/clkdev.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/clk/tegra.h>
|
||||
#include <linux/reset-controller.h>
|
||||
@ -182,6 +183,20 @@ static int tegra_clk_rst_deassert(struct reset_controller_dev *rcdev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int tegra_clk_rst_reset(struct reset_controller_dev *rcdev,
|
||||
unsigned long id)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = tegra_clk_rst_assert(rcdev, id);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
udelay(1);
|
||||
|
||||
return tegra_clk_rst_deassert(rcdev, id);
|
||||
}
|
||||
|
||||
const struct tegra_clk_periph_regs *get_reg_bank(int clkid)
|
||||
{
|
||||
int reg_bank = clkid / 32;
|
||||
@ -274,6 +289,7 @@ void __init tegra_init_from_table(struct tegra_clk_init_table *tbl,
|
||||
static const struct reset_control_ops rst_ops = {
|
||||
.assert = tegra_clk_rst_assert,
|
||||
.deassert = tegra_clk_rst_deassert,
|
||||
.reset = tegra_clk_rst_reset,
|
||||
};
|
||||
|
||||
static struct reset_controller_dev rst_ctlr = {
|
||||
|
@ -116,7 +116,7 @@ struct tegra_clk_pll_freq_table {
|
||||
unsigned long input_rate;
|
||||
unsigned long output_rate;
|
||||
u32 n;
|
||||
u16 m;
|
||||
u32 m;
|
||||
u8 p;
|
||||
u8 cpcon;
|
||||
u16 sdm_data;
|
||||
@ -586,11 +586,11 @@ struct tegra_clk_periph {
|
||||
|
||||
extern const struct clk_ops tegra_clk_periph_ops;
|
||||
struct clk *tegra_clk_register_periph(const char *name,
|
||||
const char **parent_names, int num_parents,
|
||||
const char * const *parent_names, int num_parents,
|
||||
struct tegra_clk_periph *periph, void __iomem *clk_base,
|
||||
u32 offset, unsigned long flags);
|
||||
struct clk *tegra_clk_register_periph_nodiv(const char *name,
|
||||
const char **parent_names, int num_parents,
|
||||
const char * const *parent_names, int num_parents,
|
||||
struct tegra_clk_periph *periph, void __iomem *clk_base,
|
||||
u32 offset);
|
||||
|
||||
@ -626,7 +626,7 @@ struct tegra_periph_init_data {
|
||||
const char *name;
|
||||
int clk_id;
|
||||
union {
|
||||
const char **parent_names;
|
||||
const char *const *parent_names;
|
||||
const char *parent_name;
|
||||
} p;
|
||||
int num_parents;
|
||||
@ -686,6 +686,8 @@ struct tegra_periph_init_data {
|
||||
struct tegra_clk_super_mux {
|
||||
struct clk_hw hw;
|
||||
void __iomem *reg;
|
||||
struct tegra_clk_frac_div frac_div;
|
||||
const struct clk_ops *div_ops;
|
||||
u8 width;
|
||||
u8 flags;
|
||||
u8 div2_index;
|
||||
@ -702,7 +704,10 @@ struct clk *tegra_clk_register_super_mux(const char *name,
|
||||
const char **parent_names, u8 num_parents,
|
||||
unsigned long flags, void __iomem *reg, u8 clk_super_flags,
|
||||
u8 width, u8 pllx_index, u8 div2_index, spinlock_t *lock);
|
||||
|
||||
struct clk *tegra_clk_register_super_clk(const char *name,
|
||||
const char * const *parent_names, u8 num_parents,
|
||||
unsigned long flags, void __iomem *reg, u8 clk_super_flags,
|
||||
spinlock_t *lock);
|
||||
/**
|
||||
* struct clk_init_table - clock initialization table
|
||||
* @clk_id: clock id as mentioned in device tree bindings
|
||||
|
@ -156,7 +156,7 @@
|
||||
/* 133 */
|
||||
/* 134 */
|
||||
/* 135 */
|
||||
/* 136 */
|
||||
#define TEGRA114_CLK_CEC 136
|
||||
/* 137 */
|
||||
/* 138 */
|
||||
/* 139 */
|
||||
|
@ -156,7 +156,7 @@
|
||||
/* 133 */
|
||||
/* 134 */
|
||||
/* 135 */
|
||||
/* 136 */
|
||||
#define TEGRA124_CLK_CEC 136
|
||||
/* 137 */
|
||||
/* 138 */
|
||||
/* 139 */
|
||||
|
@ -39,7 +39,7 @@
|
||||
/* 20 (register bit affects vi and vi_sensor) */
|
||||
/* 21 */
|
||||
#define TEGRA210_CLK_USBD 22
|
||||
#define TEGRA210_CLK_ISP 23
|
||||
#define TEGRA210_CLK_ISPA 23
|
||||
/* 24 */
|
||||
/* 25 */
|
||||
#define TEGRA210_CLK_DISP2 26
|
||||
@ -156,7 +156,7 @@
|
||||
/* 133 */
|
||||
/* 134 */
|
||||
/* 135 */
|
||||
/* 136 */
|
||||
#define TEGRA210_CLK_CEC 136
|
||||
/* 137 */
|
||||
/* 138 */
|
||||
/* 139 */
|
||||
@ -173,7 +173,7 @@
|
||||
#define TEGRA210_CLK_ENTROPY 149
|
||||
/* 150 */
|
||||
/* 151 */
|
||||
/* 152 */
|
||||
#define TEGRA210_CLK_DP2 152
|
||||
/* 153 */
|
||||
/* 154 */
|
||||
/* 155 (bit affects dfll_ref and dfll_soc) */
|
||||
@ -210,7 +210,7 @@
|
||||
#define TEGRA210_CLK_DBGAPB 185
|
||||
/* 186 */
|
||||
#define TEGRA210_CLK_PLL_P_OUT_ADSP 187
|
||||
/* 188 */
|
||||
/* 188 ((bit affects pll_a_out_adsp and pll_a_out0_out_adsp)*/
|
||||
#define TEGRA210_CLK_PLL_G_REF 189
|
||||
/* 190 */
|
||||
/* 191 */
|
||||
@ -222,7 +222,7 @@
|
||||
/* 196 */
|
||||
#define TEGRA210_CLK_DMIC3 197
|
||||
#define TEGRA210_CLK_APE 198
|
||||
/* 199 */
|
||||
#define TEGRA210_CLK_ADSP 199
|
||||
/* 200 */
|
||||
/* 201 */
|
||||
#define TEGRA210_CLK_MAUD 202
|
||||
@ -241,10 +241,10 @@
|
||||
/* 215 */
|
||||
/* 216 */
|
||||
/* 217 */
|
||||
/* 218 */
|
||||
#define TEGRA210_CLK_ADSP_NEON 218
|
||||
#define TEGRA210_CLK_NVENC 219
|
||||
/* 220 */
|
||||
/* 221 */
|
||||
#define TEGRA210_CLK_IQC2 220
|
||||
#define TEGRA210_CLK_IQC1 221
|
||||
#define TEGRA210_CLK_SOR_SAFE 222
|
||||
#define TEGRA210_CLK_PLL_P_OUT_CPU 223
|
||||
|
||||
@ -349,9 +349,9 @@
|
||||
#define TEGRA210_CLK_PLL_RE_OUT1 319
|
||||
/* 320 */
|
||||
/* 321 */
|
||||
/* 322 */
|
||||
/* 323 */
|
||||
/* 324 */
|
||||
#define TEGRA210_CLK_ISP 322
|
||||
#define TEGRA210_CLK_PLL_A_OUT_ADSP 323
|
||||
#define TEGRA210_CLK_PLL_A_OUT0_OUT_ADSP 324
|
||||
/* 325 */
|
||||
/* 326 */
|
||||
/* 327 */
|
||||
@ -396,6 +396,15 @@
|
||||
#define TEGRA210_CLK_PLL_C_UD 364
|
||||
#define TEGRA210_CLK_SCLK_MUX 365
|
||||
|
||||
#define TEGRA210_CLK_CLK_MAX 366
|
||||
#define TEGRA210_CLK_ACLK 370
|
||||
|
||||
#define TEGRA210_CLK_DMIC1_SYNC_CLK 388
|
||||
#define TEGRA210_CLK_DMIC1_SYNC_CLK_MUX 389
|
||||
#define TEGRA210_CLK_DMIC2_SYNC_CLK 390
|
||||
#define TEGRA210_CLK_DMIC2_SYNC_CLK_MUX 391
|
||||
#define TEGRA210_CLK_DMIC3_SYNC_CLK 392
|
||||
#define TEGRA210_CLK_DMIC3_SYNC_CLK_MUX 393
|
||||
|
||||
#define TEGRA210_CLK_CLK_MAX 394
|
||||
|
||||
#endif /* _DT_BINDINGS_CLOCK_TEGRA210_CAR_H */
|
||||
|
@ -156,7 +156,7 @@
|
||||
/* 133 */
|
||||
/* 134 */
|
||||
/* 135 */
|
||||
/* 136 */
|
||||
#define TEGRA30_CLK_CEC 136
|
||||
/* 137 */
|
||||
/* 138 */
|
||||
/* 139 */
|
||||
|
13
include/dt-bindings/reset/tegra210-car.h
Normal file
13
include/dt-bindings/reset/tegra210-car.h
Normal file
@ -0,0 +1,13 @@
|
||||
/*
|
||||
* This header provides Tegra210-specific constants for binding
|
||||
* nvidia,tegra210-car.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_RESET_TEGRA210_CAR_H
|
||||
#define _DT_BINDINGS_RESET_TEGRA210_CAR_H
|
||||
|
||||
#define TEGRA210_RESET(x) (7 * 32 + (x))
|
||||
#define TEGRA210_RST_DFLL_DVCO TEGRA210_RESET(0)
|
||||
#define TEGRA210_RST_ADSP TEGRA210_RESET(1)
|
||||
|
||||
#endif /* _DT_BINDINGS_RESET_TEGRA210_CAR_H */
|
@ -125,5 +125,8 @@ extern void tegra210_xusb_pll_hw_control_enable(void);
|
||||
extern void tegra210_xusb_pll_hw_sequence_start(void);
|
||||
extern void tegra210_sata_pll_hw_control_enable(void);
|
||||
extern void tegra210_sata_pll_hw_sequence_start(void);
|
||||
extern void tegra210_set_sata_pll_seq_sw(bool state);
|
||||
extern void tegra210_put_utmipll_in_iddq(void);
|
||||
extern void tegra210_put_utmipll_out_iddq(void);
|
||||
|
||||
#endif /* __LINUX_CLK_TEGRA_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user