1/*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7/* @AUTHOR(akroh@ertos.nicta.com.au) */
8
9#include <plat/machine/hardware.h>
10
11#define DGT_TIMER_PPTR (TIMER_PPTR + 0x024)
12
13struct timer {
14    uint32_t mtch;        /* +0x024 */
15    uint32_t cnt;         /* +0x028 */
16    uint32_t en;          /* +0x02C */
17    uint32_t clr;         /* +0x030 */
18    uint32_t clk_ctl;     /* +0x034 */
19};
20typedef volatile struct timer timer_t;
21timer_t *dgt_tmr = (timer_t *) DGT_TIMER_PPTR;
22
23#define DGTTMR_EN_CLR_ON_MTCH_EN    (1U << 1)
24#define DGTTMR_EN_EN                (1U << 0)
25#define DGTTMR_CLK_CTRL(x)          ((x) << 0)
26#define DGTTMR_CLK_CTRL_DIV1        DGTTMR_CLK_CTRL(0x0)
27#define DGTTMR_CLK_CTRL_DIV2        DGTTMR_CLK_CTRL(0x1)
28#define DGTTMR_CLK_CTRL_DIV3        DGTTMR_CLK_CTRL(0x2)
29#define DGTTMR_CLK_CTRL_DIV4        DGTTMR_CLK_CTRL(0x3)
30#define DGTTMR_CLK_CTRL_MASK        DGTTMR_CLK_CTRL(0x3)
31
32#define PRESCALER          DGTTMR_CLK_CTRL_DIV1
33#define PRESCALE_VAL       1
34
35#define TIMER_MATCH_VAL  (TIMER_RELOAD / PRESCALE_VAL)
36
37BOOT_CODE void initTimer(void)
38{
39    /* Stop the timer */
40    dgt_tmr->en = 0;
41    dgt_tmr->clr = 0xC0FFEE;
42    /* Configure the timer */
43    dgt_tmr->mtch = TIMER_MATCH_VAL;
44    /* Start the timer */
45    dgt_tmr->en = DGTTMR_EN_CLR_ON_MTCH_EN | DGTTMR_EN_EN;
46}
47