devm_* APIs are device managed and make code simpler. Signed-off-by: Slawomir Stepien <sst@xxxxxxxxx> --- Since v1: * request_threaded_irq -> devm_request_threaded_irq --- drivers/staging/iio/adc/ad7280a.c | 45 ++++++++++++------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/drivers/staging/iio/adc/ad7280a.c b/drivers/staging/iio/adc/ad7280a.c index b736275c10f5..37a6347f255d 100644 --- a/drivers/staging/iio/adc/ad7280a.c +++ b/drivers/staging/iio/adc/ad7280a.c @@ -8,7 +8,6 @@ #include <linux/device.h> #include <linux/kernel.h> -#include <linux/slab.h> #include <linux/sysfs.h> #include <linux/spi/spi.h> #include <linux/err.h> @@ -492,8 +491,8 @@ static int ad7280_channel_init(struct ad7280_state *st) { int dev, ch, cnt; - st->channels = kcalloc((st->slave_num + 1) * 12 + 2, - sizeof(*st->channels), GFP_KERNEL); + st->channels = devm_kcalloc(&st->spi->dev, (st->slave_num + 1) * 12 + 2, + sizeof(*st->channels), GFP_KERNEL); if (!st->channels) return -ENOMEM; @@ -553,9 +552,9 @@ static int ad7280_attr_init(struct ad7280_state *st) { int dev, ch, cnt; - st->iio_attr = kcalloc(2, sizeof(*st->iio_attr) * - (st->slave_num + 1) * AD7280A_CELLS_PER_DEV, - GFP_KERNEL); + st->iio_attr = devm_kcalloc(&st->spi->dev, 2, sizeof(*st->iio_attr) * + (st->slave_num + 1) * AD7280A_CELLS_PER_DEV, + GFP_KERNEL); if (!st->iio_attr) return -ENOMEM; @@ -692,7 +691,8 @@ static irqreturn_t ad7280_event_handler(int irq, void *private) unsigned int *channels; int i, ret; - channels = kcalloc(st->scan_cnt, sizeof(*channels), GFP_KERNEL); + channels = devm_kcalloc(&st->spi->dev, st->scan_cnt, sizeof(*channels), + GFP_KERNEL); if (!channels) return IRQ_HANDLED; @@ -744,7 +744,7 @@ static irqreturn_t ad7280_event_handler(int irq, void *private) } out: - kfree(channels); + devm_kfree(&st->spi->dev, channels); return IRQ_HANDLED; } @@ -909,11 +909,11 @@ static int ad7280_probe(struct spi_device *spi) ret = ad7280_attr_init(st); if (ret < 0) - goto error_free_channels; + return ret; ret = iio_device_register(indio_dev); if (ret) - goto error_free_attr; + return ret; if (spi->irq > 0) { ret = ad7280_write(st, AD7280A_DEVADDR_MASTER, @@ -929,13 +929,13 @@ static int ad7280_probe(struct spi_device *spi) if (ret) goto error_unregister; - ret = request_threaded_irq(spi->irq, - NULL, - ad7280_event_handler, - IRQF_TRIGGER_FALLING | - IRQF_ONESHOT, - indio_dev->name, - indio_dev); + ret = devm_request_threaded_irq(&spi->dev, spi->irq, + NULL, + ad7280_event_handler, + IRQF_TRIGGER_FALLING | + IRQF_ONESHOT, + indio_dev->name, + indio_dev); if (ret) goto error_unregister; } @@ -944,12 +944,6 @@ static int ad7280_probe(struct spi_device *spi) error_unregister: iio_device_unregister(indio_dev); -error_free_attr: - kfree(st->iio_attr); - -error_free_channels: - kfree(st->channels); - return ret; } @@ -958,16 +952,11 @@ static int ad7280_remove(struct spi_device *spi) struct iio_dev *indio_dev = spi_get_drvdata(spi); struct ad7280_state *st = iio_priv(indio_dev); - if (spi->irq > 0) - free_irq(spi->irq, indio_dev); iio_device_unregister(indio_dev); ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CONTROL_HB, 1, AD7280A_CTRL_HB_PWRDN_SW | st->ctrl_hb); - kfree(st->channels); - kfree(st->iio_attr); - return 0; } -- 2.19.1