Setting up repository
[linux-libre-firmware.git] / ath9k_htc / sboot / magpie_1_1 / sboot / cmnos / wdt / src / cmnos_wdt.c
1 /*
2  * Copyright (c) 2013 Qualcomm Atheros, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted (subject to the limitations in the
7  * disclaimer below) provided that the following conditions are met:
8  *
9  *  * Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  *  * Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the
15  *    distribution.
16  *
17  *  * Neither the name of Qualcomm Atheros nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific prior written permission.
20  *
21  * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
22  * GRANTED BY THIS LICENSE.  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
23  * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
24  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
32  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
33  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 #include "sys_cfg.h"
36
37 #include "athos_api.h"
38
39 #if SYSTEM_MODULE_WDT
40
41
42 typedef struct {
43     BOOLEAN             state;
44     T_WDT_ACTION_TYPE   action;
45     uint32_t            timeout;
46 }T_WDT_CTRL;
47
48
49 LOCAL T_WDT_CTRL wdt_ctrl;
50
51 /*!- Initialize watchdog timer
52  *
53  */
54 LOCAL T_BOOT_TYPE
55 cmnos_wdt_last_boot(void)
56 {  
57 #if 0
58     if (HAL_WORD_REG_READ(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR) & 0x80000000 )
59         return ENUM_WDT_BOOT;
60     else
61         return ENUM_COLD_BOOT;
62 #endif
63
64 #if defined(PROJECT_MAGPIE)
65     if ( *((volatile uint32_t*)WATCH_DOG_MAGIC_PATTERN_ADDR) == WDT_MAGIC_PATTERN )
66         return ENUM_WDT_BOOT;
67     else if ( *((volatile uint32_t*)WATCH_DOG_MAGIC_PATTERN_ADDR) == SUS_MAGIC_PATTERN )
68         return ENUM_SUSP_BOOT;
69     else
70         return ENUM_COLD_BOOT;
71 #elif defined(PROJECT_K2)
72     //if (HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == WDT_MAGIC_PATTERN || HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == SUS_MAGIC_PATTERN)
73     if ( HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == WDT_MAGIC_PATTERN )
74         return ENUM_WDT_BOOT;
75     else if ( HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == SUS_MAGIC_PATTERN )
76         return ENUM_SUSP_BOOT;
77     else
78         return ENUM_COLD_BOOT;
79 #endif /* #if defined(PROJECT_MAGPIE) */
80 }
81
82
83 /*!- trigger a wdt reset.
84  *
85  */
86 LOCAL void
87 cmnos_wdt_reset()
88 {
89     HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR, WDT_ACTION_RESET);
90     HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_ADDR, 0x100); 
91     while(1);   // never return;   
92 }
93
94
95 /*!- setup the timeout value.
96  *
97  */
98 LOCAL void
99 cmnos_wdt_set(T_WDT_CMD wdt_cmd)
100 {
101     switch(wdt_cmd.cmd)
102     {
103         case WDT_TIMEOUT:
104             if( wdt_cmd.timeout>0 ) //dummy check
105             {
106                 wdt_ctrl.timeout = wdt_cmd.timeout;
107                 HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_ADDR, wdt_ctrl.timeout); 
108             }
109             break;
110
111         case WDT_ACTION:
112             if( wdt_cmd.action < WDT_ACTION_UNKNOWN )
113             {
114                 wdt_ctrl.action = wdt_cmd.action;
115                 HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR, wdt_ctrl.action);
116             }
117     }
118 }
119
120
121 /*!- Enable watchdog timer.
122  *
123  */
124 LOCAL void
125 cmnos_wdt_enable()
126 {
127     T_WDT_CMD wdt_cmd;
128     wdt_ctrl.state = TRUE;
129
130     wdt_cmd.cmd = WDT_ACTION;
131     wdt_cmd.action = WDT_ACTION_RESET;
132     cmnos_wdt_set(wdt_cmd);
133     //HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR, HAL_WORD_REG_READ(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR)|(BIT0|BIT1));
134 }
135
136 /*!- Disable watchdog timer.
137  *
138  */
139 LOCAL void
140 cmnos_wdt_disable()
141 {
142     T_WDT_CMD wdt_cmd;
143
144     wdt_ctrl.state = FALSE;
145
146     wdt_cmd.cmd = WDT_ACTION;
147     wdt_cmd.action = WDT_ACTION_NO;
148     cmnos_wdt_set(wdt_cmd);
149 //    HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR, (HAL_WORD_REG_READ(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR)&(~(BIT0|BIT1))));
150 //    MAGPIE_REG_RST_WDT_TIMER_CTRL &= ~(BIT0|BIT1);
151 }
152
153
154 /*!- Initialize watchdog timer
155  *
156  */
157 LOCAL void
158 cmnos_wdt_init(void)
159 {
160     T_WDT_CMD wdt_cmd;
161     
162     //wdt_init_done = TRUE;
163     wdt_ctrl.state = FALSE;
164     wdt_ctrl.action = WDT_ACTION_NO;
165     wdt_ctrl.timeout = WDT_DEFAULT_TIMEOUT_VALUE;
166
167     // should be init outside but just kick it ticking at here for workaround
168     cmnos_wdt_enable();
169
170     wdt_cmd.cmd = WDT_TIMEOUT;
171     wdt_cmd.timeout= wdt_ctrl.timeout;
172     cmnos_wdt_set(wdt_cmd);
173 }
174
175
176 /*!- update the watchdog timer timerout value.
177  *
178  */
179 LOCAL void
180 cmnos_wdt_task()
181 {
182     // if wdt is not enable, just skip the update
183     if( wdt_ctrl.state )
184     {
185         HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_ADDR, wdt_ctrl.timeout); 
186     }
187     
188 }
189
190 void
191 cmnos_wdt_module_install(struct wdt_api *tbl)
192 {
193     tbl->_wdt_init          = cmnos_wdt_init;
194     tbl->_wdt_enable        = cmnos_wdt_enable;
195     tbl->_wdt_disable       = cmnos_wdt_disable;
196     tbl->_wdt_set           = cmnos_wdt_set;
197     tbl->_wdt_task          = cmnos_wdt_task;
198     tbl->_wdt_reset         = cmnos_wdt_reset;
199     tbl->_wdt_last_boot     = cmnos_wdt_last_boot;
200 }
201
202 #endif /* SYSTEM_MODULE_WDT */
203