diff mbox series

[5/6] iio: adc: ti-tsc2046: simplify with cleanup.h

Message ID 20240705-cleanup-h-iio-v1-5-77114c7e84c5@linaro.org (mailing list archive)
State Accepted
Headers show
Series iio: adc: simplify with cleanup.h | expand

Commit Message

Krzysztof Kozlowski July 5, 2024, 10:40 a.m. UTC
Allocate the memory with scoped/cleanup.h to reduce error handling and
make the code a bit simpler.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
 drivers/iio/adc/ti-tsc2046.c | 29 ++++++++++++-----------------
 1 file changed, 12 insertions(+), 17 deletions(-)

Comments

Oleksij Rempel July 6, 2024, 5:08 a.m. UTC | #1
On Fri, Jul 05, 2024 at 12:40:48PM +0200, Krzysztof Kozlowski wrote:
> Allocate the memory with scoped/cleanup.h to reduce error handling and
> make the code a bit simpler.
> 
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Reviewed-by: Oleksij Rempel <o.rempel@pengutronix.de>

Thank you!


> ---
>  drivers/iio/adc/ti-tsc2046.c | 29 ++++++++++++-----------------
>  1 file changed, 12 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/iio/adc/ti-tsc2046.c b/drivers/iio/adc/ti-tsc2046.c
> index edcef8f11522..24b1d4390872 100644
> --- a/drivers/iio/adc/ti-tsc2046.c
> +++ b/drivers/iio/adc/ti-tsc2046.c
> @@ -6,6 +6,7 @@
>   */
>  
>  #include <linux/bitfield.h>
> +#include <linux/cleanup.h>
>  #include <linux/delay.h>
>  #include <linux/module.h>
>  #include <linux/regulator/consumer.h>
> @@ -273,7 +274,6 @@ static int tsc2046_adc_read_one(struct tsc2046_adc_priv *priv, int ch_idx,
>  				u32 *effective_speed_hz)
>  {
>  	struct tsc2046_adc_ch_cfg *ch = &priv->ch_cfg[ch_idx];
> -	struct tsc2046_adc_atom *rx_buf, *tx_buf;
>  	unsigned int val, val_normalized = 0;
>  	int ret, i, count_skip = 0, max_count;
>  	struct spi_transfer xfer;
> @@ -287,18 +287,20 @@ static int tsc2046_adc_read_one(struct tsc2046_adc_priv *priv, int ch_idx,
>  		max_count = 1;
>  	}
>  
> -	if (sizeof(*tx_buf) * max_count > PAGE_SIZE)
> +	if (sizeof(struct tsc2046_adc_atom) * max_count > PAGE_SIZE)
>  		return -ENOSPC;
>  
> -	tx_buf = kcalloc(max_count, sizeof(*tx_buf), GFP_KERNEL);
> +	struct tsc2046_adc_atom *tx_buf __free(kfree) = kcalloc(max_count,
> +								sizeof(*tx_buf),
> +								GFP_KERNEL);
>  	if (!tx_buf)
>  		return -ENOMEM;
>  
> -	rx_buf = kcalloc(max_count, sizeof(*rx_buf), GFP_KERNEL);
> -	if (!rx_buf) {
> -		ret = -ENOMEM;
> -		goto free_tx;
> -	}
> +	struct tsc2046_adc_atom *rx_buf __free(kfree) = kcalloc(max_count,
> +								sizeof(*rx_buf),
> +								GFP_KERNEL);
> +	if (!rx_buf)
> +		return -ENOMEM;
>  
>  	/*
>  	 * Do not enable automatic power down on working samples. Otherwise the
> @@ -326,7 +328,7 @@ static int tsc2046_adc_read_one(struct tsc2046_adc_priv *priv, int ch_idx,
>  	if (ret) {
>  		dev_err_ratelimited(&priv->spi->dev, "SPI transfer failed %pe\n",
>  				    ERR_PTR(ret));
> -		goto free_bufs;
> +		return ret;
>  	}
>  
>  	if (effective_speed_hz)
> @@ -337,14 +339,7 @@ static int tsc2046_adc_read_one(struct tsc2046_adc_priv *priv, int ch_idx,
>  		val_normalized += val;
>  	}
>  
> -	ret = DIV_ROUND_UP(val_normalized, max_count - count_skip);
> -
> -free_bufs:
> -	kfree(rx_buf);
> -free_tx:
> -	kfree(tx_buf);
> -
> -	return ret;
> +	return DIV_ROUND_UP(val_normalized, max_count - count_skip);
>  }
>  
>  static size_t tsc2046_adc_group_set_layout(struct tsc2046_adc_priv *priv,
> 
> -- 
> 2.43.0
> 
> 
>
diff mbox series

Patch

diff --git a/drivers/iio/adc/ti-tsc2046.c b/drivers/iio/adc/ti-tsc2046.c
index edcef8f11522..24b1d4390872 100644
--- a/drivers/iio/adc/ti-tsc2046.c
+++ b/drivers/iio/adc/ti-tsc2046.c
@@ -6,6 +6,7 @@ 
  */
 
 #include <linux/bitfield.h>
+#include <linux/cleanup.h>
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/regulator/consumer.h>
@@ -273,7 +274,6 @@  static int tsc2046_adc_read_one(struct tsc2046_adc_priv *priv, int ch_idx,
 				u32 *effective_speed_hz)
 {
 	struct tsc2046_adc_ch_cfg *ch = &priv->ch_cfg[ch_idx];
-	struct tsc2046_adc_atom *rx_buf, *tx_buf;
 	unsigned int val, val_normalized = 0;
 	int ret, i, count_skip = 0, max_count;
 	struct spi_transfer xfer;
@@ -287,18 +287,20 @@  static int tsc2046_adc_read_one(struct tsc2046_adc_priv *priv, int ch_idx,
 		max_count = 1;
 	}
 
-	if (sizeof(*tx_buf) * max_count > PAGE_SIZE)
+	if (sizeof(struct tsc2046_adc_atom) * max_count > PAGE_SIZE)
 		return -ENOSPC;
 
-	tx_buf = kcalloc(max_count, sizeof(*tx_buf), GFP_KERNEL);
+	struct tsc2046_adc_atom *tx_buf __free(kfree) = kcalloc(max_count,
+								sizeof(*tx_buf),
+								GFP_KERNEL);
 	if (!tx_buf)
 		return -ENOMEM;
 
-	rx_buf = kcalloc(max_count, sizeof(*rx_buf), GFP_KERNEL);
-	if (!rx_buf) {
-		ret = -ENOMEM;
-		goto free_tx;
-	}
+	struct tsc2046_adc_atom *rx_buf __free(kfree) = kcalloc(max_count,
+								sizeof(*rx_buf),
+								GFP_KERNEL);
+	if (!rx_buf)
+		return -ENOMEM;
 
 	/*
 	 * Do not enable automatic power down on working samples. Otherwise the
@@ -326,7 +328,7 @@  static int tsc2046_adc_read_one(struct tsc2046_adc_priv *priv, int ch_idx,
 	if (ret) {
 		dev_err_ratelimited(&priv->spi->dev, "SPI transfer failed %pe\n",
 				    ERR_PTR(ret));
-		goto free_bufs;
+		return ret;
 	}
 
 	if (effective_speed_hz)
@@ -337,14 +339,7 @@  static int tsc2046_adc_read_one(struct tsc2046_adc_priv *priv, int ch_idx,
 		val_normalized += val;
 	}
 
-	ret = DIV_ROUND_UP(val_normalized, max_count - count_skip);
-
-free_bufs:
-	kfree(rx_buf);
-free_tx:
-	kfree(tx_buf);
-
-	return ret;
+	return DIV_ROUND_UP(val_normalized, max_count - count_skip);
 }
 
 static size_t tsc2046_adc_group_set_layout(struct tsc2046_adc_priv *priv,