mirror of
https://github.com/LineageOS/android_kernel_samsung_msm8226.git
synced 2026-10-06 00:01:01 +02:00
This is a squash of a handful of changes and reverts of the Qualcomm specific implementation: Revert "arm: Implement a timer based __delay() loop" This reverts commit 976eafa8b18252876e15f861944acf693b07ce7e. Revert "arm: Allow machines to override __delay()" This reverts commit bc0ef8ab167272890f1aab62928b04a9aeb87ce9. Revert "arm: Translate delay.S into (mostly) C" This reverts commit 8d5868d8205d10a0a8e423f53e9cc9bb3e9d1a34. ARM: 7451/1: arch timer: implement read_current_timer and get_cycles This patch implements read_current_timer using the architected timers when they are selected via CONFIG_ARM_ARCH_TIMER. If they are detected not to be usable at runtime, we return -ENXIO to the caller. Furthermore, if read_current_timer is exported then we can implement get_cycles in terms of it for use as both an entropy source and for implementing __udelay and friends. 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> ARM: 7452/1: delay: allow timer-based delay implementation to be selected 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> ARM: delay: set loops_per_jiffy when moving to timer-based loop The delay functions may be called by some platforms between switching to the timer-based delay loop but before calibration. In this case, the initial loops_per_jiffy may not be suitable for the timer (although a compromise may be achievable) and delay times may be considered too inaccurate. This patch updates loops_per_jiffy when switching to the timer-based delay loop so that delays are consistent prior to calibration. Signed-off-by: Will Deacon <will.deacon@arm.com> ARM: delay: add registration mechanism for delay timer sources The current timer-based delay loop relies on the architected timer to initiate the switch away from the polling-based implementation. This is unfortunate for platforms without the architected timers but with a suitable delay source (that is, constant frequency, always powered-up and ticking as long as the CPUs are online). This patch introduces a registration mechanism for the delay timer (which provides an unconditional read_current_timer implementation) and updates the architected timer code to use the new interface. Signed-off-by: Jonathan Austin <jonathan.austin@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> ARM: export default read_current_timer read_current_timer is used by get_cycles since "ARM: 7538/1: delay: add registration mechanism for delay timer sources", and get_cycles can be used by device drivers in loadable modules, so it has to be exported. Without this patch, building imote2_defconfig fails with ERROR: "read_current_timer" [crypto/tcrypt.ko] undefined! Signed-off-by: Arnd Bergmann <arnd@arndb.de> Cc: Stephen Boyd <sboyd@codeaurora.org> Cc: Jonathan Austin <jonathan.austin@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Russell King <rmk+kernel@arm.linux.org.uk> Change-Id: If1ad095d6852f5966ea995856103e06de6ab2f59 Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
68 lines
1.3 KiB
ArmAsm
68 lines
1.3 KiB
ArmAsm
/*
|
|
* linux/arch/arm/lib/delay.S
|
|
*
|
|
* Copyright (C) 1995, 1996 Russell King
|
|
*
|
|
* 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.
|
|
*/
|
|
#include <linux/linkage.h>
|
|
#include <asm/assembler.h>
|
|
#include <asm/delay.h>
|
|
.text
|
|
|
|
.LC0: .word loops_per_jiffy
|
|
.LC1: .word UDELAY_MULT
|
|
|
|
/*
|
|
* r0 <= 2000
|
|
* lpj <= 0x01ffffff (max. 3355 bogomips)
|
|
* HZ <= 1000
|
|
*/
|
|
|
|
ENTRY(__loop_udelay)
|
|
ldr r2, .LC1
|
|
mul r0, r2, r0
|
|
ENTRY(__loop_const_udelay) @ 0 <= r0 <= 0x7fffff06
|
|
mov r1, #-1
|
|
ldr r2, .LC0
|
|
ldr r2, [r2] @ max = 0x01ffffff
|
|
add r0, r0, r1, lsr #32-14
|
|
mov r0, r0, lsr #14 @ max = 0x0001ffff
|
|
add r2, r2, r1, lsr #32-10
|
|
mov r2, r2, lsr #10 @ max = 0x00007fff
|
|
mul r0, r2, r0 @ max = 2^32-1
|
|
add r0, r0, r1, lsr #32-6
|
|
movs r0, r0, lsr #6
|
|
moveq pc, lr
|
|
|
|
/*
|
|
* loops = r0 * HZ * loops_per_jiffy / 1000000
|
|
*/
|
|
|
|
@ Delay routine
|
|
ENTRY(__loop_delay)
|
|
subs r0, r0, #1
|
|
#if 0
|
|
movls pc, lr
|
|
subs r0, r0, #1
|
|
movls pc, lr
|
|
subs r0, r0, #1
|
|
movls pc, lr
|
|
subs r0, r0, #1
|
|
movls pc, lr
|
|
subs r0, r0, #1
|
|
movls pc, lr
|
|
subs r0, r0, #1
|
|
movls pc, lr
|
|
subs r0, r0, #1
|
|
movls pc, lr
|
|
subs r0, r0, #1
|
|
#endif
|
|
bhi __loop_delay
|
|
mov pc, lr
|
|
ENDPROC(__loop_udelay)
|
|
ENDPROC(__loop_const_udelay)
|
|
ENDPROC(__loop_delay)
|