mirror of https://gitee.com/openkylin/linux.git
Few fixes for the v3.17 merge window:
- Fix for DPLL rate rounding - Fix for omap3 ES3.1.2 suspend - Few coding style fixes Note that these are based on earlier omap-for-v3.17/soc. No strict dependency to it though, but I already merged in the pull request from Paul for the first fix into it and these are all SoC related. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJT21LQAAoJEBvUPslcq6VzMVMP/jgMYuWubEC+fBxiS4rVhi70 UtSXZC5BbUejf3EudJvIusS0SDoWApMLsOyanNTb5zyHMdSbYgkwJx1xfw9TYLZJ j9WnOUB3a3XA6Forz9GD1m5Z+Ii/iPhovJSWwHXllF+JW6IlkgIkCshiPohBwf4P AZiDtz76sYiCql7S25rZAchE/6kZNrsgOauWmNyINi1IKtVL/U0LhECV1VPbKly8 LbfHhHL7/RrEtmda7KG0/7FydkqKB6a6MpDGmB8UyaiMrUlu8MmUFxWHq8mbRdyk WNX/eJw5//ee5WlCx9peHMTq5swnCnyGkd5Ov2x8Fr5SnZp6mLlG6DNxhuBWoiVT UgLvhAOOE66WQJ8DrkNNJD4L9u1hpulm1bRJXfBMz+Dsu72ax0w+tRYpWzv1P+/b dtQBrZcH8D7Wz85y3hrF+ck+yxvGduEZT/+qax9GvqaYJHiuiYIDzPLlYX/61JxZ H5tES+TY9Fe6fxJAc4xWdpfLkr0Qk7K6pTLph1F2mgT3qqBd/lBtCtbJP6aiaZmo tjEyeOr5Cgxo+aEg5NTIzgOnuMO+lcU5CZ80wlJPv14szQ1DHj+4DXDE8/vgTjwT qBRxwZkultjNb6ZqgIfT3+2SyeP9ZduBmh66NLVxHHAxXa8TVrBpBHlrrhLxD2zW 00GT2lygadrg7eKgseFY =jsEw -----END PGP SIGNATURE----- Merge tag 'omap-for-v3.17/soc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into fixes Merge "few omap fixes for v3.17 merge window" from Tony Lindgren: Few fixes for the v3.17 merge window: - Fix for DPLL rate rounding - Fix for omap3 ES3.1.2 suspend - Few coding style fixes * tag 'omap-for-v3.17/soc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: ARM: OMAP3: Fix coding style problems in arch/arm/mach-omap2/control.c ARM: OMAP3: Fix choice of omap3_restore_es function in OMAP34XX rev3.1.2 case. ARM: OMAP2+: clock: allow omap2_dpll_round_rate() to round to next-lowest rate Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
bb7aedff3f
|
@ -285,10 +285,13 @@ long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate,
|
||||||
{
|
{
|
||||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||||
int m, n, r, scaled_max_m;
|
int m, n, r, scaled_max_m;
|
||||||
|
int min_delta_m = INT_MAX, min_delta_n = INT_MAX;
|
||||||
unsigned long scaled_rt_rp;
|
unsigned long scaled_rt_rp;
|
||||||
unsigned long new_rate = 0;
|
unsigned long new_rate = 0;
|
||||||
struct dpll_data *dd;
|
struct dpll_data *dd;
|
||||||
unsigned long ref_rate;
|
unsigned long ref_rate;
|
||||||
|
long delta;
|
||||||
|
long prev_min_delta = LONG_MAX;
|
||||||
const char *clk_name;
|
const char *clk_name;
|
||||||
|
|
||||||
if (!clk || !clk->dpll_data)
|
if (!clk || !clk->dpll_data)
|
||||||
|
@ -334,23 +337,34 @@ long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate,
|
||||||
if (r == DPLL_MULT_UNDERFLOW)
|
if (r == DPLL_MULT_UNDERFLOW)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* skip rates above our target rate */
|
||||||
|
delta = target_rate - new_rate;
|
||||||
|
if (delta < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (delta < prev_min_delta) {
|
||||||
|
prev_min_delta = delta;
|
||||||
|
min_delta_m = m;
|
||||||
|
min_delta_n = n;
|
||||||
|
}
|
||||||
|
|
||||||
pr_debug("clock: %s: m = %d: n = %d: new_rate = %lu\n",
|
pr_debug("clock: %s: m = %d: n = %d: new_rate = %lu\n",
|
||||||
clk_name, m, n, new_rate);
|
clk_name, m, n, new_rate);
|
||||||
|
|
||||||
if (target_rate == new_rate) {
|
if (delta == 0)
|
||||||
dd->last_rounded_m = m;
|
|
||||||
dd->last_rounded_n = n;
|
|
||||||
dd->last_rounded_rate = target_rate;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (target_rate != new_rate) {
|
if (prev_min_delta == LONG_MAX) {
|
||||||
pr_debug("clock: %s: cannot round to rate %lu\n",
|
pr_debug("clock: %s: cannot round to rate %lu\n",
|
||||||
clk_name, target_rate);
|
clk_name, target_rate);
|
||||||
return ~0;
|
return ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return target_rate;
|
dd->last_rounded_m = min_delta_m;
|
||||||
|
dd->last_rounded_n = min_delta_n;
|
||||||
|
dd->last_rounded_rate = target_rate - prev_min_delta;
|
||||||
|
|
||||||
|
return dd->last_rounded_rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -280,6 +280,7 @@ void omap3_clear_scratchpad_contents(void)
|
||||||
u32 max_offset = OMAP343X_SCRATCHPAD_ROM_OFFSET;
|
u32 max_offset = OMAP343X_SCRATCHPAD_ROM_OFFSET;
|
||||||
void __iomem *v_addr;
|
void __iomem *v_addr;
|
||||||
u32 offset = 0;
|
u32 offset = 0;
|
||||||
|
|
||||||
v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM);
|
v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM);
|
||||||
if (omap3xxx_prm_clear_global_cold_reset()) {
|
if (omap3xxx_prm_clear_global_cold_reset()) {
|
||||||
for ( ; offset <= max_offset; offset += 0x4)
|
for ( ; offset <= max_offset; offset += 0x4)
|
||||||
|
@ -309,7 +310,8 @@ void omap3_save_scratchpad_contents(void)
|
||||||
scratchpad_contents.public_restore_ptr =
|
scratchpad_contents.public_restore_ptr =
|
||||||
virt_to_phys(omap3_restore_3630);
|
virt_to_phys(omap3_restore_3630);
|
||||||
else if (omap_rev() != OMAP3430_REV_ES3_0 &&
|
else if (omap_rev() != OMAP3430_REV_ES3_0 &&
|
||||||
omap_rev() != OMAP3430_REV_ES3_1)
|
omap_rev() != OMAP3430_REV_ES3_1 &&
|
||||||
|
omap_rev() != OMAP3430_REV_ES3_1_2)
|
||||||
scratchpad_contents.public_restore_ptr =
|
scratchpad_contents.public_restore_ptr =
|
||||||
virt_to_phys(omap3_restore);
|
virt_to_phys(omap3_restore);
|
||||||
else
|
else
|
||||||
|
@ -463,7 +465,6 @@ void omap3_control_save_context(void)
|
||||||
control_context.csi = omap_ctrl_readl(OMAP343X_CONTROL_CSI);
|
control_context.csi = omap_ctrl_readl(OMAP343X_CONTROL_CSI);
|
||||||
control_context.padconf_sys_nirq =
|
control_context.padconf_sys_nirq =
|
||||||
omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_SYSNIRQ);
|
omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_SYSNIRQ);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void omap3_control_restore_context(void)
|
void omap3_control_restore_context(void)
|
||||||
|
@ -521,7 +522,6 @@ void omap3_control_restore_context(void)
|
||||||
omap_ctrl_writel(control_context.csi, OMAP343X_CONTROL_CSI);
|
omap_ctrl_writel(control_context.csi, OMAP343X_CONTROL_CSI);
|
||||||
omap_ctrl_writel(control_context.padconf_sys_nirq,
|
omap_ctrl_writel(control_context.padconf_sys_nirq,
|
||||||
OMAP343X_CONTROL_PADCONF_SYSNIRQ);
|
OMAP343X_CONTROL_PADCONF_SYSNIRQ);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void omap3630_ctrl_disable_rta(void)
|
void omap3630_ctrl_disable_rta(void)
|
||||||
|
|
|
@ -475,6 +475,7 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
{
|
{
|
||||||
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
|
||||||
struct clk *new_parent = NULL;
|
struct clk *new_parent = NULL;
|
||||||
|
unsigned long rrate;
|
||||||
u16 freqsel = 0;
|
u16 freqsel = 0;
|
||||||
struct dpll_data *dd;
|
struct dpll_data *dd;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -502,8 +503,16 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
__clk_prepare(dd->clk_ref);
|
__clk_prepare(dd->clk_ref);
|
||||||
clk_enable(dd->clk_ref);
|
clk_enable(dd->clk_ref);
|
||||||
|
|
||||||
if (dd->last_rounded_rate != rate)
|
/* XXX this check is probably pointless in the CCF context */
|
||||||
rate = __clk_round_rate(hw->clk, rate);
|
if (dd->last_rounded_rate != rate) {
|
||||||
|
rrate = __clk_round_rate(hw->clk, rate);
|
||||||
|
if (rrate != rate) {
|
||||||
|
pr_warn("%s: %s: final rate %lu does not match desired rate %lu\n",
|
||||||
|
__func__, __clk_get_name(hw->clk),
|
||||||
|
rrate, rate);
|
||||||
|
rate = rrate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (dd->last_rounded_rate == 0)
|
if (dd->last_rounded_rate == 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
Loading…
Reference in New Issue