lkml.org 
[lkml]   [2019]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 13/15] soundwire: intel: add sdw_stream_setup helper for .startup callback
    Date
    From: Rander Wang <rander.wang@linux.intel.com>

    The sdw stream is allocated and stored in dai to share the sdw runtime
    information.

    Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
    Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    ---
    drivers/soundwire/intel.c | 65 +++++++++++++++++++++++++++++++++++++++
    1 file changed, 65 insertions(+)

    diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
    index b5f6e2c6a85b..30b0ff5b7abd 100644
    --- a/drivers/soundwire/intel.c
    +++ b/drivers/soundwire/intel.c
    @@ -616,6 +616,69 @@ static int intel_post_bank_switch(struct sdw_bus *bus)
    * DAI routines
    */

    +static int sdw_stream_setup(struct snd_pcm_substream *substream,
    + struct snd_soc_dai *dai)
    +{
    + struct snd_soc_pcm_runtime *rtd = substream->private_data;
    + struct sdw_stream_runtime *sdw_stream = NULL;
    + char *name;
    + int i, ret;
    +
    + name = kzalloc(32, GFP_KERNEL);
    + if (!name)
    + return -ENOMEM;
    +
    + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
    + snprintf(name, 32, "%s-Playback", dai->name);
    + else
    + snprintf(name, 32, "%s-Capture", dai->name);
    +
    + sdw_stream = sdw_alloc_stream(name);
    + if (!sdw_stream) {
    + dev_err(dai->dev, "alloc stream failed for DAI %s", dai->name);
    + ret = -ENOMEM;
    + goto error;
    + }
    +
    + /* Set stream pointer on CPU DAI */
    + ret = snd_soc_dai_set_sdw_stream(dai, sdw_stream, substream->stream);
    + if (ret < 0) {
    + dev_err(dai->dev, "failed to set stream pointer on cpu dai %s",
    + dai->name);
    + goto release_stream;
    + }
    +
    + /* Set stream pointer on all CODEC DAIs */
    + for (i = 0; i < rtd->num_codecs; i++) {
    + ret = snd_soc_dai_set_sdw_stream(rtd->codec_dais[i], sdw_stream,
    + substream->stream);
    + if (ret < 0) {
    + dev_err(dai->dev, "failed to set stream pointer on codec dai %s",
    + rtd->codec_dais[i]->name);
    + goto release_stream;
    + }
    + }
    +
    + return 0;
    +
    +release_stream:
    + sdw_release_stream(sdw_stream);
    +error:
    + kfree(name);
    + return ret;
    +}
    +
    +static int intel_startup(struct snd_pcm_substream *substream,
    + struct snd_soc_dai *dai)
    +{
    + /*
    + * TODO: add pm_runtime support here, the startup callback
    + * will make sure the IP is 'active'
    + */
    +
    + return sdw_stream_setup(substream, dai);
    +}
    +
    static int intel_hw_params(struct snd_pcm_substream *substream,
    struct snd_pcm_hw_params *params,
    struct snd_soc_dai *dai)
    @@ -795,6 +858,7 @@ static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
    }

    static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
    + .startup = intel_startup,
    .hw_params = intel_hw_params,
    .prepare = intel_prepare,
    .trigger = intel_trigger,
    @@ -804,6 +868,7 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
    };

    static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
    + .startup = intel_startup,
    .hw_params = intel_hw_params,
    .prepare = intel_prepare,
    .trigger = intel_trigger,
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-13 06:05    [W:3.185 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site