android_kernel_samsung_msm8976/include/asm-arm/arch-ns9xxx/clock.h
Uwe Kleine-König f02e579558 [ARM] 4591/1: ns9xxx: simplify REGSET, REGGET and introduce ..._IDX variants
The semantic of the REGSET macros didn't change, but hopefully
it's more obvious as it's now.

REGGET is changed to return the unshifted value, analogous to
REGSET.  REGGETIM behaves as REGGET before.  All callers changed.

..._IDX is used to work with registers that need a parameter like
BBU_GCONFb1.

Signed-off-by: Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2007-10-12 23:43:36 +01:00

71 lines
1.8 KiB
C

/*
* include/asm-arm/arch-ns9xxx/clock.h
*
* Copyright (C) 2007 by Digi International Inc.
* All rights reserved.
*
* 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.
*/
#ifndef __ASM_ARCH_CLOCK_H
#define __ASM_ARCH_CLOCK_H
#include <asm/arch-ns9xxx/regs-sys.h>
#define CRYSTAL 29491200 /* Hz */
/* The HRM calls this value f_vco */
static inline u32 ns9xxx_systemclock(void) __attribute__((const));
static inline u32 ns9xxx_systemclock(void)
{
u32 pll = SYS_PLL;
/*
* The system clock should be a multiple of HZ * TIMERCLOCKSELECT (in
* time.c).
*
* The following values are given:
* - TIMERCLOCKSELECT == 2^i for an i in {0 .. 6}
* - CRYSTAL == 29491200 == 2^17 * 3^2 * 5^2
* - ND in {0 .. 31}
* - FS in {0 .. 3}
*
* Assuming the worst, we consider:
* - TIMERCLOCKSELECT == 64
* - ND == 0
* - FS == 3
*
* So HZ should be a divisor of:
* (CRYSTAL * (ND + 1) >> FS) / TIMERCLOCKSELECT
* == (2^17 * 3^2 * 5^2 * 1 >> 3) / 64
* == 2^8 * 3^2 * 5^2
* == 57600
*
* Currently HZ is defined to be 100 for this platform.
*
* Fine.
*/
return CRYSTAL * (REGGETIM(pll, SYS_PLL, ND) + 1)
>> REGGETIM(pll, SYS_PLL, FS);
}
static inline u32 ns9xxx_cpuclock(void) __attribute__((const));
static inline u32 ns9xxx_cpuclock(void)
{
return ns9xxx_systemclock() / 2;
}
static inline u32 ns9xxx_ahbclock(void) __attribute__((const));
static inline u32 ns9xxx_ahbclock(void)
{
return ns9xxx_systemclock() / 4;
}
static inline u32 ns9xxx_bbusclock(void) __attribute__((const));
static inline u32 ns9xxx_bbusclock(void)
{
return ns9xxx_systemclock() / 8;
}
#endif /* ifndef __ASM_ARCH_CLOCK_H */