Commit 4484bb2e authored by Andrew Morton's avatar Andrew Morton Committed by Jaroslav Kysela

[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: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent ca377fec
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/workqueue.h>
#include <sound/driver.h> #include <sound/driver.h>
#include <sound/core.h> #include <sound/core.h>
#include <sound/pcm.h> #include <sound/pcm.h>
...@@ -454,6 +455,7 @@ struct snd_soc_device { ...@@ -454,6 +455,7 @@ struct snd_soc_device {
struct snd_soc_platform *platform; struct snd_soc_platform *platform;
struct snd_soc_codec *codec; struct snd_soc_codec *codec;
struct snd_soc_codec_device *codec_dev; struct snd_soc_codec_device *codec_dev;
struct delayed_work delayed_work;
void *codec_data; void *codec_data;
}; };
......
...@@ -56,7 +56,6 @@ ...@@ -56,7 +56,6 @@
static DEFINE_MUTEX(pcm_mutex); static DEFINE_MUTEX(pcm_mutex);
static DEFINE_MUTEX(io_mutex); static DEFINE_MUTEX(io_mutex);
static struct workqueue_struct *soc_workq; static struct workqueue_struct *soc_workq;
static struct work_struct soc_stream_work;
static DECLARE_WAIT_QUEUE_HEAD(soc_pm_waitq); static DECLARE_WAIT_QUEUE_HEAD(soc_pm_waitq);
/* supported sample rates */ /* supported sample rates */
...@@ -728,9 +727,10 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) ...@@ -728,9 +727,10 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
* This is to ensure there are no pops or clicks in between any music tracks * This is to ensure there are no pops or clicks in between any music tracks
* due to DAPM power cycling. * 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 *codec = socdev->codec;
struct snd_soc_codec_dai *codec_dai; struct snd_soc_codec_dai *codec_dai;
int i; int i;
...@@ -805,7 +805,7 @@ static int soc_codec_close(struct snd_pcm_substream *substream) ...@@ -805,7 +805,7 @@ static int soc_codec_close(struct snd_pcm_substream *substream)
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
/* start delayed pop wq here for playback streams */ /* start delayed pop wq here for playback streams */
rtd->codec_dai->pop_wait = 1; 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)); msecs_to_jiffies(pmdown_time));
} else { } else {
/* capture streams can be powered down now */ /* capture streams can be powered down now */
...@@ -865,7 +865,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream) ...@@ -865,7 +865,7 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
SND_SOC_DAPM_STREAM_START); SND_SOC_DAPM_STREAM_START);
else { else {
rtd->codec_dai->pop_wait = 0; rtd->codec_dai->pop_wait = 0;
cancel_delayed_work(&soc_stream_work); cancel_delayed_work(&socdev->delayed_work);
if (rtd->codec_dai->digital_mute) if (rtd->codec_dai->digital_mute)
rtd->codec_dai->digital_mute(codec, rtd->codec_dai, 0); rtd->codec_dai->digital_mute(codec, rtd->codec_dai, 0);
} }
...@@ -1225,7 +1225,7 @@ static int soc_probe(struct platform_device *pdev) ...@@ -1225,7 +1225,7 @@ static int soc_probe(struct platform_device *pdev)
soc_workq = create_workqueue("kdapm"); soc_workq = create_workqueue("kdapm");
if (soc_workq == NULL) if (soc_workq == NULL)
goto work_err; goto work_err;
INIT_WORK(&soc_stream_work, close_delayed_work, socdev); INIT_DELAYED_WORK(&socdev->delayed_work, close_delayed_work);
return 0; return 0;
work_err: work_err:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment