ASoC: wm_adsp: Add WDT expiry IRQ handling support for Halo core
authorStuart Henderson <stuarth@opensource.cirrus.com>
Tue, 19 Mar 2019 11:52:15 +0000 (11:52 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 19 Mar 2019 13:00:40 +0000 (13:00 +0000)
Signed-off-by: Stuart Henderson <stuarth@opensource.cirrus.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm_adsp.c
sound/soc/codecs/wm_adsp.h

index 3e74cbb..644aaf1 100644 (file)
 #define HALO_SCRATCH4                        0x005d8
 #define HALO_CCM_CORE_CONTROL                0x41000
 #define HALO_CORE_SOFT_RESET                 0x00010
+#define HALO_WDT_CONTROL                     0x47000
 
 /*
  * HALO MPU banks
  */
 #define HALO_CORE_SOFT_RESET_MASK           0x00000001
 
+/*
+ * HALO_WDT_CONTROL
+ */
+#define HALO_WDT_EN_MASK                    0x00000001
+
 /*
  * HALO_MPU_?M_VIO_STATUS
  */
@@ -3083,6 +3089,12 @@ static void wm_adsp_stop_watchdog(struct wm_adsp *dsp)
                           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,
                        struct snd_kcontrol *kcontrol, int event)
 {
@@ -4379,6 +4391,22 @@ exit_unlock:
 }
 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 = {
        .validate_version = wm_adsp_validate_version,
        .parse_sizes = wm_adsp1_parse_sizes,
@@ -4454,6 +4482,7 @@ struct wm_adsp_ops wm_halo_ops = {
        .region_to_reg = wm_halo_region_to_reg,
 
        .show_fw_status = wm_halo_show_fw_status,
+       .stop_watchdog = wm_halo_stop_watchdog,
 
        .lock_memory = wm_halo_configure_mpu,
 
index 521dccb..3631c92 100644 (file)
@@ -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_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,
                  struct snd_kcontrol *kcontrol, int event);