Takashi Iwai 489ba4
From d710359c0b445e8c03e24f19ae2fb79ce7282260 Mon Sep 17 00:00:00 2001
Takashi Iwai 489ba4
From: Dmitry Rokosov <DDRokosov@sberdevices.ru>
Takashi Iwai 489ba4
Date: Tue, 24 May 2022 18:14:45 +0000
Takashi Iwai 489ba4
Subject: [PATCH] iio:chemical:ccs811: rearrange iio trigger get and register
Takashi Iwai 489ba4
Git-commit: d710359c0b445e8c03e24f19ae2fb79ce7282260
Takashi Iwai 489ba4
Patch-mainline: v5.19-rc4
Takashi Iwai 489ba4
References: git-fixes
Takashi Iwai 489ba4
Takashi Iwai 489ba4
IIO trigger interface function iio_trigger_get() should be called after
Takashi Iwai 489ba4
iio_trigger_register() (or its devm analogue) strictly, because of
Takashi Iwai 489ba4
iio_trigger_get() acquires module refcnt based on the trigger->owner
Takashi Iwai 489ba4
pointer, which is initialized inside iio_trigger_register() to
Takashi Iwai 489ba4
THIS_MODULE.
Takashi Iwai 489ba4
If this call order is wrong, the next iio_trigger_put() (from sysfs
Takashi Iwai 489ba4
callback or "delete module" path) will dereference "default" module
Takashi Iwai 489ba4
refcnt, which is incorrect behaviour.
Takashi Iwai 489ba4
Takashi Iwai 489ba4
Fixes: f1f065d7ac30 ("iio: chemical: ccs811: Add support for data ready trigger")
Takashi Iwai 489ba4
Signed-off-by: Dmitry Rokosov <ddrokosov@sberdevices.ru>
Takashi Iwai 489ba4
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Takashi Iwai 489ba4
Link: https://lore.kernel.org/r/20220524181150.9240-5-ddrokosov@sberdevices.ru
Takashi Iwai 489ba4
Cc: <Stable@vger.kernel.org>
Takashi Iwai 489ba4
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Takashi Iwai 489ba4
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 489ba4
Takashi Iwai 489ba4
---
Takashi Iwai 489ba4
 drivers/iio/chemical/ccs811.c |    4 ++--
Takashi Iwai 489ba4
 1 file changed, 2 insertions(+), 2 deletions(-)
Takashi Iwai 489ba4
Takashi Iwai 489ba4
--- a/drivers/iio/chemical/ccs811.c
Takashi Iwai 489ba4
+++ b/drivers/iio/chemical/ccs811.c
Takashi Iwai 489ba4
@@ -418,11 +418,11 @@ static int ccs811_probe(struct i2c_clien
Takashi Iwai 489ba4
 		data->drdy_trig->dev.parent = &client->dev;
Takashi Iwai 489ba4
 		data->drdy_trig->ops = &ccs811_trigger_ops;
Takashi Iwai 489ba4
 		iio_trigger_set_drvdata(data->drdy_trig, indio_dev);
Takashi Iwai 489ba4
-		indio_dev->trig = data->drdy_trig;
Takashi Iwai 489ba4
-		iio_trigger_get(indio_dev->trig);
Takashi Iwai 489ba4
 		ret = iio_trigger_register(data->drdy_trig);
Takashi Iwai 489ba4
 		if (ret)
Takashi Iwai 489ba4
 			goto err_poweroff;
Takashi Iwai 489ba4
+
Takashi Iwai 489ba4
+		indio_dev->trig = iio_trigger_get(data->drdy_trig);
Takashi Iwai 489ba4
 	}
Takashi Iwai 489ba4
 
Takashi Iwai 489ba4
 	ret = iio_triggered_buffer_setup(indio_dev, NULL,