Commit 0121327c authored by Vinod Koul's avatar Vinod Koul Committed by Mark Brown

ASoC: Intel: mfld-pcm: add control for powering up/down dsp

When we have PCM (FE/BE) opened or DAPM widgets triggered we need power
up/down DSP accordingly. The DSP will do ref count of these requests
i.e. link these runtime_get/put calls of DSP

Also fix some preexisting spacing error.
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarSubhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 6df5d768
...@@ -322,6 +322,16 @@ static int sst_platform_init_stream(struct snd_pcm_substream *substream) ...@@ -322,6 +322,16 @@ static int sst_platform_init_stream(struct snd_pcm_substream *substream)
} }
static int power_up_sst(struct sst_runtime_stream *stream)
{
return stream->ops->power(sst->dev, true);
}
static void power_down_sst(struct sst_runtime_stream *stream)
{
stream->ops->power(sst->dev, false);
}
static int sst_media_open(struct snd_pcm_substream *substream, static int sst_media_open(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
{ {
...@@ -351,6 +361,10 @@ static int sst_media_open(struct snd_pcm_substream *substream, ...@@ -351,6 +361,10 @@ static int sst_media_open(struct snd_pcm_substream *substream,
/* allocate memory for SST API set */ /* allocate memory for SST API set */
runtime->private_data = stream; runtime->private_data = stream;
ret_val = power_up_sst(stream);
if (ret_val < 0)
return ret_val;
/* Make sure, that the period size is always even */ /* Make sure, that the period size is always even */
snd_pcm_hw_constraint_step(substream->runtime, 0, snd_pcm_hw_constraint_step(substream->runtime, 0,
SNDRV_PCM_HW_PARAM_PERIODS, 2); SNDRV_PCM_HW_PARAM_PERIODS, 2);
...@@ -370,6 +384,8 @@ static void sst_media_close(struct snd_pcm_substream *substream, ...@@ -370,6 +384,8 @@ static void sst_media_close(struct snd_pcm_substream *substream,
int ret_val = 0, str_id; int ret_val = 0, str_id;
stream = substream->runtime->private_data; stream = substream->runtime->private_data;
power_down_sst(stream);
str_id = stream->stream_info.str_id; str_id = stream->stream_info.str_id;
if (str_id) if (str_id)
ret_val = stream->ops->close(sst->dev, str_id); ret_val = stream->ops->close(sst->dev, str_id);
......
...@@ -120,15 +120,16 @@ struct compress_sst_ops { ...@@ -120,15 +120,16 @@ struct compress_sst_ops {
}; };
struct sst_ops { struct sst_ops {
int (*open) (struct device *dev, struct snd_sst_params *str_param); int (*open)(struct device *dev, struct snd_sst_params *str_param);
int (*stream_init) (struct device *dev, struct pcm_stream_info *str_info); int (*stream_init)(struct device *dev, struct pcm_stream_info *str_info);
int (*stream_start) (struct device *dev, int str_id); int (*stream_start)(struct device *dev, int str_id);
int (*stream_drop) (struct device *dev, int str_id); int (*stream_drop)(struct device *dev, int str_id);
int (*stream_pause) (struct device *dev, int str_id); int (*stream_pause)(struct device *dev, int str_id);
int (*stream_pause_release) (struct device *dev, int str_id); int (*stream_pause_release)(struct device *dev, int str_id);
int (*stream_read_tstamp) (struct device *dev, struct pcm_stream_info *str_info); int (*stream_read_tstamp)(struct device *dev, struct pcm_stream_info *str_info);
int (*send_byte_stream)(struct device *dev, struct snd_sst_bytes_v2 *bytes); int (*send_byte_stream)(struct device *dev, struct snd_sst_bytes_v2 *bytes);
int (*close) (struct device *dev, unsigned int str_id); int (*close)(struct device *dev, unsigned int str_id);
int (*power)(struct device *dev, bool state);
}; };
struct sst_runtime_stream { struct sst_runtime_stream {
......
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