| From 6e4cac23c5a648d50b107d1b53e9c4e1120c7943 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Mon, 24 Apr 2017 14:09:55 +0200 |
| Subject: [PATCH] ASoC: intel: Fix PM and non-atomic crash in bytcr drivers |
| |
| commit 6e4cac23c5a648d50b107d1b53e9c4e1120c7943 upstream. |
| |
| The FE setups of Intel SST bytcr_rt5640 and bytcr_rt5651 drivers carry |
| the ignore_suspend flag, and this prevents the suspend/resume working |
| properly while the stream is running, since SST core code has the |
| check of the running streams and returns -EBUSY. Drop these |
| superfluous flags for fixing the behavior. |
| |
| Also, the bytcr_rt5640 driver lacks of nonatomic flag in some FE |
| definitions, which leads to the kernel Oops at suspend/resume like: |
| |
| BUG: scheduling while atomic: systemd-sleep/3144/0x00000003 |
| Call Trace: |
| dump_stack+0x5c/0x7a |
| __schedule_bug+0x55/0x70 |
| __schedule+0x63c/0x8c0 |
| schedule+0x3d/0x90 |
| schedule_timeout+0x16b/0x320 |
| ? del_timer_sync+0x50/0x50 |
| ? sst_wait_timeout+0xa9/0x170 [snd_intel_sst_core] |
| ? sst_wait_timeout+0xa9/0x170 [snd_intel_sst_core] |
| ? remove_wait_queue+0x60/0x60 |
| ? sst_prepare_and_post_msg+0x275/0x960 [snd_intel_sst_core] |
| ? sst_pause_stream+0x9b/0x110 [snd_intel_sst_core] |
| .... |
| |
| This patch addresses these appropriately, too. |
| |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Acked-by: Vinod Koul <vinod.koul@intel.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Cc: <stable@vger.kernel.org> # v4.1+ |
| |
| diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c |
| index 5c7219fb3aa8..9e2a3404a836 100644 |
| --- a/sound/soc/intel/boards/bytcr_rt5640.c |
| +++ b/sound/soc/intel/boards/bytcr_rt5640.c |
| @@ -621,7 +621,7 @@ static struct snd_soc_dai_link byt_rt5640_dais[] = { |
| .codec_dai_name = "snd-soc-dummy-dai", |
| .codec_name = "snd-soc-dummy", |
| .platform_name = "sst-mfld-platform", |
| - .ignore_suspend = 1, |
| + .nonatomic = true, |
| .dynamic = 1, |
| .dpcm_playback = 1, |
| .dpcm_capture = 1, |
| @@ -634,7 +634,6 @@ static struct snd_soc_dai_link byt_rt5640_dais[] = { |
| .codec_dai_name = "snd-soc-dummy-dai", |
| .codec_name = "snd-soc-dummy", |
| .platform_name = "sst-mfld-platform", |
| - .ignore_suspend = 1, |
| .nonatomic = true, |
| .dynamic = 1, |
| .dpcm_playback = 1, |
| @@ -661,6 +660,7 @@ static struct snd_soc_dai_link byt_rt5640_dais[] = { |
| | SND_SOC_DAIFMT_CBS_CFS, |
| .be_hw_params_fixup = byt_rt5640_codec_fixup, |
| .ignore_suspend = 1, |
| + .nonatomic = true, |
| .dpcm_playback = 1, |
| .dpcm_capture = 1, |
| .init = byt_rt5640_init, |
| diff --git a/sound/soc/intel/boards/bytcr_rt5651.c b/sound/soc/intel/boards/bytcr_rt5651.c |
| index 3186f015939f..8164bec63bf1 100644 |
| --- a/sound/soc/intel/boards/bytcr_rt5651.c |
| +++ b/sound/soc/intel/boards/bytcr_rt5651.c |
| @@ -235,7 +235,6 @@ static struct snd_soc_dai_link byt_rt5651_dais[] = { |
| .codec_dai_name = "snd-soc-dummy-dai", |
| .codec_name = "snd-soc-dummy", |
| .platform_name = "sst-mfld-platform", |
| - .ignore_suspend = 1, |
| .nonatomic = true, |
| .dynamic = 1, |
| .dpcm_playback = 1, |
| @@ -249,7 +248,6 @@ static struct snd_soc_dai_link byt_rt5651_dais[] = { |
| .codec_dai_name = "snd-soc-dummy-dai", |
| .codec_name = "snd-soc-dummy", |
| .platform_name = "sst-mfld-platform", |
| - .ignore_suspend = 1, |
| .nonatomic = true, |
| .dynamic = 1, |
| .dpcm_playback = 1, |
| -- |
| 2.12.0 |
| |