[PATCH 00/13] ASoC: SoundWire codecs: simplify/fix set_stream
Simplify set_stream in SoundWire codecs.
Pierre-Louis Bossart (13): ASoC: codecs: cs42l42-sdw: clear stream ASoC: codecs: sdw-mockup: simplify set_stream ASoC: codecs: max98373-sdw: simplify set_stream ASoC: codecs: rt1308-sdw: simplify set_stream ASoC: codecs: rt1316-sdw: simplify set_stream ASoC: codecs: rt1318-sdw: simplify set_stream ASoC: codecs: rt700-sdw: simplify set_stream ASoC: codecs: rt711-sdw: simplify set_stream ASoC: codecs: rt711-sdca: simplify set_stream ASoC: codecs: rt712-sdca: simplify set_stream ASoC: codecs: rt715: simplify set_stream ASoC: codecs: rt715-sdca: simplify set_stream ASoC: codecs: rt5682-sdw: simplify set_stream
sound/soc/codecs/cs42l42-sdw.c | 3 --- sound/soc/codecs/max98373-sdw.c | 34 +++++++-------------------------- sound/soc/codecs/rt1308-sdw.c | 30 +++++++---------------------- sound/soc/codecs/rt1308-sdw.h | 4 ---- sound/soc/codecs/rt1316-sdw.c | 30 +++++++---------------------- sound/soc/codecs/rt1316-sdw.h | 4 ---- sound/soc/codecs/rt1318-sdw.c | 30 +++++++---------------------- sound/soc/codecs/rt1318-sdw.h | 4 ---- sound/soc/codecs/rt5682-sdw.c | 34 +++++++-------------------------- sound/soc/codecs/rt700.c | 30 +++++++---------------------- sound/soc/codecs/rt700.h | 4 ---- sound/soc/codecs/rt711-sdca.c | 30 +++++++---------------------- sound/soc/codecs/rt711-sdca.h | 4 ---- sound/soc/codecs/rt711.c | 30 +++++++---------------------- sound/soc/codecs/rt711.h | 4 ---- sound/soc/codecs/rt712-sdca.c | 30 +++++++---------------------- sound/soc/codecs/rt712-sdca.h | 4 ---- sound/soc/codecs/rt715-sdca.c | 30 +++++++---------------------- sound/soc/codecs/rt715-sdca.h | 4 ---- sound/soc/codecs/rt715.c | 30 +++++++---------------------- sound/soc/codecs/rt715.h | 4 ---- sound/soc/codecs/sdw-mockup.c | 34 ++++++--------------------------- 22 files changed, 83 insertions(+), 328 deletions(-)
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
The API requires the stream info to be cleared when the argument is NULL.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/cs42l42-sdw.c | 3 --- 1 file changed, 3 deletions(-)
diff --git a/sound/soc/codecs/cs42l42-sdw.c b/sound/soc/codecs/cs42l42-sdw.c index 7b539ee55499..eeab07c850f9 100644 --- a/sound/soc/codecs/cs42l42-sdw.c +++ b/sound/soc/codecs/cs42l42-sdw.c @@ -152,9 +152,6 @@ static int cs42l42_sdw_port_prep(struct sdw_slave *slave, static int cs42l42_sdw_dai_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - if (!sdw_stream) - return 0; - snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0;
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/sdw-mockup.c | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-)
diff --git a/sound/soc/codecs/sdw-mockup.c b/sound/soc/codecs/sdw-mockup.c index 62b02d764f09..5498ff027c58 100644 --- a/sound/soc/codecs/sdw-mockup.c +++ b/sound/soc/codecs/sdw-mockup.c @@ -23,10 +23,6 @@ struct sdw_mockup_priv { struct sdw_slave *slave; };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - static int sdw_mockup_component_probe(struct snd_soc_component *component) { return 0; @@ -45,19 +41,7 @@ static const struct snd_soc_component_driver snd_soc_sdw_mockup_component = { static int sdw_mockup_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -65,11 +49,7 @@ static int sdw_mockup_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, static void sdw_mockup_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int sdw_mockup_pcm_hw_params(struct snd_pcm_substream *substream, @@ -80,11 +60,10 @@ static int sdw_mockup_pcm_hw_params(struct snd_pcm_substream *substream, struct sdw_mockup_priv *sdw_mockup = snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream); int ret;
- stream = snd_soc_dai_get_dma_data(dai, substream); - if (!stream) + if (!sdw_stream) return -EINVAL;
if (!sdw_mockup->slave) @@ -99,7 +78,7 @@ static int sdw_mockup_pcm_hw_params(struct snd_pcm_substream *substream, port_config.num = 8;
ret = sdw_stream_add_slave(sdw_mockup->slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (ret) dev_err(dai->dev, "Unable to configure port\n");
@@ -111,13 +90,12 @@ static int sdw_mockup_pcm_hw_free(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; struct sdw_mockup_priv *sdw_mockup = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = - snd_soc_dai_get_dma_data(dai, substream); + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!sdw_mockup->slave) return -EINVAL;
- sdw_stream_remove_slave(sdw_mockup->slave, stream->sdw_stream); + sdw_stream_remove_slave(sdw_mockup->slave, sdw_stream); return 0; }
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/max98373-sdw.c | 34 +++++++-------------------------- 1 file changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/max98373-sdw.c b/sound/soc/codecs/max98373-sdw.c index c9a2d4dabd3c..df92242af960 100644 --- a/sound/soc/codecs/max98373-sdw.c +++ b/sound/soc/codecs/max98373-sdw.c @@ -20,10 +20,6 @@ #include "max98373.h" #include "max98373-sdw.h"
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - static const u32 max98373_sdw_cache_reg[] = { MAX98373_R2054_MEAS_ADC_PVDD_CH_READBACK, MAX98373_R2055_MEAS_ADC_THERM_CH_READBACK, @@ -536,12 +532,12 @@ static int max98373_sdw_dai_hw_params(struct snd_pcm_substream *substream, snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int ret, chan_sz, sampling_rate;
- stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!max98373->slave) @@ -565,7 +561,7 @@ static int max98373_sdw_dai_hw_params(struct snd_pcm_substream *substream, }
ret = sdw_stream_add_slave(max98373->slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (ret) { dev_err(dai->dev, "Unable to configure port\n"); return ret; @@ -664,32 +660,20 @@ static int max98373_pcm_hw_free(struct snd_pcm_substream *substream, struct snd_soc_component *component = dai->component; struct max98373_priv *max98373 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!max98373->slave) return -EINVAL;
- sdw_stream_remove_slave(max98373->slave, stream->sdw_stream); + sdw_stream_remove_slave(max98373->slave, sdw_stream); return 0; }
static int max98373_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -697,11 +681,7 @@ static int max98373_set_sdw_stream(struct snd_soc_dai *dai, static void max98373_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int max98373_sdw_set_tdm_slot(struct snd_soc_dai *dai,
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt1308-sdw.c | 30 +++++++----------------------- sound/soc/codecs/rt1308-sdw.h | 4 ---- 2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c index 45544b530d3d..1797af824f60 100644 --- a/sound/soc/codecs/rt1308-sdw.c +++ b/sound/soc/codecs/rt1308-sdw.c @@ -496,19 +496,7 @@ static const struct snd_soc_dapm_route rt1308_dapm_routes[] = { static int rt1308_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -516,11 +504,7 @@ static int rt1308_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, static void rt1308_sdw_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt1308_sdw_set_tdm_slot(struct snd_soc_dai *dai, @@ -553,13 +537,13 @@ static int rt1308_sdw_hw_params(struct snd_pcm_substream *substream, snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval;
dev_dbg(dai->dev, "%s %s", __func__, dai->name); - stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!rt1308->sdw_slave) @@ -580,7 +564,7 @@ static int rt1308_sdw_hw_params(struct snd_pcm_substream *substream, }
retval = sdw_stream_add_slave(rt1308->sdw_slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(dai->dev, "Unable to configure port\n"); return retval; @@ -595,13 +579,13 @@ static int rt1308_sdw_pcm_hw_free(struct snd_pcm_substream *substream, struct snd_soc_component *component = dai->component; struct rt1308_sdw_priv *rt1308 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt1308->sdw_slave) return -EINVAL;
- sdw_stream_remove_slave(rt1308->sdw_slave, stream->sdw_stream); + sdw_stream_remove_slave(rt1308->sdw_slave, sdw_stream); return 0; }
diff --git a/sound/soc/codecs/rt1308-sdw.h b/sound/soc/codecs/rt1308-sdw.h index 1eaaef9f351b..04ff18fa18e2 100644 --- a/sound/soc/codecs/rt1308-sdw.h +++ b/sound/soc/codecs/rt1308-sdw.h @@ -170,8 +170,4 @@ struct rt1308_sdw_priv { unsigned int bq_params_cnt; };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - #endif /* __RT1308_SDW_H__ */
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt1316-sdw.c | 30 +++++++----------------------- sound/soc/codecs/rt1316-sdw.h | 4 ---- 2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt1316-sdw.c b/sound/soc/codecs/rt1316-sdw.c index b45121ee7533..2ee5e763e345 100644 --- a/sound/soc/codecs/rt1316-sdw.c +++ b/sound/soc/codecs/rt1316-sdw.c @@ -494,19 +494,7 @@ static const struct snd_soc_dapm_route rt1316_dapm_routes[] = { static int rt1316_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -514,11 +502,7 @@ static int rt1316_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, static void rt1316_sdw_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt1316_sdw_hw_params(struct snd_pcm_substream *substream, @@ -529,13 +513,13 @@ static int rt1316_sdw_hw_params(struct snd_pcm_substream *substream, snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval;
dev_dbg(dai->dev, "%s %s", __func__, dai->name); - stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!rt1316->sdw_slave) @@ -551,7 +535,7 @@ static int rt1316_sdw_hw_params(struct snd_pcm_substream *substream, port_config.num = 2;
retval = sdw_stream_add_slave(rt1316->sdw_slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(dai->dev, "Unable to configure port\n"); return retval; @@ -566,13 +550,13 @@ static int rt1316_sdw_pcm_hw_free(struct snd_pcm_substream *substream, struct snd_soc_component *component = dai->component; struct rt1316_sdw_priv *rt1316 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt1316->sdw_slave) return -EINVAL;
- sdw_stream_remove_slave(rt1316->sdw_slave, stream->sdw_stream); + sdw_stream_remove_slave(rt1316->sdw_slave, sdw_stream); return 0; }
diff --git a/sound/soc/codecs/rt1316-sdw.h b/sound/soc/codecs/rt1316-sdw.h index 57dbd49993b0..e37121655bc1 100644 --- a/sound/soc/codecs/rt1316-sdw.h +++ b/sound/soc/codecs/rt1316-sdw.h @@ -50,8 +50,4 @@ struct rt1316_sdw_priv { unsigned int bq_params_cnt; };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - #endif /* __RT1316_SDW_H__ */
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt1318-sdw.c | 30 +++++++----------------------- sound/soc/codecs/rt1318-sdw.h | 4 ---- 2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt1318-sdw.c b/sound/soc/codecs/rt1318-sdw.c index c32d8ae77981..795accedc22c 100644 --- a/sound/soc/codecs/rt1318-sdw.c +++ b/sound/soc/codecs/rt1318-sdw.c @@ -562,19 +562,7 @@ static const struct snd_soc_dapm_route rt1318_dapm_routes[] = { static int rt1318_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -582,11 +570,7 @@ static int rt1318_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, static void rt1318_sdw_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt1318_sdw_hw_params(struct snd_pcm_substream *substream, @@ -598,14 +582,14 @@ static int rt1318_sdw_hw_params(struct snd_pcm_substream *substream, struct sdw_stream_config stream_config; struct sdw_port_config port_config; enum sdw_data_direction direction; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval, port, num_channels, ch_mask; unsigned int sampling_rate;
dev_dbg(dai->dev, "%s %s", __func__, dai->name); - stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!rt1318->sdw_slave) @@ -633,7 +617,7 @@ static int rt1318_sdw_hw_params(struct snd_pcm_substream *substream, port_config.num = port;
retval = sdw_stream_add_slave(rt1318->sdw_slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(dai->dev, "Unable to configure port\n"); return retval; @@ -679,13 +663,13 @@ static int rt1318_sdw_pcm_hw_free(struct snd_pcm_substream *substream, struct snd_soc_component *component = dai->component; struct rt1318_sdw_priv *rt1318 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt1318->sdw_slave) return -EINVAL;
- sdw_stream_remove_slave(rt1318->sdw_slave, stream->sdw_stream); + sdw_stream_remove_slave(rt1318->sdw_slave, sdw_stream); return 0; }
diff --git a/sound/soc/codecs/rt1318-sdw.h b/sound/soc/codecs/rt1318-sdw.h index 4d7ac9c4bd8d..85918c184f16 100644 --- a/sound/soc/codecs/rt1318-sdw.h +++ b/sound/soc/codecs/rt1318-sdw.h @@ -94,8 +94,4 @@ struct rt1318_sdw_priv { bool first_hw_init; };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - #endif /* __RT1318_SDW_H__ */
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt700.c | 30 +++++++----------------------- sound/soc/codecs/rt700.h | 4 ---- 2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt700.c b/sound/soc/codecs/rt700.c index 659ce26e9f3b..a04b9246256b 100644 --- a/sound/soc/codecs/rt700.c +++ b/sound/soc/codecs/rt700.c @@ -875,19 +875,7 @@ static const struct snd_soc_component_driver soc_codec_dev_rt700 = { static int rt700_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -895,11 +883,7 @@ static int rt700_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, static void rt700_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt700_pcm_hw_params(struct snd_pcm_substream *substream, @@ -910,14 +894,14 @@ static int rt700_pcm_hw_params(struct snd_pcm_substream *substream, struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval; unsigned int val = 0;
dev_dbg(dai->dev, "%s %s", __func__, dai->name); - stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!rt700->slave) @@ -944,7 +928,7 @@ static int rt700_pcm_hw_params(struct snd_pcm_substream *substream, }
retval = sdw_stream_add_slave(rt700->slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(dai->dev, "Unable to configure port\n"); return retval; @@ -991,13 +975,13 @@ static int rt700_pcm_hw_free(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; struct rt700_priv *rt700 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt700->slave) return -EINVAL;
- sdw_stream_remove_slave(rt700->slave, stream->sdw_stream); + sdw_stream_remove_slave(rt700->slave, sdw_stream); return 0; }
diff --git a/sound/soc/codecs/rt700.h b/sound/soc/codecs/rt700.h index bed9d1de6d5b..93c44005d38c 100644 --- a/sound/soc/codecs/rt700.h +++ b/sound/soc/codecs/rt700.h @@ -27,10 +27,6 @@ struct rt700_priv { bool disable_irq; };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - /* NID */ #define RT700_AUDIO_FUNCTION_GROUP 0x01 #define RT700_DAC_OUT1 0x02
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt711.c | 30 +++++++----------------------- sound/soc/codecs/rt711.h | 4 ---- 2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt711.c b/sound/soc/codecs/rt711.c index 862f50950565..af53cbcc7bf2 100644 --- a/sound/soc/codecs/rt711.c +++ b/sound/soc/codecs/rt711.c @@ -964,19 +964,7 @@ static const struct snd_soc_component_driver soc_codec_dev_rt711 = { static int rt711_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -984,11 +972,7 @@ static int rt711_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, static void rt711_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt711_pcm_hw_params(struct snd_pcm_substream *substream, @@ -999,14 +983,14 @@ static int rt711_pcm_hw_params(struct snd_pcm_substream *substream, struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval; unsigned int val = 0;
dev_dbg(dai->dev, "%s %s", __func__, dai->name); - stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!rt711->slave) @@ -1027,7 +1011,7 @@ static int rt711_pcm_hw_params(struct snd_pcm_substream *substream, }
retval = sdw_stream_add_slave(rt711->slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(dai->dev, "Unable to configure port\n"); return retval; @@ -1075,13 +1059,13 @@ static int rt711_pcm_hw_free(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt711->slave) return -EINVAL;
- sdw_stream_remove_slave(rt711->slave, stream->sdw_stream); + sdw_stream_remove_slave(rt711->slave, sdw_stream); return 0; }
diff --git a/sound/soc/codecs/rt711.h b/sound/soc/codecs/rt711.h index f50f8c8d0934..b31351f11df9 100644 --- a/sound/soc/codecs/rt711.h +++ b/sound/soc/codecs/rt711.h @@ -29,10 +29,6 @@ struct rt711_priv { bool disable_irq; };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - /* NID */ #define RT711_AUDIO_FUNCTION_GROUP 0x01 #define RT711_DAC_OUT2 0x03
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt711-sdca.c | 30 +++++++----------------------- sound/soc/codecs/rt711-sdca.h | 4 ---- 2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt711-sdca.c b/sound/soc/codecs/rt711-sdca.c index c65abe812a4c..07640d2f6e56 100644 --- a/sound/soc/codecs/rt711-sdca.c +++ b/sound/soc/codecs/rt711-sdca.c @@ -1237,19 +1237,7 @@ static const struct snd_soc_component_driver soc_sdca_dev_rt711 = { static int rt711_sdca_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -1257,11 +1245,7 @@ static int rt711_sdca_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, static void rt711_sdca_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt711_sdca_pcm_hw_params(struct snd_pcm_substream *substream, @@ -1272,14 +1256,14 @@ static int rt711_sdca_pcm_hw_params(struct snd_pcm_substream *substream, struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval; unsigned int sampling_rate;
dev_dbg(dai->dev, "%s %s", __func__, dai->name); - stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!rt711->slave) @@ -1300,7 +1284,7 @@ static int rt711_sdca_pcm_hw_params(struct snd_pcm_substream *substream, }
retval = sdw_stream_add_slave(rt711->slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(dai->dev, "Unable to configure port\n"); return retval; @@ -1351,13 +1335,13 @@ static int rt711_sdca_pcm_hw_free(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt711->slave) return -EINVAL;
- sdw_stream_remove_slave(rt711->slave, stream->sdw_stream); + sdw_stream_remove_slave(rt711->slave, sdw_stream); return 0; }
diff --git a/sound/soc/codecs/rt711-sdca.h b/sound/soc/codecs/rt711-sdca.h index 10e3c801b813..22076f268577 100644 --- a/sound/soc/codecs/rt711-sdca.h +++ b/sound/soc/codecs/rt711-sdca.h @@ -36,10 +36,6 @@ struct rt711_sdca_priv { bool fu1e_dapm_mute, fu1e_mixer_l_mute, fu1e_mixer_r_mute; };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - /* NID */ #define RT711_AUDIO_FUNCTION_GROUP 0x01 #define RT711_DAC_OUT2 0x03
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt712-sdca.c | 30 +++++++----------------------- sound/soc/codecs/rt712-sdca.h | 4 ---- 2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt712-sdca.c b/sound/soc/codecs/rt712-sdca.c index 8d2fa769bb2e..89d245655ca4 100644 --- a/sound/soc/codecs/rt712-sdca.c +++ b/sound/soc/codecs/rt712-sdca.c @@ -992,19 +992,7 @@ static const struct snd_soc_component_driver soc_sdca_dev_rt712 = { static int rt712_sdca_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -1012,11 +1000,7 @@ static int rt712_sdca_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, static void rt712_sdca_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt712_sdca_pcm_hw_params(struct snd_pcm_substream *substream, @@ -1028,14 +1012,14 @@ static int rt712_sdca_pcm_hw_params(struct snd_pcm_substream *substream, struct sdw_stream_config stream_config; struct sdw_port_config port_config; enum sdw_data_direction direction; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval, port, num_channels; unsigned int sampling_rate;
dev_dbg(dai->dev, "%s %s", __func__, dai->name); - stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!rt712->slave) @@ -1068,7 +1052,7 @@ static int rt712_sdca_pcm_hw_params(struct snd_pcm_substream *substream, port_config.num = port;
retval = sdw_stream_add_slave(rt712->slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(dai->dev, "Unable to configure port\n"); return retval; @@ -1128,13 +1112,13 @@ static int rt712_sdca_pcm_hw_free(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; struct rt712_sdca_priv *rt712 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt712->slave) return -EINVAL;
- sdw_stream_remove_slave(rt712->slave, stream->sdw_stream); + sdw_stream_remove_slave(rt712->slave, sdw_stream); return 0; }
diff --git a/sound/soc/codecs/rt712-sdca.h b/sound/soc/codecs/rt712-sdca.h index cf647162f9da..c6a94a23f46e 100644 --- a/sound/soc/codecs/rt712-sdca.h +++ b/sound/soc/codecs/rt712-sdca.h @@ -40,10 +40,6 @@ struct rt712_sdca_priv { bool fu0f_mixer_r_mute; };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - /* NID */ #define RT712_VENDOR_REG 0x20 #define RT712_VENDOR_CALI 0x58
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt715.c | 30 +++++++----------------------- sound/soc/codecs/rt715.h | 4 ---- 2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt715.c b/sound/soc/codecs/rt715.c index c6dd9df7be45..6c2e165dd621 100644 --- a/sound/soc/codecs/rt715.c +++ b/sound/soc/codecs/rt715.c @@ -765,19 +765,7 @@ static int rt715_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) {
- struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -786,11 +774,7 @@ static void rt715_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
{ - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt715_pcm_hw_params(struct snd_pcm_substream *substream, @@ -801,13 +785,13 @@ static int rt715_pcm_hw_params(struct snd_pcm_substream *substream, struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval; unsigned int val = 0;
- stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!rt715->slave) @@ -830,7 +814,7 @@ static int rt715_pcm_hw_params(struct snd_pcm_substream *substream, }
retval = sdw_stream_add_slave(rt715->slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(dai->dev, "Unable to configure port\n"); return retval; @@ -893,13 +877,13 @@ static int rt715_pcm_hw_free(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt715->slave) return -EINVAL;
- sdw_stream_remove_slave(rt715->slave, stream->sdw_stream); + sdw_stream_remove_slave(rt715->slave, sdw_stream); return 0; }
diff --git a/sound/soc/codecs/rt715.h b/sound/soc/codecs/rt715.h index 25dba61f1760..17a8d041c1c3 100644 --- a/sound/soc/codecs/rt715.h +++ b/sound/soc/codecs/rt715.h @@ -27,10 +27,6 @@ struct rt715_priv { unsigned int kctl_8ch_vol_ori[8]; };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - /* NID */ #define RT715_AUDIO_FUNCTION_GROUP 0x01 #define RT715_MIC_ADC 0x07
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt715-sdca.c | 30 +++++++----------------------- sound/soc/codecs/rt715-sdca.h | 4 ---- 2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt715-sdca.c b/sound/soc/codecs/rt715-sdca.c index 920510365fd7..b989f907784b 100644 --- a/sound/soc/codecs/rt715-sdca.c +++ b/sound/soc/codecs/rt715-sdca.c @@ -784,16 +784,7 @@ static const struct snd_soc_component_driver soc_codec_dev_rt715_sdca = { static int rt715_sdca_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct rt715_sdw_stream_data *stream; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -802,14 +793,7 @@ static void rt715_sdca_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
{ - struct rt715_sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); - if (!stream) - return; - snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt715_sdca_pcm_hw_params(struct snd_pcm_substream *substream, @@ -820,13 +804,13 @@ static int rt715_sdca_pcm_hw_params(struct snd_pcm_substream *substream, struct rt715_sdca_priv *rt715 = snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct rt715_sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval; unsigned int val;
- stream = snd_soc_dai_get_dma_data(dai, substream); + sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
- if (!stream) + if (!sdw_stream) return -EINVAL;
if (!rt715->slave) @@ -851,7 +835,7 @@ static int rt715_sdca_pcm_hw_params(struct snd_pcm_substream *substream, }
retval = sdw_stream_add_slave(rt715->slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(component->dev, "Unable to configure port, retval:%d\n", retval); @@ -922,13 +906,13 @@ static int rt715_sdca_pcm_hw_free(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; struct rt715_sdca_priv *rt715 = snd_soc_component_get_drvdata(component); - struct rt715_sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt715->slave) return -EINVAL;
- sdw_stream_remove_slave(rt715->slave, stream->sdw_stream); + sdw_stream_remove_slave(rt715->slave, sdw_stream); return 0; }
diff --git a/sound/soc/codecs/rt715-sdca.h b/sound/soc/codecs/rt715-sdca.h index 90881b455ece..7577f3151934 100644 --- a/sound/soc/codecs/rt715-sdca.h +++ b/sound/soc/codecs/rt715-sdca.h @@ -37,10 +37,6 @@ struct rt715_sdca_priv { int kctl_8ch_orig[8]; };
-struct rt715_sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - struct rt715_sdca_kcontrol_private { unsigned int reg_base; unsigned int count;
From: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Using a dynamic allocation to store a single pointer is not very efficient/useful.
Worse, the memory is released in the SoundWire stream.c file, but still accessed in the DAI shutdown, leading to kmemleak reports.
And last the API requires the previous stream information to be cleared when the argument is NULL.
Simplify the code to address all 3 problems.
Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Reviewed-by: Péter Ujfalusi peter.ujfalusi@linux.intel.com Reviewed-by: Rander Wang rander.wang@intel.com Signed-off-by: Bard Liao yung-chuan.liao@linux.intel.com --- sound/soc/codecs/rt5682-sdw.c | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-)
diff --git a/sound/soc/codecs/rt5682-sdw.c b/sound/soc/codecs/rt5682-sdw.c index 5f80a5d59b65..23f17f70d7e9 100644 --- a/sound/soc/codecs/rt5682-sdw.c +++ b/sound/soc/codecs/rt5682-sdw.c @@ -88,26 +88,10 @@ static const struct regmap_config rt5682_sdw_indirect_regmap = { .reg_write = rt5682_sdw_write, };
-struct sdw_stream_data { - struct sdw_stream_runtime *sdw_stream; -}; - static int rt5682_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, int direction) { - struct sdw_stream_data *stream; - - if (!sdw_stream) - return 0; - - stream = kzalloc(sizeof(*stream), GFP_KERNEL); - if (!stream) - return -ENOMEM; - - stream->sdw_stream = sdw_stream; - - /* Use tx_mask or rx_mask to configure stream tag and set dma_data */ - snd_soc_dai_dma_data_set(dai, direction, stream); + snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
return 0; } @@ -115,11 +99,7 @@ static int rt5682_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, static void rt5682_sdw_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct sdw_stream_data *stream; - - stream = snd_soc_dai_get_dma_data(dai, substream); snd_soc_dai_set_dma_data(dai, substream, NULL); - kfree(stream); }
static int rt5682_sdw_hw_params(struct snd_pcm_substream *substream, @@ -130,14 +110,14 @@ static int rt5682_sdw_hw_params(struct snd_pcm_substream *substream, struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); struct sdw_stream_config stream_config = {0}; struct sdw_port_config port_config = {0}; - struct sdw_stream_data *stream; + struct sdw_stream_runtime *sdw_stream; int retval; unsigned int val_p = 0, val_c = 0, osr_p = 0, osr_c = 0;
dev_dbg(dai->dev, "%s %s", __func__, dai->name);
- stream = snd_soc_dai_get_dma_data(dai, substream); - if (!stream) + sdw_stream = snd_soc_dai_get_dma_data(dai, substream); + if (!sdw_stream) return -ENOMEM;
if (!rt5682->slave) @@ -152,7 +132,7 @@ static int rt5682_sdw_hw_params(struct snd_pcm_substream *substream, port_config.num = 2;
retval = sdw_stream_add_slave(rt5682->slave, &stream_config, - &port_config, 1, stream->sdw_stream); + &port_config, 1, sdw_stream); if (retval) { dev_err(dai->dev, "Unable to configure port\n"); return retval; @@ -246,13 +226,13 @@ static int rt5682_sdw_hw_free(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); - struct sdw_stream_data *stream = + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
if (!rt5682->slave) return -EINVAL;
- sdw_stream_remove_slave(rt5682->slave, stream->sdw_stream); + sdw_stream_remove_slave(rt5682->slave, sdw_stream); return 0; }
On Fri, 24 Mar 2023 09:43:55 +0800, Bard Liao wrote:
Simplify set_stream in SoundWire codecs.
Pierre-Louis Bossart (13): ASoC: codecs: cs42l42-sdw: clear stream ASoC: codecs: sdw-mockup: simplify set_stream ASoC: codecs: max98373-sdw: simplify set_stream ASoC: codecs: rt1308-sdw: simplify set_stream ASoC: codecs: rt1316-sdw: simplify set_stream ASoC: codecs: rt1318-sdw: simplify set_stream ASoC: codecs: rt700-sdw: simplify set_stream ASoC: codecs: rt711-sdw: simplify set_stream ASoC: codecs: rt711-sdca: simplify set_stream ASoC: codecs: rt712-sdca: simplify set_stream ASoC: codecs: rt715: simplify set_stream ASoC: codecs: rt715-sdca: simplify set_stream ASoC: codecs: rt5682-sdw: simplify set_stream
[...]
Applied to
broonie/sound.git for-next
Thanks!
[01/13] ASoC: codecs: cs42l42-sdw: clear stream commit: 892855d57c47c32f475e9efa36c1a3452cc19918 [02/13] ASoC: codecs: sdw-mockup: simplify set_stream commit: f3def177876450df07fab6f28ad24a70397dc94d [03/13] ASoC: codecs: max98373-sdw: simplify set_stream commit: 658d6f7381b1be5a6fec7d90c865fb593b8c78b6 [04/13] ASoC: codecs: rt1308-sdw: simplify set_stream commit: ce8ffc1bac7bee5015eb68faf214b39fcbd65d15 [05/13] ASoC: codecs: rt1316-sdw: simplify set_stream commit: 1294d7d71f6abad6299a12cf6911f8e5622c7865 [06/13] ASoC: codecs: rt1318-sdw: simplify set_stream commit: be8e5a850eb1780bae360b9b48b6d2ab70e5fb03 [07/13] ASoC: codecs: rt700-sdw: simplify set_stream commit: 3bcced019eb266e91b7eecc1f8fd3da5f55ca4cd [08/13] ASoC: codecs: rt711-sdw: simplify set_stream commit: fa55b31fb65347ceab617af7541f0a31b53901f1 [09/13] ASoC: codecs: rt711-sdca: simplify set_stream commit: b2790eccc0bc755d37ed5cd8d225cec0d72798c8 [10/13] ASoC: codecs: rt712-sdca: simplify set_stream commit: 278432084b093f7257cf96c75bb33f155e4a8232 [11/13] ASoC: codecs: rt715: simplify set_stream commit: e506b2bd1d2e9daaedd1db2ef9868f7b8c4c86c3 [12/13] ASoC: codecs: rt715-sdca: simplify set_stream commit: cf1d6a3ad07c982a09455bf8720dc75754909932 [13/13] ASoC: codecs: rt5682-sdw: simplify set_stream commit: b3a2e00e20671091f7175f8f36b7f9c9ea2e77bb
All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying to this mail.
Thanks, Mark
participants (2)
-
Bard Liao
-
Mark Brown