mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 13:27:06 +09:00
[ARM] tegra: Add arch-specific udelay using TMRUS
Change-Id: If075117642a725ee2ee24a622068274e588a5bc1 Signed-off-by: Colin Cross <ccross@android.com>
This commit is contained in:
@@ -577,6 +577,7 @@ config ARCH_TEGRA
|
||||
select COMMON_CLKDEV
|
||||
select ARCH_HAS_BARRIERS if CACHE_L2X0
|
||||
select ARCH_HAS_CPUFREQ
|
||||
select ARCH_PROVIDES_UDELAY
|
||||
help
|
||||
This enables support for NVIDIA Tegra based systems (Tegra APX,
|
||||
Tegra 6xx and Tegra 2 series).
|
||||
|
||||
@@ -6,6 +6,7 @@ obj-y += timer.o
|
||||
obj-y += gpio.o
|
||||
obj-y += pinmux.o
|
||||
obj-y += devices.o
|
||||
obj-y += delay.o
|
||||
obj-y += powergate.o
|
||||
obj-y += suspend.o
|
||||
obj-y += fuse.o
|
||||
|
||||
50
arch/arm/mach-tegra/delay.S
Normal file
50
arch/arm/mach-tegra/delay.S
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* arch/arm/mach-tegra/delay.S
|
||||
*
|
||||
* Copyright (C) 2010 Google, Inc.
|
||||
*
|
||||
* Author:
|
||||
* Colin Cross <ccross@google.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <mach/iomap.h>
|
||||
#include <mach/io.h>
|
||||
|
||||
.text
|
||||
|
||||
ENTRY(__udelay)
|
||||
ENTRY(__const_udelay)
|
||||
ldr r3, =(IO_PPSB_VIRT + TEGRA_TMRUS_BASE - IO_PPSB_PHYS)
|
||||
ldr r1, [r3]
|
||||
|
||||
/* r0 - usecs to wait
|
||||
* r1 - initial value of the counter
|
||||
*/
|
||||
loop:
|
||||
ldr r2, [r3]
|
||||
sub r2, r2, r1
|
||||
cmp r2, r0
|
||||
bls loop
|
||||
mov pc, lr
|
||||
ENDPROC(__const_udelay)
|
||||
ENDPROC(__udelay)
|
||||
|
||||
|
||||
@ Delay routine
|
||||
ENTRY(__delay)
|
||||
subs r0, r0, #1
|
||||
bhi __delay
|
||||
mov pc, lr
|
||||
ENDPROC(__delay)
|
||||
41
arch/arm/mach-tegra/include/mach/delay.h
Normal file
41
arch/arm/mach-tegra/include/mach/delay.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* arch/arm/mach-tegra/include/mach/delay.h
|
||||
*
|
||||
* Copyright (C) 2010 Google, Inc.
|
||||
*
|
||||
* Author:
|
||||
* Colin Cross <ccross@google.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
#ifndef __MACH_TEGRA_DELAY_H
|
||||
#define __MACH_TEGRA_DELAY_H
|
||||
|
||||
/* needed by loops_per_jiffy calculations */
|
||||
extern void __delay(int loops);
|
||||
|
||||
extern void __udelay(unsigned long usecs);
|
||||
extern void __const_udelay(unsigned long usecs);
|
||||
|
||||
/* we don't have any restrictions on maximum udelay length, but we'll enforce
|
||||
* the same restriction as the ARM default so we don't introduce any
|
||||
* incompatibilties in drivers.
|
||||
*/
|
||||
extern void __bad_udelay(void);
|
||||
|
||||
#define MAX_UDELAY_MS 2
|
||||
|
||||
#define udelay(n) \
|
||||
((__builtin_constant_p(n) && (n) > (MAX_UDELAY_MS * 1000)) ? \
|
||||
__bad_udelay() : \
|
||||
__udelay(n))
|
||||
|
||||
#endif /* defined(__MACH_TEGRA_DELAY_H) */
|
||||
Reference in New Issue
Block a user