xref: /rk3399_ARM-atf/drivers/arm/sp805/sp805.c (revision 9a207532f8216bf83fed0891fed9ed0bc72ca450)
138041973SJuan Castillo /*
2354305c3SAntonio Nino Diaz  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
338041973SJuan Castillo  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
538041973SJuan Castillo  */
638041973SJuan Castillo 
738041973SJuan Castillo #include <stdint.h>
838041973SJuan Castillo 
9*09d40e0eSAntonio Nino Diaz #include <drivers/arm/sp805.h>
10*09d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
11*09d40e0eSAntonio Nino Diaz 
1238041973SJuan Castillo /* Inline register access functions */
1338041973SJuan Castillo 
sp805_write_wdog_load(uintptr_t base,uint32_t value)14354305c3SAntonio Nino Diaz static inline void sp805_write_wdog_load(uintptr_t base, uint32_t value)
1538041973SJuan Castillo {
1638041973SJuan Castillo 	mmio_write_32(base + SP805_WDOG_LOAD_OFF, value);
1738041973SJuan Castillo }
1838041973SJuan Castillo 
sp805_write_wdog_ctrl(uintptr_t base,uint32_t value)19354305c3SAntonio Nino Diaz static inline void sp805_write_wdog_ctrl(uintptr_t base, uint32_t value)
2038041973SJuan Castillo {
2138041973SJuan Castillo 	mmio_write_32(base + SP805_WDOG_CTR_OFF, value);
2238041973SJuan Castillo }
2338041973SJuan Castillo 
sp805_write_wdog_lock(uintptr_t base,uint32_t value)24354305c3SAntonio Nino Diaz static inline void sp805_write_wdog_lock(uintptr_t base, uint32_t value)
2538041973SJuan Castillo {
2638041973SJuan Castillo 	mmio_write_32(base + SP805_WDOG_LOCK_OFF, value);
2738041973SJuan Castillo }
2838041973SJuan Castillo 
2938041973SJuan Castillo 
3038041973SJuan Castillo /* Public API implementation */
3138041973SJuan Castillo 
sp805_start(uintptr_t base,unsigned int ticks)32354305c3SAntonio Nino Diaz void sp805_start(uintptr_t base, unsigned int ticks)
3338041973SJuan Castillo {
3438041973SJuan Castillo 	sp805_write_wdog_load(base, ticks);
3538041973SJuan Castillo 	sp805_write_wdog_ctrl(base, SP805_CTR_RESEN | SP805_CTR_INTEN);
3638041973SJuan Castillo 	/* Lock registers access */
37354305c3SAntonio Nino Diaz 	sp805_write_wdog_lock(base, 0U);
3838041973SJuan Castillo }
3938041973SJuan Castillo 
sp805_stop(uintptr_t base)4038041973SJuan Castillo void sp805_stop(uintptr_t base)
4138041973SJuan Castillo {
4238041973SJuan Castillo 	sp805_write_wdog_lock(base, WDOG_UNLOCK_KEY);
43354305c3SAntonio Nino Diaz 	sp805_write_wdog_ctrl(base, 0U);
4438041973SJuan Castillo }
4538041973SJuan Castillo 
sp805_refresh(uintptr_t base,unsigned int ticks)46354305c3SAntonio Nino Diaz void sp805_refresh(uintptr_t base, unsigned int ticks)
4738041973SJuan Castillo {
4838041973SJuan Castillo 	sp805_write_wdog_lock(base, WDOG_UNLOCK_KEY);
4938041973SJuan Castillo 	sp805_write_wdog_load(base, ticks);
50354305c3SAntonio Nino Diaz 	sp805_write_wdog_lock(base, 0U);
5138041973SJuan Castillo }
52