1 /*
2 * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6 #include <assert.h>
7 #include <debug.h>
8 #include <delay_timer.h>
9 #include <mt8173_def.h>
10 #include <pmic_wrap_init.h>
11 #include <rtc.h>
12
13 /* RTC busy status polling interval and retry count */
14 enum {
15 RTC_WRTGR_POLLING_DELAY_MS = 10,
16 RTC_WRTGR_POLLING_CNT = 100
17 };
18
RTC_Read(uint32_t addr)19 static uint16_t RTC_Read(uint32_t addr)
20 {
21 uint32_t rdata = 0;
22
23 pwrap_read((uint32_t)addr, &rdata);
24 return (uint16_t)rdata;
25 }
26
RTC_Write(uint32_t addr,uint16_t data)27 static void RTC_Write(uint32_t addr, uint16_t data)
28 {
29 pwrap_write((uint32_t)addr, (uint32_t)data);
30 }
31
rtc_busy_wait(void)32 static inline int32_t rtc_busy_wait(void)
33 {
34 uint64_t retry = RTC_WRTGR_POLLING_CNT;
35
36 do {
37 mdelay(RTC_WRTGR_POLLING_DELAY_MS);
38 if (!(RTC_Read(RTC_BBPU) & RTC_BBPU_CBUSY))
39 return 1;
40 retry--;
41 } while (retry);
42
43 ERROR("[RTC] rtc cbusy time out!\n");
44 return 0;
45 }
46
Write_trigger(void)47 static int32_t Write_trigger(void)
48 {
49 RTC_Write(RTC_WRTGR, 1);
50 return rtc_busy_wait();
51 }
52
Writeif_unlock(void)53 static int32_t Writeif_unlock(void)
54 {
55 RTC_Write(RTC_PROT, RTC_PROT_UNLOCK1);
56 if (!Write_trigger())
57 return 0;
58 RTC_Write(RTC_PROT, RTC_PROT_UNLOCK2);
59 if (!Write_trigger())
60 return 0;
61
62 return 1;
63 }
64
rtc_bbpu_power_down(void)65 void rtc_bbpu_power_down(void)
66 {
67 uint16_t bbpu;
68
69 /* pull PWRBB low */
70 bbpu = RTC_BBPU_KEY | RTC_BBPU_AUTO | RTC_BBPU_PWREN;
71 if (Writeif_unlock()) {
72 RTC_Write(RTC_BBPU, bbpu);
73 if (!Write_trigger())
74 assert(0);
75 } else {
76 assert(0);
77 }
78 }
79