1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park *
4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park */
6*54fd6939SJiyong Park
7*54fd6939SJiyong Park #include <stdint.h>
8*54fd6939SJiyong Park
9*54fd6939SJiyong Park #include <drivers/arm/sp805.h>
10*54fd6939SJiyong Park #include <lib/mmio.h>
11*54fd6939SJiyong Park
12*54fd6939SJiyong Park /* Inline register access functions */
13*54fd6939SJiyong Park
sp805_write_wdog_load(uintptr_t base,uint32_t value)14*54fd6939SJiyong Park static inline void sp805_write_wdog_load(uintptr_t base, uint32_t value)
15*54fd6939SJiyong Park {
16*54fd6939SJiyong Park mmio_write_32(base + SP805_WDOG_LOAD_OFF, value);
17*54fd6939SJiyong Park }
18*54fd6939SJiyong Park
sp805_write_wdog_ctrl(uintptr_t base,uint32_t value)19*54fd6939SJiyong Park static inline void sp805_write_wdog_ctrl(uintptr_t base, uint32_t value)
20*54fd6939SJiyong Park {
21*54fd6939SJiyong Park mmio_write_32(base + SP805_WDOG_CTR_OFF, value);
22*54fd6939SJiyong Park }
23*54fd6939SJiyong Park
sp805_write_wdog_lock(uintptr_t base,uint32_t value)24*54fd6939SJiyong Park static inline void sp805_write_wdog_lock(uintptr_t base, uint32_t value)
25*54fd6939SJiyong Park {
26*54fd6939SJiyong Park mmio_write_32(base + SP805_WDOG_LOCK_OFF, value);
27*54fd6939SJiyong Park }
28*54fd6939SJiyong Park
29*54fd6939SJiyong Park
30*54fd6939SJiyong Park /* Public API implementation */
31*54fd6939SJiyong Park
sp805_start(uintptr_t base,unsigned int ticks)32*54fd6939SJiyong Park void sp805_start(uintptr_t base, unsigned int ticks)
33*54fd6939SJiyong Park {
34*54fd6939SJiyong Park sp805_write_wdog_load(base, ticks);
35*54fd6939SJiyong Park sp805_write_wdog_ctrl(base, SP805_CTR_RESEN | SP805_CTR_INTEN);
36*54fd6939SJiyong Park /* Lock registers access */
37*54fd6939SJiyong Park sp805_write_wdog_lock(base, 0U);
38*54fd6939SJiyong Park }
39*54fd6939SJiyong Park
sp805_stop(uintptr_t base)40*54fd6939SJiyong Park void sp805_stop(uintptr_t base)
41*54fd6939SJiyong Park {
42*54fd6939SJiyong Park sp805_write_wdog_lock(base, WDOG_UNLOCK_KEY);
43*54fd6939SJiyong Park sp805_write_wdog_ctrl(base, 0U);
44*54fd6939SJiyong Park }
45*54fd6939SJiyong Park
sp805_refresh(uintptr_t base,unsigned int ticks)46*54fd6939SJiyong Park void sp805_refresh(uintptr_t base, unsigned int ticks)
47*54fd6939SJiyong Park {
48*54fd6939SJiyong Park sp805_write_wdog_lock(base, WDOG_UNLOCK_KEY);
49*54fd6939SJiyong Park sp805_write_wdog_load(base, ticks);
50*54fd6939SJiyong Park sp805_write_wdog_lock(base, 0U);
51*54fd6939SJiyong Park }
52