From nobody Sat Jul 25 04:54:59 2026 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (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 C9B0437EFEB for ; Fri, 17 Jul 2026 18:50:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784314260; cv=none; b=sgv32AV578oD5Awf4e3c4EyxkGsP55RzBCOolKuMjtrvTO7p2cpe991fn+35rNeiBdmRXP7m2XSSxDYrgoUUIO1tH1dqcWMwZDfRYqi+/xg3KrK/nz155bDrzut6itVzpB/cX5i3zarLTY+8Xbkosp3Z5/jA+BWmDRFfX3TnQKQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784314260; c=relaxed/simple; bh=7ma1G64BJEU3Nefd92S7MV6+k++rrF4S0zC/dSz9Xgw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s69jN3HywkKr5GTGIJ0amehEJiQgR+h+DFHAmoEPqPgwYWOtb0Jdi8E4y3blSYucy+aFW9qbv7HfFG6xOCirxkbMGDDBWUkKCwcv4tbl4UTjegdJzIKV30d1KphlHn+OZmBLDJX2mzeajx5X0e0Yf0SIOK3DyyMwq9JrZkAmKtg= 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=aR8SYRJl; arc=none smtp.client-ip=209.85.167.42 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="aR8SYRJl" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-5b0115b9e17so4675825e87.0 for ; Fri, 17 Jul 2026 11:50:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784314257; x=1784919057; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Bi0gxj3tpRQmo8mc69jkt7+C/RQR070orMLktPWEIAc=; b=aR8SYRJleFklCYKwclOZIb0WjZLTO5pGyIpjwMTvBJfY5r1crpiy5eo82gOmvJp90N 2OePAd2/uE118o05x4007ZiEos/+vEIFkKAYPyev8ljh7MlVLtDbdQQeO4DuzjCXGf6R 13u17n/rzdWYsYNdRRx0xIlmVr8k4r3g32y7SgZRqR+1hk5EnNSdDtpDlSUD6LYGnBEn pju56B3+GWAvjnX3mLSOHcd+MogiUl3nHsjWA0w1F1Ht9r5swEV7VhTm4uQvGWku+ZzI Wb1qnT+QiOH1v6eqVqw/bcsdXxQESoO1v9ZGWwSah0F23H7QTaYm2Z5/WGeUfbZ1t2+K 4sMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784314257; x=1784919057; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Bi0gxj3tpRQmo8mc69jkt7+C/RQR070orMLktPWEIAc=; b=J0ACH5oM2IXOerxEDGpACv6Y2hLE5PrCbs15RnhqzNRvaGSrTB15zdbazqJHk3MtPu hoXsQ1CkcqW6UIWD5MHLtopQzSyCHYLSiedqChL+1GAUa5ycPZW0Qb+v7o6r+yJ3RcTk LDq0Rn1m/KW87I5eC6JVB4VLkdHyp1XwruWBPTr0LARY21YJ8amn5E9RVGv8T0WTspid rAmwKLYVjBNdIRGauw3gVbgnFYMbhqWLiJwEmJ4R30UQTyrYb0iLdnFG888kY8sxoy0Y gD4OxwgVsCfkDZMRvUlp6HUgg47segnMGtOMHJkYBBqEQakElcTE/xqnP2dDIS/e/0p0 kIlQ== X-Forwarded-Encrypted: i=1; AHgh+RpaxpjR15TgQ/dy7OATpqBmSyDYBpx15wcRUDztdTYG22qbqJTjoDYe3aQKgAYUhxRrXPWXNeIojugBEVA=@vger.kernel.org X-Gm-Message-State: AOJu0YwoBMi+bwFNdgb9lVC9XbdacSztu226e2H/voE78svprkBm/ME6 DkmW0A4hvBWvcd3kcSvce6TbLaFV20FZzbvkJYeabRW3zBsI+jGeA0rkObTPa6vt X-Gm-Gg: AfdE7cn0xWjmyVW2FWs192gQCGTeL2+NklflBMH3otdSpBZNuTVfY9DuJRlwF2lnyaw k95v7A/ebboQo0/RnwY7M2FgHqc4fvEUoa8u59fqhap2A+XGWJXo3OxtPxmQhxrIl8mdZfyMJaG NjYncf99qbsKVJfhllf8kae5cdKFQivslaEzohZ3Lzif+cJauYck1Q0WyErJNL1lo16OgmbIwe+ 6lRzqD7L9d+gWgDdbYb/cHvgCjpuObheyQdpH2LR1Jy6JWmPQxYFE+y7y0voSjU3h2jwQWJJehM X+gB83cjR1fnChWAvo5pzLnIgq6gSf42U5iQeJqycKLCNP26rlHH4GcCPypJSSjPziK9oSRgKx/ FU+rbvLX5V/BwdblK5A5Nn/WE9iFY6OlABHSJiUHCNmQvlnnY5UfjdM8VbyWue1hN7HI66GSUWH rdsUM7ickOK3ReG3qucn/uBrM4On3ol0vsvaHR X-Received: by 2002:a05:6512:1092:b0:5ae:c201:c3d7 with SMTP id 2adb3069b0e04-5b28f87312emr983886e87.8.1784314256632; Fri, 17 Jul 2026 11:50:56 -0700 (PDT) Received: from MSI-LINUX.kielce.vectranet.pl ([2a02:2a40:27ec:2900:9d0c:8f55:3d10:318d]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-39eb4fd4ba2sm3431721fa.24.2026.07.17.11.50.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 11:50:54 -0700 (PDT) From: Jakub Szczudlo To: linux-iio@vger.kernel.org Cc: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, marcelo.schmitt@analog.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, mike.looijmans@topic.nl, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, jorge.marques@analog.com, antoniu.miclaus@analog.com, mazziesaccount@gmail.com, jishnu.prakash@oss.qualcomm.com, duje@dujemihanovic.xyz, wens@kernel.org, sakari.ailus@linux.intel.com, linusw@kernel.org, Jakub Szczudlo Subject: [PATCH v8 1/3] iio: adc: ti-ads1100: Fix incorrect reading when datarate changed in single mode Date: Fri, 17 Jul 2026 20:50:31 +0200 Message-ID: <20260717185033.246580-2-jakubszczudlo40@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260717185033.246580-1-jakubszczudlo40@gmail.com> References: <20260717185033.246580-1-jakubszczudlo40@gmail.com> 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" When device is suspended and it is in single mode then changing datarate doesn't make it actually wait for new measurement, so to be sure that read after change is correct functions that changes datarate and gain will wait for a new data. Fixes: 541880542f2b ("iio: adc: Add TI ADS1100 and ADS1000") Signed-off-by: Jakub Szczudlo --- drivers/iio/adc/ti-ads1100.c | 71 ++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/drivers/iio/adc/ti-ads1100.c b/drivers/iio/adc/ti-ads1100.c index 9fe8d54cce83..363f790ca5d5 100644 --- a/drivers/iio/adc/ti-ads1100.c +++ b/drivers/iio/adc/ti-ads1100.c @@ -15,10 +15,12 @@ #include #include #include +#include #include #include #include #include +#include #include =20 #include @@ -43,6 +45,9 @@ static const int ads1100_data_rate[] =3D { 128, 32, 16, 8 }; static const int ads1100_data_rate_bits[] =3D { 12, 14, 15, 16 }; =20 +/* Timeout based on the minimum sample rate of 8 SPS (7500ms) */ +#define ADS1100_MAX_DRDY_TIMEOUT_US (7500 * USEC_PER_MSEC) + struct ads1100_data { struct i2c_client *client; struct regulator *reg_vdd; @@ -123,10 +128,50 @@ static int ads1100_get_adc_result(struct ads1100_data= *data, int chan, int *val) return 0; } =20 +static int ads1100_new_data_is_ready(struct ads1100_data *data) +{ + u8 buffer[3]; + int ret; + + ret =3D i2c_master_recv(data->client, (char *)&buffer, sizeof(buffer)); + if (ret < 0) { + dev_err(&data->client->dev, "I2C read fail: %d\n", ret); + return ret; + } + + return FIELD_GET(ADS1100_CFG_ST_BSY, buffer[2]) ? 0 : 1; +} + +static int ads1100_poll_data_ready(struct ads1100_data *data) +{ + int data_rate_Hz =3D ads1100_data_rate[FIELD_GET(ADS1100_DR_MASK, data->c= onfig)]; + /* To be sure we wait 5 times more than data rate */ + unsigned long wait_time_us =3D DIV_ROUND_CLOSEST(USEC_PER_SEC, 2 * data_r= ate_Hz); + int data_ready; + u8 buffer[3]; + int ret; + + /* To be sure that polled value will have value after config change */ + ret =3D i2c_master_recv(data->client, (char *)&buffer, sizeof(buffer)); + if (ret < 0) { + dev_err(&data->client->dev, "I2C read fail: %d\n", ret); + return ret; + } + + ret =3D readx_poll_timeout(ads1100_new_data_is_ready, data, + data_ready, data_ready !=3D 0, + wait_time_us, ADS1100_MAX_DRDY_TIMEOUT_US); + if (data_ready < 0) + return data_ready; + + return 0; +} + static int ads1100_set_scale(struct ads1100_data *data, int val, int val2) { int microvolts; int gain; + int ret; =20 /* With Vdd between 2.7 and 5V, the scale is always below 1 */ if (val) @@ -135,6 +180,11 @@ static int ads1100_set_scale(struct ads1100_data *data= , int val, int val2) if (!val2) return -EINVAL; =20 + PM_RUNTIME_ACQUIRE_IF_ENABLED_AUTOSUSPEND(&data->client->dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + microvolts =3D regulator_get_voltage(data->reg_vdd); /* * val2 is in 'micro' units, n =3D val2 / 1000000 @@ -149,22 +199,35 @@ static int ads1100_set_scale(struct ads1100_data *dat= a, int val, int val2) =20 ads1100_set_config_bits(data, ADS1100_PGA_MASK, ffs(gain) - 1); =20 - return 0; + return ads1100_poll_data_ready(data); } =20 static int ads1100_set_data_rate(struct ads1100_data *data, int chan, int = rate) { unsigned int i; unsigned int size; + int ret; =20 size =3D data->supports_data_rate ? ARRAY_SIZE(ads1100_data_rate) : 1; for (i =3D 0; i < size; i++) { if (ads1100_data_rate[i] =3D=3D rate) - return ads1100_set_config_bits(data, ADS1100_DR_MASK, - FIELD_PREP(ADS1100_DR_MASK, i)); + break; } =20 - return -EINVAL; + if (i =3D=3D size) + return -EINVAL; + + PM_RUNTIME_ACQUIRE_IF_ENABLED_AUTOSUSPEND(&data->client->dev, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + + ret =3D ads1100_set_config_bits(data, ADS1100_DR_MASK, + FIELD_PREP(ADS1100_DR_MASK, i)); + if (ret) + return ret; + + return ads1100_poll_data_ready(data); } =20 static int ads1100_get_vdd_millivolts(struct ads1100_data *data) --=20 2.47.3 From nobody Sat Jul 25 04:54:59 2026 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) (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 734E538E5DE for ; Fri, 17 Jul 2026 18:51:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784314264; cv=none; b=A1EiohxCqpa9GuX+0hvKpEWOked+YJHs/jQ2muOUAn5Z5WZ8CJs6tMwXr1c3Z2xoC1jV3hxeek6kxU3PJQOQiRW2CfvOr1gG14Ssxxd565CnMkUUNaNQA9FmQZNtgLKiVsqfcOBto+Ss+EjjZSycDntQ3Q/vRcfDxLN6uQ9LpzY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784314264; c=relaxed/simple; bh=U2YoNQx/hGloZRC8McPJss1WdTnU2vgI7Fy7zmdhFok=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NrXWUmZ0gzJC2T6/SFON307oyCrlTJaQYbBUMGgBXnioz23rq4FF2OFd8yy4IdjiVr/V+f36JUMVCna5YgoxpQzzT3FShQMM5E7BMbkxc13upnoeSuxWyVDqnOYb9QGptW53Xn8+Yy1Towd0gHB7ipihYUInzXE8FSkMC+OTSWo= 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=ObrwbsEr; arc=none smtp.client-ip=209.85.208.180 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="ObrwbsEr" Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-39c923b8c2aso77275231fa.2 for ; Fri, 17 Jul 2026 11:51:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784314260; x=1784919060; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=L/Qd/2tRCLWffwMQFEM05180CiTbv4f9HSRyN2+W50k=; b=ObrwbsErDknc49bmpM7HXqhKed+3vrcqjE/PBjrXABIhBAtqvyRbdyzfp2pVf1TZOv FKUINj+tqViJglHjinaLOi9mEwSlXG3mJ8m52jLpTp9gMySUz0tIhF8rr2Jb20LBfuFL 8nwaxVVfTYdIVSK8OmJltcFCUzSV9J4/q6h/b7YjlTMaASzJ+WQceSq/19CBhksOtqs2 t26h+ZkjWEh6LyN35garmwDOHzBteiLMVM0yfDF1drPXEapNvLjJDxSmmRjk/aiH7cSr OfRXxsts5HWCJUbdTvmQYZeDZH5m5vsbuH5fhEUBEnVNBmI8cDLOHMXT/uWqZrCBKl+Y MCkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784314260; x=1784919060; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=L/Qd/2tRCLWffwMQFEM05180CiTbv4f9HSRyN2+W50k=; b=OGiaeHkV9zGe1jnxlBSLFhjEYMmJAQwnOQIVyUA5wbsalChlquRcToZ129fNuxDRTc tnu/nALAqF+lReindNwaOYTBIBiTWzJIf6fv7zfEwwR4QqkZYTuPyYmVyq/Ds0SNRRx3 WaYEoLShGVkAAcTf4FUSW+q+LNckRWyv37EZW4Pwb4T+Ac3wVWjDxkmaVIakuM/7AgTx fLNsX2wIk+3ybKK1P6pP1t8tbnUr0yYWSj1kbZzEu2QcZDZOvqhQ+LH3QQR9LFlGLj8W GSWo7k//Qe+k+MLa0A2nxFgEAvzrEM7I33tk/+D+euOKq/MeRss00WGj12jFrKFS0wNk h9Hw== X-Forwarded-Encrypted: i=1; AHgh+RprEaJVY5ByzDgQ15OH2x2PFCVXKgSSV2eeNQk/txBcRRbiLRxZu6SNF1zeTdeth1Z3bEAFPxWUZW45CsY=@vger.kernel.org X-Gm-Message-State: AOJu0Yw8ZaBQ5I7g6gxjI72vf8FIPdUoMo73xkM28RlDtgnvLHk5DCy1 n+MEZUSboKQWQaKieFX6s1KUm+XPLvBH0p/tgNYIM9vNOA8dT9qOcIhp X-Gm-Gg: AfdE7ckRwYZzNFMtQy/XM7Ep8MECIJBT+QzGEOjF+HP34Xp/dS5OrQdnrKvOjTsVGTM xGFZhjTbkfnlhFbF+XhLfhS5hU/ZzXRRbIe0XJceO3oBrLiVVmlBmi9PCrvO1fx1FBcuHT8GSRg uzrIZSwoJQmyDFiHQYuynlbya/kdQgDG7Tk6FRPlcCN8CPvOtaiYKddlilXgYpka4TvWUubVEsx xXnksxXhyh4phvAbb5T9Zsg914X1P9MC2yrE9iTCTWU52xLL1s2DfsPF3GpqnbzhaTtz9UTjQzA PRCxr5S2+TCpr/Wo85qyExlO3gc9NB1b67XMP2JrHx0xqH3TScD/mOv9v7ldNZ2jlHTmTXa7DjC +DNdz0Xdqo62zdRC5N2WdSypzJUd8S3a6VnQgjvNxDSVmRnemyXOd4XwsI3/0/hhyHiUEmz/97G T1dQZcwGQYI7mwP1NkE3YzykAh2ykTd194eKlS X-Received: by 2002:a05:651c:4343:10b0:39a:cfe9:2481 with SMTP id 38308e7fff4ca-39eb2909e03mr6631871fa.30.1784314260298; Fri, 17 Jul 2026 11:51:00 -0700 (PDT) Received: from MSI-LINUX.kielce.vectranet.pl ([2a02:2a40:27ec:2900:9d0c:8f55:3d10:318d]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-39eb4fd4ba2sm3431721fa.24.2026.07.17.11.50.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 11:50:58 -0700 (PDT) From: Jakub Szczudlo To: linux-iio@vger.kernel.org Cc: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, marcelo.schmitt@analog.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, mike.looijmans@topic.nl, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, jorge.marques@analog.com, antoniu.miclaus@analog.com, mazziesaccount@gmail.com, jishnu.prakash@oss.qualcomm.com, duje@dujemihanovic.xyz, wens@kernel.org, sakari.ailus@linux.intel.com, linusw@kernel.org, Jakub Szczudlo , Krzysztof Kozlowski Subject: [PATCH v8 2/3] dt-bindings: iio: adc: ti,ads1100: add support for ADS1110 Date: Fri, 17 Jul 2026 20:50:32 +0200 Message-ID: <20260717185033.246580-3-jakubszczudlo40@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260717185033.246580-1-jakubszczudlo40@gmail.com> References: <20260717185033.246580-1-jakubszczudlo40@gmail.com> 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" Register layouts are the same as for ADS1100 but ADS1110 have different data rates and have internal voltage reference that is always 2.048V. Also correct order of ads so they will be sorted alphabetically. Signed-off-by: Jakub Szczudlo Reviewed-by: Krzysztof Kozlowski --- .../devicetree/bindings/iio/adc/ti,ads1100.yaml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/iio/adc/ti,ads1100.yaml b/Do= cumentation/devicetree/bindings/iio/adc/ti,ads1100.yaml index 970ccab15e1e..28c5e2dd0ad6 100644 --- a/Documentation/devicetree/bindings/iio/adc/ti,ads1100.yaml +++ b/Documentation/devicetree/bindings/iio/adc/ti,ads1100.yaml @@ -4,19 +4,23 @@ $id: http://devicetree.org/schemas/iio/adc/ti,ads1100.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# =20 -title: TI ADS1100/ADS1000 single channel I2C analog to digital converter +title: TI ADS1100 and similar single channel I2C Analog to Digital Convert= ers =20 maintainers: - Mike Looijmans =20 description: | - Datasheet at: https://www.ti.com/lit/gpn/ads1100 + Datasheets: + - https://www.ti.com/lit/gpn/ads1000 + - https://www.ti.com/lit/gpn/ads1100 + - https://www.ti.com/lit/gpn/ads1110 =20 properties: compatible: enum: - - ti,ads1100 - ti,ads1000 + - ti,ads1100 + - ti,ads1110 =20 reg: maxItems: 1 --=20 2.47.3 From nobody Sat Jul 25 04:54:59 2026 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) (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 9953438424D for ; Fri, 17 Jul 2026 18:51:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784314269; cv=none; b=GWlFpUhy0RqGr3syyv4YCv4k8sPhGMTJvyoJbWdRrDnsABvczDjxxzOEYuGdRBZ0oOcmV1oWwJG0rT/4aTHi4BX9UbQgTnodYqxygFspPT01oCxA54M6mWiM+z52021KWR1auyaarZs/gRLZXJdh8rrN3jV/64j3VAiYtH2WXO4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784314269; c=relaxed/simple; bh=fxVLOlAEEZbasRlArOnsqOxmKKwvvuCbKQBI3wtqDEE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZK8IJ+Sj/QHXzvCUm2Qvfprnkhm6ccu63uKsZgiSnNalZ9xtT2CZvZtF9ZPtK1QWi5Y6AX6k7LK1FYMD1/QJXHs1EuNeQvVMRuoHO+K+QUZ5WZx7MztyGkdV7Kg0c4WT5jxqEx0wCoBDv0SRjoAPe9Ospdw5h0xZuFSdgbjZ3bo= 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=qlPXlQfc; arc=none smtp.client-ip=209.85.208.180 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="qlPXlQfc" Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-39c8dbf4ef0so73564981fa.2 for ; Fri, 17 Jul 2026 11:51:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784314265; x=1784919065; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Wbe43CsBKlhwl8/JrNzWyfSM3Jsa2BsdWg38CIyjaB0=; b=qlPXlQfccrnL2jrsX+qfgkXSi1JbplodHaqm3rc4kwNyzrmGehXUyXS1OsgB6qWx02 RFz8qim9hN/8uasatfsT4IX3tc3zc1swxPrQ5WstVBEL0GH22wZq3TtyatdEUJYkTh7B FJqDUE5lzdGV0pV4dl/+dK7QLzITRStmLGhIj1RRR8Q/z7ak8QzGq4CFF5Wegjyn93r9 LYRf5LgPNqEO7UQYkSA+c9l8Ai1XEbOMog5ofFsstPJapuKKeQDGlDsSWO+gcziYPDNE ySGTDKrPKDp92nHrU6GCaQkJnJWEEP+J6EKGdaTMRKzsWblWNR8Lgof9r9N/BPVB/NiV YqeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784314265; x=1784919065; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Wbe43CsBKlhwl8/JrNzWyfSM3Jsa2BsdWg38CIyjaB0=; b=T39j5sJiCCBrp9AyWBb/9d8560FwDLHeDlWsVWm9ELYs9PraCEYnsN95JiLv9nXYK0 68B5F7PT6mbohiPuomca5EZT+bj6MKGtJwOoTIu3VzPyNWRDVKvOZCctAbYAk2QrE7rR NKH7StaQy8H/5xNW1q2ir9BBNUDY1wbF86Qf4Rx5WodtH6eAs8BXruJpM2HNPfvwtegX /4wQYWwrvybRuRO8PxfDTd/AZE7F7/alJfUZJtHqANh7/iRPSNhaSs4MLveddbkAF2fT 77R++8kme33Zw7kpMFRpjfwoEoYkOdRsQW8mwKp4O0ZjoYNs9bzPfTH1AXbX16BOtEx6 E+KA== X-Forwarded-Encrypted: i=1; AHgh+Rq+AE5T77Lzfy9BBrnPV3wcsckTikjXykmOVZ/21u5FcZ1QY7l1g8O7c1belJWrKJ5tKsWh8Kj4kiVYTZ0=@vger.kernel.org X-Gm-Message-State: AOJu0YywmOI+jXcSTTfGFBzcA+1Kk07A8tOgJo/moHstpnQDI+Z2wU2s lNiVrWunpnhj1zFXjC5SFVEYXFKL46NAi/zjjQDIw3MKqEa6AuvppeLc X-Gm-Gg: AfdE7cnSUCIunY53N8W0p+kLrEKRPo/rrTWJPO5c/d4k7Z8P4nhFIDBM/1KOQL5ELI+ 3KDlLMLPxiEWA9Q+ovW0TT6XTrg4ogHmMkDgEBs0o19ynKyHCGM9j4r85ZzFuQx5xKqvDJzPYli JGL4wOTZwS+ztfj/jNkdfhe9osFeuEwHhl5Vx9M6eS6CwBL7OZ0FZ0QJvQQHTzLmKjV5P513O6n 0orAboXV3+6F/AFP+ISkHeAalS5q6CfO9cBb9YUulo7QcHwq4BXaiKgjHBmtwjJEgHlRsiTuAqe 11FI4cfQgurXfCWyaanQpFq3SUi0cBfzslO+bGIPDDo/s47F3GsospejltaJQSdqreW0zNqTI0q sS+hym3Z7cHypr5jQI9pKnzjSKBDa/0lkHQjKdi+vVdRwryIs6vNZZTXrJ4ix0YBhZU3ZH2uYPq WRUzLaW25DwxymG4g/KGPNYRVhanJMba7Ig5NL X-Received: by 2002:a2e:be83:0:b0:39c:9955:9e0c with SMTP id 38308e7fff4ca-39eb274e2bfmr9366311fa.6.1784314265496; Fri, 17 Jul 2026 11:51:05 -0700 (PDT) Received: from MSI-LINUX.kielce.vectranet.pl ([2a02:2a40:27ec:2900:9d0c:8f55:3d10:318d]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-39eb4fd4ba2sm3431721fa.24.2026.07.17.11.51.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 11:51:03 -0700 (PDT) From: Jakub Szczudlo To: linux-iio@vger.kernel.org Cc: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, marcelo.schmitt@analog.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, mike.looijmans@topic.nl, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, jorge.marques@analog.com, antoniu.miclaus@analog.com, mazziesaccount@gmail.com, jishnu.prakash@oss.qualcomm.com, duje@dujemihanovic.xyz, wens@kernel.org, sakari.ailus@linux.intel.com, linusw@kernel.org, Jakub Szczudlo Subject: [PATCH v8 3/3] iio: adc: ti-ads1100: Add ti-ads1110 support to ti-ads1100 driver Date: Fri, 17 Jul 2026 20:50:33 +0200 Message-ID: <20260717185033.246580-4-jakubszczudlo40@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260717185033.246580-1-jakubszczudlo40@gmail.com> References: <20260717185033.246580-1-jakubszczudlo40@gmail.com> 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" Add ADS1110 support that have faster datarate than ADS1100, it also uses internal voltage reference of 2.048V for measurement. Signed-off-by: Jakub Szczudlo --- drivers/iio/adc/Kconfig | 9 ++-- drivers/iio/adc/ti-ads1100.c | 93 ++++++++++++++++++++++++++---------- 2 files changed, 74 insertions(+), 28 deletions(-) diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 3755a81c1efd..49a9ac3bf43d 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -1768,11 +1768,14 @@ config TI_ADS1018 called ti-ads1018. =20 config TI_ADS1100 - tristate "Texas Instruments ADS1100 and ADS1000 ADC" + tristate "Texas Instruments ADS1100 and similar single channel I2C ADC" depends on I2C help - If you say yes here you get support for Texas Instruments ADS1100 and - ADS1000 ADC chips. + If you say yes here you get support for TI single channel I2C Analog + Devices. + * ADS1000 12-Bit, 128 SPS Analog-to-Digital Converter + * ADS1100 16-Bit, 128 SPS Analog-to-Digital Converter + * ADS1110 16-Bit, 240 SPS Analog-to-Digital Converter =20 This driver can also be built as a module. If so, the module will be called ti-ads1100. diff --git a/drivers/iio/adc/ti-ads1100.c b/drivers/iio/adc/ti-ads1100.c index 363f790ca5d5..19533667e6cd 100644 --- a/drivers/iio/adc/ti-ads1100.c +++ b/drivers/iio/adc/ti-ads1100.c @@ -5,7 +5,7 @@ * Copyright (c) 2023, Topic Embedded Products * * Datasheet: https://www.ti.com/lit/gpn/ads1100 - * IIO driver for ADS1100 and ADS1000 ADC 16-bit I2C + * IIO driver for ADS1100 and similar single channel ADC 16-bit I2C */ =20 #include @@ -41,20 +41,44 @@ #define ADS1100_SINGLESHOT ADS1100_CFG_SC =20 #define ADS1100_SLEEP_DELAY_MS 2000 +#define ADS1110_INTERNAL_REF_mV 2048 =20 static const int ads1100_data_rate[] =3D { 128, 32, 16, 8 }; +static const int ads1110_data_rate[] =3D { 240, 60, 30, 15 }; static const int ads1100_data_rate_bits[] =3D { 12, 14, 15, 16 }; =20 /* Timeout based on the minimum sample rate of 8 SPS (7500ms) */ #define ADS1100_MAX_DRDY_TIMEOUT_US (7500 * USEC_PER_MSEC) =20 +struct ads1100_config { + const char *name; + const int *available_data_rate_hz; + const int data_rate_count; + bool has_internal_vref_only; +}; + +static const struct ads1100_config ads1100_config =3D { + .name =3D "ads1100", + .available_data_rate_hz =3D ads1100_data_rate, + .data_rate_count =3D ARRAY_SIZE(ads1100_data_rate), + .has_internal_vref_only =3D false, +}; + +static const struct ads1100_config ads1110_config =3D { + .name =3D "ads1110", + .available_data_rate_hz =3D ads1110_data_rate, + .data_rate_count =3D ARRAY_SIZE(ads1110_data_rate), + .has_internal_vref_only =3D true, +}; + struct ads1100_data { struct i2c_client *client; struct regulator *reg_vdd; struct mutex lock; int scale_avail[2 * 4]; /* 4 gain settings */ + const struct ads1100_config *chip_info; u8 config; - bool supports_data_rate; /* Only the ADS1100 can select the rate */ + bool supports_data_rate; }; =20 static const struct iio_chan_spec ads1100_channel =3D { @@ -90,6 +114,20 @@ static int ads1100_set_config_bits(struct ads1100_data = *data, u8 mask, u8 value) return 0; }; =20 +static int ads1100_get_vref_millivolts(struct ads1100_data *data) +{ + int voltage_uV; + + if (data->chip_info->has_internal_vref_only) + return ADS1110_INTERNAL_REF_mV; + + voltage_uV =3D regulator_get_voltage(data->reg_vdd); + if (voltage_uV < 0) + return voltage_uV; + + return voltage_uV / (MICRO / MILLI); +} + static int ads1100_data_bits(struct ads1100_data *data) { return ads1100_data_rate_bits[FIELD_GET(ADS1100_DR_MASK, data->config)]; @@ -139,14 +177,16 @@ static int ads1100_new_data_is_ready(struct ads1100_d= ata *data) return ret; } =20 - return FIELD_GET(ADS1100_CFG_ST_BSY, buffer[2]) ? 0 : 1; + return FIELD_GET(ADS1100_CFG_ST_BSY, buffer[2]); } =20 static int ads1100_poll_data_ready(struct ads1100_data *data) { - int data_rate_Hz =3D ads1100_data_rate[FIELD_GET(ADS1100_DR_MASK, data->c= onfig)]; + int data_rate_index =3D FIELD_GET(ADS1100_DR_MASK, data->config); + int data_rate_Hz =3D data->chip_info->available_data_rate_hz[data_rate_in= dex]; /* To be sure we wait 5 times more than data rate */ - unsigned long wait_time_us =3D DIV_ROUND_CLOSEST(USEC_PER_SEC, 2 * data_r= ate_Hz); + unsigned long period_us =3D DIV_ROUND_CLOSEST(USEC_PER_SEC, data_rate_Hz); + unsigned long wait_time_us =3D 5UL * period_us; int data_ready; u8 buffer[3]; int ret; @@ -159,7 +199,7 @@ static int ads1100_poll_data_ready(struct ads1100_data = *data) } =20 ret =3D readx_poll_timeout(ads1100_new_data_is_ready, data, - data_ready, data_ready !=3D 0, + data_ready, data_ready =3D=3D 0, wait_time_us, ADS1100_MAX_DRDY_TIMEOUT_US); if (data_ready < 0) return data_ready; @@ -185,7 +225,7 @@ static int ads1100_set_scale(struct ads1100_data *data,= int val, int val2) if (ret) return ret; =20 - microvolts =3D regulator_get_voltage(data->reg_vdd); + microvolts =3D ads1100_get_vref_millivolts(data) * (MICRO / MILLI); /* * val2 is in 'micro' units, n =3D val2 / 1000000 * result must be millivolts, d =3D microvolts / 1000 @@ -208,9 +248,9 @@ static int ads1100_set_data_rate(struct ads1100_data *d= ata, int chan, int rate) unsigned int size; int ret; =20 - size =3D data->supports_data_rate ? ARRAY_SIZE(ads1100_data_rate) : 1; + size =3D data->supports_data_rate ? data->chip_info->data_rate_count : 1; for (i =3D 0; i < size; i++) { - if (ads1100_data_rate[i] =3D=3D rate) + if (data->chip_info->available_data_rate_hz[i] =3D=3D rate) break; } =20 @@ -230,14 +270,9 @@ static int ads1100_set_data_rate(struct ads1100_data *= data, int chan, int rate) return ads1100_poll_data_ready(data); } =20 -static int ads1100_get_vdd_millivolts(struct ads1100_data *data) -{ - return regulator_get_voltage(data->reg_vdd) / (MICRO / MILLI); -} - static void ads1100_calc_scale_avail(struct ads1100_data *data) { - int millivolts =3D ads1100_get_vdd_millivolts(data); + int millivolts =3D ads1100_get_vref_millivolts(data); unsigned int i; =20 for (i =3D 0; i < ARRAY_SIZE(data->scale_avail) / 2; i++) { @@ -259,9 +294,9 @@ static int ads1100_read_avail(struct iio_dev *indio_dev, switch (mask) { case IIO_CHAN_INFO_SAMP_FREQ: *type =3D IIO_VAL_INT; - *vals =3D ads1100_data_rate; + *vals =3D data->chip_info->available_data_rate_hz; if (data->supports_data_rate) - *length =3D ARRAY_SIZE(ads1100_data_rate); + *length =3D data->chip_info->data_rate_count; else *length =3D 1; return IIO_AVAIL_LIST; @@ -281,6 +316,7 @@ static int ads1100_read_raw(struct iio_dev *indio_dev, { int ret; struct ads1100_data *data =3D iio_priv(indio_dev); + int data_rate_index; =20 guard(mutex)(&data->lock); switch (mask) { @@ -296,12 +332,12 @@ static int ads1100_read_raw(struct iio_dev *indio_dev, return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: /* full-scale is the supply voltage in millivolts */ - *val =3D ads1100_get_vdd_millivolts(data); + *val =3D ads1100_get_vref_millivolts(data); *val2 =3D 15 + FIELD_GET(ADS1100_PGA_MASK, data->config); return IIO_VAL_FRACTIONAL_LOG2; case IIO_CHAN_INFO_SAMP_FREQ: - *val =3D ads1100_data_rate[FIELD_GET(ADS1100_DR_MASK, - data->config)]; + data_rate_index =3D FIELD_GET(ADS1100_DR_MASK, data->config); + *val =3D data->chip_info->available_data_rate_hz[data_rate_index]; return IIO_VAL_INT; default: return -EINVAL; @@ -381,7 +417,12 @@ static int ads1100_probe(struct i2c_client *client) data->client =3D client; mutex_init(&data->lock); =20 - indio_dev->name =3D "ads1100"; + data->chip_info =3D i2c_get_match_data(client); + if (!data->chip_info) + return dev_err_probe(dev, -ENODATA, + "Can't get device data from firmware\n"); + + indio_dev->name =3D data->chip_info->name; indio_dev->modes =3D INDIO_DIRECT_MODE; indio_dev->channels =3D &ads1100_channel; indio_dev->num_channels =3D 1; @@ -463,16 +504,18 @@ static DEFINE_RUNTIME_DEV_PM_OPS(ads1100_pm_ops, NULL); =20 static const struct i2c_device_id ads1100_id[] =3D { - { .name =3D "ads1100" }, - { .name =3D "ads1000" }, + { .name =3D "ads1000", .driver_data =3D (kernel_ulong_t)&ads1100_config }, + { .name =3D "ads1100", .driver_data =3D (kernel_ulong_t)&ads1100_config }, + { .name =3D "ads1110", .driver_data =3D (kernel_ulong_t)&ads1110_config }, { } }; =20 MODULE_DEVICE_TABLE(i2c, ads1100_id); =20 static const struct of_device_id ads1100_of_match[] =3D { - {.compatible =3D "ti,ads1100" }, - {.compatible =3D "ti,ads1000" }, + { .compatible =3D "ti,ads1000", .data =3D &ads1100_config }, + { .compatible =3D "ti,ads1100", .data =3D &ads1100_config }, + { .compatible =3D "ti,ads1110", .data =3D &ads1110_config }, { } }; =20 --=20 2.47.3