From fadedb6bdbf603db0424cf7808f7da64bceb7a0a Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Wed, 25 Sep 2019 10:24:14 +0800 Subject: [PATCH] audio: auge: toddr irq interrupt protection for freeze mode [1/1] PD#TV-10448 Problem: crash when finished early supend but not entry suspend, the system is waked up Solution: add toddr irq interrupt protection when entry suspend and exit from suspend Verify: x301 Change-Id: I7ade7a745511bab83c70b5649b6af318163568d9 Signed-off-by: Xing Wang --- sound/soc/amlogic/auge/ddr_mngr.c | 13 +++++++++++++ sound/soc/amlogic/auge/ddr_mngr.h | 1 + sound/soc/amlogic/auge/loopback.c | 2 ++ sound/soc/amlogic/auge/pdm.c | 2 ++ 4 files changed, 18 insertions(+) diff --git a/sound/soc/amlogic/auge/ddr_mngr.c b/sound/soc/amlogic/auge/ddr_mngr.c index 3c9946b..1fa7282 100644 --- a/sound/soc/amlogic/auge/ddr_mngr.c +++ b/sound/soc/amlogic/auge/ddr_mngr.c @@ -201,6 +201,19 @@ int aml_audio_unregister_toddr(struct device *dev, void *data) return ret; } +void audio_toddr_irq_enable(struct toddr *to, bool en) +{ + if (!to || !to->in_use || to->irq < 0) + return; + + mutex_lock(&ddr_mutex); + if (en) + enable_irq(to->irq); + else + disable_irq_nosync(to->irq); + mutex_unlock(&ddr_mutex); +} + static inline unsigned int calc_toddr_address(unsigned int reg, unsigned int base) { diff --git a/sound/soc/amlogic/auge/ddr_mngr.h b/sound/soc/amlogic/auge/ddr_mngr.h index 84dc7be..476b54b 100644 --- a/sound/soc/amlogic/auge/ddr_mngr.h +++ b/sound/soc/amlogic/auge/ddr_mngr.h @@ -248,6 +248,7 @@ struct toddr *aml_audio_register_toddr(struct device *dev, struct aml_audio_controller *actrl, irq_handler_t handler, void *data); int aml_audio_unregister_toddr(struct device *dev, void *data); +void audio_toddr_irq_enable(struct toddr *to, bool en); int aml_toddr_set_buf(struct toddr *to, unsigned int start, unsigned int end); int aml_toddr_set_buf_startaddr(struct toddr *to, unsigned int start); diff --git a/sound/soc/amlogic/auge/loopback.c b/sound/soc/amlogic/auge/loopback.c index a5e622c..7290218 100644 --- a/sound/soc/amlogic/auge/loopback.c +++ b/sound/soc/amlogic/auge/loopback.c @@ -759,6 +759,7 @@ static int loopback_dai_trigger( pm_audio_set_suspend(false); /* VAD switch to alsa buffer */ vad_update_buffer(0); + audio_toddr_irq_enable(p_loopback->tddr, true); break; } @@ -786,6 +787,7 @@ static int loopback_dai_trigger( pm_audio_is_suspend()) { /* switch to VAD buffer */ vad_update_buffer(1); + audio_toddr_irq_enable(p_loopback->tddr, false); break; } diff --git a/sound/soc/amlogic/auge/pdm.c b/sound/soc/amlogic/auge/pdm.c index b1c3e57..f03660c 100644 --- a/sound/soc/amlogic/auge/pdm.c +++ b/sound/soc/amlogic/auge/pdm.c @@ -944,6 +944,7 @@ static int aml_pdm_dai_trigger( pm_audio_set_suspend(false); /* VAD switch to alsa buffer */ vad_update_buffer(0); + audio_toddr_irq_enable(p_pdm->tddr, true); break; } @@ -966,6 +967,7 @@ static int aml_pdm_dai_trigger( && pm_audio_is_suspend()) { /* switch to VAD buffer */ vad_update_buffer(1); + audio_toddr_irq_enable(p_pdm->tddr, false); break; } pdm_enable(0); -- 2.7.4