1/*
2 * Copyright 2017, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12#pragma once
13
14#include <platsupport/timer.h>
15#include <platsupport/ltimer.h>
16
17#define DMT_PATH "/soc/timer@f8008000"
18
19#define DMT_REG_CHOICE 0
20#define DMT_IRQ_CHOICE 0
21
22static UNUSED timer_properties_t dmtimer_props = {
23    .upcounter = false,
24    .timeouts = true,
25    .absolute_timeouts = false,
26    .relative_timeouts = true,
27    .periodic_timeouts = true,
28    .bit_width = 32,
29    .irqs = 1
30};
31
32typedef volatile struct dmt_regs {
33    uint32_t load;
34    uint32_t value;
35    uint32_t control;
36    uint32_t intclr;
37    uint32_t ris;
38    uint32_t mis;
39    uint32_t bgload;
40} dmt_regs_t;
41
42typedef struct {
43    /* set in init */
44    ps_io_ops_t ops;
45    ltimer_callback_fn_t user_cb_fn;
46    void *user_cb_token;
47    ltimer_event_t user_cb_event;  /* what are we being used for? */
48
49    /* set in fdt helper */
50    volatile dmt_regs_t *dmt_map;
51    void *dmt_map_base;
52    pmem_region_t pmem;
53    irq_id_t irq_id;
54
55    /* set in setup */
56    uint32_t time_h;
57} dmt_t;
58
59typedef struct {
60    char *fdt_path;
61    ltimer_callback_fn_t user_cb_fn;
62    void *user_cb_token;
63    ltimer_event_t user_cb_event;
64} dmt_config_t;
65
66int dmt_init(dmt_t *dmt, ps_io_ops_t ops, dmt_config_t config);
67int dmt_init_secondary(dmt_t *dmt, dmt_t *dmtp, ps_io_ops_t ops, dmt_config_t config);
68/* convert between dmt ticks and ns */
69uint64_t dmt_ticks_to_ns(uint64_t ticks);
70/* return true if an overflow irq is pending */
71bool dmt_is_irq_pending(dmt_t *dmt);
72int dmt_set_timeout_ticks(dmt_t *dmt, uint32_t ticks, bool periodic, bool irqs);
73/* set a timeout in nano seconds */
74int dmt_set_timeout(dmt_t *dmt, uint64_t ns, bool periodic, bool irqs);
75int dmt_start(dmt_t *dmt);
76int dmt_stop(dmt_t *dmt);
77uint64_t dmt_get_time(dmt_t *dmt);
78uint64_t dmt_get_ticks(dmt_t *dmt);
79void dmt_destroy(dmt_t *dmt);
80