On 02/09/16 19:47, Gregor Boirie wrote: > Add resource managed devm_iio_trigger_register() and > devm_iio_triger_unregister() to automatically clean up registered triggers > allocated by IIO drivers, thus leading to simplified IIO drivers code. > > Signed-off-by: Gregor Boirie <gregor.boirie@xxxxxxxxxx> Looks good to me and stands fine on it's own. Not sure why we'd never gotten around to doing this before! Applied to the togreg branch of iio.git Thanks, Jonathan > --- > Documentation/driver-model/devres.txt | 2 ++ > drivers/iio/industrialio-trigger.c | 59 +++++++++++++++++++++++++++++++++++ > include/linux/iio/trigger.h | 6 ++++ > 3 files changed, 67 insertions(+) > > diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt > index b0d775d..6a2138a 100644 > --- a/Documentation/driver-model/devres.txt > +++ b/Documentation/driver-model/devres.txt > @@ -268,6 +268,8 @@ IIO > devm_iio_kfifo_free() > devm_iio_trigger_alloc() > devm_iio_trigger_free() > + devm_iio_trigger_register() > + devm_iio_trigger_unregister() > devm_iio_channel_get() > devm_iio_channel_release() > devm_iio_channel_get_all() > diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c > index 7ad82fd..8ea2dc1 100644 > --- a/drivers/iio/industrialio-trigger.c > +++ b/drivers/iio/industrialio-trigger.c > @@ -622,6 +622,65 @@ void devm_iio_trigger_free(struct device *dev, struct iio_trigger *iio_trig) > } > EXPORT_SYMBOL_GPL(devm_iio_trigger_free); > > +static void devm_iio_trigger_unreg(struct device *dev, void *res) > +{ > + iio_trigger_unregister(*(struct iio_trigger **)res); > +} > + > +/** > + * devm_iio_trigger_register - Resource-managed iio_trigger_register() > + * @dev: device this trigger was allocated for > + * @trig_info: trigger to register > + * > + * Managed iio_trigger_register(). The IIO trigger registered with this > + * function is automatically unregistered on driver detach. This function > + * calls iio_trigger_register() internally. Refer to that function for more > + * information. > + * > + * If an iio_trigger registered with this function needs to be unregistered > + * separately, devm_iio_trigger_unregister() must be used. > + * > + * RETURNS: > + * 0 on success, negative error number on failure. > + */ > +int devm_iio_trigger_register(struct device *dev, struct iio_trigger *trig_info) > +{ > + struct iio_trigger **ptr; > + int ret; > + > + ptr = devres_alloc(devm_iio_trigger_unreg, sizeof(*ptr), GFP_KERNEL); > + if (!ptr) > + return -ENOMEM; > + > + *ptr = trig_info; > + ret = iio_trigger_register(trig_info); > + if (!ret) > + devres_add(dev, ptr); > + else > + devres_free(ptr); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(devm_iio_trigger_register); > + > +/** > + * devm_iio_trigger_unregister - Resource-managed iio_trigger_unregister() > + * @dev: device this iio_trigger belongs to > + * @trig_info: the trigger associated with the device > + * > + * Unregister trigger registered with devm_iio_trigger_register(). > + */ > +void devm_iio_trigger_unregister(struct device *dev, > + struct iio_trigger *trig_info) > +{ > + int rc; > + > + rc = devres_release(dev, devm_iio_trigger_unreg, devm_iio_trigger_match, > + trig_info); > + WARN_ON(rc); > +} > +EXPORT_SYMBOL_GPL(devm_iio_trigger_unregister); > + > void iio_device_register_trigger_consumer(struct iio_dev *indio_dev) > { > indio_dev->groups[indio_dev->groupcounter++] = > diff --git a/include/linux/iio/trigger.h b/include/linux/iio/trigger.h > index 1c9e028..623d183 100644 > --- a/include/linux/iio/trigger.h > +++ b/include/linux/iio/trigger.h > @@ -125,12 +125,18 @@ static inline void *iio_trigger_get_drvdata(struct iio_trigger *trig) > **/ > int iio_trigger_register(struct iio_trigger *trig_info); > > +int devm_iio_trigger_register(struct device *dev, > + struct iio_trigger *trig_info); > + > /** > * iio_trigger_unregister() - unregister a trigger from the core > * @trig_info: trigger to be unregistered > **/ > void iio_trigger_unregister(struct iio_trigger *trig_info); > > +void devm_iio_trigger_unregister(struct device *dev, > + struct iio_trigger *trig_info); > + > /** > * iio_trigger_poll() - called on a trigger occurring > * @trig: trigger which occurred > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html