From patchwork Thu Jun 10 12:45:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Cercueil X-Patchwork-Id: 12313049 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D31B9C47094 for ; Thu, 10 Jun 2021 12:46:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B839F61184 for ; Thu, 10 Jun 2021 12:46:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230374AbhFJMsM (ORCPT ); Thu, 10 Jun 2021 08:48:12 -0400 Received: from aposti.net ([89.234.176.197]:54506 "EHLO aposti.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230265AbhFJMsL (ORCPT ); Thu, 10 Jun 2021 08:48:11 -0400 From: Paul Cercueil To: Jonathan Cameron Cc: Lars-Peter Clausen , Michael Hennerich , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Cercueil Subject: [PATCH 1/2] iio: core: Support removing extended name in attribute filename Date: Thu, 10 Jun 2021 13:45:55 +0100 Message-Id: <20210610124556.34507-2-paul@crapouillou.net> In-Reply-To: <20210610124556.34507-1-paul@crapouillou.net> References: <20210610124556.34507-1-paul@crapouillou.net> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org By default, when a channel has an extended name, it will appear in the filename of channel attributes. E.g. if the extended name is "aux", the filename of a "sample_rate" attribute will be something like: in_voltage0_aux_sample_rate Add a mechanism to disable this feature. This will be used to add a "extended_name" channel attribute. Signed-off-by: Paul Cercueil --- drivers/iio/iio_core.h | 3 ++- drivers/iio/industrialio-buffer.c | 12 ++++++++---- drivers/iio/industrialio-core.c | 32 ++++++++++++++++++++----------- drivers/iio/industrialio-event.c | 3 ++- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/drivers/iio/iio_core.h b/drivers/iio/iio_core.h index 8f4a9b264962..2e1a251d5550 100644 --- a/drivers/iio/iio_core.h +++ b/drivers/iio/iio_core.h @@ -50,7 +50,8 @@ int __iio_add_chan_devattr(const char *postfix, enum iio_shared_by shared_by, struct device *dev, struct iio_buffer *buffer, - struct list_head *attr_list); + struct list_head *attr_list, + bool extend_name); void iio_free_chan_devattr_list(struct list_head *attr_list); int iio_device_register_sysfs_group(struct iio_dev *indio_dev, diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 9a8e16c7e9af..053f8896c81c 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c @@ -492,7 +492,8 @@ static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev, IIO_SEPARATE, &indio_dev->dev, buffer, - &buffer->buffer_attr_list); + &buffer->buffer_attr_list, + true); if (ret) return ret; attrcount++; @@ -504,7 +505,8 @@ static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev, 0, &indio_dev->dev, buffer, - &buffer->buffer_attr_list); + &buffer->buffer_attr_list, + true); if (ret) return ret; attrcount++; @@ -517,7 +519,8 @@ static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev, 0, &indio_dev->dev, buffer, - &buffer->buffer_attr_list); + &buffer->buffer_attr_list, + true); else ret = __iio_add_chan_devattr("en", chan, @@ -527,7 +530,8 @@ static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev, 0, &indio_dev->dev, buffer, - &buffer->buffer_attr_list); + &buffer->buffer_attr_list, + true); if (ret) return ret; attrcount++; diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index 59efb36db2c7..ec34d930920c 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -981,7 +981,8 @@ int __iio_device_attr_init(struct device_attribute *dev_attr, struct device_attribute *attr, const char *buf, size_t len), - enum iio_shared_by shared_by) + enum iio_shared_by shared_by, + bool extend_name) { int ret = 0; char *name = NULL; @@ -990,25 +991,28 @@ int __iio_device_attr_init(struct device_attribute *dev_attr, /* Build up postfix of __postfix */ if (chan->modified && (shared_by == IIO_SEPARATE)) { - if (chan->extend_name) + if (extend_name && chan->extend_name) { full_postfix = kasprintf(GFP_KERNEL, "%s_%s_%s", iio_modifier_names[chan ->channel2], chan->extend_name, postfix); - else + } else { full_postfix = kasprintf(GFP_KERNEL, "%s_%s", iio_modifier_names[chan ->channel2], postfix); + } } else { - if (chan->extend_name == NULL || shared_by != IIO_SEPARATE) + if (!extend_name || chan->extend_name == NULL + || shared_by != IIO_SEPARATE) { full_postfix = kstrdup(postfix, GFP_KERNEL); - else + } else { full_postfix = kasprintf(GFP_KERNEL, "%s_%s", chan->extend_name, postfix); + } } if (full_postfix == NULL) return -ENOMEM; @@ -1118,7 +1122,8 @@ int __iio_add_chan_devattr(const char *postfix, enum iio_shared_by shared_by, struct device *dev, struct iio_buffer *buffer, - struct list_head *attr_list) + struct list_head *attr_list, + bool extend_name) { int ret; struct iio_dev_attr *iio_attr, *t; @@ -1128,7 +1133,8 @@ int __iio_add_chan_devattr(const char *postfix, return -ENOMEM; ret = __iio_device_attr_init(&iio_attr->dev_attr, postfix, chan, - readfunc, writefunc, shared_by); + readfunc, writefunc, + shared_by, extend_name); if (ret) goto error_iio_dev_attr_free; iio_attr->c = chan; @@ -1171,7 +1177,8 @@ static int iio_device_add_channel_label(struct iio_dev *indio_dev, IIO_SEPARATE, &indio_dev->dev, NULL, - &iio_dev_opaque->channel_attr_list); + &iio_dev_opaque->channel_attr_list, + true); if (ret < 0) return ret; @@ -1197,7 +1204,8 @@ static int iio_device_add_info_mask_type(struct iio_dev *indio_dev, shared_by, &indio_dev->dev, NULL, - &iio_dev_opaque->channel_attr_list); + &iio_dev_opaque->channel_attr_list, + true); if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) continue; else if (ret < 0) @@ -1234,7 +1242,8 @@ static int iio_device_add_info_mask_type_avail(struct iio_dev *indio_dev, shared_by, &indio_dev->dev, NULL, - &iio_dev_opaque->channel_attr_list); + &iio_dev_opaque->channel_attr_list, + true); kfree(avail_postfix); if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) continue; @@ -1331,7 +1340,8 @@ static int iio_device_add_channel_sysfs(struct iio_dev *indio_dev, ext_info->shared, &indio_dev->dev, NULL, - &iio_dev_opaque->channel_attr_list); + &iio_dev_opaque->channel_attr_list, + true); i++; if (ret == -EBUSY && ext_info->shared) continue; diff --git a/drivers/iio/industrialio-event.c b/drivers/iio/industrialio-event.c index d0732eac0f0a..e693d1374c9b 100644 --- a/drivers/iio/industrialio-event.c +++ b/drivers/iio/industrialio-event.c @@ -387,7 +387,8 @@ static int iio_device_add_event(struct iio_dev *indio_dev, ret = __iio_add_chan_devattr(postfix, chan, show, store, (i << 16) | spec_index, shared_by, &indio_dev->dev, NULL, - &iio_dev_opaque->event_interface->dev_attr_list); + &iio_dev_opaque->event_interface->dev_attr_list, + true); kfree(postfix); if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) From patchwork Thu Jun 10 12:45:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Cercueil X-Patchwork-Id: 12313051 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 73C0BC47094 for ; Thu, 10 Jun 2021 12:46:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 576EE61184 for ; Thu, 10 Jun 2021 12:46:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230383AbhFJMsU (ORCPT ); Thu, 10 Jun 2021 08:48:20 -0400 Received: from aposti.net ([89.234.176.197]:54540 "EHLO aposti.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230396AbhFJMsS (ORCPT ); Thu, 10 Jun 2021 08:48:18 -0400 From: Paul Cercueil To: Jonathan Cameron Cc: Lars-Peter Clausen , Michael Hennerich , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Paul Cercueil Subject: [PATCH 2/2] iio: core: Add "extended_name" attribute to all channels Date: Thu, 10 Jun 2021 13:45:56 +0100 Message-Id: <20210610124556.34507-3-paul@crapouillou.net> In-Reply-To: <20210610124556.34507-1-paul@crapouillou.net> References: <20210610124556.34507-1-paul@crapouillou.net> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org The point of this new attribute is to make the IIO tree actually parsable. Before, given this attribute as a filename: in_voltage0_aux_sample_rate Userspace had no way to know if the attribute name was "aux_sample_rate" with no extended name, or "sample_rate" with "aux" as the extended name, or just "rate" with "aux_sample" as the extended name. This was somewhat possible to deduce when there was more than one attribute present for a given channel, e.g: in_voltage0_aux_sample_rate in_voltage0_aux_frequency There, it was possible to deduce that "aux" was the extended name. But even with more than one attribute, this wasn't very robust, as two attributes starting with the same prefix (e.g. "sample_rate" and "sample_size") would result in the first part of the prefix being interpreted as being part of the extended name. To address this issue, add an "extended_name" attribute to all channels that actually do have an extended name. For this attribute, the extended name is not present in the filename; so in this example, the file name would be "in_voltage0_extended_name", and reading it would return "aux". Signed-off-by: Paul Cercueil --- drivers/iio/industrialio-core.c | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index ec34d930920c..4cdf9f092d73 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -723,6 +723,16 @@ static ssize_t iio_read_channel_label(struct device *dev, return indio_dev->info->read_label(indio_dev, this_attr->c, buf); } +static ssize_t iio_read_channel_extended_name(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + const struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); + const struct iio_chan_spec *chan = this_attr->c; + + return sprintf(buf, "%s\n", chan->extend_name); +} + static ssize_t iio_read_channel_info(struct device *dev, struct device_attribute *attr, char *buf) @@ -1185,6 +1195,32 @@ static int iio_device_add_channel_label(struct iio_dev *indio_dev, return 1; } +static int +iio_device_add_channel_extended_name(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan) +{ + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); + int ret; + + if (!chan->extend_name) + return 0; + + ret = __iio_add_chan_devattr("extended_name", + chan, + &iio_read_channel_extended_name, + NULL, + 0, + IIO_SEPARATE, + &indio_dev->dev, + NULL, + &iio_dev_opaque->channel_attr_list, + false); + if (ret < 0) + return ret; + + return 1; +} + static int iio_device_add_info_mask_type(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, enum iio_shared_by shared_by, @@ -1327,6 +1363,11 @@ static int iio_device_add_channel_sysfs(struct iio_dev *indio_dev, return ret; attrcount += ret; + ret = iio_device_add_channel_extended_name(indio_dev, chan); + if (ret < 0) + return ret; + attrcount += ret; + if (chan->ext_info) { unsigned int i = 0; for (ext_info = chan->ext_info; ext_info->name; ext_info++) {