Message ID | 20240620211310.820579-2-sean.anderson@linux.dev (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | hwmon: iio: Add labels | expand |
On Thu, 20 Jun 2024 17:13:08 -0400 Sean Anderson <sean.anderson@linux.dev> wrote: > It can be convenient for other in-kernel drivers to reuse IIO channel > labels. Export the iio_read_channel_label function to allow this. The > signature is different depending on where we are calling it from, so > the meat is moved to do_iio_read_channel_label. > > Signed-off-by: Sean Anderson <sean.anderson@linux.dev> Seems like a useful addition to me. I'm not 100% what path this will take so if it goes via HWMON. Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> It may be messy and need an immutable branch however. I haven't checked for churn in this code yet. > --- > > drivers/iio/iio_core.h | 4 ++++ > drivers/iio/industrialio-core.c | 23 ++++++++++++++--------- > drivers/iio/inkern.c | 6 ++++++ > include/linux/iio/consumer.h | 10 ++++++++++ > 4 files changed, 34 insertions(+), 9 deletions(-) > > diff --git a/drivers/iio/iio_core.h b/drivers/iio/iio_core.h > index 1a38b1915e7a..b7d5f4f0fada 100644 > --- a/drivers/iio/iio_core.h > +++ b/drivers/iio/iio_core.h > @@ -34,6 +34,10 @@ void iio_device_ioctl_handler_register(struct iio_dev *indio_dev, > struct iio_ioctl_handler *h); > void iio_device_ioctl_handler_unregister(struct iio_ioctl_handler *h); > > +ssize_t do_iio_read_channel_label(struct iio_dev *indio_dev, > + const struct iio_chan_spec *c, > + char *buf); > + > int __iio_add_chan_devattr(const char *postfix, > struct iio_chan_spec const *chan, > ssize_t (*func)(struct device *dev, > diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c > index 2f185b386949..0f6cda7ffe45 100644 > --- a/drivers/iio/industrialio-core.c > +++ b/drivers/iio/industrialio-core.c > @@ -727,22 +727,27 @@ ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals) > } > EXPORT_SYMBOL_GPL(iio_format_value); > > -static ssize_t iio_read_channel_label(struct device *dev, > - struct device_attribute *attr, > - char *buf) > +ssize_t do_iio_read_channel_label(struct iio_dev *indio_dev, > + const struct iio_chan_spec *c, > + 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_label) > - return indio_dev->info->read_label(indio_dev, this_attr->c, buf); > + return indio_dev->info->read_label(indio_dev, c, buf); > > - if (this_attr->c->extend_name) > - return sysfs_emit(buf, "%s\n", this_attr->c->extend_name); > + if (c->extend_name) > + return sysfs_emit(buf, "%s\n", c->extend_name); > > return -EINVAL; > } > > +static ssize_t iio_read_channel_label(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + return do_iio_read_channel_label(dev_to_iio_dev(dev), > + to_iio_dev_attr(attr)->c, buf); > +} > + > static ssize_t iio_read_channel_info(struct device *dev, > struct device_attribute *attr, > char *buf) > diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c > index 39cf26d69d17..9f484c94bc6e 100644 > --- a/drivers/iio/inkern.c > +++ b/drivers/iio/inkern.c > @@ -1010,3 +1010,9 @@ ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, > chan->channel, buf, len); > } > EXPORT_SYMBOL_GPL(iio_write_channel_ext_info); > + > +ssize_t iio_read_channel_label(struct iio_channel *chan, char *buf) > +{ > + return do_iio_read_channel_label(chan->indio_dev, chan->channel, buf); > +} > +EXPORT_SYMBOL_GPL(iio_read_channel_label); > diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h > index e9910b41d48e..333d1d8ccb37 100644 > --- a/include/linux/iio/consumer.h > +++ b/include/linux/iio/consumer.h > @@ -441,4 +441,14 @@ ssize_t iio_read_channel_ext_info(struct iio_channel *chan, > ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, > const char *buf, size_t len); > > +/** > + * iio_read_channel_label() - read label for a given channel > + * @chan: The channel being queried. > + * @buf: Where to store the attribute value. Assumed to hold > + * at least PAGE_SIZE bytes. > + * > + * Returns the number of bytes written to buf, or an error code. > + */ > +ssize_t iio_read_channel_label(struct iio_channel *chan, char *buf); > + > #endif
diff --git a/drivers/iio/iio_core.h b/drivers/iio/iio_core.h index 1a38b1915e7a..b7d5f4f0fada 100644 --- a/drivers/iio/iio_core.h +++ b/drivers/iio/iio_core.h @@ -34,6 +34,10 @@ void iio_device_ioctl_handler_register(struct iio_dev *indio_dev, struct iio_ioctl_handler *h); void iio_device_ioctl_handler_unregister(struct iio_ioctl_handler *h); +ssize_t do_iio_read_channel_label(struct iio_dev *indio_dev, + const struct iio_chan_spec *c, + char *buf); + int __iio_add_chan_devattr(const char *postfix, struct iio_chan_spec const *chan, ssize_t (*func)(struct device *dev, diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index 2f185b386949..0f6cda7ffe45 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -727,22 +727,27 @@ ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals) } EXPORT_SYMBOL_GPL(iio_format_value); -static ssize_t iio_read_channel_label(struct device *dev, - struct device_attribute *attr, - char *buf) +ssize_t do_iio_read_channel_label(struct iio_dev *indio_dev, + const struct iio_chan_spec *c, + 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_label) - return indio_dev->info->read_label(indio_dev, this_attr->c, buf); + return indio_dev->info->read_label(indio_dev, c, buf); - if (this_attr->c->extend_name) - return sysfs_emit(buf, "%s\n", this_attr->c->extend_name); + if (c->extend_name) + return sysfs_emit(buf, "%s\n", c->extend_name); return -EINVAL; } +static ssize_t iio_read_channel_label(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return do_iio_read_channel_label(dev_to_iio_dev(dev), + to_iio_dev_attr(attr)->c, buf); +} + static ssize_t iio_read_channel_info(struct device *dev, struct device_attribute *attr, char *buf) diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 39cf26d69d17..9f484c94bc6e 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c @@ -1010,3 +1010,9 @@ ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, chan->channel, buf, len); } EXPORT_SYMBOL_GPL(iio_write_channel_ext_info); + +ssize_t iio_read_channel_label(struct iio_channel *chan, char *buf) +{ + return do_iio_read_channel_label(chan->indio_dev, chan->channel, buf); +} +EXPORT_SYMBOL_GPL(iio_read_channel_label); diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h index e9910b41d48e..333d1d8ccb37 100644 --- a/include/linux/iio/consumer.h +++ b/include/linux/iio/consumer.h @@ -441,4 +441,14 @@ ssize_t iio_read_channel_ext_info(struct iio_channel *chan, ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, const char *buf, size_t len); +/** + * iio_read_channel_label() - read label for a given channel + * @chan: The channel being queried. + * @buf: Where to store the attribute value. Assumed to hold + * at least PAGE_SIZE bytes. + * + * Returns the number of bytes written to buf, or an error code. + */ +ssize_t iio_read_channel_label(struct iio_channel *chan, char *buf); + #endif
It can be convenient for other in-kernel drivers to reuse IIO channel labels. Export the iio_read_channel_label function to allow this. The signature is different depending on where we are calling it from, so the meat is moved to do_iio_read_channel_label. Signed-off-by: Sean Anderson <sean.anderson@linux.dev> --- drivers/iio/iio_core.h | 4 ++++ drivers/iio/industrialio-core.c | 23 ++++++++++++++--------- drivers/iio/inkern.c | 6 ++++++ include/linux/iio/consumer.h | 10 ++++++++++ 4 files changed, 34 insertions(+), 9 deletions(-)