diff --git a/debian/changelog b/debian/changelog index 6e2d70a17..a85889e95 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,6 +7,9 @@ linux-2.6 (2.6.32-16) UNRELEASED; urgency=low [ Ben Hutchings ] * Add stable 2.6.32.15 + [ Aurelien Jarno ] + * [sh4] fix sh_tmu clocksource following recent nohz changes. + -- dann frazier Tue, 01 Jun 2010 09:23:57 -0600 linux-2.6 (2.6.32-15) unstable; urgency=low diff --git a/debian/patches/bugfix/sh4/fix-sh_tmu.patch b/debian/patches/bugfix/sh4/fix-sh_tmu.patch new file mode 100644 index 000000000..6e50ed782 --- /dev/null +++ b/debian/patches/bugfix/sh4/fix-sh_tmu.patch @@ -0,0 +1,59 @@ +From: Aurelien Jarno +Date: Mon, 31 May 2010 21:45:48 +0000 (+0000) +Subject: clocksource: sh_tmu: compute mult and shift before registration + +clocksource: sh_tmu: compute mult and shift before registration + +Since commit 98962465ed9e6ea99c38e0af63fe1dcb5a79dc25 ("nohz: Prevent +clocksource wrapping during idle"), the CPU of an R2D board never goes +to idle. This commit assumes that mult and shift are assigned before +the clocksource is registered. As a consequence the safe maximum sleep +time is negative and the CPU never goes into idle. + +This patch fixes the problem by moving mult and shift initialization +from sh_tmu_clocksource_enable() to sh_tmu_register_clocksource(). + +Signed-off-by: Aurelien Jarno +Cc: stable@kernel.org +Signed-off-by: Paul Mundt +--- + +diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c +index 8e44e14..de71590 100644 +--- a/drivers/clocksource/sh_tmu.c ++++ b/drivers/clocksource/sh_tmu.c +@@ -199,16 +199,8 @@ static cycle_t sh_tmu_clocksource_read(struct clocksource *cs) + static int sh_tmu_clocksource_enable(struct clocksource *cs) + { + struct sh_tmu_priv *p = cs_to_sh_tmu(cs); +- int ret; +- +- ret = sh_tmu_enable(p); +- if (ret) +- return ret; + +- /* TODO: calculate good shift from rate and counter bit width */ +- cs->shift = 10; +- cs->mult = clocksource_hz2mult(p->rate, cs->shift); +- return 0; ++ return sh_tmu_enable(p); + } + + static void sh_tmu_clocksource_disable(struct clocksource *cs) +@@ -228,6 +220,16 @@ + cs->disable = sh_tmu_clocksource_disable; + cs->mask = CLOCKSOURCE_MASK(32); + cs->flags = CLOCK_SOURCE_IS_CONTINUOUS; ++ ++ /* clk_get_rate() needs an enabled clock */ ++ clk_enable(p->clk); ++ /* channel will be configured at parent clock / 4 */ ++ p->rate = clk_get_rate(p->clk) / 4; ++ clk_disable(p->clk); ++ /* TODO: calculate good shift from rate and counter bit width */ ++ cs->shift = 10; ++ cs->mult = clocksource_hz2mult(p->rate, cs->shift); ++ + pr_info("sh_tmu: %s used as clock source\n", cs->name); + clocksource_register(cs); + return 0; diff --git a/debian/patches/series/16 b/debian/patches/series/16 index 883877d68..34b0ac9a4 100644 --- a/debian/patches/series/16 +++ b/debian/patches/series/16 @@ -1,3 +1,4 @@ + bugfix/parisc/clear-fp-exception-flag-on-SIGFPE.patch - bugfix/all/revert-percpu-stable-changes-2.patch + bugfix/all/stable/2.6.32.15.patch ++ bugfix/sh4/fix-sh_tmu.patch