From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-vk1-f173.google.com (mail-vk1-f173.google.com [209.85.221.173]) (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 2C2B03D7D7A for ; Fri, 12 Jun 2026 22:47:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.173 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781304431; cv=none; b=duDcKgOvzKVP+WlsBrDYlR8P6xwB/sLBDZIGb3070+IJe4cr14BZz2FBalVKw/VfQ6rZ+QDUKXAPzabJZdCz34i1e+UuJyts+GHMBKYOTAvq97eSzrg6VuXjE12gqj7ZCPLb2CMhgS+FpCt9xjVByPMC2wbXlW1FdlQyTyTwpeg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781304431; c=relaxed/simple; bh=EsJT2lMotT/uWF+cKzuNO4c+y11rGpYGsfhS1ED7rJ4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TSyxi0H5wa+xutfRe0MyyqQ6ay8dccPONdbOMiDxSmjS+AEU3Dy2N0/b/1WPW2c1SGO7uB0mtMlB5J/+UDZrns6MJd2Y1JfXHKOHa8j7E3P4hc9L9aTLdJMtyxW8DbKDy8mqrszkONE7GHwCQOOconiApexZ1gF+LPYdiIm6H9o= 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=oclrRre0; arc=none smtp.client-ip=209.85.221.173 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="oclrRre0" Received: by mail-vk1-f173.google.com with SMTP id 71dfb90a1353d-5a7c7e13b84so848813e0c.0 for ; Fri, 12 Jun 2026 15:47:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781304428; x=1781909228; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Js/ra5LqzPxNouNNjbCHmWUBqDkuSo6GLF0IH/adVcE=; b=oclrRre0kQE7emjth8u8hVeIfsS6xqiPI/WFPlRhkVqagAEP1s813V6mCgM/vyY+aU JvagNG06+QuAo7JMZ7l4ARt/lGplyNhS4I9j1sB4jXW7dqwneTPgUOjq1KTUSZoHGxFc lgFjEEnfopkDQP56mC/WROmXhHWLnZ4kkmXX0NfQMswtL53XeQKwvOkiaUdv84JCt5IF xQZl0vFlOsDbyk2yFGcudsTe8+PAl+7io694nV6SEFvd/4wAovxeoyabWVWkTV3LVJpi rUlDUKADS6FoJuiQmzPF10aUQEtwcokZNcSjnsgxOwdW9A8rjn/KwsUdy5RaKzQXNFma qT3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781304428; x=1781909228; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Js/ra5LqzPxNouNNjbCHmWUBqDkuSo6GLF0IH/adVcE=; b=Nx03fHZHdXTcYLqssLrgwa2Uzg4zV0tesnSTgtsAsIqp6RV77LZWzNOhfuScRrUaRC vJ7RADGJwhvPh3T54kQKtbkgCLTh1B2rFM4GtRPBARjw77ElbQS6936X+shSZjeCySR4 WG9HkP8Pf33mq4b0ai5pw+A9zvHKfSyD6efZxsUXOSBFxWtz+IbTVxyy5XB4ZTjbbinn wwD3CKuFzTHEJ7RI13eRKX5QKzj9Rk4lQiw7pyA7sFv9noBpdMqHBO18peVUyIcdCi2c Z5QaRuTLz0lomB4Ud/8f0jaTwyr0ukBpjAUsK5cj9HGYwKj2CrvQOhPS1bjUVysjvDHl dJcA== X-Forwarded-Encrypted: i=1; AFNElJ9JpsyIAB19QXL5rOYnWia9GirnWAL80ZNqb8LPqmmidMP7/YpbveUkK78Zq7DaPOuL2loZwSro4GAe@vger.kernel.org X-Gm-Message-State: AOJu0YxJVgnpmaCgdYcNjI9R1UffxEm+x4lsdiG5yMf2xvpCegYc3s1a +jXTZOWcbKRPKU8nx5eQb5jq3+PTh8rRoJRPDVbO2nV28LObZhWJVeU9 X-Gm-Gg: Acq92OEwa5tPFhulZ5f5Bgq9R4x76isbUFkMPwD+fzScTQJNCiTI7Z7YBQ1iun6OHXS 5L8FpW2/80+BQKD9S5tj1wlHHvSCPRQynjh1Tz1qdjJteLHK5kcSUVJPOtS6kjYuK0EWs0btV/X oxmwbSVfQQUkoCZxB1Efcw/ByfOiSCWMViNxzFJsaiARKbByynFA8pEeZ8fsqLrbnP7AapIYVuy E6WwF+cL6ahIK+CfYszNbYgZZdF2dnQMheNnTyMVCra/t4eMBbUYi8EUbC0Uf8th3ws60foKVtq w0zzPG95WPo/noyboPV/d9a5iHjvI+v9jTNiqn4Ls0OQlhiQPNdeu7PRgSUgrXxQipn6eiY32Hy n5H5e4oUZFuTcQm+vOgSQNH6nV9/XAG6fTk4veeCtNMLuk8SFSvNs/bksb1R/GlmRqRiTxPv3Fn 0LFensn7WPHHB/fkvstt/D4mATnsilaPZl X-Received: by 2002:a05:6122:1da2:b0:56b:9b7b:83e7 with SMTP id 71dfb90a1353d-5bb6c02821bmr3390332e0c.7.1781304428144; Fri, 12 Jun 2026 15:47:08 -0700 (PDT) Received: from [192.168.100.6] ([2800:bf0:82:11a2:7ac4:1f2:947b:2b6]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-5bb691fd8adsm4244553e0c.13.2026.06.12.15.47.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Jun 2026 15:47:07 -0700 (PDT) From: Kurt Borja Date: Fri, 12 Jun 2026 17:46:22 -0500 Subject: [PATCH 4/5] iio: adc: ti-ads1262: Add calibration support Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260612-ads126x-v1-4-894c788d03ed@gmail.com> References: <20260612-ads126x-v1-0-894c788d03ed@gmail.com> In-Reply-To: <20260612-ads126x-v1-0-894c788d03ed@gmail.com> To: Jonathan Cameron , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Bartosz Golaszewski Cc: David Lechner , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Kurt Borja , Jonathan Cameron X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4008; i=kuurtb@gmail.com; h=from:subject:message-id; bh=EsJT2lMotT/uWF+cKzuNO4c+y11rGpYGsfhS1ED7rJ4=; b=owGbwMvMwCUmluBs8WX+lTTG02pJDFk6PUkHXwQHBh/UZlLZzLP2Zen616qlUzR1la7On31XM qzHjVWro5SFQYyLQVZMkaU9YdG3R1F5b/0OhN6HmcPKBDKEgYtTACYybQEjw2lGLef42wft9aRl l79Mvf9rx5Rss9I953/Vzyl39OrYzMjwh3NV+RahVSuPWnw1+/Ii9VPJmfp8Pl+B3zeDDBefSlR v5AcA X-Developer-Key: i=kuurtb@gmail.com; a=openpgp; fpr=54D3BE170AEF777983C3C63B57E3B6585920A69A Add channel calibration support. Signed-off-by: Kurt Borja --- drivers/iio/adc/ti-ads1262.c | 70 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/drivers/iio/adc/ti-ads1262.c b/drivers/iio/adc/ti-ads1262.c index 6d5f22836ad8..b33505e7fdc7 100644 --- a/drivers/iio/adc/ti-ads1262.c +++ b/drivers/iio/adc/ti-ads1262.c @@ -217,6 +217,10 @@ #define ADS1262_RMUX_AVDD_AVSS 4 #define ADS1262_RMUX_COUNT 5 +/* The calibration word is signed 24 bits value */ +#define ADS1262_CALIB_WORD_MAX ((int)(GENMASK(22, 0))) +#define ADS1262_CALIB_WORD_MIN (-ADS1262_CALIB_WORD_MAX - 1) + struct ads1262_channel { /* MODE0 */ u8 conv_delay:4; @@ -453,6 +457,32 @@ static int ads1262_dev_start_one(struct ads1262 *st, u8 runmode) return 0; } +static int ads1262_read_calib(struct ads1262 *st, unsigned int reg, u32 *val) +{ + __le32 lval; + int ret; + + /* + * The calibration word is a signed 24 bit LSB-first value. + */ + ret = regmap_bulk_read(st->regmap, reg, &lval, 3); + if (ret) + return ret; + *val = sign_extend32(le32_to_cpu(lval), 23); + + return 0; +} + +static int ads1262_write_calib(struct ads1262 *st, unsigned int reg, u32 val) +{ + __le32 lval = cpu_to_le32(val); + + /* + * The calibration word is a signed 24 bit LSB-first value. + */ + return regmap_bulk_write(st->regmap, reg, &lval, 3); +} + static void ads1262_wait_for_conversion(struct ads1262 *st) { reinit_completion(&st->drdy); @@ -673,6 +703,18 @@ static int ads1262_read_raw(struct iio_dev *indio_dev, *val2 = ads1262_conv_delay_avail[mode][1]; return IIO_VAL_INT_PLUS_NANO; + case IIO_CHAN_INFO_CALIBSCALE: + ret = ads1262_read_calib(st, ADS1262_FSCAL0_REG, val); + if (ret) + return ret; + return IIO_VAL_INT; + + case IIO_CHAN_INFO_CALIBBIAS: + ret = ads1262_read_calib(st, ADS1262_OFCAL0_REG, val); + if (ret) + return ret; + return IIO_VAL_INT; + default: return -EOPNOTSUPP; } @@ -682,6 +724,9 @@ static int ads1262_read_avail(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, const int **vals, int *type, int *length, long mask) { + static int calib_range[3] = { ADS1262_CALIB_WORD_MIN, 1, + ADS1262_CALIB_WORD_MAX }; + switch (mask) { case IIO_CHAN_INFO_SAMP_FREQ: *type = IIO_VAL_INT_PLUS_MICRO; @@ -701,6 +746,13 @@ static int ads1262_read_avail(struct iio_dev *indio_dev, *length = ARRAY_SIZE(ads1262_conv_delay_avail) * 2; return IIO_AVAIL_LIST; + case IIO_CHAN_INFO_CALIBSCALE: + case IIO_CHAN_INFO_CALIBBIAS: + *type = IIO_VAL_INT; + *vals = calib_range; + *length = ARRAY_SIZE(calib_range); + return IIO_AVAIL_RANGE; + default: return -EOPNOTSUPP; } @@ -761,6 +813,18 @@ static int ads1262_write_raw(struct iio_dev *indio_dev, break; + case IIO_CHAN_INFO_CALIBSCALE: + if (val > ADS1262_CALIB_WORD_MAX || val < ADS1262_CALIB_WORD_MIN) + return -EINVAL; + + return ads1262_write_calib(st, ADS1262_FSCAL0_REG, val); + + case IIO_CHAN_INFO_CALIBBIAS: + if (val > ADS1262_CALIB_WORD_MAX || val < ADS1262_CALIB_WORD_MIN) + return -EINVAL; + + return ads1262_write_calib(st, ADS1262_OFCAL0_REG, val); + default: return -EOPNOTSUPP; } @@ -867,9 +931,13 @@ static const struct iio_chan_spec ads1262_iio_voltage_template = { BIT(IIO_CHAN_INFO_HARDWAREGAIN) | BIT(IIO_CHAN_INFO_SAMP_FREQ) | BIT(IIO_CHAN_INFO_CONVDELAY), + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_CALIBSCALE) | + BIT(IIO_CHAN_INFO_CALIBBIAS), .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_HARDWAREGAIN) | BIT(IIO_CHAN_INFO_SAMP_FREQ) | - BIT(IIO_CHAN_INFO_CONVDELAY), + BIT(IIO_CHAN_INFO_CONVDELAY) | + BIT(IIO_CHAN_INFO_CALIBSCALE) | + BIT(IIO_CHAN_INFO_CALIBBIAS), .ext_info = ads1262_ext_info, }; -- 2.54.0