xref: /rk3399_ARM-atf/drivers/arm/sp805/sp805.c (revision 354305c3cf14c429832f09b5246a7dffdec23f2d)
138041973SJuan Castillo /*
2*354305c3SAntonio 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 <mmio.h>
838041973SJuan Castillo #include <sp805.h>
938041973SJuan Castillo #include <stdint.h>
1038041973SJuan Castillo 
1138041973SJuan Castillo /* Inline register access functions */
1238041973SJuan Castillo 
13*354305c3SAntonio Nino Diaz static inline void sp805_write_wdog_load(uintptr_t base, uint32_t value)
1438041973SJuan Castillo {
1538041973SJuan Castillo 	mmio_write_32(base + SP805_WDOG_LOAD_OFF, value);
1638041973SJuan Castillo }
1738041973SJuan Castillo 
18*354305c3SAntonio Nino Diaz static inline void sp805_write_wdog_ctrl(uintptr_t base, uint32_t value)
1938041973SJuan Castillo {
2038041973SJuan Castillo 	mmio_write_32(base + SP805_WDOG_CTR_OFF, value);
2138041973SJuan Castillo }
2238041973SJuan Castillo 
23*354305c3SAntonio Nino Diaz static inline void sp805_write_wdog_lock(uintptr_t base, uint32_t 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 
31*354305c3SAntonio Nino Diaz void sp805_start(uintptr_t base, unsigned int 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 */
36*354305c3SAntonio Nino Diaz 	sp805_write_wdog_lock(base, 0U);
3738041973SJuan Castillo }
3838041973SJuan Castillo 
3938041973SJuan Castillo void sp805_stop(uintptr_t base)
4038041973SJuan Castillo {
4138041973SJuan Castillo 	sp805_write_wdog_lock(base, WDOG_UNLOCK_KEY);
42*354305c3SAntonio Nino Diaz 	sp805_write_wdog_ctrl(base, 0U);
4338041973SJuan Castillo }
4438041973SJuan Castillo 
45*354305c3SAntonio Nino Diaz void sp805_refresh(uintptr_t base, unsigned int ticks)
4638041973SJuan Castillo {
4738041973SJuan Castillo 	sp805_write_wdog_lock(base, WDOG_UNLOCK_KEY);
4838041973SJuan Castillo 	sp805_write_wdog_load(base, ticks);
49*354305c3SAntonio Nino Diaz 	sp805_write_wdog_lock(base, 0U);
5038041973SJuan Castillo }
51