Commit 8bc144f9 authored by Stuart Henderson's avatar Stuart Henderson Committed by Mark Brown

ASoC: wm_adsp: Add WDT expiry IRQ handling support for Halo core

Signed-off-by: default avatarStuart Henderson <stuarth@opensource.cirrus.com>
Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 2ae58138
...@@ -242,6 +242,7 @@ ...@@ -242,6 +242,7 @@
#define HALO_SCRATCH4 0x005d8 #define HALO_SCRATCH4 0x005d8
#define HALO_CCM_CORE_CONTROL 0x41000 #define HALO_CCM_CORE_CONTROL 0x41000
#define HALO_CORE_SOFT_RESET 0x00010 #define HALO_CORE_SOFT_RESET 0x00010
#define HALO_WDT_CONTROL 0x47000
/* /*
* HALO MPU banks * HALO MPU banks
...@@ -291,6 +292,11 @@ ...@@ -291,6 +292,11 @@
*/ */
#define HALO_CORE_SOFT_RESET_MASK 0x00000001 #define HALO_CORE_SOFT_RESET_MASK 0x00000001
/*
* HALO_WDT_CONTROL
*/
#define HALO_WDT_EN_MASK 0x00000001
/* /*
* HALO_MPU_?M_VIO_STATUS * HALO_MPU_?M_VIO_STATUS
*/ */
...@@ -3083,6 +3089,12 @@ static void wm_adsp_stop_watchdog(struct wm_adsp *dsp) ...@@ -3083,6 +3089,12 @@ static void wm_adsp_stop_watchdog(struct wm_adsp *dsp)
ADSP2_WDT_ENA_MASK, 0); ADSP2_WDT_ENA_MASK, 0);
} }
static void wm_halo_stop_watchdog(struct wm_adsp *dsp)
{
regmap_update_bits(dsp->regmap, dsp->base + HALO_WDT_CONTROL,
HALO_WDT_EN_MASK, 0);
}
int wm_adsp_early_event(struct snd_soc_dapm_widget *w, int wm_adsp_early_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event) struct snd_kcontrol *kcontrol, int event)
{ {
...@@ -4379,6 +4391,22 @@ irqreturn_t wm_halo_bus_error(struct wm_adsp *dsp) ...@@ -4379,6 +4391,22 @@ irqreturn_t wm_halo_bus_error(struct wm_adsp *dsp)
} }
EXPORT_SYMBOL_GPL(wm_halo_bus_error); EXPORT_SYMBOL_GPL(wm_halo_bus_error);
irqreturn_t wm_halo_wdt_expire(int irq, void *data)
{
struct wm_adsp *dsp = data;
mutex_lock(&dsp->pwr_lock);
adsp_warn(dsp, "WDT Expiry Fault\n");
wm_halo_stop_watchdog(dsp);
wm_adsp_fatal_error(dsp);
mutex_unlock(&dsp->pwr_lock);
return IRQ_HANDLED;
}
EXPORT_SYMBOL_GPL(wm_halo_wdt_expire);
struct wm_adsp_ops wm_adsp1_ops = { struct wm_adsp_ops wm_adsp1_ops = {
.validate_version = wm_adsp_validate_version, .validate_version = wm_adsp_validate_version,
.parse_sizes = wm_adsp1_parse_sizes, .parse_sizes = wm_adsp1_parse_sizes,
...@@ -4454,6 +4482,7 @@ struct wm_adsp_ops wm_halo_ops = { ...@@ -4454,6 +4482,7 @@ struct wm_adsp_ops wm_halo_ops = {
.region_to_reg = wm_halo_region_to_reg, .region_to_reg = wm_halo_region_to_reg,
.show_fw_status = wm_halo_show_fw_status, .show_fw_status = wm_halo_show_fw_status,
.stop_watchdog = wm_halo_stop_watchdog,
.lock_memory = wm_halo_configure_mpu, .lock_memory = wm_halo_configure_mpu,
......
...@@ -176,6 +176,7 @@ int wm_adsp_early_event(struct snd_soc_dapm_widget *w, ...@@ -176,6 +176,7 @@ int wm_adsp_early_event(struct snd_soc_dapm_widget *w,
irqreturn_t wm_adsp2_bus_error(struct wm_adsp *adsp); irqreturn_t wm_adsp2_bus_error(struct wm_adsp *adsp);
irqreturn_t wm_halo_bus_error(struct wm_adsp *dsp); irqreturn_t wm_halo_bus_error(struct wm_adsp *dsp);
irqreturn_t wm_halo_wdt_expire(int irq, void *data);
int wm_adsp_event(struct snd_soc_dapm_widget *w, int wm_adsp_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event); struct snd_kcontrol *kcontrol, int event);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment