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 }