aboutsummaryrefslogtreecommitdiff
path: root/src/arm/PL1/kernel/bcmclock.h
blob: 462346d185d9f815f68322f945864d055bb03bb1 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef BCMCLOCK_H
#define BCMCLOCK_H

#include <stdint.h>
#include "interrupts.h"
#include "global.h"

#define ST_BASE (PERIF_BASE + 0x3000) // System Timer

#define ST_CS  (ST_BASE + 0x0)  // System Timer Control/Status
#define ST_CLO (ST_BASE + 0x4)  // System Timer Counter Lower 32 bits
#define ST_CHI (ST_BASE + 0x8)  // System Timer Counter Higher 32 bits
#define ST_C0  (ST_BASE + 0xC)  // System Timer Compare 0
#define ST_C1  (ST_BASE + 0x10) // System Timer Compare 1
#define ST_C2  (ST_BASE + 0x14) // System Timer Compare 2
#define ST_C3  (ST_BASE + 0x18) // System Timer Compare 3

static inline void bcmclk_enable_timer_irq(void)
{
  wr32(ARM_ENABLE_IRQS_1, 1 << 3);
}

static inline void bcmclk_disable_timer_irq(void)
{
  wr32(ARM_DISABLE_IRQS_1, 1 << 3);
}

static inline void bcmclk_irq_settimeout(uint32_t timeout)
{
  uint32_t clock_now = rd32(ST_CLO);
  wr32(ST_C3, clock_now + timeout);
  wr32(ST_CS, 1 << 3);
}

#endif // BCMCLOCK_H