Skip to content

Commit e6f986f

Browse files
AlessandroLuonashif
authored andcommitted
drivers: watchdog: bugfix for ambiq wdt clk select
This commit fixed the watchdog clock select error in ambiq driver. Signed-off-by: Hao Luo <hluo@ambiq.com>
1 parent 0407185 commit e6f986f

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

drivers/watchdog/wdt_ambiq.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ typedef void (*ambiq_wdt_cfg_func_t)(void);
2020
struct wdt_ambiq_config {
2121
uint32_t base;
2222
uint32_t irq_num;
23-
uint8_t clk_freq;
23+
uint32_t clk_freq;
2424
ambiq_wdt_cfg_func_t cfg_func;
2525
};
2626

@@ -30,6 +30,13 @@ struct wdt_ambiq_data {
3030
bool reset;
3131
};
3232

33+
uint32_t wdt_ambiq_clk_select[] =
34+
#if defined(CONFIG_SOC_SERIES_APOLLO3X) || defined(CONFIG_SOC_SERIES_APOLLO4X)
35+
{128, 16, 1};
36+
#else
37+
{128, 16, 1, 32768, 16384};
38+
#endif
39+
3340
static void wdt_ambiq_isr(void *arg)
3441
{
3542
const struct device *dev = (const struct device *)arg;
@@ -39,7 +46,7 @@ static void wdt_ambiq_isr(void *arg)
3946
am_hal_wdt_int_clear();
4047
#else
4148
uint32_t status;
42-
am_hal_wdt_interrupt_status_get(AM_HAL_WDT_MCU, &status, false);
49+
am_hal_wdt_interrupt_status_get(AM_HAL_WDT_MCU, &status, true);
4350
am_hal_wdt_interrupt_clear(AM_HAL_WDT_MCU, status);
4451
#endif
4552

@@ -79,7 +86,15 @@ static int wdt_ambiq_setup(const struct device *dev, uint8_t options)
7986
cfg.eClockSource = AM_HAL_WDT_16HZ;
8087
} else if (dev_cfg->clk_freq == 1) {
8188
cfg.eClockSource = AM_HAL_WDT_1HZ;
89+
#if defined(CONFIG_SOC_SERIES_APOLLO5X)
90+
} else if (dev_cfg->clk_freq == 32768) {
91+
cfg.eClockSource = AM_HAL_WDT_XTAL_HS;
92+
} else if (dev_cfg->clk_freq == 16384) {
93+
cfg.eClockSource = AM_HAL_WDT_XTAL_HS_DIV2;
8294
}
95+
#else
96+
}
97+
#endif
8398

8499
cfg.bInterruptEnable = true;
85100
cfg.ui32InterruptValue = data->timeout;
@@ -116,7 +131,7 @@ static int wdt_ambiq_install_timeout(const struct device *dev, const struct wdt_
116131
return -EINVAL;
117132
}
118133

119-
data->timeout = cfg->window.max / 1000 * dev_cfg->clk_freq;
134+
data->timeout = cfg->window.max * dev_cfg->clk_freq / 1000;
120135
data->callback = cfg->callback;
121136

122137
switch (cfg->flags) {
@@ -145,17 +160,22 @@ static int wdt_ambiq_feed(const struct device *dev, int channel_id)
145160
#else
146161
am_hal_wdt_restart(AM_HAL_WDT_MCU);
147162
#endif
148-
LOG_DBG("Fed the watchdog");
149163

150164
return 0;
151165
}
152166

153167
static int wdt_ambiq_init(const struct device *dev)
154168
{
155169
const struct wdt_ambiq_config *dev_cfg = dev->config;
156-
157-
if (dev_cfg->clk_freq != 128 && dev_cfg->clk_freq != 16 && dev_cfg->clk_freq != 1) {
158-
return -ENOTSUP;
170+
uint8_t clk_index = sizeof(wdt_ambiq_clk_select) / sizeof(uint32_t);
171+
172+
for (uint8_t i = 0; i < clk_index; i++) {
173+
if (dev_cfg->clk_freq == wdt_ambiq_clk_select[i]) {
174+
break;
175+
}
176+
if (i == clk_index - 1) {
177+
return -ENOTSUP;
178+
}
159179
}
160180

161181
NVIC_ClearPendingIRQ(dev_cfg->irq_num);

0 commit comments

Comments
 (0)