blob: 85da43ae8a06b46dfe277f964f15cdb5668560f6 [file] [log] [blame]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02001/*
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -05002 * Copyright (c) 2018-2021, Arm Limited. All rights reserved.
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <assert.h>
8#include <debug.h>
Antonio Nino Diaz09a00ef2019-01-11 13:12:58 +00009#include <drivers/arm/sp805.h>
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020010#include <mmio.h>
11#include <platform_def.h>
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020012#include <stdint.h>
13
14static inline uint32_t sp805_read_wdog_load(unsigned long base)
15{
16 assert(base);
17 return mmio_read_32(base + SP805_WDOG_LOAD_OFF);
18}
19
20static inline void sp805_write_wdog_load(unsigned long base, uint32_t value)
21{
22 assert(base);
23 mmio_write_32(base + SP805_WDOG_LOAD_OFF, value);
24}
25
26static inline uint32_t sp805_read_wdog_value(unsigned long base)
27{
28 assert(base);
29 return mmio_read_32(base + SP805_WDOG_VALUE_0FF);
30}
31
32static inline uint32_t sp805_read_wdog_ctrl(unsigned long base)
33{
34 assert(base);
35 return mmio_read_32(base + SP805_WDOG_CTRL_OFF) & SP805_WDOG_CTRL_MASK;
36}
37
38static inline void sp805_write_wdog_ctrl(unsigned long base, uint32_t value)
39{
40 assert(base);
41 /* Not setting reserved bits */
42 assert(!(value & ~SP805_WDOG_CTRL_MASK));
43 mmio_write_32(base + SP805_WDOG_CTRL_OFF, value);
44}
45
46static inline void sp805_write_wdog_int_clr(unsigned long base, uint32_t value)
47{
48 assert(base);
49 mmio_write_32(base + SP805_WDOG_INT_CLR_OFF, value);
50}
51
52static inline uint32_t sp805_read_wdog_ris(unsigned long base)
53{
54 assert(base);
55 return mmio_read_32(base + SP805_WDOG_RIS_OFF) & SP805_WDOG_RIS_MASK;
56}
57
58static inline uint32_t sp805_read_wdog_mis(unsigned long base)
59{
60 assert(base);
61 return mmio_read_32(base + SP805_WDOG_MIS_OFF) & SP805_WDOG_MIS_MASK;
62}
63
64static inline uint32_t sp805_read_wdog_lock(unsigned long base)
65{
66 assert(base);
67 return mmio_read_32(base + SP805_WDOG_LOCK_OFF);
68}
69
70static inline void sp805_write_wdog_lock(unsigned long base, uint32_t value)
71{
72 assert(base);
73 mmio_write_32(base + SP805_WDOG_LOCK_OFF, value);
74}
75
76static inline uint32_t sp805_read_wdog_itcr(unsigned long base)
77{
78 assert(base);
79 return mmio_read_32(base + SP805_WDOG_ITCR_OFF) & SP805_WDOG_ITCR_MASK;
80}
81
82static inline void sp805_write_wdog_itcr(unsigned long base, uint32_t value)
83{
84 assert(base);
85 /* Not setting reserved bits */
86 assert(!(value & ~SP805_WDOG_ITCR_MASK));
87 mmio_write_32(base + SP805_WDOG_ITCR_OFF, value);
88}
89
90static inline void sp805_write_wdog_itop(unsigned long base, uint32_t value)
91{
92 assert(base);
93 /* Not setting reserved bits */
94 assert(!(value & ~SP805_WDOG_ITOP_MASK));
95 mmio_write_32(base + SP805_WDOG_ITOP_OFF, value);
96}
97
98static inline uint32_t sp805_read_wdog_periph_id(unsigned long base, unsigned int id)
99{
100 assert(base);
101 assert(id < 4);
102 return mmio_read_32(base + SP805_WDOG_PERIPH_ID_OFF + (id << 2));
103}
104
105static inline uint32_t sp805_read_wdog_pcell_id(unsigned long base, unsigned int id)
106{
107 assert(base);
108 assert(id < 4);
109 return mmio_read_32(base + SP805_WDOG_PCELL_ID_OFF + (id << 2));
110}
111
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500112static void sp805_wdog_start_(unsigned long base, uint32_t wdog_cycles)
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200113{
114 /* Unlock to access the watchdog registers */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500115 sp805_write_wdog_lock(base, SP805_WDOG_UNLOCK_ACCESS);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200116
117 /* Write the number of cycles needed */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500118 sp805_write_wdog_load(base, wdog_cycles);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200119
120 /* Enable reset interrupt and watchdog interrupt on expiry */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500121 sp805_write_wdog_ctrl(base,
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200122 SP805_WDOG_CTRL_RESEN | SP805_WDOG_CTRL_INTEN);
123
124 /* Lock registers so that they can't be accidently overwritten */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500125 sp805_write_wdog_lock(base, 0x0);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200126}
127
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500128static void sp805_wdog_stop_(unsigned long base)
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200129{
130 /* Unlock to access the watchdog registers */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500131 sp805_write_wdog_lock(base, SP805_WDOG_UNLOCK_ACCESS);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200132
133 /* Clearing INTEN bit stops the counter */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500134 sp805_write_wdog_ctrl(base, 0x00);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200135
136 /* Lock registers so that they can't be accidently overwritten */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500137 sp805_write_wdog_lock(base, 0x0);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200138}
139
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500140static void sp805_wdog_refresh_(unsigned long base)
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200141{
142 /* Unlock to access the watchdog registers */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500143 sp805_write_wdog_lock(base, SP805_WDOG_UNLOCK_ACCESS);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200144
145 /*
146 * Write of any value to WdogIntClr clears interrupt and reloads
147 * the counter from the value in WdogLoad Register.
148 */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500149 sp805_write_wdog_int_clr(base, 1);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200150
151 /* Lock registers so that they can't be accidently overwritten */
Madhukar Pappireddyf0c8a882021-08-05 13:58:16 -0500152 sp805_write_wdog_lock(base, 0x0);
153}
154
155void sp805_wdog_start(uint32_t wdog_cycles)
156{
157 sp805_wdog_start_(SP805_WDOG_BASE, wdog_cycles);
158}
159
160void sp805_wdog_stop(void)
161{
162 sp805_wdog_stop_(SP805_WDOG_BASE);
163}
164
165void sp805_wdog_refresh(void)
166{
167 sp805_wdog_refresh_(SP805_WDOG_BASE);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200168}
Madhukar Pappireddydd7db242021-08-05 14:14:15 -0500169
170void sp805_twdog_start(uint32_t wdog_cycles)
171{
172 sp805_wdog_start_(SP805_TWDOG_BASE, wdog_cycles);
173}
174
175void sp805_twdog_stop(void)
176{
177 sp805_wdog_stop_(SP805_TWDOG_BASE);
178}
179
180void sp805_twdog_refresh(void)
181{
182 sp805_wdog_refresh_(SP805_TWDOG_BASE);
183}