You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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:
@@ -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 = {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 = {
|
||||
|
||||
+10
-5
@@ -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 */
|
||||
|
||||
@@ -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_ */
|
||||
|
||||
Reference in New Issue
Block a user