On Thu, 5 Oct 2023 19:50:29 -0500 David Lechner <dlechner@xxxxxxxxxxxx> wrote: > This adds a new optional field to struct iio_info to allow drivers to > specify a label for the event. This is useful for cases where there are > many events or the event attribute name is not descriptive enough or > where an event doesn't have any other attributes. > > The implementation is based on the existing label support for channels. > So either all events of a device have a label attribute or none do. > > Signed-off-by: David Lechner <dlechner@xxxxxxxxxxxx> Was going to moan about lack of docs, but I see they are in later patches. Ok. General feature is fine. Applied. Jonathan > --- > > v4 changes: New patch in v4. > > drivers/iio/industrialio-event.c | 55 ++++++++++++++++++++++++++++++++++++++++ > include/linux/iio/iio.h | 8 ++++++ > 2 files changed, 63 insertions(+) > > diff --git a/drivers/iio/industrialio-event.c b/drivers/iio/industrialio-event.c > index 19f7a91157ee..910c1f14abd5 100644 > --- a/drivers/iio/industrialio-event.c > +++ b/drivers/iio/industrialio-event.c > @@ -355,6 +355,21 @@ static ssize_t iio_ev_value_store(struct device *dev, > return len; > } > > +static ssize_t iio_ev_label_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct iio_dev *indio_dev = dev_to_iio_dev(dev); > + struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); > + > + if (indio_dev->info->read_event_label) > + return indio_dev->info->read_event_label(indio_dev, > + this_attr->c, iio_ev_attr_type(this_attr), > + iio_ev_attr_dir(this_attr), buf); > + > + return -EINVAL; > +} > + > static int iio_device_add_event(struct iio_dev *indio_dev, > const struct iio_chan_spec *chan, unsigned int spec_index, > enum iio_event_type type, enum iio_event_direction dir, > @@ -411,6 +426,41 @@ static int iio_device_add_event(struct iio_dev *indio_dev, > return attrcount; > } > > +static int iio_device_add_event_label(struct iio_dev *indio_dev, > + const struct iio_chan_spec *chan, > + unsigned int spec_index, > + enum iio_event_type type, > + enum iio_event_direction dir) > +{ > + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); > + char *postfix; > + int ret; > + > + if (!indio_dev->info->read_event_label) > + return 0; > + > + if (dir != IIO_EV_DIR_NONE) > + postfix = kasprintf(GFP_KERNEL, "%s_%s_label", > + iio_ev_type_text[type], > + iio_ev_dir_text[dir]); > + else > + postfix = kasprintf(GFP_KERNEL, "%s_label", > + iio_ev_type_text[type]); > + if (postfix == NULL) > + return -ENOMEM; > + > + ret = __iio_add_chan_devattr(postfix, chan, &iio_ev_label_show, NULL, > + spec_index, IIO_SEPARATE, &indio_dev->dev, NULL, > + &iio_dev_opaque->event_interface->dev_attr_list); > + > + kfree(postfix); > + > + if (ret < 0) > + return ret; > + > + return 1; > +} > + > static int iio_device_add_event_sysfs(struct iio_dev *indio_dev, > struct iio_chan_spec const *chan) > { > @@ -448,6 +498,11 @@ static int iio_device_add_event_sysfs(struct iio_dev *indio_dev, > if (ret < 0) > return ret; > attrcount += ret; > + > + ret = iio_device_add_event_label(indio_dev, chan, i, type, dir); > + if (ret < 0) > + return ret; > + attrcount += ret; > } > ret = attrcount; > return ret; > diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h > index 7bfa1b9bc8a2..d0ce3b71106a 100644 > --- a/include/linux/iio/iio.h > +++ b/include/linux/iio/iio.h > @@ -427,6 +427,8 @@ struct iio_trigger; /* forward declaration */ > * @write_event_config: set if the event is enabled. > * @read_event_value: read a configuration value associated with the event. > * @write_event_value: write a configuration value for the event. > + * @read_event_label: function to request label name for a specified label, > + * for better event identification. > * @validate_trigger: function to validate the trigger when the > * current trigger gets changed. > * @update_scan_mode: function to configure device and scan buffer when > @@ -511,6 +513,12 @@ struct iio_info { > enum iio_event_direction dir, > enum iio_event_info info, int val, int val2); > > + int (*read_event_label)(struct iio_dev *indio_dev, > + struct iio_chan_spec const *chan, > + enum iio_event_type type, > + enum iio_event_direction dir, > + char *label); > + > int (*validate_trigger)(struct iio_dev *indio_dev, > struct iio_trigger *trig); > int (*update_scan_mode)(struct iio_dev *indio_dev, >