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

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

parent 2ae58138
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -242,6 +242,7 @@
#define HALO_SCRATCH4                        0x005d8
#define HALO_CCM_CORE_CONTROL                0x41000
#define HALO_CORE_SOFT_RESET                 0x00010
#define HALO_WDT_CONTROL                     0x47000

/*
 * HALO MPU banks
@@ -291,6 +292,11 @@
 */
#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,

+1 −0
Original line number Diff line number Diff line
@@ -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);