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