xref: /rk3399_ARM-atf/drivers/arm/sp805/sp805.c (revision 82cb2c1ad9897473743f08437d0a3995bed561b9)
138041973SJuan Castillo /*
238041973SJuan Castillo  * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
338041973SJuan Castillo  *
4*82cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
538041973SJuan Castillo  */
638041973SJuan Castillo 
738041973SJuan Castillo #include <mmio.h>
838041973SJuan Castillo #include <sp805.h>
938041973SJuan Castillo #include <stdint.h>
1038041973SJuan Castillo 
1138041973SJuan Castillo /* Inline register access functions */
1238041973SJuan Castillo 
1338041973SJuan Castillo static inline void sp805_write_wdog_load(uintptr_t base, unsigned long value)
1438041973SJuan Castillo {
1538041973SJuan Castillo 	mmio_write_32(base + SP805_WDOG_LOAD_OFF, value);
1638041973SJuan Castillo }
1738041973SJuan Castillo 
1838041973SJuan Castillo static inline void sp805_write_wdog_ctrl(uintptr_t base, unsigned long value)
1938041973SJuan Castillo {
2038041973SJuan Castillo 	mmio_write_32(base + SP805_WDOG_CTR_OFF, value);
2138041973SJuan Castillo }
2238041973SJuan Castillo 
2338041973SJuan Castillo static inline void sp805_write_wdog_lock(uintptr_t base, unsigned long value)
2438041973SJuan Castillo {
2538041973SJuan Castillo 	mmio_write_32(base + SP805_WDOG_LOCK_OFF, value);
2638041973SJuan Castillo }
2738041973SJuan Castillo 
2838041973SJuan Castillo 
2938041973SJuan Castillo /* Public API implementation */
3038041973SJuan Castillo 
3138041973SJuan Castillo void sp805_start(uintptr_t base, unsigned long ticks)
3238041973SJuan Castillo {
3338041973SJuan Castillo 	sp805_write_wdog_load(base, ticks);
3438041973SJuan Castillo 	sp805_write_wdog_ctrl(base, SP805_CTR_RESEN | SP805_CTR_INTEN);
3538041973SJuan Castillo 	/* Lock registers access */
3638041973SJuan Castillo 	sp805_write_wdog_lock(base, 0);
3738041973SJuan Castillo }
3838041973SJuan Castillo 
3938041973SJuan Castillo void sp805_stop(uintptr_t base)
4038041973SJuan Castillo {
4138041973SJuan Castillo 	sp805_write_wdog_lock(base, WDOG_UNLOCK_KEY);
4238041973SJuan Castillo 	sp805_write_wdog_ctrl(base, 0);
4338041973SJuan Castillo }
4438041973SJuan Castillo 
4538041973SJuan Castillo void sp805_refresh(uintptr_t base, unsigned long ticks)
4638041973SJuan Castillo {
4738041973SJuan Castillo 	sp805_write_wdog_lock(base, WDOG_UNLOCK_KEY);
4838041973SJuan Castillo 	sp805_write_wdog_load(base, ticks);
4938041973SJuan Castillo 	sp805_write_wdog_lock(base, 0);
5038041973SJuan Castillo }
51