diff options
author | danh-arm <dan.handley@arm.com> | 2015-12-09 10:40:51 +0000 |
---|---|---|
committer | danh-arm <dan.handley@arm.com> | 2015-12-09 10:40:51 +0000 |
commit | 8d297cc94312c52b5104235fcdc4127ecef6d1af (patch) | |
tree | 63ebf4f08f84046f99604b015948ad7322f8aa67 | |
parent | f879f002abee2489146da7b1e290339da91bf3aa (diff) | |
parent | 540a5ba8d955b6f369322b099f70bb5dc6787a06 (diff) |
Merge pull request #455 from jcastillo-arm/jc/fvp_delay_timer
Fix SP804 delay timer on FVP
-rw-r--r-- | include/drivers/delay_timer.h | 2 | ||||
-rw-r--r-- | include/plat/arm/board/common/v2m_def.h | 7 | ||||
-rw-r--r-- | plat/arm/board/fvp/fvp_bl2_setup.c | 5 | ||||
-rw-r--r-- | plat/arm/board/fvp/fvp_def.h | 10 |
4 files changed, 21 insertions, 3 deletions
diff --git a/include/drivers/delay_timer.h b/include/drivers/delay_timer.h index 4f3bdc88..0dec626c 100644 --- a/include/drivers/delay_timer.h +++ b/include/drivers/delay_timer.h @@ -38,7 +38,7 @@ * The driver must be initialized with a structure that provides a * function pointer to return the timer value and a clock * multiplier/divider. The ratio of the multiplier and the divider is - * the clock frequency in MHz. + * the clock period in microseconds. ********************************************************************/ typedef struct timer_ops { diff --git a/include/plat/arm/board/common/v2m_def.h b/include/plat/arm/board/common/v2m_def.h index 7ed0af6c..888792ed 100644 --- a/include/plat/arm/board/common/v2m_def.h +++ b/include/plat/arm/board/common/v2m_def.h @@ -112,6 +112,13 @@ #define V2M_SP804_TIMER0_BASE 0x1C110000 #define V2M_SP804_TIMER1_BASE 0x1C120000 +/* SP810 controller */ +#define V2M_SP810_BASE 0x1c020000 +#define V2M_SP810_CTRL_TIM0_SEL (1 << 15) +#define V2M_SP810_CTRL_TIM1_SEL (1 << 17) +#define V2M_SP810_CTRL_TIM2_SEL (1 << 19) +#define V2M_SP810_CTRL_TIM3_SEL (1 << 21) + #define V2M_MAP_FLASH0_RW MAP_REGION_FLAT(V2M_FLASH0_BASE,\ V2M_FLASH0_SIZE, \ MT_DEVICE | MT_RW | MT_SECURE) diff --git a/plat/arm/board/fvp/fvp_bl2_setup.c b/plat/arm/board/fvp/fvp_bl2_setup.c index b1cdef48..305309ab 100644 --- a/plat/arm/board/fvp/fvp_bl2_setup.c +++ b/plat/arm/board/fvp/fvp_bl2_setup.c @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <mmio.h> #include <plat_arm.h> #include <sp804_delay_timer.h> #include <v2m_def.h> @@ -47,6 +48,10 @@ void bl2_platform_setup(void) { arm_bl2_platform_setup(); + /* Enable the clock override for SP804 timer 0, which means that no + * clock dividers are applied and the raw (35 MHz) clock will be used */ + mmio_write_32(V2M_SP810_BASE, FVP_SP810_CTRL_TIM0_OV); + /* Initialize delay timer driver using SP804 dual timer 0 */ sp804_timer_init(V2M_SP804_TIMER0_BASE, SP804_TIMER_CLKMULT, SP804_TIMER_CLKDIV); diff --git a/plat/arm/board/fvp/fvp_def.h b/plat/arm/board/fvp/fvp_def.h index 3af4db68..41b872af 100644 --- a/plat/arm/board/fvp/fvp_def.h +++ b/plat/arm/board/fvp/fvp_def.h @@ -96,8 +96,14 @@ #define PWRC_BASE 0x1c100000 /* FVP SP804 timer frequency is 35 MHz*/ -#define SP804_TIMER_CLKMULT 35 -#define SP804_TIMER_CLKDIV 1 +#define SP804_TIMER_CLKMULT 1 +#define SP804_TIMER_CLKDIV 35 + +/* SP810 controller. FVP specific flags */ +#define FVP_SP810_CTRL_TIM0_OV (1 << 16) +#define FVP_SP810_CTRL_TIM1_OV (1 << 18) +#define FVP_SP810_CTRL_TIM2_OV (1 << 20) +#define FVP_SP810_CTRL_TIM3_OV (1 << 22) /******************************************************************************* * GIC-400 & interrupt handling related constants |