xref: /rk3399_ARM-atf/plat/mediatek/drivers/rtc/rtc_common.c (revision 04f28f895f1dc8683838a1382c8f92881f4cf21d)
1*3374752fSBo-Chen Chen /*
2*3374752fSBo-Chen Chen  * Copyright (c) 2019-2022, MediaTek Inc. All rights reserved.
3*3374752fSBo-Chen Chen  *
4*3374752fSBo-Chen Chen  * SPDX-License-Identifier: BSD-3-Clause
5*3374752fSBo-Chen Chen  */
6*3374752fSBo-Chen Chen 
7*3374752fSBo-Chen Chen #include <common/debug.h>
8*3374752fSBo-Chen Chen #include <drivers/delay_timer.h>
9*3374752fSBo-Chen Chen 
10*3374752fSBo-Chen Chen #include <pmic_wrap_init.h>
11*3374752fSBo-Chen Chen #include <rtc.h>
12*3374752fSBo-Chen Chen 
13*3374752fSBo-Chen Chen /* RTC busy status polling interval and retry count */
14*3374752fSBo-Chen Chen enum {
15*3374752fSBo-Chen Chen 	RTC_WRTGR_POLLING_DELAY_MS	= 10,
16*3374752fSBo-Chen Chen 	RTC_WRTGR_POLLING_CNT		= 100
17*3374752fSBo-Chen Chen };
18*3374752fSBo-Chen Chen 
RTC_Read(uint32_t addr)19*3374752fSBo-Chen Chen uint16_t RTC_Read(uint32_t addr)
20*3374752fSBo-Chen Chen {
21*3374752fSBo-Chen Chen 	uint32_t rdata = 0;
22*3374752fSBo-Chen Chen 
23*3374752fSBo-Chen Chen 	pwrap_read((uint32_t)addr, &rdata);
24*3374752fSBo-Chen Chen 	return (uint16_t)rdata;
25*3374752fSBo-Chen Chen }
26*3374752fSBo-Chen Chen 
RTC_Write(uint32_t addr,uint16_t data)27*3374752fSBo-Chen Chen void RTC_Write(uint32_t addr, uint16_t data)
28*3374752fSBo-Chen Chen {
29*3374752fSBo-Chen Chen 	pwrap_write((uint32_t)addr, (uint32_t)data);
30*3374752fSBo-Chen Chen }
31*3374752fSBo-Chen Chen 
rtc_busy_wait(void)32*3374752fSBo-Chen Chen int32_t rtc_busy_wait(void)
33*3374752fSBo-Chen Chen {
34*3374752fSBo-Chen Chen 	uint64_t retry = RTC_WRTGR_POLLING_CNT;
35*3374752fSBo-Chen Chen 
36*3374752fSBo-Chen Chen 	do {
37*3374752fSBo-Chen Chen 		mdelay(RTC_WRTGR_POLLING_DELAY_MS);
38*3374752fSBo-Chen Chen 		if (!(RTC_Read(RTC_BBPU) & RTC_BBPU_CBUSY))
39*3374752fSBo-Chen Chen 			return 1;
40*3374752fSBo-Chen Chen 		retry--;
41*3374752fSBo-Chen Chen 	} while (retry);
42*3374752fSBo-Chen Chen 
43*3374752fSBo-Chen Chen 	ERROR("[RTC] rtc cbusy time out!\n");
44*3374752fSBo-Chen Chen 	return 0;
45*3374752fSBo-Chen Chen }
46*3374752fSBo-Chen Chen 
RTC_Write_Trigger(void)47*3374752fSBo-Chen Chen int32_t RTC_Write_Trigger(void)
48*3374752fSBo-Chen Chen {
49*3374752fSBo-Chen Chen 	RTC_Write(RTC_WRTGR, 1);
50*3374752fSBo-Chen Chen 	return rtc_busy_wait();
51*3374752fSBo-Chen Chen }
52*3374752fSBo-Chen Chen 
Writeif_unlock(void)53*3374752fSBo-Chen Chen int32_t Writeif_unlock(void)
54*3374752fSBo-Chen Chen {
55*3374752fSBo-Chen Chen 	RTC_Write(RTC_PROT, RTC_PROT_UNLOCK1);
56*3374752fSBo-Chen Chen 	if (!RTC_Write_Trigger())
57*3374752fSBo-Chen Chen 		return 0;
58*3374752fSBo-Chen Chen 	RTC_Write(RTC_PROT, RTC_PROT_UNLOCK2);
59*3374752fSBo-Chen Chen 	if (!RTC_Write_Trigger())
60*3374752fSBo-Chen Chen 		return 0;
61*3374752fSBo-Chen Chen 
62*3374752fSBo-Chen Chen 	return 1;
63*3374752fSBo-Chen Chen }
64*3374752fSBo-Chen Chen 
65