1 #include "bflb_rtc.h"
2 #include "hardware/rtc_reg.h"
3
4 #if defined(BL602) || defined(BL702) || defined(BL702L)
5 #define BFLB_RTC_BASE 0x4000F000
6 #elif defined(BL808) || defined(BL606P) || defined(BL616)
7 #define BFLB_RTC_BASE 0x2000F000
8 #elif defined(BL628)
9 #define BFLB_RTC_BASE 0x2008F000
10 #endif
11
bflb_rtc_disable(struct bflb_device_s * dev)12 void bflb_rtc_disable(struct bflb_device_s *dev)
13 {
14 uint32_t reg_base;
15 uint32_t regval;
16
17 reg_base = BFLB_RTC_BASE;
18
19 /* Clear & Disable RTC counter */
20 regval = getreg32(reg_base + HBN_CTL_OFFSET);
21 regval &=~ HBN_RTC_ENABLE;
22 putreg32(regval, reg_base + HBN_CTL_OFFSET);
23 }
24
bflb_rtc_set_time(struct bflb_device_s * dev,uint64_t time)25 void bflb_rtc_set_time(struct bflb_device_s *dev, uint64_t time)
26 {
27 uint32_t reg_base;
28 uint32_t regval;
29 uint64_t rtc_cnt;
30
31 reg_base = BFLB_RTC_BASE;
32
33 /* Clear RTC Control */
34 regval = getreg32(reg_base + HBN_CTL_OFFSET);
35 regval &= ~HBN_RTC_CTL_MASK;
36 putreg32(regval, reg_base + HBN_CTL_OFFSET);
37
38 regval |= HBN_RTC_DLY_OPTION;
39 regval |= HBN_RTC_BIT39_0_COMPARE;
40 putreg32(regval, reg_base + HBN_CTL_OFFSET);
41
42 /* Tigger RTC val read */
43 regval = getreg32(reg_base + HBN_RTC_TIME_H_OFFSET);
44 regval |= HBN_RTC_TIME_LATCH;
45 putreg32(regval, reg_base + HBN_RTC_TIME_H_OFFSET);
46 regval &= ~HBN_RTC_TIME_LATCH;
47 putreg32(regval, reg_base + HBN_RTC_TIME_H_OFFSET);
48
49 /* Read RTC val */
50 rtc_cnt = getreg32(reg_base + HBN_RTC_TIME_H_OFFSET) & 0xff;
51 rtc_cnt <<= 32;
52 rtc_cnt |= getreg32(reg_base + HBN_RTC_TIME_L_OFFSET);
53
54 /* calculate RTC Comp time */
55 rtc_cnt += time;
56
57 /* Set RTC Comp time */
58 putreg32((uint32_t)rtc_cnt, reg_base + HBN_TIME_L_OFFSET);
59 putreg32((uint32_t)(rtc_cnt >> 32) & 0xff, reg_base + HBN_TIME_H_OFFSET);
60
61 /* Enable RTC Counter */
62 regval = getreg32(reg_base + HBN_CTL_OFFSET);
63 regval |= HBN_RTC_ENABLE;
64 putreg32(regval, reg_base + HBN_CTL_OFFSET);
65 }
66
bflb_rtc_get_time(struct bflb_device_s * dev)67 uint64_t bflb_rtc_get_time(struct bflb_device_s *dev)
68 {
69 uint32_t reg_base;
70 uint32_t regval;
71 uint64_t time_l;
72 uint64_t time_h;
73
74 reg_base = BFLB_RTC_BASE;
75
76 /* Tigger RTC val read */
77 regval = getreg32(reg_base + HBN_RTC_TIME_H_OFFSET);
78 regval |= HBN_RTC_TIME_LATCH;
79 putreg32(regval, reg_base + HBN_RTC_TIME_H_OFFSET);
80 regval &= ~HBN_RTC_TIME_LATCH;
81 putreg32(regval, reg_base + HBN_RTC_TIME_H_OFFSET);
82
83 /* Read RTC val */
84 time_l = getreg32(reg_base + HBN_RTC_TIME_L_OFFSET);
85 time_h = getreg32(reg_base + HBN_RTC_TIME_H_OFFSET) & 0xff;
86
87 return (((uint64_t)time_h << 32) | (uint64_t)time_l);
88 }