From c6d8822dc50f9b1ada93c4fb749e0efdd4ad8c47 Mon Sep 17 00:00:00 2001 From: Liam Girdwood Date: Wed, 31 Jan 2007 14:14:57 +0100 Subject: [PATCH] --- yaml --- r: 47203 b: refs/heads/master c: 965ac42ce919db225ee64678f0be02f2fdf5b5e4 h: refs/heads/master i: 47201: 5bb949bf434c1d5f01255a42cbddacac23260546 47199: 257c1c3e6a5d9d6c1e8e56c4596d707363885e61 v: v3 --- [refs] | 2 +- trunk/sound/soc/soc-core.c | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 12eb1adb3d8f..9929d3187917 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: beb60119bcc9cbd80bc5b4f7feec419e067d3e46 +refs/heads/master: 965ac42ce919db225ee64678f0be02f2fdf5b5e4 diff --git a/trunk/sound/soc/soc-core.c b/trunk/sound/soc/soc-core.c index 736949fbb4d5..e5aa1c20dddb 100644 --- a/trunk/sound/soc/soc-core.c +++ b/trunk/sound/soc/soc-core.c @@ -77,6 +77,25 @@ static int pmdown_time = 5000; module_param(pmdown_time, int, 0); MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)"); +/* + * This function forces any delayed work to be queued and run. + */ +static int run_delayed_work(struct delayed_work *dwork) +{ + int ret; + + /* cancel any work waiting to be queued. */ + ret = cancel_delayed_work(dwork); + + /* if there was any work waiting then we run it now and + * wait for it's completion */ + if (ret) { + schedule_delayed_work(dwork, 0); + flush_scheduled_work(); + } + return ret; +} + #ifdef CONFIG_SND_SOC_AC97_BUS /* unregister ac97 codec */ static int soc_ac97_dev_unregister(struct snd_soc_codec *codec) @@ -1101,7 +1120,7 @@ static int soc_suspend(struct platform_device *pdev, pm_message_t state) } /* close any waiting streams and save state */ - flush_scheduled_work(); + run_delayed_work(&socdev->delayed_work); codec->suspend_dapm_state = codec->dapm_state; for(i = 0; i < codec->num_dai; i++) { @@ -1255,6 +1274,8 @@ static int soc_remove(struct platform_device *pdev) struct snd_soc_platform *platform = socdev->platform; struct snd_soc_codec_device *codec_dev = socdev->codec_dev; + run_delayed_work(&socdev->delayed_work); + if (platform->remove) platform->remove(pdev);