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 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 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 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 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 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