diff options
author | Andrew Morton <akpm@osdl.org> | 2006-12-15 09:30:07 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2007-02-09 09:02:26 +0100 |
commit | 4484bb2e93a9ab636d149edc6515c75ea224e2b0 (patch) | |
tree | 4cbc87d7c03d76b0f305fcb1a3a9884b9ed306d6 | |
parent | ca377fecdd822f9ef5b0a21586040e7d0e1d0c7a (diff) |
[ALSA] Fix the soc code after dhowells workqueue changes.
From: Andrew Morton <akpm@osdl.org>
I converted the workqueues to per-device while I was there. It seems
strange to create a new kernel thread (on each CPU!) and to then only
have a single global work to ever be queued upon it.
Plus without this, I'd have to use the _NAR stuff, gawd help me.
Does that workqueue really need to be per-cpu?
Does that workqueue really need to exist? Why not use keventd?
Cc: Takashi Iwai <tiwai@suse.de>
Cc: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r-- | include/sound/soc.h | 2 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 12 |
2 files changed, 8 insertions, 6 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h index 3dfe052e078..c985a111bc3 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -15,6 +15,7 @@ #include <linux/platform_device.h> #include <linux/types.h> +#include <linux/workqueue.h> #include <sound/driver.h> #include <sound/core.h> #include <sound/pcm.h> @@ -454,6 +455,7 @@ struct snd_soc_device { struct snd_soc_platform *platform; struct snd_soc_codec *codec; struct snd_soc_codec_device *codec_dev; + struct delayed_work delayed_work; void *codec_data; }; diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 90e8841e7e3..0bae14145a0 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -56,7 +56,6 @@ static DEFINE_MUTEX(pcm_mutex); static DEFINE_MUTEX(io_mutex); static struct workqueue_struct *soc_workq; -static struct work_struct soc_stream_work; static DECLARE_WAIT_QUEUE_HEAD(soc_pm_waitq); /* supported sample rates */ @@ -728,9 +727,10 @@ out: * This is to ensure there are no pops or clicks in between any music tracks * due to DAPM power cycling. */ -static void close_delayed_work(void *data) +static void close_delayed_work(struct work_struct *work) { - struct snd_soc_device *socdev = data; + struct snd_soc_device *socdev = + container_of(work, struct snd_soc_device, delayed_work.work); struct snd_soc_codec *codec = socdev->codec; struct snd_soc_codec_dai *codec_dai; int i; @@ -805,7 +805,7 @@ static int soc_codec_close(struct snd_pcm_substream *substream) if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { /* start delayed pop wq here for playback streams */ rtd->codec_dai->pop_wait = 1; - queue_delayed_work(soc_workq, &soc_stream_work, + queue_delayed_work(soc_workq, &socdev->delayed_work, msecs_to_jiffies(pmdown_time)); } else { /* capture streams can be powered down now */ @@ -865,7 +865,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream) SND_SOC_DAPM_STREAM_START); else { rtd->codec_dai->pop_wait = 0; - cancel_delayed_work(&soc_stream_work); + cancel_delayed_work(&socdev->delayed_work); if (rtd->codec_dai->digital_mute) rtd->codec_dai->digital_mute(codec, rtd->codec_dai, 0); } @@ -1225,7 +1225,7 @@ static int soc_probe(struct platform_device *pdev) soc_workq = create_workqueue("kdapm"); if (soc_workq == NULL) goto work_err; - INIT_WORK(&soc_stream_work, close_delayed_work, socdev); + INIT_DELAYED_WORK(&socdev->delayed_work, close_delayed_work); return 0; work_err: |