iio: set default trig->dev.parent
authorGwendal Grignou <gwendal@chromium.org>
Tue, 9 Mar 2021 19:36:13 +0000 (11:36 -0800)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 25 Mar 2021 19:13:50 +0000 (19:13 +0000)
When allocated with [devm_]iio_trigger_alloc(), set trig device parent to
the device the trigger is allocated for by default.

It can always be reassigned in the probe routine.

Change iio_trigger_alloc() API to add the device pointer to be coherent
with devm_iio_trigger_alloc, using similar interface to
iio_device_alloc().

Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20210309193620.2176163-2-gwendal@chromium.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
13 files changed:
drivers/iio/accel/bma180.c
drivers/iio/adc/ad_sigma_delta.c
drivers/iio/adc/at91_adc.c
drivers/iio/common/hid-sensors/hid-sensor-trigger.c
drivers/iio/common/st_sensors/st_sensors_trigger.c
drivers/iio/gyro/itg3200_buffer.c
drivers/iio/industrialio-trigger.c
drivers/iio/trigger/iio-trig-hrtimer.c
drivers/iio/trigger/iio-trig-interrupt.c
drivers/iio/trigger/iio-trig-loop.c
drivers/iio/trigger/iio-trig-sysfs.c
include/linux/iio/iio.h
include/linux/iio/trigger.h

index 71f85a3..b8a7469 100644 (file)
@@ -1044,7 +1044,7 @@ static int bma180_probe(struct i2c_client *client,
        indio_dev->info = &bma180_info;
 
        if (client->irq > 0) {
-               data->trig = iio_trigger_alloc("%s-dev%d", indio_dev->name,
+               data->trig = iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name,
                        indio_dev->id);
                if (!data->trig) {
                        ret = -ENOMEM;
@@ -1059,7 +1059,6 @@ static int bma180_probe(struct i2c_client *client,
                        goto err_trigger_free;
                }
 
-               data->trig->dev.parent = dev;
                data->trig->ops = &bma180_trigger_ops;
                iio_trigger_set_drvdata(data->trig, indio_dev);
                indio_dev->trig = iio_trigger_get(data->trig);
index 3a6f239..9289812 100644 (file)
@@ -475,8 +475,9 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
        struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
        int ret;
 
-       sigma_delta->trig = iio_trigger_alloc("%s-dev%d", indio_dev->name,
-                                               indio_dev->id);
+       sigma_delta->trig = iio_trigger_alloc(&sigma_delta->spi->dev,
+                                             "%s-dev%d", indio_dev->name,
+                                             indio_dev->id);
        if (sigma_delta->trig == NULL) {
                ret = -ENOMEM;
                goto error_ret;
@@ -496,7 +497,6 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
                sigma_delta->irq_dis = true;
                disable_irq_nosync(sigma_delta->spi->irq);
        }
-       sigma_delta->trig->dev.parent = &sigma_delta->spi->dev;
        iio_trigger_set_drvdata(sigma_delta->trig, sigma_delta);
 
        ret = iio_trigger_register(sigma_delta->trig);
index 70750ab..0b5f0c9 100644 (file)
@@ -625,12 +625,11 @@ static struct iio_trigger *at91_adc_allocate_trigger(struct iio_dev *idev,
        struct iio_trigger *trig;
        int ret;
 
-       trig = iio_trigger_alloc("%s-dev%d-%s", idev->name,
+       trig = iio_trigger_alloc(idev->dev.parent, "%s-dev%d-%s", idev->name,
                                 idev->id, trigger->name);
        if (trig == NULL)
                return NULL;
 
-       trig->dev.parent = idev->dev.parent;
        iio_trigger_set_drvdata(trig, idev);
        trig->ops = &at91_adc_trigger_ops;
 
index 064c32b..95ddccb 100644 (file)
@@ -255,14 +255,14 @@ int hid_sensor_setup_trigger(struct iio_dev *indio_dev, const char *name,
                return ret;
        }
 
-       trig = iio_trigger_alloc("%s-dev%d", name, indio_dev->id);
+       trig = iio_trigger_alloc(indio_dev->dev.parent,
+                                "%s-dev%d", name, indio_dev->id);
        if (trig == NULL) {
                dev_err(&indio_dev->dev, "Trigger Allocate Failed\n");
                ret = -ENOMEM;
                goto error_triggered_buffer_cleanup;
        }
 
-       trig->dev.parent = indio_dev->dev.parent;
        iio_trigger_set_drvdata(trig, attrb);
        trig->ops = &hid_sensor_trigger_ops;
        ret = iio_trigger_register(trig);
index 2dbd264..0b51166 100644 (file)
@@ -123,7 +123,8 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
        unsigned long irq_trig;
        int err;
 
-       sdata->trig = iio_trigger_alloc("%s-trigger", indio_dev->name);
+       sdata->trig = iio_trigger_alloc(sdata->dev, "%s-trigger",
+                                       indio_dev->name);
        if (sdata->trig == NULL) {
                dev_err(&indio_dev->dev, "failed to allocate iio trigger.\n");
                return -ENOMEM;
@@ -131,7 +132,6 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
 
        iio_trigger_set_drvdata(sdata->trig, indio_dev);
        sdata->trig->ops = trigger_ops;
-       sdata->trig->dev.parent = sdata->dev;
 
        irq_trig = irqd_get_trigger_type(irq_get_irq_data(sdata->irq));
        /*
index 1c3c1bd..af0aaa1 100644 (file)
@@ -113,7 +113,7 @@ int itg3200_probe_trigger(struct iio_dev *indio_dev)
        int ret;
        struct itg3200 *st = iio_priv(indio_dev);
 
-       st->trig = iio_trigger_alloc("%s-dev%d", indio_dev->name,
+       st->trig = iio_trigger_alloc(&st->i2c->dev, "%s-dev%d", indio_dev->name,
                                     indio_dev->id);
        if (!st->trig)
                return -ENOMEM;
@@ -127,7 +127,6 @@ int itg3200_probe_trigger(struct iio_dev *indio_dev)
                goto error_free_trig;
 
 
-       st->trig->dev.parent = &st->i2c->dev;
        st->trig->ops = &itg3200_trigger_ops;
        iio_trigger_set_drvdata(st->trig, indio_dev);
        ret = iio_trigger_register(st->trig);
index a035d5c..32ac1be 100644 (file)
@@ -514,8 +514,10 @@ static void iio_trig_subirqunmask(struct irq_data *d)
        trig->subirqs[d->irq - trig->subirq_base].enabled = true;
 }
 
-static __printf(1, 0)
-struct iio_trigger *viio_trigger_alloc(const char *fmt, va_list vargs)
+static __printf(2, 0)
+struct iio_trigger *viio_trigger_alloc(struct device *parent,
+                                      const char *fmt,
+                                      va_list vargs)
 {
        struct iio_trigger *trig;
        int i;
@@ -524,6 +526,7 @@ struct iio_trigger *viio_trigger_alloc(const char *fmt, va_list vargs)
        if (!trig)
                return NULL;
 
+       trig->dev.parent = parent;
        trig->dev.type = &iio_trig_type;
        trig->dev.bus = &iio_bus_type;
        device_initialize(&trig->dev);
@@ -559,13 +562,23 @@ free_trig:
        return NULL;
 }
 
-struct iio_trigger *iio_trigger_alloc(const char *fmt, ...)
+/**
+ * iio_trigger_alloc - Allocate a trigger
+ * @parent:            Device to allocate iio_trigger for
+ * @fmt:               trigger name format. If it includes format
+ *                     specifiers, the additional arguments following
+ *                     format are formatted and inserted in the resulting
+ *                     string replacing their respective specifiers.
+ * RETURNS:
+ * Pointer to allocated iio_trigger on success, NULL on failure.
+ */
+struct iio_trigger *iio_trigger_alloc(struct device *parent, const char *fmt, ...)
 {
        struct iio_trigger *trig;
        va_list vargs;
 
        va_start(vargs, fmt);
-       trig = viio_trigger_alloc(fmt, vargs);
+       trig = viio_trigger_alloc(parent, fmt, vargs);
        va_end(vargs);
 
        return trig;
@@ -586,20 +599,19 @@ static void devm_iio_trigger_release(struct device *dev, void *res)
 
 /**
  * devm_iio_trigger_alloc - Resource-managed iio_trigger_alloc()
- * @dev:               Device to allocate iio_trigger for
+ * Managed iio_trigger_alloc.  iio_trigger allocated with this function is
+ * automatically freed on driver detach.
+ * @parent:            Device to allocate iio_trigger for
  * @fmt:               trigger name format. If it includes format
  *                     specifiers, the additional arguments following
  *                     format are formatted and inserted in the resulting
  *                     string replacing their respective specifiers.
  *
- * Managed iio_trigger_alloc.  iio_trigger allocated with this function is
- * automatically freed on driver detach.
  *
  * RETURNS:
  * Pointer to allocated iio_trigger on success, NULL on failure.
  */
-struct iio_trigger *devm_iio_trigger_alloc(struct device *dev,
-                                               const char *fmt, ...)
+struct iio_trigger *devm_iio_trigger_alloc(struct device *parent, const char *fmt, ...)
 {
        struct iio_trigger **ptr, *trig;
        va_list vargs;
@@ -611,11 +623,11 @@ struct iio_trigger *devm_iio_trigger_alloc(struct device *dev,
 
        /* use raw alloc_dr for kmalloc caller tracing */
        va_start(vargs, fmt);
-       trig = viio_trigger_alloc(fmt, vargs);
+       trig = viio_trigger_alloc(parent, fmt, vargs);
        va_end(vargs);
        if (trig) {
                *ptr = trig;
-               devres_add(dev, ptr);
+               devres_add(parent, ptr);
        } else {
                devres_free(ptr);
        }
index e68a2c5..51e362f 100644 (file)
@@ -135,7 +135,7 @@ static struct iio_sw_trigger *iio_trig_hrtimer_probe(const char *name)
        if (!trig_info)
                return ERR_PTR(-ENOMEM);
 
-       trig_info->swt.trigger = iio_trigger_alloc("%s", name);
+       trig_info->swt.trigger = iio_trigger_alloc(NULL, "%s", name);
        if (!trig_info->swt.trigger) {
                ret = -ENOMEM;
                goto err_free_trig_info;
index 94a487c..f746c46 100644 (file)
@@ -45,7 +45,7 @@ static int iio_interrupt_trigger_probe(struct platform_device *pdev)
 
        irq = irq_res->start;
 
-       trig = iio_trigger_alloc("irqtrig%d", irq);
+       trig = iio_trigger_alloc(NULL, "irqtrig%d", irq);
        if (!trig) {
                ret = -ENOMEM;
                goto error_ret;
index 4a00668..96ec06b 100644 (file)
@@ -84,7 +84,7 @@ static struct iio_sw_trigger *iio_trig_loop_probe(const char *name)
        if (!trig_info)
                return ERR_PTR(-ENOMEM);
 
-       trig_info->swt.trigger = iio_trigger_alloc("%s", name);
+       trig_info->swt.trigger = iio_trigger_alloc(NULL, "%s", name);
        if (!trig_info->swt.trigger) {
                ret = -ENOMEM;
                goto err_free_trig_info;
index 0f6b512..e9adfff 100644 (file)
@@ -149,7 +149,7 @@ static int iio_sysfs_trigger_probe(int id)
                goto out1;
        }
        t->id = id;
-       t->trig = iio_trigger_alloc("sysfstrig%d", id);
+       t->trig = iio_trigger_alloc(&iio_sysfs_trig_dev, "sysfstrig%d", id);
        if (!t->trig) {
                ret = -ENOMEM;
                goto free_t;
@@ -157,7 +157,6 @@ static int iio_sysfs_trigger_probe(int id)
 
        t->trig->dev.groups = iio_sysfs_trigger_attr_groups;
        t->trig->ops = &iio_sysfs_trigger_ops;
-       t->trig->dev.parent = &iio_sysfs_trig_dev;
        iio_trigger_set_drvdata(t->trig, t);
 
        t->work = IRQ_WORK_INIT_HARD(iio_sysfs_trigger_work);
index f8585d0..f2d65e2 100644 (file)
@@ -693,7 +693,7 @@ static inline void *iio_priv(const struct iio_dev *indio_dev)
 void iio_device_free(struct iio_dev *indio_dev);
 struct iio_dev *devm_iio_device_alloc(struct device *parent, int sizeof_priv);
 __printf(2, 3)
-struct iio_trigger *devm_iio_trigger_alloc(struct device *dev,
+struct iio_trigger *devm_iio_trigger_alloc(struct device *parent,
                                           const char *fmt, ...);
 /**
  * iio_buffer_enabled() - helper function to test if the buffer is enabled
index 055890b..096f68d 100644 (file)
@@ -161,7 +161,8 @@ void iio_trigger_poll_chained(struct iio_trigger *trig);
 
 irqreturn_t iio_trigger_generic_data_rdy_poll(int irq, void *private);
 
-__printf(1, 2) struct iio_trigger *iio_trigger_alloc(const char *fmt, ...);
+__printf(2, 3)
+struct iio_trigger *iio_trigger_alloc(struct device *parent, const char *fmt, ...);
 void iio_trigger_free(struct iio_trigger *trig);
 
 /**