On 22 September 2016 14:32:32 BST, William Breathitt Gray <vilhelm.gray@xxxxxxxxx> wrote: >On Thu, Sep 22, 2016 at 03:10:21PM +0200, gregkh@xxxxxxxxxxxxxxxxxxx >wrote: >> >>The patch below does not apply to the 4.7-stable tree. >>If someone wants it applied there, or to any other stable or longterm >>tree, then please email the backport, including the original git >commit >>id to <stable@xxxxxxxxxxxxxxx>. >> >>thanks, >> >>greg k-h > >This patch fixes an issues introduced in commit 765550e4d98d >("iio: stx104: Add GPIO support for the Apex Embedded Systems STX104"). >If I'm not mistaken, commit 765550e4d98d is not in the 4.7-stable tree. >Since the source of the issue is not present, this patch to resolve the >issue should not be merged into 4.7-stable. > >Sincerely, > >William Breathitt Gray Another wrong tag from me. Sorry! > >>------------------ original commit in Linus's tree ------------------ >> >>From 45e98152850c36560484f3fa3bb857a4bfe1a419 Mon Sep 17 00:00:00 2001 >>From: William Breathitt Gray <vilhelm.gray@xxxxxxxxx> >>Date: Tue, 19 Jul 2016 12:25:00 -0400 >>Subject: [PATCH] iio: stx104: Unregister IIO device on remove callback >> >>The devm_iio_device_register function should not be used if custom >>operations must be performed in the remove callback. This patch >replaces >>the dem_iio_device_register call with a iio_device_register call and >>respective iio_device_unregister call in the remove callback. >> >>Fixes: 765550e4d98d ("iio: stx104: Add GPIO support for the Apex >Embedded Systems STX104") >>Signed-off-by: William Breathitt Gray <vilhelm.gray@xxxxxxxxx> >>Cc: <Stable@xxxxxxxxxxxxxxx> >>Signed-off-by: Jonathan Cameron <jic23@xxxxxxxxxx> >> >>diff --git a/drivers/iio/dac/stx104.c b/drivers/iio/dac/stx104.c >>index 792a97164cb2..bebbd00304ce 100644 >>--- a/drivers/iio/dac/stx104.c >>+++ b/drivers/iio/dac/stx104.c >>@@ -65,6 +65,16 @@ struct stx104_gpio { >> unsigned int out_state; >> }; >> >>+/** >>+ * struct stx104_dev - STX104 device private data structure >>+ * @indio_dev: IIO device >>+ * @chip: instance of the gpio_chip >>+ */ >>+struct stx104_dev { >>+ struct iio_dev *indio_dev; >>+ struct gpio_chip *chip; >>+}; >>+ >> static int stx104_read_raw(struct iio_dev *indio_dev, >> struct iio_chan_spec const *chan, int *val, int *val2, long mask) >> { >>@@ -107,6 +117,7 @@ static const struct iio_chan_spec >stx104_channels[STX104_NUM_CHAN] = { >> static int stx104_gpio_get_direction(struct gpio_chip *chip, >> unsigned int offset) >> { >>+ /* GPIO 0-3 are input only, while the rest are output only */ >> if (offset < 4) >> return 1; >> >>@@ -169,6 +180,7 @@ static int stx104_probe(struct device *dev, >unsigned int id) >> struct iio_dev *indio_dev; >> struct stx104_iio *priv; >> struct stx104_gpio *stx104gpio; >>+ struct stx104_dev *stx104dev; >> int err; >> >> indio_dev = devm_iio_device_alloc(dev, sizeof(*priv)); >>@@ -179,6 +191,10 @@ static int stx104_probe(struct device *dev, >unsigned int id) >> if (!stx104gpio) >> return -ENOMEM; >> >>+ stx104dev = devm_kzalloc(dev, sizeof(*stx104dev), GFP_KERNEL); >>+ if (!stx104dev) >>+ return -ENOMEM; >>+ >> if (!devm_request_region(dev, base[id], STX104_EXTENT, >> dev_name(dev))) { >> dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n", >>@@ -199,12 +215,6 @@ static int stx104_probe(struct device *dev, >unsigned int id) >> outw(0, base[id] + 4); >> outw(0, base[id] + 6); >> >>- err = devm_iio_device_register(dev, indio_dev); >>- if (err) { >>- dev_err(dev, "IIO device registering failed (%d)\n", err); >>- return err; >>- } >>- >> stx104gpio->chip.label = dev_name(dev); >> stx104gpio->chip.parent = dev; >> stx104gpio->chip.owner = THIS_MODULE; >>@@ -220,7 +230,9 @@ static int stx104_probe(struct device *dev, >unsigned int id) >> >> spin_lock_init(&stx104gpio->lock); >> >>- dev_set_drvdata(dev, stx104gpio); >>+ stx104dev->indio_dev = indio_dev; >>+ stx104dev->chip = &stx104gpio->chip; >>+ dev_set_drvdata(dev, stx104dev); >> >> err = gpiochip_add_data(&stx104gpio->chip, stx104gpio); >> if (err) { >>@@ -228,14 +240,22 @@ static int stx104_probe(struct device *dev, >unsigned int id) >> return err; >> } >> >>+ err = iio_device_register(indio_dev); >>+ if (err) { >>+ dev_err(dev, "IIO device registering failed (%d)\n", err); >>+ gpiochip_remove(&stx104gpio->chip); >>+ return err; >>+ } >>+ >> return 0; >> } >> >> static int stx104_remove(struct device *dev, unsigned int id) >> { >>- struct stx104_gpio *const stx104gpio = dev_get_drvdata(dev); >>+ struct stx104_dev *const stx104dev = dev_get_drvdata(dev); >> >>- gpiochip_remove(&stx104gpio->chip); >>+ iio_device_unregister(stx104dev->indio_dev); >>+ gpiochip_remove(stx104dev->chip); >> >> return 0; >> } >> -- Sent from my Android device with K-9 Mail. Please excuse my brevity. -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html