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