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