mirror of https://gitee.com/openkylin/linux.git
clk: tegra: Changes for v4.8-rc1
Fixes and enhancements mostly for Tegra210 clocks that allow DSI and HDMI to work on Tegra X1. There's also a refactoring, including fixes, the USB PLL. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJXdn0rAAoJEN0jrNd/PrOhcOAQAIvunWSUKIuYzyOnDfUMqWig bZ1tZYg2kgQQojYTFkKqWRim//Lj3BwfYxGz6ZsswqQB2NsciiBF+yK3RUmhabik CwBwHmDxtQFAhyQ/saJlwWNpokym02X3zNQ5s8R6NJLlnbKVZy8k0MrpBgg7t6yH LHcojKnqBxD5XxKtEojJl5bJbizH4uLxSr6oivFD5eUoiKvFP/oLIYVRBdZ6wXcP cumO/e82vIdEkouGWeK/+LPz3G92FKRYtfI6qv6I7Tluv3G1S7JGWQ9sYcYWbxnU 6Y+QMuXVcAe1yf0LKRDR2vOVTxBq1/YBMJEV403TK1dM0tp1I8AK7UtkURNmI8yx xXOSPvG6buhbCI/uUy6U86nTXDnwsqWfEdXGFQXt1xwlUKOtRITrQA09khXj5+Dj IrhdDSyKXUO5sMCalT+AxPko+lyvxhOLOXQrJwMB6jg8IZfgksi2opdKcBnhhE8P b4WyJnXN2fKB8/y7CW6sqQ69+T5Djj1c3m5uDx1384HkWUdamRLaNWlITof/NvNm 0O5s6mtzml0/oKckH+ROFIq3TNt4NeOOM9M5K7oekEVd5VDk4YrnqIilK9MRXkBi XlmZ1VDhXxlfQWBlFhE8mZ6pDegkgGmijtu8YBBghWyUZDEu3bJyATppX/LjANZV ooLDGoSXV+Lv9TEnUh5A =MxTG -----END PGP SIGNATURE----- Merge tag 'tegra-for-4.8-clk' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into clk-next Pull tegra clk driver updates from Thierry Reding: Fixes and enhancements mostly for Tegra210 clocks that allow DSI and HDMI to work on Tegra X1. There's also a refactoring, including fixes, the USB PLL. * tag 'tegra-for-4.8-clk' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux: clk: tegra: Initialize UTMI PLL when enabling PLLU clk: tegra: Micro-optimize Tegra210 clock setup clk: tegra: Make sor_safe the parent of dpaux and dpaux1 clk: tegra: Mark timer clock as critical clk: tegra: Enable sor1 and sor1_src on Tegra210 clk: tegra: Squash sor1 safe/brick/src into a single mux clk: tegra: Disable spread spectrum on pll_d2 clk: tegra: Fixup post dividers on Tegra210
This commit is contained in:
commit
345c42964c
|
@ -238,7 +238,6 @@ enum clk_id {
|
|||
tegra_clk_sor0,
|
||||
tegra_clk_sor0_lvds,
|
||||
tegra_clk_sor1,
|
||||
tegra_clk_sor1_brick,
|
||||
tegra_clk_sor1_src,
|
||||
tegra_clk_spdif,
|
||||
tegra_clk_spdif_2x,
|
||||
|
|
|
@ -191,6 +191,53 @@
|
|||
#define PLLSS_REF_SRC_SEL_SHIFT 25
|
||||
#define PLLSS_REF_SRC_SEL_MASK (3 << PLLSS_REF_SRC_SEL_SHIFT)
|
||||
|
||||
#define UTMIP_PLL_CFG1 0x484
|
||||
#define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0)
|
||||
#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 27)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP BIT(15)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP BIT(17)
|
||||
|
||||
#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_CFG2_PHY_XTAL_CLOCKEN BIT(30)
|
||||
|
||||
#define UTMIPLL_HW_PWRDN_CFG0 0x52c
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25)
|
||||
|
||||
#define PLLU_HW_PWRDN_CFG0 0x530
|
||||
#define PLLU_HW_PWRDN_CFG0_CLK_SWITCH_SWCTL BIT(0)
|
||||
#define PLLU_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
|
||||
#define PLLU_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
|
||||
#define PLLU_HW_PWRDN_CFG0_USE_SWITCH_DETECT BIT(7)
|
||||
#define PLLU_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
|
||||
#define PLLU_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE BIT(28)
|
||||
|
||||
#define XUSB_PLL_CFG0 0x534
|
||||
#define XUSB_PLL_CFG0_UTMIPLL_LOCK_DLY 0x3ff
|
||||
#define XUSB_PLL_CFG0_PLLU_LOCK_DLY (0x3ff << 14)
|
||||
|
||||
#define PLLU_BASE_CLKENABLE_USB BIT(21)
|
||||
#define PLLU_BASE_OVERRIDE BIT(24)
|
||||
|
||||
#define pll_readl(offset, p) readl_relaxed(p->clk_base + offset)
|
||||
#define pll_readl_base(p) pll_readl(p->params->base_reg, p)
|
||||
#define pll_readl_misc(p) pll_readl(p->params->misc_reg, p)
|
||||
|
@ -973,6 +1020,133 @@ const struct clk_ops tegra_clk_plle_ops = {
|
|||
.enable = clk_plle_enable,
|
||||
};
|
||||
|
||||
/*
|
||||
* Structure defining the fields for USB UTMI clocks Parameters.
|
||||
*/
|
||||
struct utmi_clk_param {
|
||||
/* Oscillator Frequency in Hz */
|
||||
u32 osc_frequency;
|
||||
/* UTMIP PLL Enable Delay Count */
|
||||
u8 enable_delay_count;
|
||||
/* UTMIP PLL Stable count */
|
||||
u8 stable_count;
|
||||
/* UTMIP PLL Active delay count */
|
||||
u8 active_delay_count;
|
||||
/* UTMIP PLL Xtal frequency count */
|
||||
u8 xtal_freq_count;
|
||||
};
|
||||
|
||||
static const struct utmi_clk_param utmi_parameters[] = {
|
||||
{
|
||||
.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 = 0x04,
|
||||
.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
|
||||
}, {
|
||||
.osc_frequency = 38400000, .enable_delay_count = 0x0,
|
||||
.stable_count = 0x0, .active_delay_count = 0x6,
|
||||
.xtal_freq_count = 0x80
|
||||
},
|
||||
};
|
||||
|
||||
static int clk_pllu_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);
|
||||
|
||||
value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG2);
|
||||
/* Program UTMIP PLL stable and active counts */
|
||||
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);
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
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_C_POWERDOWN;
|
||||
writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG2);
|
||||
|
||||
value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG1);
|
||||
/* Program UTMIP PLL delay and oscillator frequency counts */
|
||||
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);
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
|
||||
writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
out:
|
||||
if (pll->lock)
|
||||
spin_unlock_irqrestore(pll->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct clk_ops tegra_clk_pllu_ops = {
|
||||
.is_enabled = clk_pll_is_enabled,
|
||||
.enable = clk_pllu_enable,
|
||||
.disable = clk_pll_disable,
|
||||
.recalc_rate = clk_pll_recalc_rate,
|
||||
};
|
||||
|
||||
static int _pll_fixed_mdiv(struct tegra_clk_pll_params *pll_params,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
|
@ -1505,6 +1679,112 @@ static void clk_plle_tegra114_disable(struct clk_hw *hw)
|
|||
if (pll->lock)
|
||||
spin_unlock_irqrestore(pll->lock, flags);
|
||||
}
|
||||
|
||||
static int clk_pllu_tegra114_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_clk_pll *pll = to_clk_pll(hw);
|
||||
const struct utmi_clk_param *params = NULL;
|
||||
struct clk *osc = __clk_lookup("osc");
|
||||
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(__clk_get_hw(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);
|
||||
|
||||
value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG2);
|
||||
/* Program UTMIP PLL stable and active counts */
|
||||
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);
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
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_C_POWERDOWN;
|
||||
writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG2);
|
||||
|
||||
value = readl_relaxed(pll->clk_base + UTMIP_PLL_CFG1);
|
||||
/* Program UTMIP PLL delay and oscillator frequency counts */
|
||||
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);
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP;
|
||||
value &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
|
||||
writel_relaxed(value, pll->clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
/* Setup HW control of UTMIPLL */
|
||||
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;
|
||||
value |= UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE;
|
||||
writel_relaxed(value, pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
|
||||
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);
|
||||
|
||||
udelay(1);
|
||||
|
||||
/*
|
||||
* Setup SW override of UTMIPLL assuming USB2.0 ports are assigned
|
||||
* to USB2
|
||||
*/
|
||||
value = readl_relaxed(pll->clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
value |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL;
|
||||
value &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
|
||||
writel_relaxed(value, pll->clk_base + UTMIPLL_HW_PWRDN_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;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct tegra_clk_pll *_tegra_init_pll(void __iomem *clk_base,
|
||||
|
@ -1614,6 +1894,27 @@ struct clk *tegra_clk_register_plle(const char *name, const char *parent_name,
|
|||
return clk;
|
||||
}
|
||||
|
||||
struct clk *tegra_clk_register_pllu(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_ops);
|
||||
if (IS_ERR(clk))
|
||||
kfree(pll);
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_ARCH_TEGRA_114_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_124_SOC) || \
|
||||
defined(CONFIG_ARCH_TEGRA_132_SOC) || \
|
||||
|
@ -1652,6 +1953,12 @@ static const struct clk_ops tegra_clk_plle_tegra114_ops = {
|
|||
.recalc_rate = clk_pll_recalc_rate,
|
||||
};
|
||||
|
||||
static const struct clk_ops tegra_clk_pllu_tegra114_ops = {
|
||||
.is_enabled = clk_pll_is_enabled,
|
||||
.enable = clk_pllu_tegra114_enable,
|
||||
.disable = clk_pll_disable,
|
||||
.recalc_rate = clk_pll_recalc_rate,
|
||||
};
|
||||
|
||||
struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name,
|
||||
void __iomem *clk_base, void __iomem *pmc,
|
||||
|
@ -1919,6 +2226,29 @@ struct clk *tegra_clk_register_plle_tegra114(const char *name,
|
|||
|
||||
return clk;
|
||||
}
|
||||
|
||||
struct clk *
|
||||
tegra_clk_register_pllu_tegra114(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_tegra114_ops);
|
||||
if (IS_ERR(clk))
|
||||
kfree(pll);
|
||||
|
||||
return clk;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_TEGRA_124_SOC) || defined(CONFIG_ARCH_TEGRA_132_SOC)
|
||||
|
@ -2187,6 +2517,152 @@ 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,
|
||||
|
@ -2194,6 +2670,13 @@ 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,
|
||||
|
@ -2434,4 +2917,26 @@ 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
|
||||
|
|
|
@ -594,15 +594,17 @@ static u32 mux_pllp_plld_plld2_clkm_idx[] = {
|
|||
[0] = 0, [1] = 2, [2] = 5, [3] = 6
|
||||
};
|
||||
|
||||
static const char *mux_plldp_sor1_src[] = {
|
||||
"pll_dp", "clk_sor1_src"
|
||||
static const char *mux_sor_safe_sor1_brick_sor1_src[] = {
|
||||
/*
|
||||
* Bit 0 of the mux selects sor1_brick, irrespective of bit 1, so the
|
||||
* sor1_brick parent appears twice in the list below. This is merely
|
||||
* to support clk_get_parent() if firmware happened to set these bits
|
||||
* to 0b11. While not an invalid setting, code should always set the
|
||||
* bits to 0b01 to select sor1_brick.
|
||||
*/
|
||||
"sor_safe", "sor1_brick", "sor1_src", "sor1_brick"
|
||||
};
|
||||
#define mux_plldp_sor1_src_idx NULL
|
||||
|
||||
static const char *mux_clkm_sor1_brick_sor1_src[] = {
|
||||
"clk_m", "sor1_brick", "sor1_src", "sor1_brick"
|
||||
};
|
||||
#define mux_clkm_sor1_brick_sor1_src_idx NULL
|
||||
#define mux_sor_safe_sor1_brick_sor1_src_idx NULL
|
||||
|
||||
static const char *mux_pllp_pllre_clkm[] = {
|
||||
"pll_p", "pll_re_out1", "clk_m"
|
||||
|
@ -778,8 +780,7 @@ static struct tegra_periph_init_data periph_clks[] = {
|
|||
MUX8("nvjpg", mux_pllc2_c_c3_pllp_plla1_clkm, CLK_SOURCE_NVJPG, 195, 0, tegra_clk_nvjpg),
|
||||
MUX8("ape", mux_plla_pllc4_out0_pllc_pllc4_out1_pllp_pllc4_out2_clkm, CLK_SOURCE_APE, 198, TEGRA_PERIPH_ON_APB, tegra_clk_ape),
|
||||
MUX8_NOGATE_LOCK("sor1_src", mux_pllp_plld_plld2_clkm, CLK_SOURCE_SOR1, tegra_clk_sor1_src, &sor1_lock),
|
||||
NODIV("sor1_brick", mux_plldp_sor1_src, CLK_SOURCE_SOR1, 14, MASK(1), 183, 0, tegra_clk_sor1_brick, &sor1_lock),
|
||||
NODIV("sor1", mux_clkm_sor1_brick_sor1_src, CLK_SOURCE_SOR1, 15, MASK(1), 183, 0, tegra_clk_sor1, &sor1_lock),
|
||||
NODIV("sor1", mux_sor_safe_sor1_brick_sor1_src, CLK_SOURCE_SOR1, 14, MASK(2), 183, 0, tegra_clk_sor1, &sor1_lock),
|
||||
MUX8("sdmmc_legacy", mux_pllp_out3_clkm_pllp_pllc4, CLK_SOURCE_SDMMC_LEGACY, 193, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_sdmmc_legacy),
|
||||
MUX8("qspi", mux_pllp_pllc_pllc_out1_pllc4_out2_pllc4_out1_clkm_pllc4_out0, CLK_SOURCE_QSPI, 211, TEGRA_PERIPH_ON_APB, tegra_clk_qspi),
|
||||
I2C("vii2c", mux_pllp_pllc_clkm, CLK_SOURCE_VI_I2C, 208, tegra_clk_vi_i2c),
|
||||
|
@ -791,7 +792,7 @@ static struct tegra_periph_init_data periph_clks[] = {
|
|||
|
||||
static struct tegra_periph_init_data gate_clks[] = {
|
||||
GATE("rtc", "clk_32k", 4, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_rtc, 0),
|
||||
GATE("timer", "clk_m", 5, 0, tegra_clk_timer, 0),
|
||||
GATE("timer", "clk_m", 5, 0, tegra_clk_timer, CLK_IS_CRITICAL),
|
||||
GATE("isp", "clk_m", 23, 0, tegra_clk_isp, 0),
|
||||
GATE("vcp", "clk_m", 29, 0, tegra_clk_vcp, 0),
|
||||
GATE("apbdma", "clk_m", 34, 0, tegra_clk_apbdma, 0),
|
||||
|
|
|
@ -113,32 +113,6 @@
|
|||
|
||||
#define CCLKG_BURST_POLICY 0x368
|
||||
|
||||
#define UTMIP_PLL_CFG2 0x488
|
||||
#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 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_B_POWERDOWN BIT(2)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4)
|
||||
|
||||
#define UTMIP_PLL_CFG1 0x484
|
||||
#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 6)
|
||||
#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 UTMIPLL_HW_PWRDN_CFG0 0x52c
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0)
|
||||
|
||||
#define CLK_SOURCE_CSITE 0x1d4
|
||||
#define CLK_SOURCE_EMC 0x19c
|
||||
|
||||
|
@ -649,43 +623,6 @@ static unsigned long tegra114_input_freq[] = {
|
|||
|
||||
#define MASK(x) (BIT(x) - 1)
|
||||
|
||||
struct utmi_clk_param {
|
||||
/* Oscillator Frequency in KHz */
|
||||
u32 osc_frequency;
|
||||
/* UTMIP PLL Enable Delay Count */
|
||||
u8 enable_delay_count;
|
||||
/* UTMIP PLL Stable count */
|
||||
u8 stable_count;
|
||||
/* UTMIP PLL Active delay count */
|
||||
u8 active_delay_count;
|
||||
/* UTMIP PLL Xtal frequency count */
|
||||
u8 xtal_freq_count;
|
||||
};
|
||||
|
||||
static const struct utmi_clk_param utmi_parameters[] = {
|
||||
{
|
||||
.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 = 0x04,
|
||||
.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
|
||||
},
|
||||
};
|
||||
|
||||
/* peripheral mux definitions */
|
||||
|
||||
static const char *mux_plld_out0_plld2_out0[] = {
|
||||
|
@ -986,92 +923,9 @@ static void __init tegra114_fixed_clk_init(void __iomem *clk_base)
|
|||
|
||||
}
|
||||
|
||||
static __init void tegra114_utmi_param_configure(void __iomem *clk_base)
|
||||
{
|
||||
unsigned int i;
|
||||
u32 reg;
|
||||
|
||||
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 + 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);
|
||||
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
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_C_POWERDOWN;
|
||||
|
||||
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);
|
||||
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
/* Setup HW control of UTMIPLL */
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
reg |= UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET;
|
||||
reg &= ~UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL;
|
||||
reg |= UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE;
|
||||
writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
|
||||
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
udelay(1);
|
||||
|
||||
/* Setup SW override of UTMIPLL assuming USB2.0
|
||||
ports are assigned to USB2 */
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
reg |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL;
|
||||
reg &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
|
||||
writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_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 void __init tegra114_pll_init(void __iomem *clk_base,
|
||||
void __iomem *pmc)
|
||||
{
|
||||
u32 val;
|
||||
struct clk *clk;
|
||||
|
||||
/* PLLC */
|
||||
|
@ -1118,16 +972,10 @@ static void __init tegra114_pll_init(void __iomem *clk_base,
|
|||
CLK_SET_RATE_PARENT, 1, 1);
|
||||
|
||||
/* PLLU */
|
||||
val = readl(clk_base + pll_u_params.base_reg);
|
||||
val &= ~BIT(24); /* disable PLLU_OVERRIDE */
|
||||
writel(val, clk_base + pll_u_params.base_reg);
|
||||
|
||||
clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc, 0,
|
||||
&pll_u_params, &pll_u_lock);
|
||||
clk = tegra_clk_register_pllu_tegra114("pll_u", "pll_ref", clk_base, 0,
|
||||
&pll_u_params, &pll_u_lock);
|
||||
clks[TEGRA114_CLK_PLL_U] = clk;
|
||||
|
||||
tegra114_utmi_param_configure(clk_base);
|
||||
|
||||
/* PLLU_480M */
|
||||
clk = clk_register_gate(NULL, "pll_u_480M", "pll_u",
|
||||
CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
|
||||
|
|
|
@ -99,32 +99,6 @@
|
|||
|
||||
#define CCLKG_BURST_POLICY 0x368
|
||||
|
||||
#define UTMIP_PLL_CFG2 0x488
|
||||
#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 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_B_POWERDOWN BIT(2)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4)
|
||||
|
||||
#define UTMIP_PLL_CFG1 0x484
|
||||
#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 6)
|
||||
#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 UTMIPLL_HW_PWRDN_CFG0 0x52c
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1)
|
||||
#define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0)
|
||||
|
||||
/* Tegra CPU clock and reset control regs */
|
||||
#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470
|
||||
|
||||
|
@ -764,43 +738,6 @@ static struct tegra_clk_pll_params pll_u_params = {
|
|||
TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
};
|
||||
|
||||
struct utmi_clk_param {
|
||||
/* Oscillator Frequency in KHz */
|
||||
u32 osc_frequency;
|
||||
/* UTMIP PLL Enable Delay Count */
|
||||
u8 enable_delay_count;
|
||||
/* UTMIP PLL Stable count */
|
||||
u8 stable_count;
|
||||
/* UTMIP PLL Active delay count */
|
||||
u8 active_delay_count;
|
||||
/* UTMIP PLL Xtal frequency count */
|
||||
u8 xtal_freq_count;
|
||||
};
|
||||
|
||||
static const struct utmi_clk_param utmi_parameters[] = {
|
||||
{
|
||||
.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 = 0x04,
|
||||
.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 tegra124_clks[tegra_clk_max] __initdata = {
|
||||
[tegra_clk_ispb] = { .dt_id = TEGRA124_CLK_ISPB, .present = true },
|
||||
[tegra_clk_rtc] = { .dt_id = TEGRA124_CLK_RTC, .present = true },
|
||||
|
@ -1063,88 +1000,6 @@ static struct tegra_devclk devclks[] __initdata = {
|
|||
|
||||
static struct clk **clks;
|
||||
|
||||
static void tegra124_utmi_param_configure(void __iomem *clk_base)
|
||||
{
|
||||
unsigned int i;
|
||||
u32 reg;
|
||||
|
||||
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 + 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);
|
||||
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
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_C_POWERDOWN;
|
||||
|
||||
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);
|
||||
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
/* Setup HW control of UTMIPLL */
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
reg |= UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET;
|
||||
reg &= ~UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL;
|
||||
reg |= UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE;
|
||||
writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
|
||||
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
|
||||
|
||||
udelay(1);
|
||||
|
||||
/* Setup SW override of UTMIPLL assuming USB2.0
|
||||
ports are assigned to USB2 */
|
||||
reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
|
||||
reg |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL;
|
||||
reg &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
|
||||
writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_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 __init void tegra124_periph_clk_init(void __iomem *clk_base,
|
||||
void __iomem *pmc_base)
|
||||
{
|
||||
|
@ -1195,7 +1050,6 @@ static __init void tegra124_periph_clk_init(void __iomem *clk_base,
|
|||
static void __init tegra124_pll_init(void __iomem *clk_base,
|
||||
void __iomem *pmc)
|
||||
{
|
||||
u32 val;
|
||||
struct clk *clk;
|
||||
|
||||
/* PLLC */
|
||||
|
@ -1256,17 +1110,11 @@ static void __init tegra124_pll_init(void __iomem *clk_base,
|
|||
clks[TEGRA124_CLK_PLL_M_UD] = clk;
|
||||
|
||||
/* PLLU */
|
||||
val = readl(clk_base + pll_u_params.base_reg);
|
||||
val &= ~BIT(24); /* disable PLLU_OVERRIDE */
|
||||
writel(val, clk_base + pll_u_params.base_reg);
|
||||
|
||||
clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc, 0,
|
||||
&pll_u_params, &pll_u_lock);
|
||||
clk = tegra_clk_register_pllu_tegra114("pll_u", "pll_ref", clk_base, 0,
|
||||
&pll_u_params, &pll_u_lock);
|
||||
clk_register_clkdev(clk, "pll_u", NULL);
|
||||
clks[TEGRA124_CLK_PLL_U] = clk;
|
||||
|
||||
tegra124_utmi_param_configure(clk_base);
|
||||
|
||||
/* PLLU_480M */
|
||||
clk = clk_register_gate(NULL, "pll_u_480M", "pll_u",
|
||||
CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
|
||||
|
|
|
@ -155,27 +155,6 @@
|
|||
#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)
|
||||
|
@ -1366,9 +1345,9 @@ static u32 pll_expo_p_to_pdiv(u32 p, u32 *pdiv)
|
|||
|
||||
static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
|
||||
/* 1 GHz */
|
||||
{ 12000000, 1000000000, 166, 1, 1, 0 }, /* actual: 996.0 MHz */
|
||||
{ 13000000, 1000000000, 153, 1, 1, 0 }, /* actual: 994.0 MHz */
|
||||
{ 38400000, 1000000000, 156, 3, 1, 0 }, /* actual: 998.4 MHz */
|
||||
{ 12000000, 1000000000, 166, 1, 2, 0 }, /* actual: 996.0 MHz */
|
||||
{ 13000000, 1000000000, 153, 1, 2, 0 }, /* actual: 994.0 MHz */
|
||||
{ 38400000, 1000000000, 156, 3, 2, 0 }, /* actual: 998.4 MHz */
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -1417,9 +1396,9 @@ static struct div_nmp pllc_nmp = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_cx_freq_table[] = {
|
||||
{ 12000000, 510000000, 85, 1, 1, 0 },
|
||||
{ 13000000, 510000000, 78, 1, 1, 0 }, /* actual: 507.0 MHz */
|
||||
{ 38400000, 510000000, 79, 3, 1, 0 }, /* actual: 505.6 MHz */
|
||||
{ 12000000, 510000000, 85, 1, 2, 0 },
|
||||
{ 13000000, 510000000, 78, 1, 2, 0 }, /* actual: 507.0 MHz */
|
||||
{ 38400000, 510000000, 79, 3, 2, 0 }, /* actual: 505.6 MHz */
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -1532,9 +1511,9 @@ static struct div_nmp pllss_nmp = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_c4_vco_freq_table[] = {
|
||||
{ 12000000, 600000000, 50, 1, 0, 0 },
|
||||
{ 13000000, 600000000, 46, 1, 0, 0 }, /* actual: 598.0 MHz */
|
||||
{ 38400000, 600000000, 62, 4, 0, 0 }, /* actual: 595.2 MHz */
|
||||
{ 12000000, 600000000, 50, 1, 1, 0 },
|
||||
{ 13000000, 600000000, 46, 1, 1, 0 }, /* actual: 598.0 MHz */
|
||||
{ 38400000, 600000000, 62, 4, 1, 0 }, /* actual: 595.2 MHz */
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -1583,19 +1562,19 @@ static struct tegra_clk_pll_params pll_c4_vco_params = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
|
||||
{ 12000000, 800000000, 66, 1, 0, 0 }, /* actual: 792.0 MHz */
|
||||
{ 13000000, 800000000, 61, 1, 0, 0 }, /* actual: 793.0 MHz */
|
||||
{ 38400000, 297600000, 93, 4, 2, 0 },
|
||||
{ 38400000, 400000000, 125, 4, 2, 0 },
|
||||
{ 38400000, 532800000, 111, 4, 1, 0 },
|
||||
{ 38400000, 665600000, 104, 3, 1, 0 },
|
||||
{ 38400000, 800000000, 125, 3, 1, 0 },
|
||||
{ 38400000, 931200000, 97, 4, 0, 0 },
|
||||
{ 38400000, 1065600000, 111, 4, 0, 0 },
|
||||
{ 38400000, 1200000000, 125, 4, 0, 0 },
|
||||
{ 38400000, 1331200000, 104, 3, 0, 0 },
|
||||
{ 38400000, 1459200000, 76, 2, 0, 0 },
|
||||
{ 38400000, 1600000000, 125, 3, 0, 0 },
|
||||
{ 12000000, 800000000, 66, 1, 1, 0 }, /* actual: 792.0 MHz */
|
||||
{ 13000000, 800000000, 61, 1, 1, 0 }, /* actual: 793.0 MHz */
|
||||
{ 38400000, 297600000, 93, 4, 3, 0 },
|
||||
{ 38400000, 400000000, 125, 4, 3, 0 },
|
||||
{ 38400000, 532800000, 111, 4, 2, 0 },
|
||||
{ 38400000, 665600000, 104, 3, 2, 0 },
|
||||
{ 38400000, 800000000, 125, 3, 2, 0 },
|
||||
{ 38400000, 931200000, 97, 4, 1, 0 },
|
||||
{ 38400000, 1065600000, 111, 4, 1, 0 },
|
||||
{ 38400000, 1200000000, 125, 4, 1, 0 },
|
||||
{ 38400000, 1331200000, 104, 3, 1, 0 },
|
||||
{ 38400000, 1459200000, 76, 2, 1, 0 },
|
||||
{ 38400000, 1600000000, 125, 3, 1, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -1705,9 +1684,9 @@ static struct tegra_clk_pll_params pll_e_params = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_re_vco_freq_table[] = {
|
||||
{ 12000000, 672000000, 56, 1, 0, 0 },
|
||||
{ 13000000, 672000000, 51, 1, 0, 0 }, /* actual: 663.0 MHz */
|
||||
{ 38400000, 672000000, 70, 4, 0, 0 },
|
||||
{ 12000000, 672000000, 56, 1, 1, 0 },
|
||||
{ 13000000, 672000000, 51, 1, 1, 0 }, /* actual: 663.0 MHz */
|
||||
{ 38400000, 672000000, 70, 4, 1, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -1754,8 +1733,8 @@ static struct div_nmp pllp_nmp = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
|
||||
{ 12000000, 408000000, 34, 1, 0, 0 },
|
||||
{ 38400000, 408000000, 85, 8, 0, 0 }, /* cf = 4.8MHz, allowed exception */
|
||||
{ 12000000, 408000000, 34, 1, 1, 0 },
|
||||
{ 38400000, 408000000, 85, 8, 1, 0 }, /* cf = 4.8MHz, allowed exception */
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -1820,14 +1799,14 @@ static struct div_nmp plla_nmp = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
|
||||
{ 12000000, 282240000, 47, 1, 1, 1, 0xf148 }, /* actual: 282240234 */
|
||||
{ 12000000, 368640000, 61, 1, 1, 1, 0xfe15 }, /* actual: 368640381 */
|
||||
{ 12000000, 240000000, 60, 1, 2, 1, 0 },
|
||||
{ 13000000, 282240000, 43, 1, 1, 1, 0xfd7d }, /* actual: 282239807 */
|
||||
{ 13000000, 368640000, 56, 1, 1, 1, 0x06d8 }, /* actual: 368640137 */
|
||||
{ 13000000, 240000000, 55, 1, 2, 1, 0 }, /* actual: 238.3 MHz */
|
||||
{ 38400000, 282240000, 44, 3, 1, 1, 0xf333 }, /* actual: 282239844 */
|
||||
{ 38400000, 368640000, 57, 3, 1, 1, 0x0333 }, /* actual: 368639844 */
|
||||
{ 12000000, 282240000, 47, 1, 2, 1, 0xf148 }, /* actual: 282240234 */
|
||||
{ 12000000, 368640000, 61, 1, 2, 1, 0xfe15 }, /* actual: 368640381 */
|
||||
{ 12000000, 240000000, 60, 1, 3, 1, 0 },
|
||||
{ 13000000, 282240000, 43, 1, 2, 1, 0xfd7d }, /* actual: 282239807 */
|
||||
{ 13000000, 368640000, 56, 1, 2, 1, 0x06d8 }, /* actual: 368640137 */
|
||||
{ 13000000, 240000000, 55, 1, 3, 1, 0 }, /* actual: 238.3 MHz */
|
||||
{ 38400000, 282240000, 44, 3, 2, 1, 0xf333 }, /* actual: 282239844 */
|
||||
{ 38400000, 368640000, 57, 3, 2, 1, 0x0333 }, /* actual: 368639844 */
|
||||
{ 38400000, 240000000, 75, 3, 3, 1, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
@ -1873,9 +1852,9 @@ static struct div_nmp plld_nmp = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
|
||||
{ 12000000, 594000000, 99, 1, 1, 0, 0 },
|
||||
{ 13000000, 594000000, 91, 1, 1, 0, 0xfc4f }, /* actual: 594000183 */
|
||||
{ 38400000, 594000000, 30, 1, 1, 0, 0x0e00 },
|
||||
{ 12000000, 594000000, 99, 1, 2, 0, 0 },
|
||||
{ 13000000, 594000000, 91, 1, 2, 0, 0xfc4f }, /* actual: 594000183 */
|
||||
{ 38400000, 594000000, 30, 1, 2, 0, 0x0e00 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -1911,9 +1890,9 @@ static struct tegra_clk_pll_params pll_d_params = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table tegra210_pll_d2_freq_table[] = {
|
||||
{ 12000000, 594000000, 99, 1, 1, 0, 0xf000 },
|
||||
{ 13000000, 594000000, 91, 1, 1, 0, 0xfc4f }, /* actual: 594000183 */
|
||||
{ 38400000, 594000000, 30, 1, 1, 0, 0x0e00 },
|
||||
{ 12000000, 594000000, 99, 1, 2, 0, 0xf000 },
|
||||
{ 13000000, 594000000, 91, 1, 2, 0, 0xfc4f }, /* actual: 594000183 */
|
||||
{ 38400000, 594000000, 30, 1, 2, 0, 0x0e00 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -1935,8 +1914,9 @@ static struct tegra_clk_pll_params pll_d2_params = {
|
|||
.sdm_din_mask = PLLA_SDM_DIN_MASK,
|
||||
.sdm_ctrl_reg = PLLD2_MISC1,
|
||||
.sdm_ctrl_en_mask = PLLD2_SDM_EN_MASK,
|
||||
.ssc_ctrl_reg = PLLD2_MISC1,
|
||||
.ssc_ctrl_en_mask = PLLD2_SSC_EN_MASK,
|
||||
/* disable spread-spectrum for pll_d2 */
|
||||
.ssc_ctrl_reg = 0,
|
||||
.ssc_ctrl_en_mask = 0,
|
||||
.round_p_to_pdiv = pll_qlin_p_to_pdiv,
|
||||
.pdiv_tohw = pll_qlin_pdiv_to_hw,
|
||||
.div_nmp = &pllss_nmp,
|
||||
|
@ -1955,9 +1935,9 @@ static struct tegra_clk_pll_params pll_d2_params = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_dp_freq_table[] = {
|
||||
{ 12000000, 270000000, 90, 1, 3, 0, 0xf000 },
|
||||
{ 13000000, 270000000, 83, 1, 3, 0, 0xf000 }, /* actual: 269.8 MHz */
|
||||
{ 38400000, 270000000, 28, 1, 3, 0, 0xf400 },
|
||||
{ 12000000, 270000000, 90, 1, 4, 0, 0xf000 },
|
||||
{ 13000000, 270000000, 83, 1, 4, 0, 0xf000 }, /* actual: 269.8 MHz */
|
||||
{ 38400000, 270000000, 28, 1, 4, 0, 0xf400 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -2007,9 +1987,9 @@ static struct div_nmp pllu_nmp = {
|
|||
};
|
||||
|
||||
static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
|
||||
{ 12000000, 480000000, 40, 1, 0, 0 },
|
||||
{ 13000000, 480000000, 36, 1, 0, 0 }, /* actual: 468.0 MHz */
|
||||
{ 38400000, 480000000, 25, 2, 0, 0 },
|
||||
{ 12000000, 480000000, 40, 1, 1, 0 },
|
||||
{ 13000000, 480000000, 36, 1, 1, 0 }, /* actual: 468.0 MHz */
|
||||
{ 38400000, 480000000, 25, 2, 1, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
|
@ -2037,47 +2017,6 @@ static struct tegra_clk_pll_params pll_u_vco_params = {
|
|||
.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 = {
|
||||
[tegra_clk_ispb] = { .dt_id = TEGRA210_CLK_ISPB, .present = true },
|
||||
[tegra_clk_rtc] = { .dt_id = TEGRA210_CLK_RTC, .present = true },
|
||||
|
@ -2154,6 +2093,8 @@ static struct tegra_clk tegra210_clks[tegra_clk_max] __initdata = {
|
|||
[tegra_clk_dpaux1] = { .dt_id = TEGRA210_CLK_DPAUX1, .present = true },
|
||||
[tegra_clk_sor0] = { .dt_id = TEGRA210_CLK_SOR0, .present = true },
|
||||
[tegra_clk_sor0_lvds] = { .dt_id = TEGRA210_CLK_SOR0_LVDS, .present = true },
|
||||
[tegra_clk_sor1] = { .dt_id = TEGRA210_CLK_SOR1, .present = true },
|
||||
[tegra_clk_sor1_src] = { .dt_id = TEGRA210_CLK_SOR1_SRC, .present = true },
|
||||
[tegra_clk_gpu] = { .dt_id = TEGRA210_CLK_GPU, .present = true },
|
||||
[tegra_clk_pll_g_ref] = { .dt_id = TEGRA210_CLK_PLL_G_REF, .present = true, },
|
||||
[tegra_clk_uartb_8] = { .dt_id = TEGRA210_CLK_UARTB, .present = true },
|
||||
|
@ -2345,114 +2286,6 @@ static struct tegra_audio_clk_info tegra210_audio_plls[] = {
|
|||
|
||||
static struct clk **clks;
|
||||
|
||||
static void tegra210_utmi_param_configure(void __iomem *clk_base)
|
||||
{
|
||||
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 + 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 + 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);
|
||||
|
||||
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 __init void tegra210_periph_clk_init(void __iomem *clk_base,
|
||||
void __iomem *pmc_base)
|
||||
{
|
||||
|
@ -2463,18 +2296,18 @@ static __init void tegra210_periph_clk_init(void __iomem *clk_base,
|
|||
1, 2);
|
||||
clks[TEGRA210_CLK_XUSB_SS_DIV2] = clk;
|
||||
|
||||
clk = tegra_clk_register_periph_fixed("dpaux", "pll_p", 0, clk_base,
|
||||
1, 17, 181);
|
||||
clks[TEGRA210_CLK_DPAUX] = clk;
|
||||
|
||||
clk = tegra_clk_register_periph_fixed("dpaux1", "pll_p", 0, clk_base,
|
||||
1, 17, 207);
|
||||
clks[TEGRA210_CLK_DPAUX1] = clk;
|
||||
|
||||
clk = tegra_clk_register_periph_fixed("sor_safe", "pll_p", 0, clk_base,
|
||||
1, 17, 222);
|
||||
clks[TEGRA210_CLK_SOR_SAFE] = clk;
|
||||
|
||||
clk = tegra_clk_register_periph_fixed("dpaux", "sor_safe", 0, clk_base,
|
||||
1, 17, 181);
|
||||
clks[TEGRA210_CLK_DPAUX] = clk;
|
||||
|
||||
clk = tegra_clk_register_periph_fixed("dpaux1", "sor_safe", 0, clk_base,
|
||||
1, 17, 207);
|
||||
clks[TEGRA210_CLK_DPAUX1] = clk;
|
||||
|
||||
/* pll_d_dsi_out */
|
||||
clk = clk_register_gate(NULL, "pll_d_dsi_out", "pll_d_out0", 0,
|
||||
clk_base + PLLD_MISC0, 21, 0, &pll_d_lock);
|
||||
|
@ -2520,7 +2353,6 @@ static __init void tegra210_periph_clk_init(void __iomem *clk_base,
|
|||
static void __init tegra210_pll_init(void __iomem *clk_base,
|
||||
void __iomem *pmc)
|
||||
{
|
||||
u32 val;
|
||||
struct clk *clk;
|
||||
|
||||
/* PLLC */
|
||||
|
@ -2580,12 +2412,9 @@ static void __init tegra210_pll_init(void __iomem *clk_base,
|
|||
clks[TEGRA210_CLK_PLL_M_UD] = clk;
|
||||
|
||||
/* PLLU_VCO */
|
||||
val = readl(clk_base + pll_u_vco_params.base_reg);
|
||||
val &= ~PLLU_BASE_OVERRIDE; /* disable PLLU_OVERRIDE */
|
||||
writel(val, clk_base + pll_u_vco_params.base_reg);
|
||||
|
||||
clk = tegra_clk_register_pllre("pll_u_vco", "pll_ref", clk_base, pmc,
|
||||
0, &pll_u_vco_params, &pll_u_lock, pll_ref_freq);
|
||||
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;
|
||||
|
||||
|
@ -2618,8 +2447,6 @@ static void __init tegra210_pll_init(void __iomem *clk_base,
|
|||
clk_register_clkdev(clk, "pll_u_out2", NULL);
|
||||
clks[TEGRA210_CLK_PLL_U_OUT2] = clk;
|
||||
|
||||
tegra210_utmi_param_configure(clk_base);
|
||||
|
||||
/* PLLU_480M */
|
||||
clk = clk_register_gate(NULL, "pll_u_480M", "pll_u_vco",
|
||||
CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
|
||||
|
|
|
@ -118,20 +118,6 @@
|
|||
|
||||
#define AUDIO_SYNC_DOUBLER 0x49c
|
||||
|
||||
#define UTMIP_PLL_CFG2 0x488
|
||||
#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 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_B_POWERDOWN BIT(2)
|
||||
#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4)
|
||||
|
||||
#define UTMIP_PLL_CFG1 0x484
|
||||
#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 6)
|
||||
#define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12)
|
||||
#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16)
|
||||
|
||||
/* Tegra CPU clock and reset control regs */
|
||||
#define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX 0x4c
|
||||
#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET 0x340
|
||||
|
@ -207,46 +193,6 @@ static DEFINE_SPINLOCK(emc_lock);
|
|||
|
||||
static struct clk **clks;
|
||||
|
||||
/*
|
||||
* Structure defining the fields for USB UTMI clocks Parameters.
|
||||
*/
|
||||
struct utmi_clk_param {
|
||||
/* Oscillator Frequency in KHz */
|
||||
u32 osc_frequency;
|
||||
/* UTMIP PLL Enable Delay Count */
|
||||
u8 enable_delay_count;
|
||||
/* UTMIP PLL Stable count */
|
||||
u8 stable_count;
|
||||
/* UTMIP PLL Active delay count */
|
||||
u8 active_delay_count;
|
||||
/* UTMIP PLL Xtal frequency count */
|
||||
u8 xtal_freq_count;
|
||||
};
|
||||
|
||||
static const struct utmi_clk_param utmi_parameters[] = {
|
||||
{
|
||||
.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 = 0x04,
|
||||
.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_pll_freq_table pll_c_freq_table[] = {
|
||||
{ 12000000, 1040000000, 520, 6, 1, 8 },
|
||||
{ 13000000, 1040000000, 480, 6, 1, 8 },
|
||||
|
@ -873,59 +819,6 @@ static struct tegra_clk tegra30_clks[tegra_clk_max] __initdata = {
|
|||
[tegra_clk_pll_a_out0] = { .dt_id = TEGRA30_CLK_PLL_A_OUT0, .present = true },
|
||||
};
|
||||
|
||||
static void tegra30_utmi_param_configure(void)
|
||||
{
|
||||
unsigned int i;
|
||||
u32 reg;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
|
||||
if (input_freq == utmi_parameters[i].osc_frequency)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= ARRAY_SIZE(utmi_parameters)) {
|
||||
pr_err("%s: Unexpected input rate %lu\n", __func__, input_freq);
|
||||
return;
|
||||
}
|
||||
|
||||
reg = readl_relaxed(clk_base + UTMIP_PLL_CFG2);
|
||||
|
||||
/* Program UTMIP PLL stable and active counts */
|
||||
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);
|
||||
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
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_C_POWERDOWN;
|
||||
|
||||
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);
|
||||
|
||||
/* Remove power downs from UTMIP PLL control bits */
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
|
||||
reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
|
||||
|
||||
writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
|
||||
}
|
||||
|
||||
static const char *pll_e_parents[] = { "pll_ref", "pll_p" };
|
||||
|
||||
static void __init tegra30_pll_init(void)
|
||||
|
@ -972,12 +865,10 @@ static void __init tegra30_pll_init(void)
|
|||
clks[TEGRA30_CLK_PLL_X_OUT0] = clk;
|
||||
|
||||
/* PLLU */
|
||||
clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc_base, 0,
|
||||
&pll_u_params, NULL);
|
||||
clk = tegra_clk_register_pllu("pll_u", "pll_ref", clk_base, 0,
|
||||
&pll_u_params, NULL);
|
||||
clks[TEGRA30_CLK_PLL_U] = clk;
|
||||
|
||||
tegra30_utmi_param_configure();
|
||||
|
||||
/* PLLD */
|
||||
clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc_base, 0,
|
||||
&pll_d_params, &pll_d_lock);
|
||||
|
|
|
@ -427,6 +427,23 @@ struct clk *tegra_clk_register_pllmb(const char *name, const char *parent_name,
|
|||
struct tegra_clk_pll_params *pll_params,
|
||||
spinlock_t *lock);
|
||||
|
||||
struct clk *tegra_clk_register_pllu(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 clk *tegra_clk_register_pllu_tegra114(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 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_out - PLL divider down clock
|
||||
*
|
||||
|
|
|
@ -308,7 +308,7 @@
|
|||
#define TEGRA210_CLK_CLK_OUT_3 279
|
||||
#define TEGRA210_CLK_BLINK 280
|
||||
/* 281 */
|
||||
/* 282 */
|
||||
#define TEGRA210_CLK_SOR1_SRC 282
|
||||
/* 283 */
|
||||
#define TEGRA210_CLK_XUSB_HOST_SRC 284
|
||||
#define TEGRA210_CLK_XUSB_FALCON_SRC 285
|
||||
|
|
Loading…
Reference in New Issue