lkml.org 
[lkml]   [2019]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 14/17] soundwire: intel: free all resources on hw_free()
    Date
    Make sure all calls to the SoundWire stream API are done and involve
    callback

    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 | 40 +++++++++++++++++++++++++++++++++++++--
    1 file changed, 38 insertions(+), 2 deletions(-)

    diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
    index b4a9337b64d2..0e77df0a7760 100644
    --- a/drivers/soundwire/intel.c
    +++ b/drivers/soundwire/intel.c
    @@ -549,6 +549,25 @@ static int intel_params_stream(struct sdw_intel *sdw,
    return -EIO;
    }

    +static int intel_free_stream(struct sdw_intel *sdw,
    + struct snd_pcm_substream *substream,
    + struct snd_soc_dai *dai,
    + int link_id)
    +{
    + struct sdw_intel_link_res *res = sdw->link_res;
    + struct sdw_intel_stream_free_data free_data;
    +
    + free_data.substream = substream;
    + free_data.dai = dai;
    + free_data.link_id = link_id;
    +
    + if (res->ops && res->ops->free_stream && res->dev)
    + return res->ops->free_stream(res->dev,
    + &free_data);
    +
    + return 0;
    +}
    +
    /*
    * bank switch routines
    */
    @@ -817,6 +836,7 @@ static int
    intel_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
    {
    struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
    + struct sdw_intel *sdw = cdns_to_intel(cdns);
    struct sdw_cdns_dma_data *dma;
    int ret;

    @@ -824,12 +844,28 @@ intel_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
    if (!dma)
    return -EIO;

    + ret = sdw_deprepare_stream(dma->stream);
    + if (ret) {
    + dev_err(dai->dev, "sdw_deprepare_stream: failed %d", ret);
    + return ret;
    + }
    +
    ret = sdw_stream_remove_master(&cdns->bus, dma->stream);
    - if (ret < 0)
    + if (ret < 0) {
    dev_err(dai->dev, "remove master from stream %s failed: %d\n",
    dma->stream->name, ret);
    + return ret;
    + }

    - return ret;
    + ret = intel_free_stream(sdw, substream, dai, sdw->instance);
    + if (ret < 0) {
    + dev_err(dai->dev, "intel_free_stream: failed %d", ret);
    + return ret;
    + }
    +
    + sdw_release_stream(dma->stream);
    +
    + return 0;
    }

    static void intel_shutdown(struct snd_pcm_substream *substream,
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-17 22:04    [W:2.331 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site