From: "Nuno Sá" <noname.nuno@gmail.com>
To: rodrigo.alencar@analog.com
Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
linux-hardening@vger.kernel.org,
Lars-Peter Clausen <lars@metafoo.de>,
Michael Hennerich <Michael.Hennerich@analog.com>,
Jonathan Cameron <jic23@kernel.org>,
David Lechner <dlechner@baylibre.com>,
Andy Shevchenko <andy@kernel.org>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Philipp Zabel <p.zabel@pengutronix.de>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Kees Cook <kees@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>
Subject: Re: [PATCH v6 06/16] iio: core: create local __iio_chan_prefix_emit() for reuse
Date: Thu, 18 Jun 2026 16:06:27 +0100 [thread overview]
Message-ID: <ajQGTQ1_qcOwfzne@nsa> (raw)
In-Reply-To: <20260618-ad9910-iio-driver-v6-6-79125ffbe430@analog.com>
On Thu, Jun 18, 2026 at 02:27:22PM +0100, Rodrigo Alencar via B4 Relay wrote:
> From: Rodrigo Alencar <rodrigo.alencar@analog.com>
>
> Move logic to create a channel prefix for naming attribute files into a
> separate __iio_chan_prefix_emit() function for reuse.
>
> Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
> ---
> drivers/iio/industrialio-core.c | 167 ++++++++++++++++------------------------
> 1 file changed, 68 insertions(+), 99 deletions(-)
>
> diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
> index 03019bf9327b..9373006235c8 100644
> --- a/drivers/iio/industrialio-core.c
> +++ b/drivers/iio/industrialio-core.c
> @@ -26,6 +26,7 @@
> #include <linux/property.h>
> #include <linux/sched.h>
> #include <linux/slab.h>
> +#include <linux/sprintf.h>
> #include <linux/wait.h>
>
> #include <linux/iio/buffer.h>
> @@ -199,6 +200,64 @@ static const char * const iio_chan_info_postfix[] = {
> [IIO_CHAN_INFO_CONVDELAY] = "convdelay",
> [IIO_CHAN_INFO_POWERFACTOR] = "powerfactor",
> };
> +
> +static int __iio_chan_prefix_emit(const struct iio_chan_spec *chan,
> + enum iio_shared_by shared_by,
> + char *buf, size_t len)
> +{
> + const char *dir = iio_direction[chan->output];
> + const char *type = iio_chan_type_name_spec[chan->type];
> + int n = 0;
> +
> + switch (shared_by) {
> + case IIO_SHARED_BY_ALL:
> + buf[0] = '\0'; /* empty channel prefix */
> + break;
> + case IIO_SHARED_BY_DIR:
> + n = scnprintf(buf, len, "%s", dir);
> + break;
> + case IIO_SHARED_BY_TYPE:
> + n = scnprintf(buf, len, "%s_%s", dir, type);
> + if (chan->differential)
> + n += scnprintf(buf + n, len - n, "-%s", type);
> + break;
> + case IIO_SEPARATE:
> + if (chan->indexed) {
> + n = scnprintf(buf, len, "%s_%s%d", dir, type,
> + chan->channel);
> + if (chan->differential)
> + n += scnprintf(buf + n, len - n, "-%s%d", type,
> + chan->channel2);
> + } else {
> + if (chan->differential) {
> + WARN(1, "Differential channels must be indexed\n");
> + return -EINVAL;
> + }
> + n = scnprintf(buf, len, "%s_%s", dir, type);
> + }
> +
> + if (chan->modified) {
> + if (chan->differential) {
> + WARN(1, "Differential channels can not have modifier\n");
> + return -EINVAL;
WARN() looks too much to me. dev_error() as we're treating it as such. I
guess you don't want to pass struct device but not really an issue IMHO.
> + }
> + n += scnprintf(buf + n, len - n, "_%s",
> + iio_modifier_names[chan->channel2]);
> + }
> +
> + if (chan->extend_name)
> + n += scnprintf(buf + n, len - n, "_%s", chan->extend_name);
> + break;
> + }
> +
> + if (n > 0 && n < len - 1) { /* prefix termination if not empty */
> + buf[n++] = '_';
> + buf[n] = '\0';
> + }
> +
Can't we handle the above in the caller on kasprintf()? Then we could
simplify and return in place.
> + return n;
> +}
> +
> /**
> * iio_device_id() - query the unique ID for the device
> * @indio_dev: Device structure whose ID is being queried
> @@ -1100,106 +1159,19 @@ int __iio_device_attr_init(struct device_attribute *dev_attr,
> size_t len),
> enum iio_shared_by shared_by)
> {
> - int ret = 0;
> - char *name = NULL;
> - char *full_postfix;
> + char prefix[NAME_MAX + 1];
> + int ret;
>
> sysfs_attr_init(&dev_attr->attr);
>
> - /* Build up postfix of <extend_name>_<modifier>_postfix */
> - if (chan->modified && (shared_by == IIO_SEPARATE)) {
> - if (chan->extend_name)
> - full_postfix = kasprintf(GFP_KERNEL, "%s_%s_%s",
> - iio_modifier_names[chan->channel2],
> - chan->extend_name,
> - postfix);
> - else
> - full_postfix = kasprintf(GFP_KERNEL, "%s_%s",
> - iio_modifier_names[chan->channel2],
> - postfix);
> - } else {
> - if (chan->extend_name == NULL || shared_by != IIO_SEPARATE)
> - full_postfix = kstrdup(postfix, GFP_KERNEL);
> - else
> - full_postfix = kasprintf(GFP_KERNEL,
> - "%s_%s",
> - chan->extend_name,
> - postfix);
> - }
> - if (full_postfix == NULL)
> + ret = __iio_chan_prefix_emit(chan, shared_by, prefix, sizeof(prefix));
> + if (ret < 0)
> + return ret;
> +
> + dev_attr->attr.name = kasprintf(GFP_KERNEL, "%s%s", prefix, postfix);
> + if (!dev_attr->attr.name)
> return -ENOMEM;
I don't oppose the change. Looks like a nice cleanup. But bear in mind
this very sensible as any subtle mistake means ABI breakage.
- Nuno Sá
>
> - if (chan->differential) { /* Differential can not have modifier */
> - switch (shared_by) {
> - case IIO_SHARED_BY_ALL:
> - name = kasprintf(GFP_KERNEL, "%s", full_postfix);
> - break;
> - case IIO_SHARED_BY_DIR:
> - name = kasprintf(GFP_KERNEL, "%s_%s",
> - iio_direction[chan->output],
> - full_postfix);
> - break;
> - case IIO_SHARED_BY_TYPE:
> - name = kasprintf(GFP_KERNEL, "%s_%s-%s_%s",
> - iio_direction[chan->output],
> - iio_chan_type_name_spec[chan->type],
> - iio_chan_type_name_spec[chan->type],
> - full_postfix);
> - break;
> - case IIO_SEPARATE:
> - if (!chan->indexed) {
> - WARN(1, "Differential channels must be indexed\n");
> - ret = -EINVAL;
> - goto error_free_full_postfix;
> - }
> - name = kasprintf(GFP_KERNEL,
> - "%s_%s%d-%s%d_%s",
> - iio_direction[chan->output],
> - iio_chan_type_name_spec[chan->type],
> - chan->channel,
> - iio_chan_type_name_spec[chan->type],
> - chan->channel2,
> - full_postfix);
> - break;
> - }
> - } else { /* Single ended */
> - switch (shared_by) {
> - case IIO_SHARED_BY_ALL:
> - name = kasprintf(GFP_KERNEL, "%s", full_postfix);
> - break;
> - case IIO_SHARED_BY_DIR:
> - name = kasprintf(GFP_KERNEL, "%s_%s",
> - iio_direction[chan->output],
> - full_postfix);
> - break;
> - case IIO_SHARED_BY_TYPE:
> - name = kasprintf(GFP_KERNEL, "%s_%s_%s",
> - iio_direction[chan->output],
> - iio_chan_type_name_spec[chan->type],
> - full_postfix);
> - break;
> -
> - case IIO_SEPARATE:
> - if (chan->indexed)
> - name = kasprintf(GFP_KERNEL, "%s_%s%d_%s",
> - iio_direction[chan->output],
> - iio_chan_type_name_spec[chan->type],
> - chan->channel,
> - full_postfix);
> - else
> - name = kasprintf(GFP_KERNEL, "%s_%s_%s",
> - iio_direction[chan->output],
> - iio_chan_type_name_spec[chan->type],
> - full_postfix);
> - break;
> - }
> - }
> - if (name == NULL) {
> - ret = -ENOMEM;
> - goto error_free_full_postfix;
> - }
> - dev_attr->attr.name = name;
> -
> if (readfunc) {
> dev_attr->attr.mode |= 0444;
> dev_attr->show = readfunc;
> @@ -1210,10 +1182,7 @@ int __iio_device_attr_init(struct device_attribute *dev_attr,
> dev_attr->store = writefunc;
> }
>
> -error_free_full_postfix:
> - kfree(full_postfix);
> -
> - return ret;
> + return 0;
> }
>
> static void __iio_device_attr_deinit(struct device_attribute *dev_attr)
>
> --
> 2.43.0
>
>
next prev parent reply other threads:[~2026-06-18 15:05 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-18 13:27 [PATCH v6 00/16] AD9910 Direct Digital Synthesizer Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:27 ` [PATCH v6 01/16] iio: ABI: add attributes for altcurrent channels Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:27 ` [PATCH v6 02/16] iio: ABI: scale and offset for frequency/phase channels Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:27 ` [PATCH v6 03/16] iio: ABI: add parent entry for iio channels Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:27 ` [PATCH v6 04/16] iio: add IIO_FREQUENCY channel type Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:27 ` [PATCH v6 05/16] iio: core: support 64-bit register through debugfs Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 14:45 ` Nuno Sá
2026-06-18 13:27 ` [PATCH v6 06/16] iio: core: create local __iio_chan_prefix_emit() for reuse Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 15:06 ` Nuno Sá [this message]
2026-06-18 16:14 ` Rodrigo Alencar
2026-06-18 18:14 ` Andy Shevchenko
2026-06-18 13:27 ` [PATCH v6 07/16] iio: core: add hierarchical channel relationships Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:33 ` sashiko-bot
2026-06-18 13:27 ` [PATCH v6 08/16] dt-bindings: iio: frequency: add ad9910 Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:35 ` sashiko-bot
2026-06-18 13:27 ` [PATCH v6 09/16] iio: frequency: ad9910: initial driver implementation Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:37 ` sashiko-bot
2026-06-18 13:27 ` [PATCH v6 10/16] iio: frequency: ad9910: add basic parallel port support Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:41 ` sashiko-bot
2026-06-18 13:27 ` [PATCH v6 11/16] iio: frequency: ad9910: add digital ramp generator support Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:42 ` sashiko-bot
2026-06-18 13:27 ` [PATCH v6 12/16] iio: frequency: ad9910: add RAM mode support Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:43 ` sashiko-bot
2026-06-18 13:27 ` [PATCH v6 13/16] iio: frequency: ad9910: add output shift keying support Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:27 ` [PATCH v6 14/16] iio: frequency: ad9910: show channel priority in debugfs Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:45 ` sashiko-bot
2026-06-18 13:27 ` [PATCH v6 15/16] iio: ABI: add docs for ad9910 sysfs entries Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
2026-06-18 13:44 ` sashiko-bot
2026-06-18 13:27 ` [PATCH v6 16/16] docs: iio: add documentation for ad9910 driver Rodrigo Alencar via B4 Relay
2026-06-18 13:27 ` Rodrigo Alencar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ajQGTQ1_qcOwfzne@nsa \
--to=noname.nuno@gmail.com \
--cc=Michael.Hennerich@analog.com \
--cc=andy@kernel.org \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=gustavoars@kernel.org \
--cc=jic23@kernel.org \
--cc=kees@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-doc@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=robh@kernel.org \
--cc=rodrigo.alencar@analog.com \
--cc=skhan@linuxfoundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.