1d0787656SStefan Roese /* 2d0787656SStefan Roese * Copyright (C) Marvell International Ltd. and its affiliates 3d0787656SStefan Roese * Written-by: Prafulla Wadaskar <prafulla@marvell.com> 4d0787656SStefan Roese * 52fbc18feSStefan Roese * Copyright (C) 2015 Stefan Roese <sr@denx.de> 62fbc18feSStefan Roese * 7d0787656SStefan Roese * SPDX-License-Identifier: GPL-2.0+ 8d0787656SStefan Roese */ 9d0787656SStefan Roese 10d0787656SStefan Roese #include <common.h> 11d0787656SStefan Roese #include <asm/io.h> 12d0787656SStefan Roese #include <asm/arch/soc.h> 13d0787656SStefan Roese 142fbc18feSStefan Roese DECLARE_GLOBAL_DATA_PTR; 15d0787656SStefan Roese 16d0787656SStefan Roese #define TIMER_LOAD_VAL 0xffffffff 17d0787656SStefan Roese 18787ddb7cSStefan Roese static int init_done __attribute__((section(".data"))) = 0; 19ade741b3SStefan Roese 20d0787656SStefan Roese /* 212fbc18feSStefan Roese * Timer initialization 22d0787656SStefan Roese */ timer_init(void)23d0787656SStefan Roeseint timer_init(void) 24d0787656SStefan Roese { 25ade741b3SStefan Roese /* Only init the timer once */ 26ade741b3SStefan Roese if (init_done) 27ade741b3SStefan Roese return 0; 28ade741b3SStefan Roese init_done = 1; 29ade741b3SStefan Roese 30d0787656SStefan Roese /* load value into timer */ 312fbc18feSStefan Roese writel(TIMER_LOAD_VAL, MVEBU_TIMER_BASE + 0x10); 322fbc18feSStefan Roese writel(TIMER_LOAD_VAL, MVEBU_TIMER_BASE + 0x14); 33d0787656SStefan Roese 34*81e33f4bSStefan Roese #if defined(CONFIG_ARCH_MVEBU) 352fbc18feSStefan Roese /* On Armada XP / 38x ..., the 25MHz clock source needs to be enabled */ 362fbc18feSStefan Roese setbits_le32(MVEBU_TIMER_BASE + 0x00, BIT(11)); 372fbc18feSStefan Roese #endif 38d0787656SStefan Roese /* enable timer in auto reload mode */ 392fbc18feSStefan Roese setbits_le32(MVEBU_TIMER_BASE + 0x00, 0x3); 40d0787656SStefan Roese 41d0787656SStefan Roese return 0; 42d0787656SStefan Roese } 43