From nobody Fri Apr 3 17:32:20 2026 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) (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 12A8037B032 for ; Mon, 23 Mar 2026 21:56:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774302999; cv=none; b=I4QfrnLXJOmNeEIEnbj/DS6ushf3sWFUboZmSet4xrrDN/eSo9h2i2jzMS9eU5M2w6tnj27TodLPrKLM9Ct/NV6mPXoB7wb+m3a4fphDBRKAGBQevM2WqPynQBjbrHEjzdruWX70TKAA5pS1Bv+wZhDsDSwPDFpjXpgaIVd8Ito= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774302999; c=relaxed/simple; bh=Ujo0Ob23N8hrmFPDyXFf8zYPvDVPzGArh3g9JRIWtbc=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=tl9AnCMcTovJfwsp1j0JoYVBANX8S761G9MvNIfGZ/4YsRgUcTTqnW1RqBHiq4BNmCHXU7ie0SRNKY/tdYSCkuwUgVGM86aFdU0xWD+7ZU1pDVMme5qQshcN8OaSuUamgXrcMA+ONePRIURtWubiHu4stcRodrKeZuwhp3lvaXo= 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=ZdV8ebjV; arc=none smtp.client-ip=209.85.221.53 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="ZdV8ebjV" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-43b467dcf0bso3372317f8f.0 for ; Mon, 23 Mar 2026 14:56:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774302996; x=1774907796; 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=FdniiB3LpgBVWCzDfwMBNKyDPXkUftkwlbzeRzbR+DE=; b=ZdV8ebjVmCF11qbGNOKf24WCbfdqltHTfwOLEoChjS73qXBKIMwaqISKg5RHP6MRMY KnzPfLUGZjbHPRwVzVfh/w5gYfLN1ZXbMJUkLD1tG0U047Ij5GQLWR8SB5PHyIEKdTJM 7Mzk8IRhwzxinX7g5j9Jc+cip21+Bkcl8JVhXcIy8XsEvelARo0bzSLXA6FzgKS0Xvk5 h8NPtgcOAlQsJ0TEQKKwfcBsOEilypmWAY39yqI1ukjHefZlGEg2XHHU5mQjVMz8ldbF 7fC0abDoDS2O3DjOZHEtvJLX06aeG34FnYHKG3SMTYclPi6I0zcw6+OZwAzEEtQmq1oQ RvGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774302996; x=1774907796; 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=FdniiB3LpgBVWCzDfwMBNKyDPXkUftkwlbzeRzbR+DE=; b=qBwijuWrpVCMq9115qm972lflCtvl+gSGgMbMkYh4/eNTe634f1b/mDH8LEcbC0/Ib 0hXTbtuTcjGhG534d7pQ4ELeq3f5OotHs0/dLkKSM6YR9xnGLMYRtBA07m6aAC4ZuHO4 2CpeWMZNqAwgNk7U/MywO059rbBhDvI/Dj40di4PsgvajsvzKMmlVPXYpIILpRBiJniN NxBtI7vjkFkTK/jG945B0Hg7G9BzO6+NRiW9VdqfK6oijP+XysGyPnjMD9bE44y5ScPv voJPOCMEJIp0Vr0fxrnIEhcFqfICBTgMcio4RGfIAKnkaKrU56kQcNSy7MVun7YtthJK C9Pg== X-Forwarded-Encrypted: i=1; AJvYcCXeKc1tI0IKy8SSqe4msurUGYRvnrTe0r6dmzZtUzz/yXqXHhsVegyq0WO2blm1Zo4OFho0FkzZb8beOnY=@vger.kernel.org X-Gm-Message-State: AOJu0Yw2+SXOn8nkTReIJgnUZlU2YySYoqZssDmTHRe+1NFKOFeM8P+D l1PkvqgrSGS2TSfo1TSxQ3ichLnVW/EyRamUxfUcqQUx/+id9yP3A56W X-Gm-Gg: ATEYQzwGdvOLlHGrNswJybSsHYjsUPlRoBwOlR2jtGKfYzVMtZDI1xWqYn8LeQFDz8l 2wCFuGlWvM6wITno3W850NIVWvxE5GqJjH4WCvSuB0t+3BiSnWNQWbTi/xFfzcP2+16wUIeu2Cn yFoVfh1piiEDhnU9l+IKUmGXG4leNpJr9jNCu7qB8FZgvgPPk006yXOMJqJsj2qf0jqj/WnheQR nO0mdU7Kf2JqKgk2HPh2O8CzH1MQOH4zASjVgowMZ1M/4RfCWh5EScbzDna3dnBPEBpBnv3sTDA rJA9qQWWn3arEyThsdAJ4V8AqPIvBiKopmFsVRxB5j8CWNnhkb544W4A6rNGxgOxRNrOGIsXMnL FTV7Nasl5BziuGoZL6sUOjXbzJ2tjiLBexL6CJm9xEwldWoCWsG2w/Z+PFBZLh/nwtrDFNcmQDn R0hFwkjmgPeoXbhd8W7l645ZuhOt1apEAXEbEI8USr/SrRp/MDa6A= X-Received: by 2002:a05:6000:4911:b0:43b:6a49:29fd with SMTP id ffacd0b85a97d-43b805aa9camr1469157f8f.24.1774302996361; Mon, 23 Mar 2026 14:56:36 -0700 (PDT) Received: from localhost.localdomain ([2001:8a0:6c9b:a000:e561:a158:b78:a92e]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43b644ae132sm31597912f8f.6.2026.03.23.14.56.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 14:56:35 -0700 (PDT) From: Gabriel Rondon To: Jonathan Cameron Cc: David Lechner , Nuno Sa , Andy Shevchenko , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] iio: adc: ti-ads8688: use read_avail for available attributes Date: Mon, 23 Mar 2026 21:56:33 +0000 Message-Id: <20260323215633.8140-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-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Gabriel Rondon Reviewed-by: Nuno S=C3=A1 --- drivers/iio/adc/ti-ads8688.c | 73 +++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/drivers/iio/adc/ti-ads8688.c b/drivers/iio/adc/ti-ads8688.c index b0bf46cae..f37098db9 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 { + -(1 << (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) @@ -412,7 +409,7 @@ static int ads8688_probe(struct spi_device *spi) { struct ads8688_state *st; struct iio_dev *indio_dev; - int ret; + int ret, i; =20 indio_dev =3D devm_iio_device_alloc(&spi->dev, sizeof(*st)); if (indio_dev =3D=3D NULL) @@ -426,6 +423,12 @@ static int ads8688_probe(struct spi_device *spi) =20 st->vref_mv =3D ret =3D=3D -ENODEV ? ADS8688_VREF_MV : ret / 1000; =20 + for (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