-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ARM: 7452/1: delay: allow timer-based delay implementation to be sele…
…cted This patch allows a timer-based delay implementation to be selected by switching the delay routines over to use get_cycles, which is implemented in terms of read_current_timer. This further allows us to skip the loop calibration and have a consistent delay function in the face of core frequency scaling. To avoid the pain of dealing with memory-mapped counters, this implementation uses the co-processor interface to the architected timers when they are available. The previous loop-based implementation is kept around for CPUs without the architected timers and we retain both the maximum delay (2ms) and the corresponding conversion factors for determining the number of loops required for a given interval. Since the indirection of the timer routines will only work when called from C, the sa1100 sleep routines are modified to branch to the loop-based delay functions directly. Tested-by: Shinya Kuribayashi <shinya.kuribayashi.px@renesas.com> Reviewed-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
- Loading branch information
Will Deacon
authored and
Russell King
committed
Jul 9, 2012
1 parent
923df96
commit d0a533b
Showing
7 changed files
with
114 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
/* | ||
* Delay loops based on the OpenRISC implementation. | ||
* | ||
* Copyright (C) 2012 ARM Limited | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
* | ||
* Author: Will Deacon <will.deacon@arm.com> | ||
*/ | ||
|
||
#include <linux/delay.h> | ||
#include <linux/init.h> | ||
#include <linux/kernel.h> | ||
#include <linux/module.h> | ||
#include <linux/timex.h> | ||
|
||
/* | ||
* Default to the loop-based delay implementation. | ||
*/ | ||
struct arm_delay_ops arm_delay_ops = { | ||
.delay = __loop_delay, | ||
.const_udelay = __loop_const_udelay, | ||
.udelay = __loop_udelay, | ||
}; | ||
|
||
#ifdef ARCH_HAS_READ_CURRENT_TIMER | ||
static void __timer_delay(unsigned long cycles) | ||
{ | ||
cycles_t start = get_cycles(); | ||
|
||
while ((get_cycles() - start) < cycles) | ||
cpu_relax(); | ||
} | ||
|
||
static void __timer_const_udelay(unsigned long xloops) | ||
{ | ||
unsigned long long loops = xloops; | ||
loops *= loops_per_jiffy; | ||
__timer_delay(loops >> UDELAY_SHIFT); | ||
} | ||
|
||
static void __timer_udelay(unsigned long usecs) | ||
{ | ||
__timer_const_udelay(usecs * UDELAY_MULT); | ||
} | ||
|
||
void __init init_current_timer_delay(unsigned long freq) | ||
{ | ||
pr_info("Switching to timer-based delay loop\n"); | ||
lpj_fine = freq / HZ; | ||
arm_delay_ops.delay = __timer_delay; | ||
arm_delay_ops.const_udelay = __timer_const_udelay; | ||
arm_delay_ops.udelay = __timer_udelay; | ||
} | ||
|
||
unsigned long __cpuinit calibrate_delay_is_known(void) | ||
{ | ||
return lpj_fine; | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters