2 * Copyright (c) 2013 Qualcomm Atheros, Inc.
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:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
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
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.
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.
37 #include "athos_api.h"
44 T_WDT_ACTION_TYPE action;
49 LOCAL T_WDT_CTRL wdt_ctrl;
51 /*!- Initialize watchdog timer
55 cmnos_wdt_last_boot(void)
58 if (HAL_WORD_REG_READ(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR) & 0x80000000 )
61 return ENUM_COLD_BOOT;
64 #if defined(PROJECT_MAGPIE)
65 if ( *((volatile uint32_t*)WATCH_DOG_MAGIC_PATTERN_ADDR) == WDT_MAGIC_PATTERN )
67 else if ( *((volatile uint32_t*)WATCH_DOG_MAGIC_PATTERN_ADDR) == SUS_MAGIC_PATTERN )
68 return ENUM_SUSP_BOOT;
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 )
75 else if ( HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == SUS_MAGIC_PATTERN )
76 return ENUM_SUSP_BOOT;
78 return ENUM_COLD_BOOT;
79 #endif /* #if defined(PROJECT_MAGPIE) */
83 /*!- trigger a wdt reset.
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;
95 /*!- setup the timeout value.
99 cmnos_wdt_set(T_WDT_CMD wdt_cmd)
104 if( wdt_cmd.timeout>0 ) //dummy check
106 wdt_ctrl.timeout = wdt_cmd.timeout;
107 HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_ADDR, wdt_ctrl.timeout);
112 if( wdt_cmd.action < WDT_ACTION_UNKNOWN )
114 wdt_ctrl.action = wdt_cmd.action;
115 HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR, wdt_ctrl.action);
121 /*!- Enable watchdog timer.
128 wdt_ctrl.state = TRUE;
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));
136 /*!- Disable watchdog timer.
144 wdt_ctrl.state = FALSE;
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);
154 /*!- Initialize watchdog timer
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;
167 // should be init outside but just kick it ticking at here for workaround
170 wdt_cmd.cmd = WDT_TIMEOUT;
171 wdt_cmd.timeout= wdt_ctrl.timeout;
172 cmnos_wdt_set(wdt_cmd);
176 /*!- update the watchdog timer timerout value.
182 // if wdt is not enable, just skip the update
185 HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_ADDR, wdt_ctrl.timeout);
191 cmnos_wdt_module_install(struct wdt_api *tbl)
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;
202 #endif /* SYSTEM_MODULE_WDT */