From nobody Fri Apr 3 01:22:51 2026 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A1E23CF04D for ; Wed, 25 Mar 2026 11:09:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774436991; cv=none; b=dO8klepuruwnwSunSjXr1Mb1ULnp3Z25NI1K0zq6PF9NbVLDvxgaDGjHsw1Ds4ioWm/o1h8N1nDo2mhPhIRbFfKZUfPpTkWiDWCsR3r5bjE7zgN9kd/FFZJ3CEdAlNiWudJO42U4kzq/52VeZ+pnLScSgCcc95kcBp2fq8Ja6EE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774436991; c=relaxed/simple; bh=W7zUZDtGNn20lMvdnvzQKIeaqO3L7T2YvE8j3vlT8QY=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version:Content-Type; b=J86laV63g5oOFYdLtOV/3Gf3rUqGZK0rDZRvk6Lgn3U95IrXqcW5AOTZzBwAoKoyS5r3Rz+ZUA0iSXV0esuFBB0LQtWZksf+IQ5NF+LQ/mMnQ9cogO/PamjVvjkX2PRc7MMWvPSJR798eYY2TyPC2ciobDjea5VAcuGgctLY30M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=C4c8d5/M; arc=none smtp.client-ip=209.85.221.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C4c8d5/M" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-439b9cf8cb5so2662485f8f.0 for ; Wed, 25 Mar 2026 04:09:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774436985; x=1775041785; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=uVK4wjtaqmG3ZXCPVMVUf5h3phFobdBtD0gg2Af7Zb8=; b=C4c8d5/M2ugcwRoA1z33G6uXZCzU5veRhVBJm76WRf5PnE/hT0jYjiznQrtPINUldt IRuigQ7weuTbKuv9K2kbYsbN1e2It7c7WMmx52LOk5fcrgB/kLzzZZ22nnpKdaWwX1+f 6/A7biIOBI0+8Wgwm2vnYpqjiwa/i++Xe0i4OQACLBzddu4RnQvQeV0LgBlaFl214/AW CbY7vXfdSHseDpHzJ41k++OQnuO6xjuJHfyejORwGssvwmQdjyjoVO1Nie8DP2KJiPmA 7aCFabRd5d9ESQskBT5CalNw5HRJJzElqvJh1+i2uEdMK879cqsyA4KyJROLd39rwAFu DZKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774436985; x=1775041785; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=uVK4wjtaqmG3ZXCPVMVUf5h3phFobdBtD0gg2Af7Zb8=; b=sE6vHNwRY1+J1ckEaT2i7BKvdSBlrXVf8Z7UQqPA70mMmSWp9pYH/C20B/4vwkBmzl O1dIlCC+Ur1FhquphnMs3u9AU3c/lomq31JTVLui8gSJjn4KSarCx1z5pjxnlRIExP1l b/2cQKrhVI2HIMVWNoW1LVpbkb4HJj6u5vfrJPC8k8krPQV5btscgoAet1BAmeCJ4OiS BBaUy9WrDr61bSavimAxfjV0YgXyc9nZep2SNVwdrQxT4w5Fpy55WpsJ4aaT/FeNqtBb WJC1mBL4JBzjDlEflbsbJ+zB2FDouA8Uwh+U/aoZOkrX4wG92CJk4pDROvN28ptyWfjf 2JwA== X-Forwarded-Encrypted: i=1; AJvYcCXKpy3CzczHfAiInDp7MdJXdSfJH9heQ1wf+3hN5GWLkiruuvZUhRPaKoB1phDCzNLszMJgbG5W1mun15g=@vger.kernel.org X-Gm-Message-State: AOJu0YzKQGb3p6ubnpgjx13BoizOyt8mQJHc3uXyOaDweziD3pvoHLSL qtaZIwvOiu8spZy0YyZQbdooWKpB2NDc1Yowh4yC0T363ny29hYJ0EjD X-Gm-Gg: ATEYQzyKG8GlNN5Js1+zPRGXA4oaavl5+mQOvVEH/C9sxuzlFjpqWBKtmk/x+bzhPEG mNoMk6LQ4gg7RQRDPfFkc39lk5fJdSRDA1eoZNOmVBUIZkL1qFOjA3nsCwvu9JCh/YTQ6ebPygz dBH5hDkwawROXKMEweYOGp/iEGNCxLBtsL6kUIOPaWxWnbLJ91OAiyAqX3XKVC3+lq6niq4axb0 9BeYW1Avweheco8Lkm2/mx42ikYQqEl1FyxEiz8pR3P9Ktwi31URsX+zkLRbGn2vPc1fhiqnjbD SMl+GMhzAHSDbq9U58YZqsFEvdphcHWBeogSIf5VLyiVDkl8yRoL9gJs74qCmlmqeaHdqwbBpHX xQ1AxAa3EYv7oc3JNJcLj14kSDYdCFg5hkzPhixOLA/MkW2Fulw3Anpaeg1NeHm+0Jx2U1SiLHZ VyMTBNFKTc/P327J5zlN3DS8TiBkYHJFH7yanT9+DDxu5MAR4vvJTI X-Received: by 2002:a05:600c:45d4:b0:487:1114:d42f with SMTP id 5b1f17b1804b1-48715fd4aa6mr45424655e9.1.1774436985034; Wed, 25 Mar 2026 04:09:45 -0700 (PDT) Received: from localhost.localdomain ([2001:8a0:6c9b:a000:28db:f3e8:2f9b:ca58]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48711701804sm125621605e9.4.2026.03.25.04.09.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Mar 2026 04:09:44 -0700 (PDT) From: Gabriel Rondon To: Jonathan Cameron Cc: David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] iio: adc: ti-ads8688: use read_avail for available attributes Date: Wed, 25 Mar 2026 11:09:42 +0000 Message-Id: <20260325110942.65337-1-grondon@gmail.com> X-Mailer: git-send-email 2.33.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Convert the in_voltage_scale_available and in_voltage_offset_available attributes from legacy IIO_DEVICE_ATTR with custom show functions to the IIO framework's read_avail callback. This uses the framework's built-in support for _available attributes, removing the need for manual sysfs formatting. Precompute the available scale values at probe time since they depend on the reference voltage which does not change after initialization. Reviewed-by: Nuno S=C3=A1 Signed-off-by: Gabriel Rondon --- Changes in v2: - Use -BIT() macro instead of -(1 << ...) to avoid potential UB and improve readability (Andy Shevchenko) - Remove trailing comma from offset_avail array (Andy Shevchenko) - Declare loop counter as unsigned int in for() (Andy Shevchenko, Nuno S=C3= =A1) - Keep scale_avail assignment on a single line (Andy Shevchenko, Nuno S=C3= =A1) drivers/iio/adc/ti-ads8688.c | 70 +++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/drivers/iio/adc/ti-ads8688.c b/drivers/iio/adc/ti-ads8688.c index b0bf46cae..31c43a4cb 100644 --- a/drivers/iio/adc/ti-ads8688.c +++ b/drivers/iio/adc/ti-ads8688.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -17,7 +16,6 @@ #include #include #include -#include =20 #define ADS8688_CMD_REG(x) (x << 8) #define ADS8688_CMD_REG_NOOP 0x00 @@ -66,6 +64,7 @@ struct ads8688_state { const struct ads8688_chip_info *chip_info; struct spi_device *spi; unsigned int vref_mv; + int scale_avail[3][2]; enum ads8688_range range[8]; union { __be32 d32; @@ -114,37 +113,9 @@ static const struct ads8688_ranges ads8688_range_def[5= ] =3D { } }; =20 -static ssize_t ads8688_show_scales(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct ads8688_state *st =3D iio_priv(dev_to_iio_dev(dev)); - - return sprintf(buf, "0.%09u 0.%09u 0.%09u\n", - ads8688_range_def[0].scale * st->vref_mv, - ads8688_range_def[1].scale * st->vref_mv, - ads8688_range_def[2].scale * st->vref_mv); -} - -static ssize_t ads8688_show_offsets(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%d %d\n", ads8688_range_def[0].offset, - ads8688_range_def[3].offset); -} - -static IIO_DEVICE_ATTR(in_voltage_scale_available, S_IRUGO, - ads8688_show_scales, NULL, 0); -static IIO_DEVICE_ATTR(in_voltage_offset_available, S_IRUGO, - ads8688_show_offsets, NULL, 0); - -static struct attribute *ads8688_attributes[] =3D { - &iio_dev_attr_in_voltage_scale_available.dev_attr.attr, - &iio_dev_attr_in_voltage_offset_available.dev_attr.attr, - NULL, -}; - -static const struct attribute_group ads8688_attribute_group =3D { - .attrs =3D ads8688_attributes, +static const int ads8688_offset_avail[] =3D { + -BIT(ADS8688_REALBITS - 1), + 0 }; =20 #define ADS8688_CHAN(index) \ @@ -155,6 +126,9 @@ static const struct attribute_group ads8688_attribute_g= roup =3D { .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) \ | BIT(IIO_CHAN_INFO_SCALE) \ | BIT(IIO_CHAN_INFO_OFFSET), \ + .info_mask_shared_by_type_available =3D \ + BIT(IIO_CHAN_INFO_SCALE) \ + | BIT(IIO_CHAN_INFO_OFFSET), \ .scan_index =3D index, \ .scan_type =3D { \ .sign =3D 'u', \ @@ -369,11 +343,34 @@ static int ads8688_write_raw_get_fmt(struct iio_dev *= indio_dev, return -EINVAL; } =20 +static int ads8688_read_avail(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + const int **vals, int *type, int *length, + long mask) +{ + struct ads8688_state *st =3D iio_priv(indio_dev); + + switch (mask) { + case IIO_CHAN_INFO_SCALE: + *vals =3D (const int *)st->scale_avail; + *type =3D IIO_VAL_INT_PLUS_NANO; + *length =3D ARRAY_SIZE(st->scale_avail) * 2; + return IIO_AVAIL_LIST; + case IIO_CHAN_INFO_OFFSET: + *vals =3D ads8688_offset_avail; + *type =3D IIO_VAL_INT; + *length =3D ARRAY_SIZE(ads8688_offset_avail); + return IIO_AVAIL_LIST; + default: + return -EINVAL; + } +} + static const struct iio_info ads8688_info =3D { .read_raw =3D &ads8688_read_raw, + .read_avail =3D &ads8688_read_avail, .write_raw =3D &ads8688_write_raw, .write_raw_get_fmt =3D &ads8688_write_raw_get_fmt, - .attrs =3D &ads8688_attribute_group, }; =20 static irqreturn_t ads8688_trigger_handler(int irq, void *p) @@ -426,6 +423,11 @@ static int ads8688_probe(struct spi_device *spi) =20 st->vref_mv =3D ret =3D=3D -ENODEV ? ADS8688_VREF_MV : ret / 1000; =20 + for (unsigned int i =3D 0; i < ARRAY_SIZE(st->scale_avail); i++) { + st->scale_avail[i][0] =3D 0; + st->scale_avail[i][1] =3D ads8688_range_def[i].scale * st->vref_mv; + } + st->chip_info =3D &ads8688_chip_info_tbl[spi_get_device_id(spi)->driver_d= ata]; =20 spi->mode =3D SPI_MODE_1; --=20 2.33.0