summaryrefslogtreecommitdiff
path: root/sound/soc/codecs/audio-iio-aux.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/audio-iio-aux.c')
-rw-r--r--sound/soc/codecs/audio-iio-aux.c83
1 files changed, 29 insertions, 54 deletions
diff --git a/sound/soc/codecs/audio-iio-aux.c b/sound/soc/codecs/audio-iio-aux.c
index 1e8e1effc2af..588e48044c13 100644
--- a/sound/soc/codecs/audio-iio-aux.c
+++ b/sound/soc/codecs/audio-iio-aux.c
@@ -6,6 +6,7 @@
//
// Author: Herve Codina <herve.codina@bootlin.com>
+#include <linux/cleanup.h>
#include <linux/iio/consumer.h>
#include <linux/minmax.h>
#include <linux/mod_devicetable.h>
@@ -131,33 +132,27 @@ static int audio_iio_aux_add_dapms(struct snd_soc_component *component,
struct audio_iio_aux_chan *chan)
{
struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
- char *output_name;
- char *input_name;
- char *pga_name;
int ret;
- input_name = kasprintf(GFP_KERNEL, "%s IN", chan->name);
+ /* Allocated names are not needed afterwards (duplicated in ASoC internals) */
+ char *input_name __free(kfree) = kasprintf(GFP_KERNEL, "%s IN", chan->name);
if (!input_name)
return -ENOMEM;
- output_name = kasprintf(GFP_KERNEL, "%s OUT", chan->name);
- if (!output_name) {
- ret = -ENOMEM;
- goto out_free_input_name;
- }
+ char *output_name __free(kfree) = kasprintf(GFP_KERNEL, "%s OUT", chan->name);
+ if (!output_name)
+ return -ENOMEM;
- pga_name = kasprintf(GFP_KERNEL, "%s PGA", chan->name);
- if (!pga_name) {
- ret = -ENOMEM;
- goto out_free_output_name;
- }
+ char *pga_name __free(kfree) = kasprintf(GFP_KERNEL, "%s PGA", chan->name);
+ if (!pga_name)
+ return -ENOMEM;
widgets[0] = SND_SOC_DAPM_INPUT(input_name);
widgets[1] = SND_SOC_DAPM_OUTPUT(output_name);
widgets[2] = SND_SOC_DAPM_PGA(pga_name, SND_SOC_NOPM, 0, 0, NULL, 0);
ret = snd_soc_dapm_new_controls(dapm, widgets, 3);
if (ret)
- goto out_free_pga_name;
+ return ret;
routes[0].sink = pga_name;
routes[0].control = NULL;
@@ -165,17 +160,8 @@ static int audio_iio_aux_add_dapms(struct snd_soc_component *component,
routes[1].sink = output_name;
routes[1].control = NULL;
routes[1].source = pga_name;
- ret = snd_soc_dapm_add_routes(dapm, routes, 2);
-
- /* Allocated names are no more needed (duplicated in ASoC internals) */
-out_free_pga_name:
- kfree(pga_name);
-out_free_output_name:
- kfree(output_name);
-out_free_input_name:
- kfree(input_name);
- return ret;
+ return snd_soc_dapm_add_routes(dapm, routes, 2);
}
static int audio_iio_aux_component_probe(struct snd_soc_component *component)
@@ -244,8 +230,6 @@ static int audio_iio_aux_probe(struct platform_device *pdev)
struct audio_iio_aux_chan *iio_aux_chan;
struct device *dev = &pdev->dev;
struct audio_iio_aux *iio_aux;
- const char **names;
- u32 *invert_ranges;
int count;
int ret;
int i;
@@ -262,22 +246,22 @@ static int audio_iio_aux_probe(struct platform_device *pdev)
iio_aux->num_chans = count;
- names = kcalloc(iio_aux->num_chans, sizeof(*names), GFP_KERNEL);
+ const char **names __free(kfree) = kcalloc(iio_aux->num_chans,
+ sizeof(*names),
+ GFP_KERNEL);
if (!names)
return -ENOMEM;
- invert_ranges = kcalloc(iio_aux->num_chans, sizeof(*invert_ranges), GFP_KERNEL);
- if (!invert_ranges) {
- ret = -ENOMEM;
- goto out_free_names;
- }
+ u32 *invert_ranges __free(kfree) = kcalloc(iio_aux->num_chans,
+ sizeof(*invert_ranges),
+ GFP_KERNEL);
+ if (!invert_ranges)
+ return -ENOMEM;
ret = device_property_read_string_array(dev, "io-channel-names",
names, iio_aux->num_chans);
- if (ret < 0) {
- dev_err_probe(dev, ret, "failed to read io-channel-names\n");
- goto out_free_invert_ranges;
- }
+ if (ret < 0)
+ return dev_err_probe(dev, ret, "failed to read io-channel-names\n");
/*
* snd-control-invert-range is optional and can contain fewer items
@@ -288,10 +272,8 @@ static int audio_iio_aux_probe(struct platform_device *pdev)
count = min_t(unsigned int, count, iio_aux->num_chans);
ret = device_property_read_u32_array(dev, "snd-control-invert-range",
invert_ranges, count);
- if (ret < 0) {
- dev_err_probe(dev, ret, "failed to read snd-control-invert-range\n");
- goto out_free_invert_ranges;
- }
+ if (ret < 0)
+ return dev_err_probe(dev, ret, "failed to read snd-control-invert-range\n");
}
for (i = 0; i < iio_aux->num_chans; i++) {
@@ -300,23 +282,16 @@ static int audio_iio_aux_probe(struct platform_device *pdev)
iio_aux_chan->is_invert_range = invert_ranges[i];
iio_aux_chan->iio_chan = devm_iio_channel_get(dev, iio_aux_chan->name);
- if (IS_ERR(iio_aux_chan->iio_chan)) {
- ret = PTR_ERR(iio_aux_chan->iio_chan);
- dev_err_probe(dev, ret, "get IIO channel '%s' failed\n",
- iio_aux_chan->name);
- goto out_free_invert_ranges;
- }
+ if (IS_ERR(iio_aux_chan->iio_chan))
+ return dev_err_probe(dev, PTR_ERR(iio_aux_chan->iio_chan),
+ "get IIO channel '%s' failed\n",
+ iio_aux_chan->name);
}
platform_set_drvdata(pdev, iio_aux);
- ret = devm_snd_soc_register_component(dev, &audio_iio_aux_component_driver,
- NULL, 0);
-out_free_invert_ranges:
- kfree(invert_ranges);
-out_free_names:
- kfree(names);
- return ret;
+ return devm_snd_soc_register_component(dev, &audio_iio_aux_component_driver,
+ NULL, 0);
}
static const struct of_device_id audio_iio_aux_ids[] = {