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