From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi1-f175.google.com (mail-oi1-f175.google.com [209.85.167.175]) (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 F41DD32ED40 for ; Thu, 10 Sep 2026 21:14:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074881; cv=none; b=igue02B5UbjgN05VJ8HxflxHZ56jhfBN3r08Ilw2qqfsnZNNYqbCgiOjSCyGKbguAa9tpg5V2R6ahPf2mSNGpW8DNQ7KJgpsloP5WrcNs5WSEfjxoav1Gblcg2tpdYD8IgyyVtJMrxoOLLmD8vUw6khjT3tGHjurth3AT7a4pk8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074881; c=relaxed/simple; bh=VauWigPxn+Z06uluw3jfgiSH2uLFsBfjesGM7iHnEqM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=s/t3Ugxi+3XEw4W//U6lCjQO3nqayrbMwfP8/SJOszq6UDlCAU48FFMhjzxQZVrfEJNMMmvfmolU9RxA86L2fl2Z42JrMYXlRGOmibmK71ODGyCpt+KiBnlNmKjtbRLH4I80nIDQe/VRrlHjqlETfovd3nWlhb2+S96L8X38z+k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=QOdaOJ1o; arc=none smtp.client-ip=209.85.167.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="QOdaOJ1o" Received: by mail-oi1-f175.google.com with SMTP id 5614622812f47-4b28db31b89so212302b6e.1 for ; Thu, 10 Sep 2026 14:14:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074872; x=1789679672; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=2twO4FOA5lpjNQCxYEeZuWL/IrJEo6qIPnLetgsF0Cc=; b=QOdaOJ1o61lBpyuGceeXAwHeeWyCtUEuXrHcpOkeJzBWpqBrvIUEIRs9etaxk2JGRP ZLY8jqrNjaJUC1koxks/IihYpU8x+Stuia4JSgHtebD+OcLw82U1eiW6n/yLxHyIdunp oaY5d325Gzpwhqa1ObvC0P8eoAj2r3UJVs9Q5L4wJ3cqyMP+MNMPUulXyuVjxTpTimQM xJyn9G2p5asrdbsMuY/uRSizva4tgGaBHywZ9DixxYi4RzltBvdN1m8qVWB+CMhbwtFU 96ELHXoYZbW/HR3icNTHcMekdsWjqIinnaxlD3TzrgLbZ7jmCSRzle3xqct3nhoGyQ2r zcZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074872; x=1789679672; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=2twO4FOA5lpjNQCxYEeZuWL/IrJEo6qIPnLetgsF0Cc=; b=Ojqb6CgBSLxwOeBvsL8GxTERA0EfeF+/JDRSmmZmuv9yR5p4/BE4dImc7WRdGBe3Vo 6U/T/MQYHOOa2W5XAHhCcgkebg81Jq20CyLynBFiFONGwvb7BYe6mDCExmp0gx/GS3jT R7MrWcn8+nsOmdVSKx2/xoLhxKM1CR0zePAPwBVrMnNiZfalCOjXlnQ1MRllYYiVFgOK CIysCY9Npkp9QUUviLrGCG1C9QYskzmFPHQGRFiGCIQ7+mi7JanSBiJ7Z4dXUIAaSJxi zDNkPI3iV/fC5OGN+3wdi4KGXDCkJQwwVqR7d2D+MaCdH/1h7B+B91Lv4nzfdqgU0P5M qGQw== X-Forwarded-Encrypted: i=1; AKwUvBygOHzQzyN2WzBU3RVw6zuiKrV2k/wvQ5/gf8eOUyJyktBluyqhxguqRXRotLS3dr2uShwrsBMH+h2wVrE=@vger.kernel.org X-Gm-Message-State: AFuF++nSh8AQVZgxVARzbRJTVMgEvtWTQVf2HYmBXVbExO3ZVyV/epsq MD4aTXz8DmLOBdZTXXIXTfFI06WL0FyV3FtogilrknaC9PK4WVixvMYsx1fL7SQ8OM09cpEO4Zp 5mjq2 X-Gm-Gg: AYBFou0r604YGD5DeP3Iyk5HyT8SsiwJ78KckML0mIbmMJdKQjTHDL1Teq54T3c4KGv AGEEgOvKS/5gja7lcvKTFc5XwDWi1FvDTcQbhMU/p8MfE/yUtjImzP6mbM51V/ENMlDjTNwKu8o HxprFSjuEMMvRju2+Vr7W7PGjaB4i8xN7SDcsiiJtUSWkbLncFypLBwV76I2MNdd0p6N6iA268Y PK64+lg1pW95nDZi4KZPJmb+oJvqR10Ei8+LHyO0t1Btz6f8Q7JLPIqicZaNBLNciK+cm00N8Ra 0RyCcf8LNyUOH0R6tdrieTFzQ8U9ZxOmZbvm6SWGsxsvYjjTAyCjP3j7QsC6TFrHZqYJUtgI0Lq zhCMYbSr2+7TNAjKJEUx+oQbFR1wUlbaFlnnbvmu4IWA8Qam7irbj16oezxKRtm6X/AhASayXjT lPfBEXSinDWdrQtGicxBFkxEdHu54LGnhhL4qBwJBz9cidegKtDnC0D382bt23brmcwomE5ll4l u2v X-Received: by 2002:a05:6808:bc4:b0:4b5:5bfa:2698 with SMTP id 5614622812f47-4c31f29bbdamr637922b6e.20.1789074872096; Thu, 10 Sep 2026 14:14:32 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:31 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:00 -0500 Subject: [PATCH v3 01/10] iio: adc: ti-ads112c14: add DRDY interrupt support 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-1-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=6077; i=dlechner@baylibre.com; h=from:subject:message-id; bh=VauWigPxn+Z06uluw3jfgiSH2uLFsBfjesGM7iHnEqM=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqox1zRAl8t0XV1k72wgNbvQnrebA7vNlJrC0Ik pWNHoDHO4eJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaqMdcwAKCRDCzCAB/wGP wMVBB/9CVUwz7VYQtx1gS9gLJMycRuNRg16SiZ9JTlJt2lMFkhSWu0doFPx1qwkPOsfkRDAv/3r dV5bJwEOwdqHSP8UKnrUgYwrBJarm9j1iA66UoolWmqaqffRIYx7vegFYCj5186NO8hjVk4bdRp E3WsDz5Zex6S68jCSCOXvRmPAqpNF+pdTN4FoLPftEL2Ry49nCD+RbQo8QxV2L+q7LHz0jBaMTF fPzjvhKk/xqrfMkDWVxjN3ketu2eATUuCI92/njKCVf0zgCcAg1JOnreOwIQ/3WeatB3I/kvb+n A7H1sBbxBDfB/OjWw+hJxZrEheRYyvjjveVL7IHiTEPntHPR X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add handling for the DRDY interrupt to wait for data ready events rather than polling (only when it is wired up). Signed-off-by: David Lechner (TI) --- Small note: the hard-coded 100 ms timeout will be replaced in a future series with a dynamic value, so I didn't bother with a macro or comments to explain why the value was chosen. And passing indio_dev instead of data to irq is intentional as it will be used in the next patch. --- drivers/iio/adc/ti-ads112c14.c | 100 ++++++++++++++++++++++++++++++++++++-= ---- 1 file changed, 90 insertions(+), 10 deletions(-) diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c index 60eab4852ba2..9058ad34bc06 100644 --- a/drivers/iio/adc/ti-ads112c14.c +++ b/drivers/iio/adc/ti-ads112c14.c @@ -10,6 +10,7 @@ =20 #include #include +#include #include #include #include @@ -19,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -117,9 +119,15 @@ #define ADS112C14_GPIO_CFG_GPIO2_CFG GENMASK(5, 4) #define ADS112C14_GPIO_CFG_GPIO1_CFG GENMASK(3, 2) #define ADS112C14_GPIO_CFG_GPIO0_CFG GENMASK(1, 0) +#define ADS112C14_GPIO_CFG_GPIO_CFG_DISABLED 0 +#define ADS112C14_GPIO_CFG_GPIO_CFG_INPUT 1 +#define ADS112C14_GPIO_CFG_GPIO_CFG_OUTPUT_PUSH_PULL 2 +#define ADS112C14_GPIO_CFG_GPIO_CFG_OUTPUT_OPEN_DRAIN 3 =20 #define ADS112C14_REG_GPIO_DATA_OUTPUT 0x0C #define ADS112C14_GPIO_DATA_OUTPUT_GPIO3_SRC BIT(7) +#define ADS112C14_GPIO_DATA_OUTPUT_GPIO3_SRC_DAT_OUT 0 +#define ADS112C14_GPIO_DATA_OUTPUT_GPIO3_SRC_DRDY 1 #define ADS112C14_GPIO_DATA_OUTPUT_GPIO2_SRC BIT(6) #define ADS112C14_GPIO_DATA_OUTPUT_GPIO3_DAT_OUT BIT(3) #define ADS112C14_GPIO_DATA_OUTPUT_GPIO2_DAT_OUT BIT(2) @@ -251,6 +259,8 @@ struct ads112c14_data { struct regmap *regmap; /* Synchronizes access to register value fields. */ struct mutex lock; + int drdy_irq; + struct completion drdy_completion; bool i2c_crc_enabled; u32 avdd_uV; u32 ext_ref_uV; @@ -265,6 +275,16 @@ struct ads112c14_data { ARRAY_SIZE(ads112c14_sys_mon_channels)); }; =20 +static irqreturn_t ads112c14_drdy_irq_handler(int irq, void *private) +{ + struct iio_dev *indio_dev =3D private; + struct ads112c14_data *data =3D iio_priv(indio_dev); + + complete(&data->drdy_completion); + + return IRQ_HANDLED; +} + static bool ads112c14_writeable_reg(struct device *dev, unsigned int reg) { switch (reg) { @@ -581,12 +601,45 @@ static int ads112c14_prepare_sys_mon_channel(struct a= ds112c14_data *data, return 0; } =20 +static int ads112c14_wait_for_conversion_irq(struct ads112c14_data *data) +{ + unsigned long remaining; + int ret; + + reinit_completion(&data->drdy_completion); + + ret =3D regmap_write(data->regmap, ADS112C14_REG_CONVERSION_CTRL, + ADS112C14_CONVERSION_CTRL_START); + if (ret) + return ret; + + remaining =3D wait_for_completion_timeout(&data->drdy_completion, + msecs_to_jiffies(100)); + + return remaining ? 0 : -ETIMEDOUT; +} + +static int ads112c14_wait_for_conversion_poll(struct ads112c14_data *data) +{ + u32 reg_val; + int ret; + + ret =3D regmap_write(data->regmap, ADS112C14_REG_CONVERSION_CTRL, + ADS112C14_CONVERSION_CTRL_START); + if (ret) + return ret; + + return regmap_read_poll_timeout(data->regmap, + ADS112C14_REG_STATUS_MSB, reg_val, + FIELD_GET(ADS112C14_STATUS_MSB_DRDY, reg_val), + 1 * USEC_PER_MSEC, 100 * USEC_PER_MSEC); +} + static int ads112c14_single_conversion(struct ads112c14_data *data, const struct iio_chan_spec *chan, u8 *buf, bool for_scan) { struct i2c_client *client =3D to_i2c_client(regmap_get_device(data->regma= p)); - u32 reg_val; int ret; =20 guard(mutex)(&data->lock); @@ -601,15 +654,10 @@ static int ads112c14_single_conversion(struct ads112c= 14_data *data, return ret; } =20 - ret =3D regmap_write(data->regmap, ADS112C14_REG_CONVERSION_CTRL, - ADS112C14_CONVERSION_CTRL_START); - if (ret) - return ret; - - ret =3D regmap_read_poll_timeout(data->regmap, - ADS112C14_REG_STATUS_MSB, reg_val, - FIELD_GET(ADS112C14_STATUS_MSB_DRDY, reg_val), - 1 * USEC_PER_MSEC, 100 * USEC_PER_MSEC); + if (data->drdy_irq) + ret =3D ads112c14_wait_for_conversion_irq(data); + else + ret =3D ads112c14_wait_for_conversion_poll(data); if (ret) return ret; =20 @@ -1391,6 +1439,38 @@ static int ads112c14_probe(struct i2c_client *client) if (ret) return ret; =20 + if (fwnode_property_match_string(dev_fwnode(dev), "interrupt-names", "drd= y") >=3D 0) { + data->drdy_irq =3D fwnode_irq_get_byname(dev_fwnode(dev), "drdy"); + if (data->drdy_irq < 0) + return dev_err_probe(dev, data->drdy_irq, + "failed to get drdy interrupt\n"); + + /* + * REVISIT: would probably need to implement a pin controller in + * order to support open drain option here. + */ + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_GPIO_CFG, + ADS112C14_GPIO_CFG_GPIO3_CFG, + FIELD_PREP(ADS112C14_GPIO_CFG_GPIO3_CFG, + ADS112C14_GPIO_CFG_GPIO_CFG_OUTPUT_PUSH_PULL)); + if (ret) + return ret; + + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_GPIO_DATA_OUTPUT, + ADS112C14_GPIO_DATA_OUTPUT_GPIO3_SRC, + FIELD_PREP(ADS112C14_GPIO_DATA_OUTPUT_GPIO3_SRC, + ADS112C14_GPIO_DATA_OUTPUT_GPIO3_SRC_DRDY)); + if (ret) + return ret; + + init_completion(&data->drdy_completion); + + ret =3D devm_request_irq(dev, data->drdy_irq, ads112c14_drdy_irq_handler, + 0, dev_name(dev), indio_dev); + if (ret) + return ret; + } + ads112c14_populate_tables(data); =20 indio_dev->name =3D info->name; --=20 2.43.0 From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi1-f180.google.com (mail-oi1-f180.google.com [209.85.167.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 5E46242BE95 for ; Thu, 10 Sep 2026 21:14:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074883; cv=none; b=lMmBA8iMK6Yhqkyqy+dX2U+wsFC3CuHuF/BZE1LnFBfVinBwrb0c7oNvqa0Qe9EMLPyTpD0NuuHgIDegPQkAqyiBD4MmGPoudAQJ3JFH79h8GDIyzDMwu86ZkX/HrZVEMh+YaCFV5bxLZE4gGNWe67PqwEqVhUZu+OrpjHyhu14= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074883; c=relaxed/simple; bh=yI4Hk3lgmAclykhu+CF4IfwMFXOwKo7xr12Yxb8s+vc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=k4KeLKg2HUsYFsMH1IaWFpUac19Vw0YBq0hdfRdGgD5FBrxehmVkjZdl0OXpC6XyeAxCMYaVqsq0AKygj6/USWkcHE7sQU80+/bPo6ZMEqd82q3mAWY65GS3h61AvYzQQZmW/uohj/IfmpD9SGcqUDnqapyRupmmHnDmXASkpNg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=LUA4weC/; arc=none smtp.client-ip=209.85.167.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="LUA4weC/" Received: by mail-oi1-f180.google.com with SMTP id 5614622812f47-4b381337e1fso326520b6e.1 for ; Thu, 10 Sep 2026 14:14:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074873; x=1789679673; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=8Lqb73MWiqVxTq8osVaR58AWy47UTsGolXWTeVg1RTI=; b=LUA4weC/0J2nvc/ZX7bYOQXDG+oXdIfkx12oJYBY6jGnGm9UzLIQfq6aJYKwuUB2v5 KAvGS+xViroFsTlAsBWEJ0SuO6IVZcetpcyk/vxRZjTM9G/45vzDi4gH++KNAPaoJYCv lGNuAdrvdJImmRRF0OfkrtQfefLayB+XafQ6OMlv3SWyYa5xM3aLC3s/6AwCYCb2qM6g B5wwIoKSnLNUV13KQUkdmKoBslRLB2rGQujpPee3vkHuQoOHicJnE5F7rdwcqhYwSXAP GApU5Gl1eyBYJ1dW/zI393LMppp25HKpc5oPjqwSKm4Qh7TAyCotmcpvuCmJQEkMWSnw giTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074873; x=1789679673; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=8Lqb73MWiqVxTq8osVaR58AWy47UTsGolXWTeVg1RTI=; b=nmpoQYCFsYJPCp8wBU8Ke1XviApkz+lvBDDy/qigeayqlk4TtILpBLqyhk1pgTc4cI N+BCTyTpY5o0n69kncoZW+p4isfv65oP/xzPQ9WEZTDG2g5pCoEqcBjIdjkYFz/V9rXA WIdtKJjSZ6syMlyQJvgFNmG9hkJWI+0Bz2cy50JZiDFiJgLUqyIpG0QxxX/34XHureuj y9ivw8hGdcXe/82p7cuRyfJzE0lshUPV8cbwU/1UpICAY83ASyzmJqSIrtVntf6WWDuK xADNyXtGmvs4+0o8EaVoNHvs4j63Y6XkP1EGgTsctnTHDUXT65N6cyu4rwJzdIqBgz/+ A5+A== X-Forwarded-Encrypted: i=1; AKwUvByMFpcdEOViYnlRVKW0QJCVjaQ6hA+IJUtuZAswJHARcAWk8EcV1dSpP8AVz3vR9dKClFui9vci6WkgxKg=@vger.kernel.org X-Gm-Message-State: AFuF++m6dhPtClkiIsgtIt7lnz9C0LHUpdrey9JfR7VwiCeLY1LVYNA3 iDyVOxe8m7qRTnuf78R1Bgfple0MOlWUfUTrdIH+dE903jZ6BO+dHe9jZRvT8HIlnBn+mOMGMKv 8oNGU X-Gm-Gg: AYBFou0lVdzeKRpJ0+syjrcI1ZwfFTyTd8zyMu8aSpNQvDn80C97e0WgpexW5AZbJde QlPfF67r+ZPVPFn7XBJ8fE2knuvv/m4r2AqCsYc34nsi8bbzHhVNlDmL7MwP7OW3bflnk7Q2iVQ LPbwFf8mQldr8u7e7KAlKcfEMlsYtp1xZ+2jnYIYFRhXk0ZV8211ndw7r7sy2Cc3cigIcpA93T0 e17ZQeUZj/ol4zPX+FGn0/OUM+FhbcEUrTrF1iDc5guPtnnI8lcwX6em4WoZalkDjsJQ9qbQdTQ dl9w2LvpmyXP+Vxnn0VyINHbDDv9Du3iZ593CSM/8dwPgb47nhLaY8rUQn0nkMYtRM/lPE5H+uz AVoNLeeiehTXroGWOvzYc7+MbtsCCQZGadt2+66Vk5f5HSaz/EF4uu5OV0b6nTHowuiVitY+5kl kNNg/jNEzbxk/Q/LmZjnF2c9epf4wnAcEFkmkkQ04kT41a8Aupm3s+bw5UD0dJ5HIhFJ/cMe23Z 7DG X-Received: by 2002:a05:6808:d4e:b0:4c2:dd8a:fa46 with SMTP id 5614622812f47-4c319a4f5d7mr676216b6e.16.1789074872995; Thu, 10 Sep 2026 14:14:32 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:32 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:01 -0500 Subject: [PATCH v3 02/10] iio: adc: ti-ads112c14: create data read helper functions 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-2-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=2657; i=dlechner@baylibre.com; h=from:subject:message-id; bh=yI4Hk3lgmAclykhu+CF4IfwMFXOwKo7xr12Yxb8s+vc=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqox15NIzRzXG8xctuhvC/NL85GoIo6+4MDso3a G0oJUKViWuJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaqMdeQAKCRDCzCAB/wGP wGY+CACXYZ57zGgdJRSF2r+iC+IQwHm+q11Hg+ZWHf10JIRnoxLxd5tgo92Z84B62yFC2t1FE3v MXcVUFOfsbDLwlLnwooMjHjM8H6dHpHXVQEL5pFF7z8KliwiDICIYslKPaETpewZ6DAfU5LMbIH BfEEzYkzqlCHE9ROYikkTjFDar3n+bgNQAtz72m3aRV0apIKmS1KmL3KIi60nnPwhW29Mad1Xvk tMSrKcOhNKLbxoVxokKTLHhAJ6nf1cNS9cLg/UFxSVxT+CrH9EyX8e61bcgb+18v7iIDHsVXqaT XPkukubrhbuePjac7htbsHTvCV0sjg/XkF7tTW2w6VxFpB+I X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Refactor a few bits of code into helper functions. These will be reused when continuous mode support is added in a later patch. Signed-off-by: David Lechner (TI) --- drivers/iio/adc/ti-ads112c14.c | 51 +++++++++++++++++++++++++-------------= ---- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c index 9058ad34bc06..b2940b5d3c99 100644 --- a/drivers/iio/adc/ti-ads112c14.c +++ b/drivers/iio/adc/ti-ads112c14.c @@ -601,6 +601,32 @@ static int ads112c14_prepare_sys_mon_channel(struct ad= s112c14_data *data, return 0; } =20 +static int ads112c14_prepare_channel(struct ads112c14_data *data, + const struct iio_chan_spec *chan) +{ + if (chan->channel < ADS112C14_SYS_MON_CHANNEL_BASE) + return ads112c14_prepare_measurement_channel(data, chan); + + return ads112c14_prepare_sys_mon_channel(data, chan); +} + +static int ads112c14_scan_read(struct ads112c14_data *data, u8 *buf) +{ + struct i2c_client *client =3D to_i2c_client(regmap_get_device(data->regma= p)); + int ret; + u8 len; + + len =3D BITS_TO_BYTES(data->chip_info->resolution_bits); + if (data->i2c_crc_enabled) + len +=3D 1; + + ret =3D i2c_smbus_read_i2c_block_data(client, ADS112C14_CMD_RDATA, len, b= uf); + if (ret < 0) + return ret; + + return 0; +} + static int ads112c14_wait_for_conversion_irq(struct ads112c14_data *data) { unsigned long remaining; @@ -644,15 +670,9 @@ static int ads112c14_single_conversion(struct ads112c1= 4_data *data, =20 guard(mutex)(&data->lock); =20 - if (chan->channel < ADS112C14_SYS_MON_CHANNEL_BASE) { - ret =3D ads112c14_prepare_measurement_channel(data, chan); - if (ret) - return ret; - } else { - ret =3D ads112c14_prepare_sys_mon_channel(data, chan); - if (ret) - return ret; - } + ret =3D ads112c14_prepare_channel(data, chan); + if (ret) + return ret; =20 if (data->drdy_irq) ret =3D ads112c14_wait_for_conversion_irq(data); @@ -667,17 +687,8 @@ static int ads112c14_single_conversion(struct ads112c1= 4_data *data, * with CRC errors, but rather leave it to userspace to decide what to * do. */ - if (for_scan) { - u8 len =3D BITS_TO_BYTES(data->chip_info->resolution_bits) + - (data->i2c_crc_enabled ? 1 : 0); - - ret =3D i2c_smbus_read_i2c_block_data(client, ADS112C14_CMD_RDATA, - len, buf); - if (ret < 0) - return ret; - - return 0; - } + if (for_scan) + return ads112c14_scan_read(data, buf); =20 return ads112c14_i2c_read_bytes(client, ADS112C14_CMD_RDATA, buf, BITS_TO_BYTES(data->chip_info->resolution_bits), --=20 2.43.0 From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi2-f13.google.com (mail-oi2-f13.google.com [74.125.231.205]) (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 C56DA42AF82 for ; Thu, 10 Sep 2026 21:14:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.231.205 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074891; cv=none; b=EC9YKHVde/iVmAoeGgKDf/YWZ8o2M/TfUTkRMvdvozVDCqQl5xWp5WqUCjRM5xU8f66C8qrso5urXwtHAYNyc9Bw2P4XG9dpFWq7eHtS9APElUryGP4gb8aiDlKhbur8xEYGvXVycU5Kj9Zau9wEgLyE4SiX9128wCJkt1DLyRc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074891; c=relaxed/simple; bh=ipRQM+y4GEfK0iLNUB8nAfxP8/yNtQ0sDmoWBJ2tDGI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lwqvBo6Xt4VevThgkeC8jb43LcJfV58DLlZT1rtbr2V/n45ETOBuO/2ZZw5rOZG8HSRbH2a/i7gkk/hZ+tDihodx/TcFJIH1TCqyWbeUwgg9k2aRWcN2KRFXu1h+22i91gDUI/xVgK/TV5uZIdEdfwJ5BhZ4F7M47Vb2Xm/T4Qc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=gjEDSmf9; arc=none smtp.client-ip=74.125.231.205 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="gjEDSmf9" Received: by mail-oi2-f13.google.com with SMTP id 5614622812f47-4bf948737e1so233598b6e.2 for ; Thu, 10 Sep 2026 14:14:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074875; x=1789679675; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=wBiJn8Ecvvni6QBRfEghFXWnlQeSyCYHU8s9BH4FLQU=; b=gjEDSmf9Cze5DGk7lvDcIWqke3hNey1+qCmc+7vwkBvubBWN6EF3YMAt+7XWx2HQWe Ma112U47v4X0Xo3rKvkoUgsQGFzZO/M+8/0UE0z6ngRLmOEvi2OZPOgSVzdrVh6TaYGx EqFuNQhlv6G4ZMOICxni/0RAa6ZJX3+9jZJ9/nKOL6nZ8tiuYh8iF/rGTUrvmwLg8k1y MefvQ80+6ZZ0owI4MKE8V5YtKOlf9Sa8C+Xkcvk/BvnJ/qPJGUP5jPUJwdPMMe495RTW CJpTbhtTw1Cr4JMLptSIgFVLlpMxucuGuu+tOvqOlCUh4ZVz7g3gmVBhBvzMboIN/kvC ZIZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074875; x=1789679675; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=wBiJn8Ecvvni6QBRfEghFXWnlQeSyCYHU8s9BH4FLQU=; b=axxF8hAWwAmLNom0KQfPO2kBuND9QNgy5bYHeyG40a6RsrUg0sW2VZzj+2ySKQQ+5X E9R75H23+yvnG662U1xhLdDEEJJYJsBJhXqKLcdj8EMj/7mdxIKEU0TBml6U7zAAiis9 rLi/nrteFvhE9vzsLThI2lru9A2qVFUHvggXr11TEXQnWW2PodUHQnHFZKhVJxY5QiCJ NNjC779e9a3QK18Y8x+8ZF5Mz6KKi+yhzLjnLN2tCp5HyfwzUJZtaL+eG/ND6n5/FagE lcXanV3iDcX26ysVXaRALbDoUhe0iqP8zltZOE59k0stA/Ra+D7EDFoKt7gYEx+283u/ H5FA== X-Forwarded-Encrypted: i=1; AKwUvByy0S3/YCkhWu+oPTNYBSwDPsl63DVe8PERtzJMrJxAJ+yRG9ahcwAxYc/s8+wS2eu4nk2rpZ0/0d81BZ0=@vger.kernel.org X-Gm-Message-State: AFuF++mzfbFzzwc1iKe3qqd/KzI3NRX6BCppESKjsx7a4Lah3F5pAZJm 5LvY5jyimvyObD5SJ64KxQjoC5WUZIiGSXsE51ZmvWDG32GJObjll2vzQFVu0PXV/+ndl6N0K1y zzBeR X-Gm-Gg: AYBFou23WcTv30kP0MAaCEIft468zKNZiF6zgk9m2VIvETszWTIZa9BZSD9hWA3cWNc h/Ym12LyrK92lBzlI9OBm7QITrgRTty56miA4DPWl+Pi7TU4VziXLnGJcBNZ3Qcabwxl7BcMJdN 0Q6DOCRMT/A8h2SPxSDXTMsgsqJB7vN5FvfJOZat7bQAcNDPXQ40zA45EzSukqHvsucndrvAyGx ddHgXzLMZFAk3AHjtlDXzOVS0UZXcHVFE1HNzLVTspcxG8QgW9sNAbXKOY/vUrJa941o+j3utHV dG5DXvEuKDuMcTxdsaOm4yMC6cQmrKYwH8NYicVX4kTBr4KjfJlRKNjCDdApe9vSW+1D4b+IR7L 6m1mEU0/VfUnMXwvdS0/LMEI+mH/OuhLEBYtITZfhpXsb3XoIlMDlhHtxHgi+4uT2o2hpxBBv+M +Y8Kn2xqhtJDjSbLMbqtPGPbsCRkr2Kgwyse2i9E0VTCch+fiXQdsw86uLmCOurh5bmWzmyaIrT cTH X-Received: by 2002:a05:6808:2f0d:b0:4c1:30a9:6dac with SMTP id 5614622812f47-4c31c6263f4mr1346436b6e.19.1789074874957; Thu, 10 Sep 2026 14:14:34 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:33 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:02 -0500 Subject: [PATCH v3 03/10] iio: adc: ti-ads112c14: add continuous mode support 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-3-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=8170; i=dlechner@baylibre.com; h=from:subject:message-id; bh=ipRQM+y4GEfK0iLNUB8nAfxP8/yNtQ0sDmoWBJ2tDGI=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqox1/1aiAbgy+Uf3d3gNsS+yyEcwcEWW/qJX2R xM7emYTUeOJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaqMdfwAKCRDCzCAB/wGP wLq7B/4rq3+r6tbXQG6SmX1KkB29Ri8ZzWD5Cpp2y562utbYrcQ9XrHqI+CmzAOayk5FsDk/k/q 2+J9d1YIOd9EaMsLGj+krSBsPHxMT3L6DHQYpa63E2GC1lZt7YJPzEF4TQ/2UX0QRh7dahUswhz uKieByxUshAzid6VPaIXhIZucriRGFsfwxj+9qZY9em4cUAVSR14GPGtAUWfxAiNqSrH45TUyBo tn4HjVgoc8mOCjjXnORaDlOhQtDgJW+hmaEA/nOk2HLAw1f1Dewto8p0miq+N4tNF1IBI5nskSa MsN0KA4e2itP651j/wPfhFhxONBjYyPRkGJRINzKumYkPBKx X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add support for continuous mode in the TI ADS112C14 ADC driver. In this mode the ADC itself is starting each conversion, so we add a trigger based on the DRDY interrupt to read each sample. This mode is also limited in that only one channel can be enabled at a time since the chip does not have a sequencer or simultaneous sampling capability. Continuous mode will only be used when this new trigger is the current trigger. Signed-off-by: David Lechner (TI) --- drivers/iio/adc/ti-ads112c14.c | 153 +++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 151 insertions(+), 2 deletions(-) diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c index b2940b5d3c99..09807ea4fb18 100644 --- a/drivers/iio/adc/ti-ads112c14.c +++ b/drivers/iio/adc/ti-ads112c14.c @@ -9,6 +9,7 @@ */ =20 #include +#include #include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -257,10 +259,12 @@ struct ads112c14_measurement { struct ads112c14_data { const struct ads112c14_chip_info *chip_info; struct regmap *regmap; + struct iio_trigger *drdy_trig; /* Synchronizes access to register value fields. */ struct mutex lock; int drdy_irq; struct completion drdy_completion; + bool continuous_mode; bool i2c_crc_enabled; u32 avdd_uV; u32 ext_ref_uV; @@ -280,11 +284,18 @@ static irqreturn_t ads112c14_drdy_irq_handler(int irq= , void *private) struct iio_dev *indio_dev =3D private; struct ads112c14_data *data =3D iio_priv(indio_dev); =20 - complete(&data->drdy_completion); + if (READ_ONCE(data->continuous_mode)) + iio_trigger_poll(data->drdy_trig); + else + complete(&data->drdy_completion); =20 return IRQ_HANDLED; } =20 +static const struct iio_trigger_ops ads112c14_trigger_ops =3D { + .validate_device =3D iio_trigger_validate_own_device, +}; + static bool ads112c14_writeable_reg(struct device *dev, unsigned int reg) { switch (reg) { @@ -695,6 +706,13 @@ static int ads112c14_single_conversion(struct ads112c1= 4_data *data, data->i2c_crc_enabled); } =20 +static bool ads112c14_using_drdy_trigger(struct iio_dev *indio_dev) +{ + struct ads112c14_data *data =3D iio_priv(indio_dev); + + return data->drdy_trig && indio_dev->trig =3D=3D data->drdy_trig; +} + static int ads112c14_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) @@ -898,6 +916,19 @@ static int ads112c14_write_raw_get_fmt(struct iio_dev = *indio_dev, } } =20 +static int ads112c14_update_scan_mode(struct iio_dev *indio_dev, + const unsigned long *scan_mask) +{ + /* Only continuous mode is limited to a single channel. */ + if (!ads112c14_using_drdy_trigger(indio_dev)) + return 0; + + if (!iio_validate_scan_mask_onehot(indio_dev, scan_mask)) + return -EINVAL; + + return 0; +} + static int ads112c14_debugfs_reg_access(struct iio_dev *indio_dev, unsigned int reg, unsigned int writeval, @@ -952,6 +983,19 @@ static int ads112c14_read_label(struct iio_dev *indio_= dev, return sysfs_emit(label, "%s\n", label_source); } =20 +static const struct iio_chan_spec * +ads112c14_first_active_channel(struct iio_dev *indio_dev) +{ + unsigned int scan_mask_len =3D iio_get_masklength(indio_dev); + unsigned int i; + + i =3D find_first_bit(indio_dev->active_scan_mask, scan_mask_len); + if (i =3D=3D scan_mask_len) + return NULL; + + return &indio_dev->channels[i]; +} + static irqreturn_t ads112c14_trigger_handler(int irq, void *private) { struct iio_poll_func *pf =3D private; @@ -961,6 +1005,26 @@ static irqreturn_t ads112c14_trigger_handler(int irq,= void *private) u32 i; int ret; =20 + if (ads112c14_using_drdy_trigger(indio_dev)) { + const struct iio_chan_spec *chan; + + chan =3D ads112c14_first_active_channel(indio_dev); + if (!chan) + goto out; + + ret =3D ads112c14_scan_read(data, (u8 *)&data->scan[0]); + if (ret) { + dev_err_once(indio_dev->dev.parent, + "failed to read channel %d: %pe; additional errors will be suppre= ssed\n", + chan->channel, ERR_PTR(ret)); + goto out; + } + + iio_push_to_buffers_with_ts(indio_dev, data->scan, + sizeof(data->scan), pf->timestamp); + goto out; + } + iio_for_each_active_channel(indio_dev, i) { const struct iio_chan_spec *chan =3D &indio_dev->channels[i]; =20 @@ -988,10 +1052,81 @@ static const struct iio_info ads112c14_info =3D { .read_avail =3D ads112c14_read_avail, .write_raw =3D ads112c14_write_raw, .write_raw_get_fmt =3D ads112c14_write_raw_get_fmt, + .update_scan_mode =3D ads112c14_update_scan_mode, .debugfs_reg_access =3D ads112c14_debugfs_reg_access, .read_label =3D ads112c14_read_label, }; =20 +static int ads112c14_buffer_postenable(struct iio_dev *indio_dev) +{ + struct ads112c14_data *data =3D iio_priv(indio_dev); + const struct iio_chan_spec *chan; + int ret; + + if (!ads112c14_using_drdy_trigger(indio_dev)) + return 0; + + chan =3D ads112c14_first_active_channel(indio_dev); + if (!chan) + return -EINVAL; + + guard(mutex)(&data->lock); + + ret =3D ads112c14_prepare_channel(data, chan); + if (ret) + return ret; + + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + ADS112C14_DEVICE_CFG_CONV_MODE, + FIELD_PREP(ADS112C14_DEVICE_CFG_CONV_MODE, + ADS112C14_DEVICE_CFG_CONV_MODE_CONTINUOUS)); + if (ret) + return ret; + + WRITE_ONCE(data->continuous_mode, true); + + ret =3D regmap_write(data->regmap, ADS112C14_REG_CONVERSION_CTRL, + ADS112C14_CONVERSION_CTRL_START); + if (ret) { + WRITE_ONCE(data->continuous_mode, false); + regmap_update_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + ADS112C14_DEVICE_CFG_CONV_MODE, + FIELD_PREP(ADS112C14_DEVICE_CFG_CONV_MODE, + ADS112C14_DEVICE_CFG_CONV_MODE_SINGLE_SHOT)); + return ret; + } + + return 0; +} + +static int ads112c14_buffer_predisable(struct iio_dev *indio_dev) +{ + struct ads112c14_data *data =3D iio_priv(indio_dev); + int ret; + + if (!ads112c14_using_drdy_trigger(indio_dev)) + return 0; + + guard(mutex)(&data->lock); + + WRITE_ONCE(data->continuous_mode, false); + + ret =3D regmap_write(data->regmap, ADS112C14_REG_CONVERSION_CTRL, + ADS112C14_CONVERSION_CTRL_STOP); + if (ret) + return ret; + + return regmap_update_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + ADS112C14_DEVICE_CFG_CONV_MODE, + FIELD_PREP(ADS112C14_DEVICE_CFG_CONV_MODE, + ADS112C14_DEVICE_CFG_CONV_MODE_SINGLE_SHOT)); +} + +static const struct iio_buffer_setup_ops ads112c14_buffer_setup_ops =3D { + .postenable =3D ads112c14_buffer_postenable, + .predisable =3D ads112c14_buffer_predisable, +}; + static int ads112c14_populate_idac_mag(u32 current_nA, u8 *idac_mag) { u32 current_uA =3D current_nA / (NANO / MICRO); @@ -1476,6 +1611,19 @@ static int ads112c14_probe(struct i2c_client *client) =20 init_completion(&data->drdy_completion); =20 + data->drdy_trig =3D devm_iio_trigger_alloc(dev, "%s-dev%d-drdy", + info->name, + iio_device_id(indio_dev)); + if (!data->drdy_trig) + return -ENOMEM; + + data->drdy_trig->ops =3D &ads112c14_trigger_ops; + iio_trigger_set_drvdata(data->drdy_trig, indio_dev); + + ret =3D devm_iio_trigger_register(dev, data->drdy_trig); + if (ret) + return ret; + ret =3D devm_request_irq(dev, data->drdy_irq, ads112c14_drdy_irq_handler, 0, dev_name(dev), indio_dev); if (ret) @@ -1490,7 +1638,8 @@ static int ads112c14_probe(struct i2c_client *client) =20 ret =3D devm_iio_triggered_buffer_setup(dev, indio_dev, iio_pollfunc_store_time, - ads112c14_trigger_handler, NULL); + ads112c14_trigger_handler, + &ads112c14_buffer_setup_ops); if (ret) return ret; =20 --=20 2.43.0 From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi2-f12.google.com (mail-oi2-f12.google.com [74.125.231.204]) (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 4AA4442E415 for ; Thu, 10 Sep 2026 21:14:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.231.204 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074882; cv=none; b=gN2a7Qx1zZV41NakqtMqBLFFzNOSogDRLSoAlmrUnMujPJHriH/v3mU4LoApA+PIZ1hrlHAuwMGFdoYZSq3Mm/Vr4ZzMpSbIZhWDU1kP/AeCz2staWF8wbCD7JgnfENG2gWXqM669ybsC0PsaTWSqmMDpTDbNuX2Cgtd63iC1vM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074882; c=relaxed/simple; bh=KU+4AV+kOnzd5jEsWKuPqEzXiklLnQiKMAGatDLd+aE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qoHjjJA4PPfgUhnP8vcazOEbCW+mFPe1qlOOt9htgyHgQiPkZKYiwcRhdl+YLmRuOQ47VfBjB/LeWfA+SSgRAGElLHo2+vhHHwPnBtXc1xrazBLhZhHqLntsriWMmwul5Dh/oX51I+y6B5Kx+mQq5eguOUoQBxO25J/4v+zfKT0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=hn7LRkLq; arc=none smtp.client-ip=74.125.231.204 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="hn7LRkLq" Received: by mail-oi2-f12.google.com with SMTP id 5614622812f47-4b37a3c0d7aso49733b6e.1 for ; Thu, 10 Sep 2026 14:14:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074876; x=1789679676; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=y6lYMnoAXwzmgp5VcdAbIKbPvgnPHfrFuyY1q4g3+vs=; b=hn7LRkLqV4Kha7XuVyTkws8e8ajy3Bi2cUR0lFRBI5NjVWck71Dyi4j79v6YQtJUGQ 5G6jvTxsjb4KRC+ItVXKRFeCLryw8k3a58zuGnG3NUsmqV7F7JiqTSk+uvNSCuVwBs2F JoNwEXJrNxEZiqa56FWGJpwfUhZBpGnHsQCvUqVtwYLuvtNvH6OL4cpTepzreCF+TEY7 V4peE0y7HMnCmEeBC1Z7R7Kx98Fnau0fBy4hlU1J7yLILQuSJJat52r+h4eOFTDgCmaE Q7A4QjXwwM3PPe1Y32/yEcby2J878pSzjuGl+4LLGsD39pxJW9/6mtmqhUqFmSJf5FN7 9ZCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074876; x=1789679676; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=y6lYMnoAXwzmgp5VcdAbIKbPvgnPHfrFuyY1q4g3+vs=; b=AQc/DsmYC8g/ZBS1QsDaJz8wo3ELG9/CQZDUGO6QIXEjyFxBJb8R9TyKZDu9Sdq4JK z/eeK+us8DdvmLzrTofH0RhTdQZffCWIVPIvNLNcz3dUfcVvKqbGa4lMIWu0U/z+W1rq 580QxpTfpLFWq6rBNVBSMRD7MDltcO5C5jUXjOpS/uCLkbocxoQay8WzYWXzUrC0SG/i /gsSlBO6cBx+tiYONk25J9YmoglRgQKh8XnD/ABJNPAnMOPycoY0HmO1mPKxDctHh/iW YoLskd8tKJiRDXvVivZKus8YNoOBWlp0N3aSoRJOuueh9j87wvmn4ccZ5ed/ajyELC7P 11VA== X-Forwarded-Encrypted: i=1; AKwUvByMQWh4hBEVGgqlOCmYrdAon1kr3ScgIwWEQv01rY1o0g6t/DTsaq9kVDh882yJU3Y9mGEzY0nKn9o2H6g=@vger.kernel.org X-Gm-Message-State: AFuF++kq290G2AXnK44bFRR9lcvGNomR27oaBsbK7gQN8k97+d8JSOBF LJvCvVgm2CI7L+xCMvWbMwE/QiZc4mokiXtOnTyZ8A0tRmPjAAp9IgmRlsXsd0iCHU0Wk+KLn3S pRpwM X-Gm-Gg: AYBFou3DDsm3ux94wkdfQQHZkUH2ktqz1r181D4LdiUErNLQ+sNs1XA43wqqkOFucpD lgynGBEcHBHYMbSwLH4sW/r08oU7EHWlFABgwSedwmQyeQIRyOcTDjSNyOzrz2PAygbR7z2Eiuy zY0nVopAPPzK74Tr4hy+lCxsB0ztFMKotmBXwVfFcPvtYQ8W+2fDbLGzdJ5K3tViXhE8tawc+Cx CpaZrfFyW+Lyp0Sl2yLWi5WEqItXy6XQm8mHBzARMdLY9rbV78xgRkOoYYP27QXMe4gECUj5XwM fFq3NNr6KjsaJB/rYF+XxtepiigpPYU3NPgW9g4OqDcroWFQom14nIIWTPXiFUU5oCUWU8xqvSq qWQ18lBUgRIvewDvJOUN3xhwUr7uLxwCow+fHJ7BEeP773/qL9+wvL2Tr1AOFn9xE/kdkELC/6X mzqIfxVTgR9zHW3uxBULM7kQ0JrpGRCNOPXpXY3XgdB1a3G8cybN/uIOP1WHHRpXbB7da95K64s DcX X-Received: by 2002:a05:6808:1450:b0:4b8:46e3:e224 with SMTP id 5614622812f47-4c3087a6c89mr653693b6e.16.1789074875829; Thu, 10 Sep 2026 14:14:35 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:35 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:03 -0500 Subject: [PATCH v3 04/10] iio: adc: ti-ads112c14: add burnout current support 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-4-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=8219; i=dlechner@baylibre.com; h=from:subject:message-id; bh=KU+4AV+kOnzd5jEsWKuPqEzXiklLnQiKMAGatDLd+aE=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqox2GIPeBzEgCBZBs9wKq2h1JkAQwnOQAZCm8T o1EhSE+Ju2JATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaqMdhgAKCRDCzCAB/wGP wBWdCACLUs10qRIsxUSKVSKMw23ml0dDS6NDxbGIz7DnfS7xMKx9NjBQPiSjgKWCgzzDs3rLB9Z Rc6CGEgwZCXa5S/WntKFnLkudrGVBtWB/wO1eiEd2UazGMTKNUnAuf9H2YucTXYAQOjk7HL9G8S ALA+6ww4jB9k+BeMe/PxMiT8SHLSD3XvpI6qg1QlrvfKjycutxPJUDODuCFoz9VEp437CC8j4/u lvgi/W0LJ/jrC88FCpb57Pg4/bfKB+PWRolF7Q2GbdhRl4BRcwVo2bGlcpmjZc3zvpHA0phGUy2 yLekPt95ku5nJQGenAbwFeUnQRfyzRPpBeHqx3EcmCEHejgJ X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add a custom attribute via ext_info when a channel has a burnout current specified in the devicetree. This adds an in_{voltageY,resistanceY, voltageY-voltageX}_burnoutraw sysfs attribute for the channel that performs a single conversion (same as _raw attribute) except that it enables the burnout current. The chip also has a restriction that input chopping cannot be enabled when burnout current is enabled, so we also disable input chopping when burnout current is active. Signed-off-by: David Lechner (TI) --- drivers/iio/adc/ti-ads112c14.c | 125 +++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 116 insertions(+), 9 deletions(-) diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c index 09807ea4fb18..efea1e22d067 100644 --- a/drivers/iio/adc/ti-ads112c14.c +++ b/drivers/iio/adc/ti-ads112c14.c @@ -76,6 +76,11 @@ #define ADS112C14_DEVICE_CFG_PWDN BIT(7) #define ADS112C14_DEVICE_CFG_STBY_MODE BIT(6) #define ADS112C14_DEVICE_CFG_BOCS GENMASK(5, 4) +#define ADS112C14_DEVICE_CFG_BOCS_DISABLED 0 +#define ADS112C14_DEVICE_CFG_BOCS_200_nA 1 +#define ADS112C14_DEVICE_CFG_BOCS_1_uA 2 +#define ADS112C14_DEVICE_CFG_BOCS_10_uA 3 + #define ADS112C14_DEVICE_CFG_CLK_SEL BIT(3) #define ADS112C14_DEVICE_CFG_CONV_MODE BIT(2) #define ADS112C14_DEVICE_CFG_CONV_MODE_CONTINUOUS 0 @@ -251,6 +256,7 @@ struct ads112c14_measurement { u8 idac2_mux; u8 iadc_count; u8 gain_val; + u8 burnout; bool global_chop; bool bipolar; int scale_available[ARRAY_SIZE(ads112c14_pga_gains_x10)][2]; @@ -461,7 +467,8 @@ static const struct regmap_config ads112c14_regmap_conf= ig =3D { }; =20 static int ads112c14_prepare_measurement_channel(struct ads112c14_data *da= ta, - const struct iio_chan_spec *chan) + const struct iio_chan_spec *chan, + bool en_burnout) { struct ads112c14_measurement *measurement =3D &data->measurements[chan->s= can_index]; u32 refp_buf_en, refn_buf_en, ref_val, ref_sel; @@ -515,7 +522,8 @@ static int ads112c14_prepare_measurement_channel(struct= ads112c14_data *data, ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DATA_RATE_CFG, ADS112C14_DATA_RATE_CFG_GC_EN, FIELD_PREP(ADS112C14_DATA_RATE_CFG_GC_EN, - measurement->global_chop)); + (measurement->global_chop && + !en_burnout) ? 1 : 0)); if (ret) return ret; =20 @@ -613,10 +621,11 @@ static int ads112c14_prepare_sys_mon_channel(struct a= ds112c14_data *data, } =20 static int ads112c14_prepare_channel(struct ads112c14_data *data, - const struct iio_chan_spec *chan) + const struct iio_chan_spec *chan, + bool en_burnout) { if (chan->channel < ADS112C14_SYS_MON_CHANNEL_BASE) - return ads112c14_prepare_measurement_channel(data, chan); + return ads112c14_prepare_measurement_channel(data, chan, en_burnout); =20 return ads112c14_prepare_sys_mon_channel(data, chan); } @@ -674,14 +683,14 @@ static int ads112c14_wait_for_conversion_poll(struct = ads112c14_data *data) =20 static int ads112c14_single_conversion(struct ads112c14_data *data, const struct iio_chan_spec *chan, - u8 *buf, bool for_scan) + u8 *buf, bool en_burnout, bool for_scan) { struct i2c_client *client =3D to_i2c_client(regmap_get_device(data->regma= p)); int ret; =20 guard(mutex)(&data->lock); =20 - ret =3D ads112c14_prepare_channel(data, chan); + ret =3D ads112c14_prepare_channel(data, chan, en_burnout); if (ret) return ret; =20 @@ -742,7 +751,7 @@ static int ads112c14_read_raw(struct iio_dev *indio_dev, if (IIO_DEV_ACQUIRE_FAILED(claim)) return -EBUSY; =20 - ret =3D ads112c14_single_conversion(data, chan, buf, false); + ret =3D ads112c14_single_conversion(data, chan, buf, false, false); if (ret) return ret; =20 @@ -1030,7 +1039,7 @@ static irqreturn_t ads112c14_trigger_handler(int irq,= void *private) =20 ret =3D ads112c14_single_conversion(data, chan, (u8 *)&data->scan[offset++], - true); + false, true); if (ret) { dev_err_once(indio_dev->dev.parent, "failed to read channel %d: %pe; additional errors will be suppre= ssed\n", @@ -1072,7 +1081,7 @@ static int ads112c14_buffer_postenable(struct iio_dev= *indio_dev) =20 guard(mutex)(&data->lock); =20 - ret =3D ads112c14_prepare_channel(data, chan); + ret =3D ads112c14_prepare_channel(data, chan, false); if (ret) return ret; =20 @@ -1127,6 +1136,74 @@ static const struct iio_buffer_setup_ops ads112c14_b= uffer_setup_ops =3D { .predisable =3D ads112c14_buffer_predisable, }; =20 +static ssize_t ads112c14_read_burnout_raw(struct iio_dev *indio_dev, + uintptr_t private, + struct iio_chan_spec const *chan, + char *buf) +{ + struct ads112c14_data *data =3D iio_priv(indio_dev); + struct ads112c14_measurement *measurement; + int ret, ret2, val; + u8 raw_buf[3]; + + if (chan->channel >=3D ADS112C14_SYS_MON_CHANNEL_BASE) + return -EINVAL; + + measurement =3D &data->measurements[chan->scan_index]; + if (!measurement->burnout) + return -EINVAL; + + IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); + if (IIO_DEV_ACQUIRE_FAILED(claim)) + return -EBUSY; + + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + ADS112C14_DEVICE_CFG_BOCS, + FIELD_PREP(ADS112C14_DEVICE_CFG_BOCS, + measurement->burnout)); + if (ret) + return ret; + + ret =3D ads112c14_single_conversion(data, chan, raw_buf, true, false); + + /* + * Important to always turn off burnout current even if the conversion + * fails so that it does not affect subsequent measurements. + */ + ret2 =3D regmap_update_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + ADS112C14_DEVICE_CFG_BOCS, + FIELD_PREP(ADS112C14_DEVICE_CFG_BOCS, + ADS112C14_DEVICE_CFG_BOCS_DISABLED)); + if (ret < 0) + return ret; + if (ret2) + return ret2; + + switch (data->chip_info->resolution_bits) { + case 16: + val =3D get_unaligned_be16(raw_buf); + break; + case 24: + val =3D get_unaligned_be24(raw_buf); + break; + default: + return -EINVAL; + } + + if (measurement->bipolar) + val =3D sign_extend32(val, data->chip_info->resolution_bits - 1); + + return sysfs_emit(buf, "%d\n", val); +} + +static const struct iio_chan_spec_ext_info ads112c14_ext_info_burnout[] = =3D { + { + .name =3D "burnoutraw", + .read =3D ads112c14_read_burnout_raw, + }, + { } +}; + static int ads112c14_populate_idac_mag(u32 current_nA, u8 *idac_mag) { u32 current_uA =3D current_nA / (NANO / MICRO); @@ -1172,6 +1249,7 @@ static int ads112c14_parse_channels(struct iio_dev *i= ndio_dev, device_for_each_named_child_node_scoped(dev, child, "channel") { struct ads112c14_measurement *measurement =3D &data->measurements[i]; struct iio_chan_spec *spec =3D &channels[i]; + const char *propname; =20 spec->indexed =3D 1; spec->scan_index =3D i; @@ -1295,6 +1373,35 @@ static int ads112c14_parse_channels(struct iio_dev *= indio_dev, measurement->global_chop =3D fwnode_property_read_bool(child, "input-chopping"); =20 + propname =3D "burn-out-current-nanoamp"; + if (fwnode_property_present(child, propname)) { + u32 burnout_nA; + + ret =3D fwnode_property_read_u32(child, propname, &burnout_nA); + if (ret) + return dev_err_probe(dev, ret, + "failed to read %s property\n", + propname); + + switch (burnout_nA) { + case 200: + measurement->burnout =3D ADS112C14_DEVICE_CFG_BOCS_200_nA; + break; + case 1000: + measurement->burnout =3D ADS112C14_DEVICE_CFG_BOCS_1_uA; + break; + case 10000: + measurement->burnout =3D ADS112C14_DEVICE_CFG_BOCS_10_uA; + break; + default: + return dev_err_probe(dev, -EINVAL, + "invalid %s value\n", propname); + } + + if (measurement->burnout !=3D ADS112C14_DEVICE_CFG_BOCS_DISABLED) + spec->ext_info =3D ads112c14_ext_info_burnout; + } + if (fwnode_property_present(child, "reference-sources")) { ret =3D fwnode_property_match_property_string(child, "reference-sources", ads112c14_vref_source_names, --=20 2.43.0 From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi2-f13.google.com (mail-oi2-f13.google.com [74.125.231.205]) (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 DC91D3B52E7 for ; Thu, 10 Sep 2026 21:14:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.231.205 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074888; cv=none; b=KwoI+DLI+/WRgpt3D2AiRPw6P3VgygioKOr2FhoKoWp3xmztKW3BdjPM2l8nogmqsjeYEB+cGy4f9Qo1B8ACLqrTFzf+QU4vIJc7WbpEM0oXnNN1+ZPo+e1PA5Y2y4YOXUyDLisJQ003HRpB5IcSLrlOnjGxft8dZTLnmVZtQvE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074888; c=relaxed/simple; bh=GJPVs2NQci4j2hQP0V6E0YPPvN8JlhkXSX7vksZ1gUg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KAc8rrFXCGPHMD9X3KKNGIwCyqiz4xCpGljqbotHlNVUNIK8Qn4xA8W6Yq5lbWcMZHHtFSlcVfm12UKSOKcO2gnbhf00Ha/3Tt1UIf8SPm16aXNrkkG0jjyBxkRf6I3dBtxCY8qWjGxD/qD5WUrm/dTCOJQtkoJPqinXOog+9NQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=HAFDQy7+; arc=none smtp.client-ip=74.125.231.205 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="HAFDQy7+" Received: by mail-oi2-f13.google.com with SMTP id 5614622812f47-4c227aeffc1so58744b6e.1 for ; Thu, 10 Sep 2026 14:14:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074878; x=1789679678; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=RaUDv6jZm7IW5T2ncwIblB7pFriUxG8BMMkD58QXmUY=; b=HAFDQy7+RhttkDhQlPJgllU4poo90y1uN58YjM3XrGvv5FmbuZopKLwWkZOl0vXz1T 3xZfUjqNL1wOVqqxH547ByzayduVw1IerrNi4P5lESH9/DijlGKArJyrbKRNzqEJjW+C VUTROwa9G62wVoxbp+Te0dYsTXCpTgeZnszH8xIpzCvCI86O9IZPbmRJeOGWYFLnERL9 SDogtaGLAquEuqyIGsoB4m0QpmjZRYgjNDE7zM9yZfe/NKKQZGpw0VWKTAW1fApEZNz6 rCxCRhz6hck+LveWYjxVIhiZn58Alf5Wh9PZVrDYDwoYtHtLSK0KBdBVBdUWGcsRUqpn I9TA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074878; x=1789679678; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=RaUDv6jZm7IW5T2ncwIblB7pFriUxG8BMMkD58QXmUY=; b=fRjMFHF3CAPII0a2BhRyfsUrc8G5GhVDJ1XVihNJC+ol9AKG3TCK5nVAqCKFPtuO2p qgc35PMFK4KVHivXj3vwoLECL8iil21o9bhf2QCM4a9anwuuD4Y7vNucLY8QaGXX5F3x ytZCknqJ571DhE91pSrFZ/Iib8QYQpGsIRtzzi1a0lHIkoC7HF66qJsmSXUmOBv1m0h8 lmsgWepLDE7qo+bW7OpuTA1UBkAP2+exJtXMB/zcL+g0daBSfCKwJ0SNGGzHK1VmKC5A 1Dr3kGy4SPzO4m8Y8MELLJxBoHYSOvggf/mVd/h/97JBiJTwsFrnan026dXGQ9GXayKW BWUA== X-Forwarded-Encrypted: i=1; AKwUvBwFu7Ctcdpe30h6wOWKKzH5r17OIU9MCXCZSxMkkmO+cv9hYPlUYt6KEi6qkf2uHE+jHOqF4NF5b7ECWdQ=@vger.kernel.org X-Gm-Message-State: AFuF++nOdwAf2vB0QuU+2v9yP0au/c6zRgIVczZB6tPoA/3N4ezTVLLH ZjkwV8MRlrIKmgTuSvdpjhha6jLPOZcZ8CjKmX+cU7UVdAmjhr9nbgFW/xmexZs19i0f2kSqIVR FlIW4 X-Gm-Gg: AYBFou1Om8zTFIPR+vHe6MOJYlGVbnZHZ6Uanpwl/u/73or6zAckJLmLM0JpPLpVfHn nZackNBStADj/i3vpU8CIzvJA8wp+58ru1tkMQM+9Wtzv0h1ZfqFS5Fg/mj+bUB5rkzSKt959az 1x3xPq2cOLIherFfHqyCxSQTpbixPlOS29SwYd8zozE7pI5/WsYWVMJ/BGbsYves7zhI+ewdEnm VM1V0tO9OzflaHks+avABKUtWUJGwQ/6ppayv9e7NpuiQKg/4lSpoKR+wWf64cFuufvYBXTlnwk 7JxDSkCI1hSXJW+jP4lIFILJOekSGbLzWBab/qEU5W0o7xdB1JaKgaUj4y0x2KFpyhCMue/r3oz GrlQOwyfmv6r2bcg1tI9x3SN5VvCcfvYUmPPK5IQWXjgSZxJrOQpQIb/6vU/BsN1VLXBO7MXtio /iLu4K7MAJP3NeW+mtpupXAlr/r0lzacamSX7eLojyV5WFZvWZ+BbfwTGUpLznuvNWNBpB1up7q 4Q5 X-Received: by 2002:a05:6808:2f0d:b0:4b3:5da8:1da0 with SMTP id 5614622812f47-4c3062ff672mr776765b6e.5.1789074877754; Thu, 10 Sep 2026 14:14:37 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:36 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:04 -0500 Subject: [PATCH v3 05/10] iio: ABI: add sysfs attribute for _burnoutraw 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-5-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=1104; i=dlechner@baylibre.com; h=from:subject:message-id; bh=GJPVs2NQci4j2hQP0V6E0YPPvN8JlhkXSX7vksZ1gUg=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqox2Mm0sB7XapQX43w/pwQEiRiUGXEfKSzjCk7 cMX/22PIXiJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaqMdjAAKCRDCzCAB/wGP wM+LB/9rV0udXgWjKDj+MCoUTl43iZuCii2tDgM2haR44hQZcLbx1Dh8IN7MLl4ymuyufWrVqss V91e0kInXHrXl14MwpqBQKvgiDim7QPh6/2BPr6itnMUVydJcbTLqJbLQzCQoDTfyX3WqfwhRNT caSMg1KbwYwGBT3G9E3yetKoKESpQLbg4bgcjdOQAQEM3k7R6mOs1TLzpm+ntWptPTp4KCJVKdB q8ooaG3I6pKaX5aPZ1uSGpcoW1mj82xxc1jcGVOeczi6Is0wqVOKwOI8EDNFEfHIu/IpzupGKCX tn9Mo2XWh3OtPGWMZyiEuhIRqIQ4lZrELNod5rr8lqFAzZ6r X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add a new _burnoutraw attribute to the IIO ADC ABI. This is likely only applicable to ADCs (but is seen on multiple chips and vendors) so it gets its own file instead of being added to the main IIO ABI file. Signed-off-by: David Lechner (TI) --- Documentation/ABI/testing/sysfs-bus-iio-adc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-iio-adc b/Documentation/AB= I/testing/sysfs-bus-iio-adc new file mode 100644 index 000000000000..e1309b371efb --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-iio-adc @@ -0,0 +1,9 @@ +What: /sys/bus/iio/devices/iio:deviceX/in_resistanceY_burnoutraw +What: /sys/bus/iio/devices/iio:deviceX/in_voltageY_burnoutraw +What: /sys/bus/iio/devices/iio:deviceX/in_voltageY-voltageZ_burnoutraw +KernelVersion: 7.4 +Contact: linux-iio@vger.kernel.org +Description: + Raw value from channel Y read using a single conversion with + the channel burnout current enabled. This is typically used + for diagnostic purposes to detect an open or shorted input. --=20 2.43.0 From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi1-f176.google.com (mail-oi1-f176.google.com [209.85.167.176]) (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 1759E3B7B9D for ; Thu, 10 Sep 2026 21:14:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074887; cv=none; b=ungLV+AjIjmWqxrfug4LyYcjjsRlsaAoiKuRujwdPZ9Nwa27oHULdGsjNpTXSVtq8iO0zN6rfds1sC9EsH/k2kRJGfBshiI7QXLYMd2M/VaaP0jaA6uuf2FZHN39YRUVPE4IEaLJtnlIt/81wDNn4pK5CJTiSKvms4r/hU40mBE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074887; c=relaxed/simple; bh=NlAn62+1tvYuJ/QDOCCCJAGBONbgbO7UKHidEAgXFbc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g4AcKmwIz/So+31ip75QomvsxCdVyl+EXkRB6nHXLIIeV3yz87a2QRujNCMBnDN5DSnNH2lLzSnfMlxk/8J6g6k7XxgZuicNF+LKe1gDYVom6J8RD9M3B0iE057HPcnmX1Rf8qpQ6EO8colgpeV9lvVLkw+ikeDLcsz4vEQje0Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=ikf71vLN; arc=none smtp.client-ip=209.85.167.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="ikf71vLN" Received: by mail-oi1-f176.google.com with SMTP id 5614622812f47-4b28d7c729fso246002b6e.0 for ; Thu, 10 Sep 2026 14:14:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074880; x=1789679680; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=C7TzjYhYQHl6A/Cy+Gf5z/r3vfrczkehr4YTwiho+ac=; b=ikf71vLNOY+ZsmJo+7AUN6LMbMXF7RZck83AQ6B4NC4K9YQuu7gA6dlJNd/7+cSrok OJvbUaNwa+MCpqy0RWGUENAk/qy2LxC3A+YNNRZNwFOGH3hR5D7N1HF9jjOFjlLpw+kV QeYsqQ8FbI9sNdjVGlXG9p3NpcK/YPb+BG3DU5N67oAARlHgKz5DZYm0Q0GKGdEZG1pP 7JWTGJZvo/w+wA9leAnqXkj5cTQK60Ee1rk+98XZcPbuk9wqGfaEfkJnRya2u1S5n1f1 oXvhNxkopI9YnUF12f90gtwLS3exRTaKi2BU+ieg3MuJfwqnm/EoSurdDXu8hpdJ2wFr BGKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074880; x=1789679680; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=C7TzjYhYQHl6A/Cy+Gf5z/r3vfrczkehr4YTwiho+ac=; b=HBc1bQF7EDJRPwe7WFtwr6uc9IN3RubdA59VPv6K2eE6xXyuE38xXrzO/7hw9R+uI8 Du2yRAVNtOVEVVkn1oMbHvzZ1pBt+29fV0xmsZlLb8XHtFFFogNcZen10uKCaCJ742uy PyypmSn9UcGEQuuLqux6o5BdEs2753CHcsLtxCH3XkJmCzqripMlQSoo9stCHDiZpyzM tj8P16mFbY5x2gp1p2x1xN9TckG0zhvK5nq1CZVUNRP1LeILuTyDUSB/hfuqtebtPBNp kTeMqBJr/NtTtVxhKY/6NHmRM1URTwFDMZcALeyR21sdTG1wb6OrKh39REaFKE5N7LbL LemQ== X-Forwarded-Encrypted: i=1; AKwUvByE3H4DoOLuO7wRuk4KAtw2UvDobupZhxuPUmqFsmnxYdqS844c9av0cmaIK1dAzJsdoOzsZlu2O078yHQ=@vger.kernel.org X-Gm-Message-State: AFuF++mu3iHHccRhVsmfjAGF5dUi+KPViYO7vwwedIOSXKoFym/1DwrZ l5Ta2hYIklKyQPbQnB34xrFUB3FE1dlNMPNBmSBZ0zIVoDtPisEzryjGcuv74MQsSux9v29fDVu 7whxR X-Gm-Gg: AYBFou1kwIL4KqNxNGaafE/WY+/i+5KZ58UTxZdRiFqQYC+QWz3eiYN38+DcsquJ8uu dHgvD4iQ3Hi3R6sZXj5PBT2DisS6BJeImxtinLT0h6CG3TMRAJzJzV867C8U30U335zyNmx3huQ 344ScVkMeojiORr4YaYU+Wq5/ahE0d+ZngtwGDeyrx8zWqqCI1xsYSnyAuMNM83dF3BRcIztRJR HX+4ksjBanVsMoE6hF8IUbxllnmIMZ2MkTbe1EoCHQuN6xmmBTNLeM0KrvGkcXys/WmAksiYJUi Cimdz8DsGkPKtVNZ0cTrS8WJaNAW4i0y6B4n/ZWbQBcELMnkTAsXdevJZuJpS2bM5syGBwi8zfX e1VMhuao7F325aLmFWUpBQgFgFdCjDpT5umTGbGeBpEGp2i3kkuahQLoEMKF1L6scEDjhnR3J7K G5malw8bzaxfTEK/WvZjlnrFMkDWXDZ5sIPBgTLq5ubiOfJLlxCiv77imewVJprw1dapB0DiE3n k5C X-Received: by 2002:a05:6808:238c:b0:4b9:e65b:8c2c with SMTP id 5614622812f47-4c31b5c1f1dmr714570b6e.26.1789074879810; Thu, 10 Sep 2026 14:14:39 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:38 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:05 -0500 Subject: [PATCH v3 06/10] iio: adc: ti-ads112c14: support external clock 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-6-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=3749; i=dlechner@baylibre.com; h=from:subject:message-id; bh=NlAn62+1tvYuJ/QDOCCCJAGBONbgbO7UKHidEAgXFbc=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqox2T+V/oKw+pUSGVkVN4NTBA02qbU78qUsHDS 0h0ehUYggyJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaqMdkwAKCRDCzCAB/wGP wAP3CACG0r7acfhY3stdbmMVZVZ3So3i1cz/ll1vDWwet/N9GWrZAjBoEephSKllfj4t0toQg4z GhD14J3llATl+2grz8j/K3LTQvwFfLSpnImMy4MUNWHxip21ElBPAl+TCwYbFgQioy6DH3emDFV 9BBgmKrTtVAZdIFbj2oM56Iv/CUi8yzj0vcSqUTc0zVkx0eQVGjkQoGueVC6mt2vbiefJZ5mx6s aJXtpmNpJCPBUEopGejg+duLw7fVb0nb5jUTmRIVvnh4NvL4KESHOWv0kXkN1CDwM7f7KQXg/cS MC8t3LUEVPgizHqmhejlO+5NDPi2R5MbNwUzjegJ/s5vwT7C X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add support for an external clock source to the TI ADS112C14 ADC driver. The unused fclk_Hz field is added in preparation for filter support. Signed-off-by: David Lechner (TI) Reviewed-by: Joshua Crofts --- drivers/iio/adc/ti-ads112c14.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c index efea1e22d067..0e4584b4675e 100644 --- a/drivers/iio/adc/ti-ads112c14.c +++ b/drivers/iio/adc/ti-ads112c14.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,8 @@ #define ADS112C14_DEVICE_CFG_BOCS_10_uA 3 =20 #define ADS112C14_DEVICE_CFG_CLK_SEL BIT(3) +#define ADS112C14_DEVICE_CFG_CLK_SEL_INTERNAL 0 +#define ADS112C14_DEVICE_CFG_CLK_SEL_EXTERNAL 1 #define ADS112C14_DEVICE_CFG_CONV_MODE BIT(2) #define ADS112C14_DEVICE_CFG_CONV_MODE_CONTINUOUS 0 #define ADS112C14_DEVICE_CFG_CONV_MODE_SINGLE_SHOT 1 @@ -178,6 +181,8 @@ static const u32 ads112c14_pga_gains_x10[] =3D { 200, 320, 500, 640, 1000, 1280, 2000, 2560, /* 8 - 15 */ }; =20 +#define ADS112C14_INTERNAL_CLK_Hz 4096000 + #define ADS112C14_I2C_CRC8_POLYNOMIAL 0x07 DECLARE_CRC8_TABLE(ads112c14_crc8_table); =20 @@ -268,6 +273,7 @@ struct ads112c14_data { struct iio_trigger *drdy_trig; /* Synchronizes access to register value fields. */ struct mutex lock; + long fclk_Hz; int drdy_irq; struct completion drdy_completion; bool continuous_mode; @@ -1536,6 +1542,7 @@ static int ads112c14_probe(struct i2c_client *client) const struct ads112c14_chip_info *info; struct iio_dev *indio_dev; struct ads112c14_data *data; + struct clk *clk; bool need_avdd_ref, need_ext_ref; u32 refp_uV =3D 0; u32 refn_uV =3D 0; @@ -1628,6 +1635,18 @@ static int ads112c14_probe(struct i2c_client *client) return dev_err_probe(dev, -EINVAL, "external reference measurements require either refp-supply or ti= ,refp-refn-resistor-ohms property\n"); =20 + clk =3D devm_clk_get_optional_enabled(dev, NULL); + if (IS_ERR(clk)) + return dev_err_probe(dev, PTR_ERR(clk), "failed to get clk\n"); + + if (clk) { + data->fclk_Hz =3D clk_get_rate(clk); + if (!data->fclk_Hz) + return dev_err_probe(dev, -EINVAL, "clk rate is 0\n"); + } else { + data->fclk_Hz =3D ADS112C14_INTERNAL_CLK_Hz; + } + /* It takes some time for the internal reference to stabilize. */ fsleep(10 * USEC_PER_MSEC); =20 @@ -1698,6 +1717,10 @@ static int ads112c14_probe(struct i2c_client *client) return dev_err_probe(dev, data->drdy_irq, "failed to get drdy interrupt\n"); =20 + if (clk) + return dev_err_probe(dev, -EINVAL, + "cannot use both DRDY and CLK - they share the same pin\n"); + /* * REVISIT: would probably need to implement a pin controller in * order to support open drain option here. @@ -1737,6 +1760,22 @@ static int ads112c14_probe(struct i2c_client *client) return ret; } =20 + if (clk) { + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_GPIO_CFG, + ADS112C14_GPIO_CFG_GPIO3_CFG, + FIELD_PREP(ADS112C14_GPIO_CFG_GPIO3_CFG, + ADS112C14_GPIO_CFG_GPIO_CFG_INPUT)); + if (ret) + return ret; + + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + ADS112C14_DEVICE_CFG_CLK_SEL, + FIELD_PREP(ADS112C14_DEVICE_CFG_CLK_SEL, + ADS112C14_DEVICE_CFG_CLK_SEL_EXTERNAL)); + if (ret) + return ret; + } + ads112c14_populate_tables(data); =20 indio_dev->name =3D info->name; --=20 2.43.0 From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi1-f170.google.com (mail-oi1-f170.google.com [209.85.167.170]) (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 22F1C42AFAC for ; Thu, 10 Sep 2026 21:14:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074899; cv=none; b=QC8OVP7yJfHe5jymQTkotLSZZy5kFqOn5eZSDvlfbSY55fOCW1Q8pCl7NcXlRnrFc/8kHCm4gCfo3felohUbq9nBJcuSu623I0PrGAtlZLqbMNLuk7CoTq1EZi2k2SH9Eq9G/jVB/NgEODc5U939G6bxg2TYu/mJTyLJH5W3VM4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074899; c=relaxed/simple; bh=kzUgSvXLi/JZDSr/vK2K0UNxNU3aymUYqEPICh6L/8A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y4g/8eIVNQ4IRWE1HHZ/uGeF/K36WfGanRiezWAL0znCiD/VOJPHuNev/lbyzQe43ndmzj2JPIsGB2bk5OtDVS3yG66rXrL2XcIJe/E9fuu4CSjeSlDycEBtXne6FqmaY++hM7U+uvlGdkJKLkVvH9n2fGJeeZtyxn9s6CxpnEA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=ZTlyE/tw; arc=none smtp.client-ip=209.85.167.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="ZTlyE/tw" Received: by mail-oi1-f170.google.com with SMTP id 5614622812f47-4b333de9451so291699b6e.3 for ; Thu, 10 Sep 2026 14:14:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074882; x=1789679682; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=y9MeiO0bVEuDB8kWxbVFOe6+2iOBgBAXWqHDeoInBkU=; b=ZTlyE/twMbdFct47+M2nFaGDRrpFV+FoRfrctctO4OTdFxYw5U6Pkquen6DAQ1VABc Kc/uAeWwodec+W7QoCqiPUpfwgQsya6GWRbJscVtJmVu231ktxx0+ZNIOlLfQRa8WXuE xf7VfHOhxdbOJpTMZMNOSXfqYKF2k4ViZ3auHoQ0rf+tUvJ5uirTscZsI7MBHep6b4l0 8dulKqrlkE5ol0oD6ORFfHSzxaG5y3oYXHyLcda7OIixYrLF+Kq0Lmp/vs6ibCPhIVur zK+23ZwraRcCfcsMn+07Wk6aQOr6cc+ksfJADq0N1j7JaW89S5ML/pn417MjmuNFbL1k hgGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074882; x=1789679682; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=y9MeiO0bVEuDB8kWxbVFOe6+2iOBgBAXWqHDeoInBkU=; b=SeOe+JPLvi2Pu+h0n0yjyrnML2GJsRCDiSUN6zJ/1Mvp83cd2uTy1LkYTYju6HCTiz BUMrYhJJqvUIEStn1/MasjPZ8O3BmU/vHs8WWll91SLO6dOUMrYavxlgVdMp7ivuvVxM smS+3ghA7jytHvaN3KleZcTpFkNovfY8edm/PV7i85UOEYMZvkgYt4GFPFTVn43xZ/37 s6BPSqUWMWZqlQyPhnQOcbtaTFspjr7uxzx38E7DWWmlmvKlocTqQhQ5fbLcqCiWLdCn FugtdfCjZJsr+x6P5OSdTYKkd1/7j4ogtZpcahG+M9vksoQS6GoHaeYmQ2W/i6JOPySO tvtg== X-Forwarded-Encrypted: i=1; AKwUvBzpqXQN4xwTzT2qks1s/a6dy9tr1NiBgNtPG9RKH2wjUq/DeSUPZK+8S21kR1nx3wb3rxJEhCmdRgdTP7Y=@vger.kernel.org X-Gm-Message-State: AFuF++nEoUPUoZuflFSdzdnZhSaqeYQpcZVpwqYy9VKL70TA5Tn1RCzG p18zOia3Kkfg/7OSufI0zuQu+fk+Det2vUfPBytr9E5KnMU20t/Xkw/HS0+59OGWWZxa+vOMit+ 2mUIC X-Gm-Gg: AYBFou3IAmnkIuA66VHb9hLzw+2GEdEMu+yXnKGqJ+5xHa3/QCcjLufCRiKLVmzn3yw OMOohcjKdpeW2Q7BevfK4YjStNCktOW+fmTgrFZ5mGTczDFeg3cHryOQwwZvtwPnfZ7+bwnuokx oR7m1wHzjoNew8oOCsuFRX/qmRrG24AgVOP5my2Z+KvFK5RZx4WVhQqOrYaCTNnDhjJO/OdKlKx mzW3aVzsCR8z0Z677Q8Btob0t5ps4XSwZhdw/wz7dbOasoWaZ9EVRpBb6PoPm6fcaTryyEdQTVP YI+GFHWJhc5IgWb1KM8XxcgkO8W/LNMD3KNydwyZfXcXF2/j5qZXMYa+4Exs+FxYmftUD1YA5f6 l1TutMpamCLJSZth9hKWHOhRnjILKAg+2ca4EK4vr34n+9lfRScJUnMRXxH7rPqszLDDVb4/YGa IEvLGdzH8LEMOVSlcuLKtisC28DbaftIRt4VBa0hgA6Ab4bhVafFFXEn3/N1TuNdqtIXPhmiVR6 J+O X-Received: by 2002:a05:6808:1b21:b0:4b9:e6ab:d083 with SMTP id 5614622812f47-4c31fdda3admr617829b6e.35.1789074881757; Thu, 10 Sep 2026 14:14:41 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:40 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:06 -0500 Subject: [PATCH v3 07/10] iio: adc: ti-ads112c14: add filter support 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-7-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=26453; i=dlechner@baylibre.com; h=from:subject:message-id; bh=kzUgSvXLi/JZDSr/vK2K0UNxNU3aymUYqEPICh6L/8A=; b=kA0DAAoBwswgAf8Bj8AByyZiAGqjHZqidk7BswbXJcKGkXbD6N+wPO+j3gQin6XNWurkTJbcS 4kBMwQAAQoAHRYhBOwY2Z5iDoPWnNhomMLMIAH/AY/ABQJqox2aAAoJEMLMIAH/AY/AQmgH/Aqd 2zP6O+aXGGHNs7bjl0sgCQ2FCQU7z1fy8WziG3xc3IH5clXzpSfB06ru1zKSlBOi5Y6paX8F6Xk EgLUmXbBvdp7Y8tVJfmNuB86Ft/fbrDMYH6SYaXSgaxe0JnS0x3MbmJer/Yfz/JXiBEpszG1+Ym TbVoZUBTYKxlw3xne/jrCZ6RWVMYTWiHDvdYilpZC1rBdqfp8hKk7YScnLt3EdWgGnp3a85xaAc W3AGwv8/G1ZHUONhdlRDUIFQPjaglY/htXU8knW8e1lZLLm86zAnm/tCv/HfxHp8+9N6i+AmHzP iR3CxehO8go+znX3vMKKVw9TvVHIy1mAYqcFg24= X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add support for filter_type, oversampling_ratio and sampling_frequency attributes to the ti-ads112c14 driver. On these chips, these three controls are interdependent and the SPEED_MODE register value has a different meaning depending on the filter type, which makes the interactions a bit complex. As such, the expectation is that the user will set the filter type first, then depending on the filter type, either set the oversampling ratio or the sampling frequency and finally the other of these two. Signed-off-by: David Lechner (TI) --- Note: I intend to sumbit a documentation patch later that explains the "right way" to set these three attributes since it is a bit odd due to the conditional interdependencies. --- drivers/iio/adc/ti-ads112c14.c | 496 +++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 483 insertions(+), 13 deletions(-) diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c index 0e4584b4675e..ee4992b9e029 100644 --- a/drivers/iio/adc/ti-ads112c14.c +++ b/drivers/iio/adc/ti-ads112c14.c @@ -94,6 +94,14 @@ #define ADS112C14_DATA_RATE_CFG_DELAY GENMASK(7, 4) #define ADS112C14_DATA_RATE_CFG_GC_EN BIT(3) #define ADS112C14_DATA_RATE_CFG_FLTR_OSR GENMASK(2, 0) +#define ADS112C14_DATA_RATE_CFG_FLTR_OSR_16 0 +#define ADS112C14_DATA_RATE_CFG_FLTR_OSR_32 1 +#define ADS112C14_DATA_RATE_CFG_FLTR_OSR_128 2 +#define ADS112C14_DATA_RATE_CFG_FLTR_OSR_256 3 +#define ADS112C14_DATA_RATE_CFG_FLTR_OSR_512 4 +#define ADS112C14_DATA_RATE_CFG_FLTR_OSR_1024 5 +#define ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS 6 +#define ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS 7 =20 #define ADS112C14_REG_MUX_CFG 0x07 #define ADS112C14_MUX_CFG_AINP GENMASK(7, 4) @@ -183,6 +191,43 @@ static const u32 ads112c14_pga_gains_x10[] =3D { =20 #define ADS112C14_INTERNAL_CLK_Hz 4096000 =20 +/* Index corresponds to first 2 ADS112C14_DATA_RATE_CFG_FLTR_OSR values. */ +static const int ads112c14_sinc4_osr_available[] =3D { + 16, 32 +}; + +/* Index corresponds to next 4 ADS112C14_DATA_RATE_CFG_FLTR_OSR values. */ +static const int ads112c14_sinc4_sinc1_osr_available[] =3D { + 128, 256, 512, 1024 +}; + +/* Index corresponds to ADS112C14_DEVICE_CFG_SPEED_MODE value. */ +static const int ads112c14_sinc4_sinc1_pf1_20sps_osr_available[] =3D { + 1600, 12800, 25600, 51200 +}; + +/* Index corresponds to ADS112C14_DEVICE_CFG_SPEED_MODE value. */ +static const int ads112c14_sinc4_sinc1_pf1_25sps_osr_available[] =3D { + 1280, 10240, 20480, 40960 +}; + +/* Index corresponds to ADS112C14_DEVICE_CFG_SPEED_MODE value. */ +static const int ads112c14_fmod_div[] =3D { + 128, 16, 8, 4 +}; + +enum ads112c14_filter_type { + ADS112C14_FILTER_TYPE_SINC4, + ADS112C14_FILTER_TYPE_SINC4_SINC1, + ADS112C14_FILTER_TYPE_SINC4_SINC1_PF1, +}; + +static const char * const ads112c14_filter_type_names[] =3D { + [ADS112C14_FILTER_TYPE_SINC4] =3D "sinc4", + [ADS112C14_FILTER_TYPE_SINC4_SINC1] =3D "sinc4+sinc1", + [ADS112C14_FILTER_TYPE_SINC4_SINC1_PF1] =3D "sinc4+sinc1+pf1", +}; + #define ADS112C14_I2C_CRC8_POLYNOMIAL 0x07 DECLARE_CRC8_TABLE(ads112c14_crc8_table); =20 @@ -204,6 +249,8 @@ enum { ADS112C14_SYS_MON_CHANNEL_SHORT, }; =20 +static const struct iio_chan_spec_ext_info ads112c14_ext_info[]; + static const struct iio_chan_spec ads112c14_sys_mon_channels[] =3D { { .type =3D IIO_TEMP, @@ -212,7 +259,12 @@ static const struct iio_chan_spec ads112c14_sys_mon_ch= annels[] =3D { .address =3D 2, .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE) - | BIT(IIO_CHAN_INFO_OFFSET), + | BIT(IIO_CHAN_INFO_OFFSET) + | BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .ext_info =3D ads112c14_ext_info, }, { .type =3D IIO_VOLTAGE, @@ -220,7 +272,12 @@ static const struct iio_chan_spec ads112c14_sys_mon_ch= annels[] =3D { .channel =3D ADS112C14_SYS_MON_CHANNEL_EXT_REF, .address =3D 3, .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) - | BIT(IIO_CHAN_INFO_SCALE), + | BIT(IIO_CHAN_INFO_SCALE) + | BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .ext_info =3D ads112c14_ext_info, }, { .type =3D IIO_VOLTAGE, @@ -228,7 +285,12 @@ static const struct iio_chan_spec ads112c14_sys_mon_ch= annels[] =3D { .channel =3D ADS112C14_SYS_MON_CHANNEL_AVDD, .address =3D 4, .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) - | BIT(IIO_CHAN_INFO_SCALE), + | BIT(IIO_CHAN_INFO_SCALE) + | BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .ext_info =3D ads112c14_ext_info, }, { .type =3D IIO_VOLTAGE, @@ -236,7 +298,12 @@ static const struct iio_chan_spec ads112c14_sys_mon_ch= annels[] =3D { .channel =3D ADS112C14_SYS_MON_CHANNEL_DVDD, .address =3D 5, .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) - | BIT(IIO_CHAN_INFO_SCALE), + | BIT(IIO_CHAN_INFO_SCALE) + | BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .ext_info =3D ads112c14_ext_info, }, { .type =3D IIO_VOLTAGE, @@ -246,8 +313,13 @@ static const struct iio_chan_spec ads112c14_sys_mon_ch= annels[] =3D { .differential =3D 1, .address =3D 1, .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) - | BIT(IIO_CHAN_INFO_SCALE), - .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SCALE), + | BIT(IIO_CHAN_INFO_SCALE) + | BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SCALE) + | BIT(IIO_CHAN_INFO_SAMP_FREQ) + | BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), + .ext_info =3D ads112c14_ext_info, }, }; =20 @@ -267,6 +339,11 @@ struct ads112c14_measurement { int scale_available[ARRAY_SIZE(ads112c14_pga_gains_x10)][2]; }; =20 +struct ads112c14_channel_state { + u8 speed_mode; + u8 filter_osr; +}; + struct ads112c14_data { const struct ads112c14_chip_info *chip_info; struct regmap *regmap; @@ -284,9 +361,13 @@ struct ads112c14_data { bool refn_is_gnd; u32 ext_ref_ohms; struct ads112c14_measurement *measurements; + struct ads112c14_channel_state *channel_states; u32 num_measurements; u8 sys_mon_chan_short_gain_val; int sys_mon_chan_short_scale_available[ARRAY_SIZE(ads112c14_pga_gains_x10= )][2]; + int sinc4_sample_rate_available[ARRAY_SIZE(ads112c14_sinc4_osr_available)= ][ARRAY_SIZE(ads112c14_fmod_div)][2]; + int sinc4_sinc1_sample_rate_available[ARRAY_SIZE(ads112c14_sinc4_sinc1_os= r_available)][ARRAY_SIZE(ads112c14_fmod_div)][2]; + int sinc4_sinc1_pf1_sample_rate_available[2][2]; IIO_DECLARE_BUFFER_WITH_TS(__be32, scan, ADS112C14_MAX_MEASUREMENT_CHANNE= LS + ARRAY_SIZE(ads112c14_sys_mon_channels)); }; @@ -472,14 +553,46 @@ static const struct regmap_config ads112c14_regmap_co= nfig =3D { .cache_type =3D REGCACHE_MAPLE, }; =20 +static int ads112c14_get_osr(struct ads112c14_channel_state *channel_state) +{ + u8 i; + + switch (channel_state->filter_osr) { + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_16...ADS112C14_DATA_RATE_CFG_FLTR_O= SR_32: + i =3D channel_state->filter_osr; + return ads112c14_sinc4_osr_available[i]; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_128...ADS112C14_DATA_RATE_CFG_FLTR_= OSR_1024: + i =3D channel_state->filter_osr - ADS112C14_DATA_RATE_CFG_FLTR_OSR_128; + return ads112c14_sinc4_sinc1_osr_available[i]; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS: + i =3D channel_state->speed_mode; + return ads112c14_sinc4_sinc1_pf1_25sps_osr_available[i]; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS: + i =3D channel_state->speed_mode; + return ads112c14_sinc4_sinc1_pf1_20sps_osr_available[i]; + default: + return -EINVAL; + } +} + static int ads112c14_prepare_measurement_channel(struct ads112c14_data *da= ta, const struct iio_chan_spec *chan, bool en_burnout) { struct ads112c14_measurement *measurement =3D &data->measurements[chan->s= can_index]; + struct ads112c14_channel_state *channel_state; u32 refp_buf_en, refn_buf_en, ref_val, ref_sel; int ret; =20 + channel_state =3D &data->channel_states[chan->scan_index]; + + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + ADS112C14_DEVICE_CFG_SPEED_MODE, + FIELD_PREP(ADS112C14_DEVICE_CFG_SPEED_MODE, + channel_state->speed_mode)); + if (ret) + return ret; + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_MUX_CFG, ADS112C14_MUX_CFG_AINP | ADS112C14_MUX_CFG_AINN, FIELD_PREP(ADS112C14_MUX_CFG_AINP, chan->channel) | @@ -526,10 +639,13 @@ static int ads112c14_prepare_measurement_channel(stru= ct ads112c14_data *data, return ret; =20 ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DATA_RATE_CFG, - ADS112C14_DATA_RATE_CFG_GC_EN, + ADS112C14_DATA_RATE_CFG_GC_EN | + ADS112C14_DATA_RATE_CFG_FLTR_OSR, FIELD_PREP(ADS112C14_DATA_RATE_CFG_GC_EN, (measurement->global_chop && - !en_burnout) ? 1 : 0)); + !en_burnout) ? 1 : 0) | + FIELD_PREP(ADS112C14_DATA_RATE_CFG_FLTR_OSR, + channel_state->filter_osr)); if (ret) return ret; =20 @@ -572,9 +688,12 @@ static int ads112c14_prepare_measurement_channel(struc= t ads112c14_data *data, static int ads112c14_prepare_sys_mon_channel(struct ads112c14_data *data, const struct iio_chan_spec *chan) { + struct ads112c14_channel_state *channel_state; u32 gain_val; int ret; =20 + channel_state =3D &data->channel_states[chan->scan_index]; + /* * NB: IDAC registers are left as-is in case they are generating current * needed for the external reference measurement. @@ -601,6 +720,22 @@ static int ads112c14_prepare_sys_mon_channel(struct ad= s112c14_data *data, if (ret) return ret; =20 + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + ADS112C14_DEVICE_CFG_SPEED_MODE, + FIELD_PREP(ADS112C14_DEVICE_CFG_SPEED_MODE, + channel_state->speed_mode)); + if (ret) + return ret; + + ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DATA_RATE_CFG, + ADS112C14_DATA_RATE_CFG_GC_EN | + ADS112C14_DATA_RATE_CFG_FLTR_OSR, + FIELD_PREP(ADS112C14_DATA_RATE_CFG_GC_EN, 0) | + FIELD_PREP(ADS112C14_DATA_RATE_CFG_FLTR_OSR, + channel_state->filter_osr)); + if (ret) + return ret; + /* * REVISIT: if we implement regulator support for the REFOUT pin, we * might need to make this voltage match what is required by that. In @@ -835,6 +970,45 @@ static int ads112c14_read_raw(struct iio_dev *indio_de= v, */ *val =3D div_s64((s64)(25 * 405 - 119500) * BIT(fsr_bits), vref_uV); return IIO_VAL_INT; + case IIO_CHAN_INFO_SAMP_FREQ: { + struct ads112c14_channel_state *channel_state; + const int (*available)[2]; + u8 i, j; + + guard(mutex)(&data->lock); + + channel_state =3D &data->channel_states[chan->scan_index]; + + switch (channel_state->filter_osr) { + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_16...ADS112C14_DATA_RATE_CFG_FLTR_= OSR_32: + j =3D channel_state->filter_osr; + available =3D data->sinc4_sample_rate_available[j]; + i =3D channel_state->speed_mode; + break; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_128...ADS112C14_DATA_RATE_CFG_FLTR= _OSR_1024: + j =3D channel_state->filter_osr - ADS112C14_DATA_RATE_CFG_FLTR_OSR_128; + available =3D data->sinc4_sinc1_sample_rate_available[j]; + i =3D channel_state->speed_mode; + break; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS: + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS: + available =3D data->sinc4_sinc1_pf1_sample_rate_available; + i =3D channel_state->filter_osr - ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SP= S; + break; + default: + return -EINVAL; + } + + *val =3D available[i][0]; + *val2 =3D available[i][1]; + return IIO_VAL_INT_PLUS_MICRO; + } + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: { + guard(mutex)(&data->lock); + + *val =3D ads112c14_get_osr(&data->channel_states[chan->scan_index]); + return IIO_VAL_INT; + } default: return -EINVAL; } @@ -845,6 +1019,9 @@ static int ads112c14_read_avail(struct iio_dev *indio_= dev, int *type, int *length, long mask) { struct ads112c14_data *data =3D iio_priv(indio_dev); + struct ads112c14_channel_state *channel_state; + + channel_state =3D &data->channel_states[chan->scan_index]; =20 switch (mask) { case IIO_CHAN_INFO_SCALE: @@ -870,6 +1047,58 @@ static int ads112c14_read_avail(struct iio_dev *indio= _dev, } =20 return -EINVAL; + + case IIO_CHAN_INFO_SAMP_FREQ: { + guard(mutex)(&data->lock); + + switch (channel_state->filter_osr) { + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_16...ADS112C14_DATA_RATE_CFG_FLTR_= OSR_32: + *vals =3D (const int *)data->sinc4_sample_rate_available[channel_state-= >filter_osr]; + *length =3D 2 * ARRAY_SIZE(data->sinc4_sample_rate_available[0]); + *type =3D IIO_VAL_INT_PLUS_MICRO; + return IIO_AVAIL_LIST; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_128...ADS112C14_DATA_RATE_CFG_FLTR= _OSR_1024: + *vals =3D (const int *)data->sinc4_sinc1_sample_rate_available[channel_= state->filter_osr - ADS112C14_DATA_RATE_CFG_FLTR_OSR_128]; + *length =3D 2 * ARRAY_SIZE(data->sinc4_sinc1_sample_rate_available[0]); + *type =3D IIO_VAL_INT_PLUS_MICRO; + return IIO_AVAIL_LIST; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS...ADS112C14_DATA_RATE_CFG_FL= TR_OSR_20SPS: + *vals =3D (const int *)data->sinc4_sinc1_pf1_sample_rate_available; + *length =3D 2 * ARRAY_SIZE(data->sinc4_sinc1_pf1_sample_rate_available); + *type =3D IIO_VAL_INT_PLUS_MICRO; + return IIO_AVAIL_LIST; + default: + return -EINVAL; + } + } + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: { + guard(mutex)(&data->lock); + + switch (channel_state->filter_osr) { + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_16...ADS112C14_DATA_RATE_CFG_FLTR_= OSR_32: + *vals =3D ads112c14_sinc4_osr_available; + *length =3D ARRAY_SIZE(ads112c14_sinc4_osr_available); + *type =3D IIO_VAL_INT; + return IIO_AVAIL_LIST; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_128...ADS112C14_DATA_RATE_CFG_FLTR= _OSR_1024: + *vals =3D ads112c14_sinc4_sinc1_osr_available; + *length =3D ARRAY_SIZE(ads112c14_sinc4_sinc1_osr_available); + *type =3D IIO_VAL_INT; + return IIO_AVAIL_LIST; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS: + *vals =3D ads112c14_sinc4_sinc1_pf1_25sps_osr_available; + *length =3D ARRAY_SIZE(ads112c14_sinc4_sinc1_pf1_25sps_osr_available); + *type =3D IIO_VAL_INT; + return IIO_AVAIL_LIST; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS: + *vals =3D ads112c14_sinc4_sinc1_pf1_20sps_osr_available; + *length =3D ARRAY_SIZE(ads112c14_sinc4_sinc1_pf1_20sps_osr_available); + *type =3D IIO_VAL_INT; + return IIO_AVAIL_LIST; + default: + return -EINVAL; + } + } default: return -EINVAL; } @@ -914,6 +1143,99 @@ static int ads112c14_write_raw(struct iio_dev *indio_= dev, =20 return -EINVAL; } + case IIO_CHAN_INFO_SAMP_FREQ: { + struct ads112c14_channel_state *channel_state; + const int (*available)[2]; + + guard(mutex)(&data->lock); + + channel_state =3D &data->channel_states[chan->scan_index]; + + switch (channel_state->filter_osr) { + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_16...ADS112C14_DATA_RATE_CFG_FLTR_= OSR_1024: + if (channel_state->filter_osr < ADS112C14_DATA_RATE_CFG_FLTR_OSR_128) { + u8 idx =3D channel_state->filter_osr; + + available =3D data->sinc4_sample_rate_available[idx]; + } else { + u8 idx =3D channel_state->filter_osr - ADS112C14_DATA_RATE_CFG_FLTR_OS= R_128; + + available =3D data->sinc4_sinc1_sample_rate_available[idx]; + } + + for (unsigned int i =3D 0; i < ARRAY_SIZE(ads112c14_fmod_div); i++) { + if (val =3D=3D available[i][0] && val2 =3D=3D available[i][1]) { + channel_state->speed_mode =3D i; + return 0; + } + } + + return -EINVAL; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS: + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS: { + available =3D data->sinc4_sinc1_pf1_sample_rate_available; + + for (unsigned int i =3D 0; i < ARRAY_SIZE(data->sinc4_sinc1_pf1_sample_= rate_available); i++) { + if (val =3D=3D available[i][0] && val2 =3D=3D available[i][1]) { + channel_state->filter_osr =3D i + ADS112C14_DATA_RATE_CFG_FLTR_OSR_25= SPS; + return 0; + } + } + + return -EINVAL; + } + default: + return -EINVAL; + } + } + case IIO_CHAN_INFO_OVERSAMPLING_RATIO: { + struct ads112c14_channel_state *channel_state; + + guard(mutex)(&data->lock); + + channel_state =3D &data->channel_states[chan->scan_index]; + + switch (channel_state->filter_osr) { + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_16...ADS112C14_DATA_RATE_CFG_FLTR_= OSR_32: + for (unsigned int i =3D 0; i < ARRAY_SIZE(ads112c14_sinc4_osr_available= ); i++) { + if (val =3D=3D ads112c14_sinc4_osr_available[i]) { + channel_state->filter_osr =3D i; + return 0; + } + } + + return -EINVAL; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_128...ADS112C14_DATA_RATE_CFG_FLTR= _OSR_1024: + for (unsigned int i =3D 0; i < ARRAY_SIZE(ads112c14_sinc4_sinc1_osr_ava= ilable); i++) { + if (val =3D=3D ads112c14_sinc4_sinc1_osr_available[i]) { + channel_state->filter_osr =3D i + ADS112C14_DATA_RATE_CFG_FLTR_OSR_12= 8; + return 0; + } + } + + return -EINVAL; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS: + for (unsigned int i =3D 0; i < ARRAY_SIZE(ads112c14_sinc4_sinc1_pf1_25s= ps_osr_available); i++) { + if (val =3D=3D ads112c14_sinc4_sinc1_pf1_25sps_osr_available[i]) { + channel_state->speed_mode =3D i; + return 0; + } + } + + return -EINVAL; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS: + for (unsigned int i =3D 0; i < ARRAY_SIZE(ads112c14_sinc4_sinc1_pf1_20s= ps_osr_available); i++) { + if (val =3D=3D ads112c14_sinc4_sinc1_pf1_20sps_osr_available[i]) { + channel_state->speed_mode =3D i; + return 0; + } + } + + return -EINVAL; + default: + return -EINVAL; + } + } default: return -EINVAL; } @@ -1202,11 +1524,98 @@ static ssize_t ads112c14_read_burnout_raw(struct ii= o_dev *indio_dev, return sysfs_emit(buf, "%d\n", val); } =20 +static int ads112c14_get_filter_type_from_state(struct ads112c14_channel_s= tate *channel_state) +{ + switch (channel_state->filter_osr) { + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_16...ADS112C14_DATA_RATE_CFG_FLTR_O= SR_32: + return ADS112C14_FILTER_TYPE_SINC4; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_128...ADS112C14_DATA_RATE_CFG_FLTR_= OSR_1024: + return ADS112C14_FILTER_TYPE_SINC4_SINC1; + case ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS...ADS112C14_DATA_RATE_CFG_FLT= R_OSR_20SPS: + return ADS112C14_FILTER_TYPE_SINC4_SINC1_PF1; + default: + return -EINVAL; + } +} + +static int ads112c14_set_filter_type(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + unsigned int val) +{ + struct ads112c14_data *data =3D iio_priv(indio_dev); + struct ads112c14_channel_state *channel_state; + int ret; + + IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); + if (IIO_DEV_ACQUIRE_FAILED(claim)) + return -EBUSY; + + guard(mutex)(&data->lock); + + channel_state =3D &data->channel_states[chan->scan_index]; + + ret =3D ads112c14_get_filter_type_from_state(channel_state); + if (ret < 0) + return ret; + + /* + * channel_state->filter_osr affects multiple attributes, so don't modify + * it if the filter type is already set to the requested value. + */ + if (ret =3D=3D val) + return 0; + + /* Otherwise, pick an arbitrary default for each type. */ + switch (val) { + case ADS112C14_FILTER_TYPE_SINC4: + channel_state->filter_osr =3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_16; + break; + case ADS112C14_FILTER_TYPE_SINC4_SINC1: + channel_state->filter_osr =3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_128; + break; + case ADS112C14_FILTER_TYPE_SINC4_SINC1_PF1: + channel_state->filter_osr =3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int ads112c14_get_filter_type(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan) +{ + struct ads112c14_data *data =3D iio_priv(indio_dev); + struct ads112c14_channel_state *channel_state; + + guard(mutex)(&data->lock); + + channel_state =3D &data->channel_states[chan->scan_index]; + + return ads112c14_get_filter_type_from_state(channel_state); +} + +static const struct iio_enum ads112c14_filter_type_enum =3D { + .items =3D ads112c14_filter_type_names, + .num_items =3D ARRAY_SIZE(ads112c14_filter_type_names), + .set =3D ads112c14_set_filter_type, + .get =3D ads112c14_get_filter_type, +}; + +static const struct iio_chan_spec_ext_info ads112c14_ext_info[] =3D { + IIO_ENUM("filter_type", IIO_SEPARATE, &ads112c14_filter_type_enum), + IIO_ENUM_AVAILABLE("filter_type", IIO_SEPARATE, &ads112c14_filter_type_en= um), + { } +}; + static const struct iio_chan_spec_ext_info ads112c14_ext_info_burnout[] = =3D { { .name =3D "burnoutraw", .read =3D ads112c14_read_burnout_raw, }, + IIO_ENUM("filter_type", IIO_SEPARATE, &ads112c14_filter_type_enum), + IIO_ENUM_AVAILABLE("filter_type", IIO_SEPARATE, &ads112c14_filter_type_en= um), { } }; =20 @@ -1232,7 +1641,7 @@ static int ads112c14_parse_channels(struct iio_dev *i= ndio_dev, struct ads112c14_data *data =3D iio_priv(indio_dev); struct device *dev =3D indio_dev->dev.parent; struct iio_chan_spec *channels; - u32 num_child_nodes, i, pair[2]; + u32 num_child_nodes, num_data_chans, i, pair[2]; int ret; =20 *need_avdd_ref =3D false; @@ -1245,8 +1654,15 @@ static int ads112c14_parse_channels(struct iio_dev *= indio_dev, if (!data->measurements) return -ENOMEM; =20 - channels =3D devm_kcalloc(dev, num_child_nodes + - ARRAY_SIZE(ads112c14_sys_mon_channels) + 1, + num_data_chans =3D num_child_nodes + ARRAY_SIZE(ads112c14_sys_mon_channel= s); + + data->channel_states =3D devm_kcalloc(dev, num_data_chans, + sizeof(*data->channel_states), + GFP_KERNEL); + if (!data->channel_states) + return -ENOMEM; + + channels =3D devm_kcalloc(dev, num_data_chans + 1, sizeof(*channels), GFP_KERNEL); if (!channels) return -ENOMEM; @@ -1259,7 +1675,9 @@ static int ads112c14_parse_channels(struct iio_dev *i= ndio_dev, =20 spec->indexed =3D 1; spec->scan_index =3D i; + spec->ext_info =3D ads112c14_ext_info; measurement->gain_val =3D 1; + data->channel_states[i].filter_osr =3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_= 16; =20 if (fwnode_property_present(child, "label")) { ret =3D fwnode_property_read_string(child, "label", &measurement->label= ); @@ -1424,8 +1842,13 @@ static int ads112c14_parse_channels(struct iio_dev *= indio_dev, if (measurement->vref_source =3D=3D ADS112C14_VREF_SOURCE_EXTERNAL) *need_ext_ref =3D true; =20 - spec->info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_= SCALE); - spec->info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SCALE); + spec->info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | + BIT(IIO_CHAN_INFO_SCALE) | + BIT(IIO_CHAN_INFO_SAMP_FREQ) | + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO); + spec->info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SCALE) | + BIT(IIO_CHAN_INFO_SAMP_FREQ) | + BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO); =20 /* * If reference source is resistor rather than voltage supply, @@ -1459,6 +1882,10 @@ static int ads112c14_parse_channels(struct iio_dev *= indio_dev, =20 for (u32 j =3D 0; j < ARRAY_SIZE(ads112c14_sys_mon_channels); j++) { struct iio_chan_spec *spec =3D &channels[i]; + struct ads112c14_channel_state *channel_state; + + channel_state =3D &data->channel_states[i]; + channel_state->filter_osr =3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_16; =20 /* Update the template that was already copied with dynamic values. */ spec->scan_index =3D i; @@ -1497,6 +1924,48 @@ static void ads112c14_populate_scale_available(int (= *scale_avail)[2], } } =20 +static void ads112c14_populate_odr_tables(struct ads112c14_data *data) +{ + int *available; + u32 osr, fmod_Hz; + u64 odr_uHz; + u32 rem; + + for (unsigned int i =3D 0; i < ARRAY_SIZE(ads112c14_sinc4_osr_available);= i++) { + osr =3D ads112c14_sinc4_osr_available[i]; + + for (unsigned int j =3D 0; j < ARRAY_SIZE(ads112c14_fmod_div); j++) { + fmod_Hz =3D data->fclk_Hz / ads112c14_fmod_div[j]; + odr_uHz =3D div_u64((u64)fmod_Hz * MICRO, osr); + available =3D data->sinc4_sample_rate_available[i][j]; + available[0] =3D div_u64_rem(odr_uHz, MICRO, &rem); + available[1] =3D rem; + } + } + + for (unsigned int i =3D 0; i < ARRAY_SIZE(ads112c14_sinc4_sinc1_osr_avail= able); i++) { + osr =3D ads112c14_sinc4_sinc1_osr_available[i]; + + for (unsigned int j =3D 0; j < ARRAY_SIZE(ads112c14_fmod_div); j++) { + fmod_Hz =3D data->fclk_Hz / ads112c14_fmod_div[j]; + odr_uHz =3D div_u64((u64)fmod_Hz * MICRO, osr); + available =3D data->sinc4_sinc1_sample_rate_available[i][j]; + available[0] =3D div_u64_rem(odr_uHz, MICRO, &rem); + available[1] =3D rem; + } + } + + odr_uHz =3D div_u64((u64)25 * data->fclk_Hz * MICRO, ADS112C14_INTERNAL_C= LK_Hz); + available =3D data->sinc4_sinc1_pf1_sample_rate_available[0]; + available[0] =3D div_u64_rem(odr_uHz, MICRO, &rem); + available[1] =3D rem; + + odr_uHz =3D div_u64((u64)20 * data->fclk_Hz * MICRO, ADS112C14_INTERNAL_C= LK_Hz); + available =3D data->sinc4_sinc1_pf1_sample_rate_available[1]; + available[0] =3D div_u64_rem(odr_uHz, MICRO, &rem); + available[1] =3D rem; +} + static void ads112c14_populate_tables(struct ads112c14_data *data) { u32 full_scale, fsr_bits; @@ -1534,6 +2003,7 @@ static void ads112c14_populate_tables(struct ads112c1= 4_data *data) =20 ads112c14_populate_scale_available(data->sys_mon_chan_short_scale_availab= le, full_scale, fsr_bits); + ads112c14_populate_odr_tables(data); } =20 static int ads112c14_probe(struct i2c_client *client) --=20 2.43.0 From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi1-f171.google.com (mail-oi1-f171.google.com [209.85.167.171]) (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 7B37936212C for ; Thu, 10 Sep 2026 21:14:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074900; cv=none; b=WrMkZmRhHYdL9oqHv+Bx7tBw410gyEtugMXq5N0zWR0CiEfr9UDcMabo5DCjZzqhLQYbWJMxWGEz5rLKJ0kYCKtY1coWtdJaFcz796XUyF+B/A1x/5Ai8ItfrrBCltNUgPTP2yHR5DvfmSul9uaZDVvqqopyHG7xQVSRwB1OQzA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074900; c=relaxed/simple; bh=4mIrQseGaDrWXOkGj+VmtS3xT3kzP+fkmkBCoKYUU7I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rtkiwDsWJmrV/z4kMyiKXg+o0oFPG94VPOzth7wIe4MTa+Edzwy4udBztrjCjoyZOxeKXWJKeXxol6l7zJS+G/UHd3lY59UCi1ThD8uy5MNbWawGpHXxfgOBP5TYlgfdZ5RO8DoSKd7Vs8IaIWUgJhf9Hs5tcH0cu3X8IovNSjE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=BmtCe44l; arc=none smtp.client-ip=209.85.167.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="BmtCe44l" Received: by mail-oi1-f171.google.com with SMTP id 5614622812f47-4b28d7c729fso246038b6e.0 for ; Thu, 10 Sep 2026 14:14:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074884; x=1789679684; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=oxj4NP1Iiq6S7QGXGCteoLSsgcXgpsaLfh9MJtp5gfo=; b=BmtCe44lKd4Es0fmw33kmaqs32b333/l7tIcJ+hv2+V4QBuBwvtG4hr9gm+x88F+At mODX9PKF5bkwgC9S5kf3jp+CUcT8aV/T2XC5jVPMXxgV2yyQ0OAQlFuaiyYEplq4n8HW Pje5ySQ56H5jnxewz8FYlZzsY5Iw8AcetHIPRt7x69LHG4pBH8lvPQLygMeNBypREyeI Q0obBapCP2ma/Q26ti1G2xS8AzeTiuaV97CJ6xk2dp7DiYxj44dAds+Op80CmV+q1gsh 7HvI7gVSBteDIQ5p6NibskIOeGiNLbce36a82aEaTdw1bzr4VbOG9xy57kC8TG/0OCk/ FG1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074884; x=1789679684; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=oxj4NP1Iiq6S7QGXGCteoLSsgcXgpsaLfh9MJtp5gfo=; b=UJ6ICxB7tMpVo8Uy4HFA3BlOb+TOU4+nbRt53o9kp2nhTlRpxzof7dV/pwP07lNCpw Q5pzq2eolEAbtKBuOFPwHj4dAj+MxUVrt7gtMdj4+gfh3KcQXFD6AY1Czk/uQR40qET0 5JC4ZtMDuKqKufZpdL4038mSjEdz4Cqy12vQIGmWXrhziw8VJzYF/edGjOGyWb3dhVrO jo3h1yjIhb6/daDOhHM0glQHQkf3vFiOqe9Xlt2I7et2HfK80TzD0FMlSFuXjmtKN8Fd bZ9YuDF/mDdqK4MfCPJLwVInVqXyiqT3l4fxIGIhFne3XUHDEm9jb/OMzl/RYaYMyrzO OMbg== X-Forwarded-Encrypted: i=1; AKwUvBwxoMGT/U8PqEvFFOJ6KA6JFvgcMn64dQEdSl0NTGeoU0jO6DcRKGFvyM81wN2Lnu0rqVkkCt+83rVIHSo=@vger.kernel.org X-Gm-Message-State: AFuF++lvyEBZg02Ss9CWw540Nde/VjdS6oWieB3gpGxNJ6RJVgZPEred EkuSMedWpsxfGDZ3sgKxqa8vpmPjETiIePtnblZisR93aptkgWIqfJhQts1ZgmwaaYLOKgnEmdk bxdAS X-Gm-Gg: AYBFou2WD19WNVFIdgpdxFE0lYCNr/aj8IKZv2bpOeH+1qzWCcj3LsiEUJHW5xkNR6K Av3FOITsHKhgFJYHX2zO90DI/cZIugc83ACbQ0/vfzPTu6dW8RTXrEvmkz/dMeSVPUkTEUCTuBg nNBHORq+dx8zMGbjgWwfR7eC7FGAI2iPa0FnhvBwNDzRcBZIAExgqn2JNTLqVl2/DZrBVgJc1qO cSwnXNPRsetx4G1FmIpQjZS0Qq22tFjxQ3TmHsX8DPeKKJ5B08aH9kKUl6El4PwX9fjmtX1o3zA VnKByf1FvOhrimji9adJ78DkCA9WY/fz8bGf6izVetWwmcNMy+crqmVH24kL6DClKXOgVV++cNF WC9XxWQD+gmYpcznHxOpU0D6DxB4D4I7goqZkaIdg3xskgDSiwy6dBg2VRX8s9AIqmhD6aGxJbe YjFBxqBNzRr5hhXdS8SO1iQk7B9QnFL9IXy4Sgd3hVOzaQA+j78mRnjh4O2tsLLaJpWMKwdbzy9 bjC X-Received: by 2002:a05:6808:c166:b0:48c:4c00:596a with SMTP id 5614622812f47-4c319341b39mr666976b6e.5.1789074883692; Thu, 10 Sep 2026 14:14:43 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:43 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:07 -0500 Subject: [PATCH v3 08/10] iio: ABI: add sinc4+sinc1+pf1 filter_type 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-8-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=859; i=dlechner@baylibre.com; h=from:subject:message-id; bh=4mIrQseGaDrWXOkGj+VmtS3xT3kzP+fkmkBCoKYUU7I=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqox2gsnyZz5eiy3zeJH6x3A/wXsvKhVqHWdGmj BC9k5l4DsWJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaqMdoAAKCRDCzCAB/wGP wA3HB/97UdmxWYF1wSRrDhaegBfjz9KItpeYC9uVju1XB8Y9G0pDaCH97QBz7qKciVFvnSWf7dc kZm3B/sTvc4P3ajFHohL83ZmP4luQs2hn1YrtsHSASLoMfdKF099CzY/WccG0xWDzlQBLZq1dZR NnR++mG1HU37fQ7hn2aJWQOc2I0dpc6WgJte0ru6DeclKw8n+y9NUcapB9gZb4pcd/H3WaWWG9i GXGLLJNSbZSWkOAfTZs1VBZTKCYH3uABjvYLBxuQ2T3S1Nbt/G2cJ8ehw6lkXujF3wxxaD4Jtma ua9W7NT7F/j9NNJ+XtQ2Gf9TGAi7Vj9802G/n0QWqBM9qo75 X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Document "sinc4+sinc1+pf1" as a valid value for the filter_type attributes (used by the ti-ads112c14 driver). Signed-off-by: David Lechner (TI) --- Documentation/ABI/testing/sysfs-bus-iio | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/te= sting/sysfs-bus-iio index a4f5595722ad..a8e1cb8e7490 100644 --- a/Documentation/ABI/testing/sysfs-bus-iio +++ b/Documentation/ABI/testing/sysfs-bus-iio @@ -2380,6 +2380,7 @@ Description: * "sinc4+lp" - Sinc4 + Low Pass Filter. * "sinc4+sinc1" - Sinc4 + averaging by 8. Low 1st conversion time. + * "sinc4+sinc1+pf1" - Sinc4 + Sinc1 + device specific Post Filter 1. * "sinc4+rej60" - Sinc4 + 60Hz rejection. * "sinc5" - The digital sinc5 filter. Excellent noise performance --=20 2.43.0 From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi2-f13.google.com (mail-oi2-f13.google.com [74.125.231.205]) (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 714B9426690 for ; Thu, 10 Sep 2026 21:14:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.231.205 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074896; cv=none; b=VF8xbDrIT9WZDBRfqTW2QRK0ARHRmIRBvH+bXW51oxHyGQYrNvwb4umP8bIf4fjqIO0W1nNkc4Qowydq9zxrByuwU8JzIFJR/PB2wpITM+SaLeSqBxcuK9dIJ47QdYFRKuc20e3/O2dR3r2t2yvRm8GBqxgCSod1pMdQkVZl3EQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074896; c=relaxed/simple; bh=+pJJY4T3JRnbsPKEPsryKioKn/+DD79vyB/fSaDvxHQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rX4HM68JZsK5AvrkNDQo+GiJpDX7hne9/CoYqZ2LtSdo+kh5w/BgoIWNZNmqSxcUxPi25/+yztfIFn4g7+BwOK6cH2DaRs5HwgNZiJ3jHgmnJuiQ918sLWD3L1aUZdImS9Sm2YlT0H++fe1cq7WXEjOQ/859VKeX3KlRWqaPK74= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=pj8KsLSL; arc=none smtp.client-ip=74.125.231.205 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="pj8KsLSL" Received: by mail-oi2-f13.google.com with SMTP id 5614622812f47-4bf948737e1so233804b6e.2 for ; Thu, 10 Sep 2026 14:14:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074885; x=1789679685; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Rsh4HQYpeLh3LHOXR0Mo25jgQj3alHd3Q6Y+Zo7F9ts=; b=pj8KsLSLPFhm9V9USv1veiH/McsS6ElMAh9QUjHOsz/tpoA8lYnWearu1sJ71ORr1d JGPvffNYC4gB94bl6eUl1PPw9OB5Ct1ngA0BAoQOW3TX1FkMkyY05C2H//in4I0c0VJy PKQISlsuhrsv4ejxJuXXSzcpvamXolZ/nBrNWnP3wFbXYtV3ot5ZL8gmbPOEDq+uEP0Y 3bV0LHNCxtwJqiEldtVdHJcoH8GB4obQjA/yPF5g47+NwjydWjXwST5w285sTYX0rawD x6ov6VBtWgsL8fZsK3LwYmrETNZ6NpBQZhO7B54S0zd0jqn9kZyRWaEieY7pALxyqYxU aLlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074885; x=1789679685; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Rsh4HQYpeLh3LHOXR0Mo25jgQj3alHd3Q6Y+Zo7F9ts=; b=lu9wBeLd6g1mwVjFFZizl7Xlf0SoEM6Za9RjdoiCkb9NlTk99OyzAFdfWUZzW9tI++ Qh3n1FwrvmVNJqMM4fTm9/5SRwXbkMNrUj2mCZplNGGBaMBBHwV7I/eu4m5PG5kElsnK fDh8mPrgfHvYemJwyCmo2HlJC5ywOPvXigTUPgO6LLroFSeEmokbA0T04DilFQ3cQiY4 4PDGbT2fiB5Jq8uc9G2RyMsCQZeY1rcDH2Jqc0jKkG4rA6eJadE3yIgkf9wKRvmDHx5V v0ZpVRKnb6kR4kqRfrhn+Lqj9pT7HxqDW0aprCFFASnNtxMsm/Olzpy/0Y1DCgiOXcy6 jfuw== X-Forwarded-Encrypted: i=1; AKwUvBx6kZgSh2j8yyy+/glOxX84FOqbQ3crqV5MOCSTAP70FA5VwRl+geBm902zcKvXKNb+cOtSJkPP+5gKinw=@vger.kernel.org X-Gm-Message-State: AFuF++kPzSssuX2qXqsPCDzmck/9aluKsjLgDyongnZ9ObZDxMbELJc5 vODo4f3fgqTAh4k1jr2q6x5a1q8ygwICv12MJcwM8Le/5jog6epQAGhdmqjgVg2zvX1hsJqywOz yz3KY X-Gm-Gg: AYBFou1sWaqOOBv9DmyrUP8laHPlDJ/sR22YRZhYZfUWgwAGK7NnCw7eXEBni5UbIL+ LN74upRLnhrkdQ2Yn7OESTRLPtJ5IrWMRBUvqKEFpB3IOCjQaWVdf4lDUqLKc1SPqe1bpv9vgON 231i1NBS42WQJRjL83HM7c/Q9hR5jGq1paL4efgIV1wViSAzRQ/KsQhpICEercEfbSpXrEH4RsM 55BLw8bKvaqdPhL1qpX8am0gT+f9yLPVgFtyKXj48WSGXiVfgH6TMWfJkjNpxkuZtZ4T5WxDQd/ eAwZulWilLqhLyZqq845XUBBxLjFlkal8c3aITuhOtmH+BYSAy341wFspgqMcbRPjoHyFzWCQtB QywxQm3icDstTak5gxeVtCC1hk3+CP/2JBr5W+M27kU2/CTlmc1a4aVf7/gtNXetVD1kVxO1Gn2 g2oYzCoyJg+UEvnQYu/rSgZlq0NttEqLwXiFX4tkNJ27lAcKqfKl/FMUw5mMTCewsyC6NFXKD5D iZ9 X-Received: by 2002:a05:6808:150a:b0:497:df42:1e04 with SMTP id 5614622812f47-4c31c40dfdbmr1118628b6e.18.1789074884597; Thu, 10 Sep 2026 14:14:44 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:44 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:08 -0500 Subject: [PATCH v3 09/10] iio: adc: ti-ads112c14: add settlingtime attribute 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-9-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=16275; i=dlechner@baylibre.com; h=from:subject:message-id; bh=+pJJY4T3JRnbsPKEPsryKioKn/+DD79vyB/fSaDvxHQ=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqox2nNNR32jHE9HR3YveksEYtLR3UF5PRY4FNw LrQerceOfiJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaqMdpwAKCRDCzCAB/wGP wHqwB/9LJbqDescPoB0NNt4yTDfiNCK45IsA1kv/sY5Z8bWzk/ar820sNhw1uRalt/m3oaPNKf9 fkeztfLBckTo8gvr+392E+sjmJQ+fbPPosQ0C/DY0Jt9Zd0qav7YUS9pov/A1qJf8GqTLwwYSBg lu1EKu5mJiE5BxzxncZeil/nbke0vrf/Y2hyCN/63gGwImXR8OPkyJZDtZBBKajb1YOsDOOv9Ad 2NnyTUPy1sEDg+SD059fliIQ2vkXakQhpXEcdWfM5/9CukTqpjdyrPz9ueiA6Q4XCgwcJTStUTT aHnCHD6nW9BtoaivNqG04Pes8zoa+hbxM8QXbwmDZeSUArqB X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add per-channel sysfs attributes for settlingtime and settlingtime_available. These allow adjusting the total settling time for each channel. The value consists of a fixed t_latency time (based on the selected filter_type, oversampling_ratio and sampling_frequency) plus a user-configurable t_delay that determines the value to write to the DELAY field in the registers. The allowable values are non-linear integer multiples, so the step size is just the smallest step size. Writing the attribute will match the closest matching value for the DELAY field with a time equal to or greater than the requested settling time (unless the requested time is larger than the maximum allowable settling time). Signed-off-by: David Lechner (TI) --- drivers/iio/adc/ti-ads112c14.c | 336 +++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 330 insertions(+), 6 deletions(-) diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c index ee4992b9e029..ec598f82cf7f 100644 --- a/drivers/iio/adc/ti-ads112c14.c +++ b/drivers/iio/adc/ti-ads112c14.c @@ -216,6 +216,24 @@ static const int ads112c14_fmod_div[] =3D { 128, 16, 8, 4 }; =20 +#define ADS112C14_DELAY_MAX FIELD_MAX(ADS112C14_DATA_RATE_CFG_DELAY) + +/* Table 7-6 latency in t_MOD for OSR [16, 32, 128, 256, 512, 1024]. */ +static const int ads112c14_sinc_latency_tmod[][ARRAY_SIZE(ads112c14_fmod_d= iv)] =3D { + { 80, 88, 88, 104 }, + { 144, 152, 152, 168 }, + { 240, 248, 248, 264 }, + { 368, 376, 376, 392 }, + { 624, 632, 632, 648 }, + { 1136, 1144, 1144, 1160 }, +}; + +/* Table 7-7 latency in t_MOD for output data rates [25SPS, 20SPS]. */ +static const int ads112c14_fir_latency_tmod[][ARRAY_SIZE(ads112c14_fmod_di= v)] =3D { + { 1416, 10384, 20624, 41120 }, + { 1736, 12944, 25744, 51360 }, +}; + enum ads112c14_filter_type { ADS112C14_FILTER_TYPE_SINC4, ADS112C14_FILTER_TYPE_SINC4_SINC1, @@ -342,6 +360,7 @@ struct ads112c14_measurement { struct ads112c14_channel_state { u8 speed_mode; u8 filter_osr; + u8 delay; }; =20 struct ads112c14_data { @@ -368,6 +387,8 @@ struct ads112c14_data { int sinc4_sample_rate_available[ARRAY_SIZE(ads112c14_sinc4_osr_available)= ][ARRAY_SIZE(ads112c14_fmod_div)][2]; int sinc4_sinc1_sample_rate_available[ARRAY_SIZE(ads112c14_sinc4_sinc1_os= r_available)][ARRAY_SIZE(ads112c14_fmod_div)][2]; int sinc4_sinc1_pf1_sample_rate_available[2][2]; + int sinc_settling_time_range_available[ARRAY_SIZE(ads112c14_sinc_latency_= tmod)][ARRAY_SIZE(ads112c14_fmod_div)][3][2]; + int fir_settling_time_range_available[ARRAY_SIZE(ads112c14_fir_latency_tm= od)][ARRAY_SIZE(ads112c14_fmod_div)][3][2]; IIO_DECLARE_BUFFER_WITH_TS(__be32, scan, ADS112C14_MAX_MEASUREMENT_CHANNE= LS + ARRAY_SIZE(ads112c14_sys_mon_channels)); }; @@ -575,6 +596,210 @@ static int ads112c14_get_osr(struct ads112c14_channel= _state *channel_state) } } =20 +static int ads112c14_get_fmod_Hz(struct ads112c14_data *data, + struct ads112c14_channel_state *channel_state) +{ + return data->fclk_Hz / ads112c14_fmod_div[channel_state->speed_mode]; +} + +static int ads112c14_delay_to_tmod(u8 delay) +{ + if (!delay) + return 0; + + return BIT(delay - 1); +} + +static int ads112c14_get_latency_tmod(struct ads112c14_channel_state *chan= nel_state) +{ + u8 speed_mode =3D channel_state->speed_mode; + u8 filter_osr =3D channel_state->filter_osr; + + if (speed_mode >=3D ARRAY_SIZE(ads112c14_fmod_div)) + return -EINVAL; + + if (filter_osr <=3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_1024) + return ads112c14_sinc_latency_tmod[filter_osr][speed_mode]; + + if (filter_osr =3D=3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS) + return ads112c14_fir_latency_tmod[0][speed_mode]; + + if (filter_osr =3D=3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS) + return ads112c14_fir_latency_tmod[1][speed_mode]; + + return -EINVAL; +} + +static int ads112c14_get_settling_time_us(struct ads112c14_data *data, + struct ads112c14_channel_state *channel_state, + u8 delay, u32 *settling_time_us) +{ + int fmod_Hz, latency_tmod; + u64 total_tmod; + + fmod_Hz =3D ads112c14_get_fmod_Hz(data, channel_state); + if (fmod_Hz <=3D 0) + return -EINVAL; + + latency_tmod =3D ads112c14_get_latency_tmod(channel_state); + if (latency_tmod < 0) + return latency_tmod; + + total_tmod =3D latency_tmod + ads112c14_delay_to_tmod(delay); + *settling_time_us =3D div64_u64(total_tmod * USEC_PER_SEC, fmod_Hz); + + return 0; +} + +static int ads112c14_find_delay_for_settling_time_us(struct ads112c14_data= *data, + struct ads112c14_channel_state *channel_state, + s64 settling_time_us, u8 *delay) +{ + u64 delay_us, delay_tmod_needed; + u32 fixed_latency_us; + int ret, fmod_Hz; + u8 i; + + ret =3D ads112c14_get_settling_time_us(data, channel_state, 0, &fixed_lat= ency_us); + if (ret) + return ret; + + if (settling_time_us <=3D fixed_latency_us) { + *delay =3D 0; + return 0; + } + + fmod_Hz =3D ads112c14_get_fmod_Hz(data, channel_state); + if (fmod_Hz <=3D 0) + return -EINVAL; + + delay_us =3D settling_time_us - fixed_latency_us; + delay_tmod_needed =3D DIV_ROUND_UP_ULL(delay_us * fmod_Hz, USEC_PER_SEC); + + for (i =3D 1; i < ADS112C14_DELAY_MAX; i++) { + if (ads112c14_delay_to_tmod(i) >=3D delay_tmod_needed) + break; + } + + *delay =3D i; + + return 0; +} + +static ssize_t ads112c14_read_settling_time(struct iio_dev *indio_dev, + uintptr_t private, + const struct iio_chan_spec *chan, + char *buf) +{ + struct ads112c14_data *data =3D iio_priv(indio_dev); + struct ads112c14_channel_state *channel_state; + u32 settling_time_us; + int vals[2]; + int ret; + + guard(mutex)(&data->lock); + + channel_state =3D &data->channel_states[chan->scan_index]; + + ret =3D ads112c14_get_settling_time_us(data, channel_state, + channel_state->delay, + &settling_time_us); + if (ret) + return ret; + + iio_val_s64_decompose(settling_time_us, &vals[0], &vals[1]); + + return iio_format_value(buf, IIO_VAL_DECIMAL64_MICRO, ARRAY_SIZE(vals), v= als); +} + +static ssize_t ads112c14_write_settling_time(struct iio_dev *indio_dev, + uintptr_t private, + const struct iio_chan_spec *chan, + const char *buf, size_t len) +{ + struct ads112c14_data *data =3D iio_priv(indio_dev); + struct ads112c14_channel_state *channel_state; + s64 settling_time_us; + int integer; + int fract; + u8 delay; + int ret; + + ret =3D iio_str_to_fixpoint(buf, 100000, &integer, &fract); + if (ret) + return ret; + + settling_time_us =3D integer * MICRO + fract; + if (settling_time_us < 0) + return -EINVAL; + + IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); + if (IIO_DEV_ACQUIRE_FAILED(claim)) + return -EBUSY; + + guard(mutex)(&data->lock); + + channel_state =3D &data->channel_states[chan->scan_index]; + + ret =3D ads112c14_find_delay_for_settling_time_us(data, channel_state, + settling_time_us, &delay); + if (ret) + return ret; + + channel_state->delay =3D delay; + + return len; +} + +static ssize_t ads112c14_read_settling_time_available(struct iio_dev *indi= o_dev, + uintptr_t private, + const struct iio_chan_spec *chan, + char *buf) +{ + struct ads112c14_data *data =3D iio_priv(indio_dev); + struct ads112c14_channel_state *channel_state; + u8 filter_osr, speed_mode; + const int (*range)[2]; + size_t len =3D 0; + int i; + + guard(mutex)(&data->lock); + + channel_state =3D &data->channel_states[chan->scan_index]; + + filter_osr =3D channel_state->filter_osr; + speed_mode =3D channel_state->speed_mode; + + if (speed_mode >=3D ARRAY_SIZE(ads112c14_fmod_div)) + return -EINVAL; + + if (filter_osr <=3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_1024) + range =3D data->sinc_settling_time_range_available[filter_osr][speed_mod= e]; + else if (filter_osr =3D=3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_25SPS) + range =3D data->fir_settling_time_range_available[0][speed_mode]; + else if (filter_osr =3D=3D ADS112C14_DATA_RATE_CFG_FLTR_OSR_20SPS) + range =3D data->fir_settling_time_range_available[1][speed_mode]; + else + return -EINVAL; + + len +=3D sysfs_emit_at(buf, len, "["); + for (i =3D 0; i < 3; i++) { + s64 range_val; + s32 int_val, rem; + + range_val =3D iio_val_s64_compose(range[i][0], range[i][1]); + int_val =3D div_s64_rem(range_val, MICRO, &rem); + + if (i) + len +=3D sysfs_emit_at(buf, len, " "); + + len +=3D sysfs_emit_at(buf, len, "%d.%06d", int_val, rem); + } + len +=3D sysfs_emit_at(buf, len, "]\n"); + + return len; +} + static int ads112c14_prepare_measurement_channel(struct ads112c14_data *da= ta, const struct iio_chan_spec *chan, bool en_burnout) @@ -639,8 +864,11 @@ static int ads112c14_prepare_measurement_channel(struc= t ads112c14_data *data, return ret; =20 ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DATA_RATE_CFG, + ADS112C14_DATA_RATE_CFG_DELAY | ADS112C14_DATA_RATE_CFG_GC_EN | ADS112C14_DATA_RATE_CFG_FLTR_OSR, + FIELD_PREP(ADS112C14_DATA_RATE_CFG_DELAY, + channel_state->delay) | FIELD_PREP(ADS112C14_DATA_RATE_CFG_GC_EN, (measurement->global_chop && !en_burnout) ? 1 : 0) | @@ -728,8 +956,11 @@ static int ads112c14_prepare_sys_mon_channel(struct ad= s112c14_data *data, return ret; =20 ret =3D regmap_update_bits(data->regmap, ADS112C14_REG_DATA_RATE_CFG, + ADS112C14_DATA_RATE_CFG_DELAY | ADS112C14_DATA_RATE_CFG_GC_EN | ADS112C14_DATA_RATE_CFG_FLTR_OSR, + FIELD_PREP(ADS112C14_DATA_RATE_CFG_DELAY, + channel_state->delay) | FIELD_PREP(ADS112C14_DATA_RATE_CFG_GC_EN, 0) | FIELD_PREP(ADS112C14_DATA_RATE_CFG_FLTR_OSR, channel_state->filter_osr)); @@ -788,7 +1019,8 @@ static int ads112c14_scan_read(struct ads112c14_data *= data, u8 *buf) return 0; } =20 -static int ads112c14_wait_for_conversion_irq(struct ads112c14_data *data) +static int ads112c14_wait_for_conversion_irq(struct ads112c14_data *data, + u32 settle_time_us) { unsigned long remaining; int ret; @@ -800,13 +1032,16 @@ static int ads112c14_wait_for_conversion_irq(struct = ads112c14_data *data) if (ret) return ret; =20 + /* Give it 1ms more than calculated settling time. */ remaining =3D wait_for_completion_timeout(&data->drdy_completion, - msecs_to_jiffies(100)); + usecs_to_jiffies(settle_time_us + + 1 * USEC_PER_MSEC)); =20 return remaining ? 0 : -ETIMEDOUT; } =20 -static int ads112c14_wait_for_conversion_poll(struct ads112c14_data *data) +static int ads112c14_wait_for_conversion_poll(struct ads112c14_data *data, + u32 settle_time_us) { u32 reg_val; int ret; @@ -816,10 +1051,12 @@ static int ads112c14_wait_for_conversion_poll(struct= ads112c14_data *data) if (ret) return ret; =20 + /* Give it 1ms more than calculated settling time. */ return regmap_read_poll_timeout(data->regmap, ADS112C14_REG_STATUS_MSB, reg_val, FIELD_GET(ADS112C14_STATUS_MSB_DRDY, reg_val), - 1 * USEC_PER_MSEC, 100 * USEC_PER_MSEC); + 1 * USEC_PER_MSEC, + settle_time_us + 1 * USEC_PER_MSEC); } =20 static int ads112c14_single_conversion(struct ads112c14_data *data, @@ -827,6 +1064,8 @@ static int ads112c14_single_conversion(struct ads112c1= 4_data *data, u8 *buf, bool en_burnout, bool for_scan) { struct i2c_client *client =3D to_i2c_client(regmap_get_device(data->regma= p)); + struct ads112c14_channel_state *channel_state; + u32 settle_time_us; int ret; =20 guard(mutex)(&data->lock); @@ -835,10 +1074,26 @@ static int ads112c14_single_conversion(struct ads112= c14_data *data, if (ret) return ret; =20 + channel_state =3D &data->channel_states[chan->scan_index]; + ret =3D ads112c14_get_settling_time_us(data, channel_state, + channel_state->delay, + &settle_time_us); + if (ret) + return ret; + + ret =3D regmap_test_bits(data->regmap, ADS112C14_REG_DATA_RATE_CFG, + ADS112C14_DATA_RATE_CFG_GC_EN); + if (ret < 0) + return ret; + + /* Input chopping doubles the settling time. */ + if (ret) + settle_time_us *=3D 2; + if (data->drdy_irq) - ret =3D ads112c14_wait_for_conversion_irq(data); + ret =3D ads112c14_wait_for_conversion_irq(data, settle_time_us); else - ret =3D ads112c14_wait_for_conversion_poll(data); + ret =3D ads112c14_wait_for_conversion_poll(data, settle_time_us); if (ret) return ret; =20 @@ -1604,6 +1859,17 @@ static const struct iio_enum ads112c14_filter_type_e= num =3D { }; =20 static const struct iio_chan_spec_ext_info ads112c14_ext_info[] =3D { + { + .name =3D "settlingtime", + .read =3D ads112c14_read_settling_time, + .write =3D ads112c14_write_settling_time, + .shared =3D IIO_SEPARATE, + }, + { + .name =3D "settlingtime_available", + .read =3D ads112c14_read_settling_time_available, + .shared =3D IIO_SEPARATE, + }, IIO_ENUM("filter_type", IIO_SEPARATE, &ads112c14_filter_type_enum), IIO_ENUM_AVAILABLE("filter_type", IIO_SEPARATE, &ads112c14_filter_type_en= um), { } @@ -1614,6 +1880,17 @@ static const struct iio_chan_spec_ext_info ads112c14= _ext_info_burnout[] =3D { .name =3D "burnoutraw", .read =3D ads112c14_read_burnout_raw, }, + { + .name =3D "settlingtime", + .read =3D ads112c14_read_settling_time, + .write =3D ads112c14_write_settling_time, + .shared =3D IIO_SEPARATE, + }, + { + .name =3D "settlingtime_available", + .read =3D ads112c14_read_settling_time_available, + .shared =3D IIO_SEPARATE, + }, IIO_ENUM("filter_type", IIO_SEPARATE, &ads112c14_filter_type_enum), IIO_ENUM_AVAILABLE("filter_type", IIO_SEPARATE, &ads112c14_filter_type_en= um), { } @@ -1966,6 +2243,52 @@ static void ads112c14_populate_odr_tables(struct ads= 112c14_data *data) available[1] =3D rem; } =20 +static void ads112c14_populate_settling_range_tables(struct ads112c14_data= *data) +{ + s32 (*avail)[2]; + u32 i, j; + + for (i =3D 0; i < ARRAY_SIZE(ads112c14_sinc_latency_tmod); i++) { + for (j =3D 0; j < ARRAY_SIZE(ads112c14_fmod_div); j++) { + u64 fmod_Hz =3D data->fclk_Hz / ads112c14_fmod_div[j]; + u64 start_tmod =3D ads112c14_sinc_latency_tmod[i][j]; + u64 step_tmod =3D ads112c14_delay_to_tmod(1); + u64 stop_tmod =3D start_tmod + ads112c14_delay_to_tmod(ADS112C14_DELAY_= MAX); + s64 start_us, step_us, stop_us; + + start_us =3D DIV_ROUND_CLOSEST_ULL(start_tmod * USEC_PER_SEC, fmod_Hz); + step_us =3D DIV_ROUND_CLOSEST_ULL(step_tmod * USEC_PER_SEC, fmod_Hz); + stop_us =3D DIV_ROUND_CLOSEST_ULL(stop_tmod * USEC_PER_SEC, fmod_Hz); + + avail =3D data->sinc_settling_time_range_available[i][j]; + + iio_val_s64_decompose(start_us, &avail[0][0], &avail[0][1]); + iio_val_s64_decompose(step_us, &avail[1][0], &avail[1][1]); + iio_val_s64_decompose(stop_us, &avail[2][0], &avail[2][1]); + } + } + + for (i =3D 0; i < ARRAY_SIZE(ads112c14_fir_latency_tmod); i++) { + for (j =3D 0; j < ARRAY_SIZE(ads112c14_fmod_div); j++) { + u64 fmod_Hz =3D data->fclk_Hz / ads112c14_fmod_div[j]; + u64 start_tmod =3D ads112c14_fir_latency_tmod[i][j]; + u64 step_tmod =3D ads112c14_delay_to_tmod(1); + u64 stop_tmod =3D start_tmod + ads112c14_delay_to_tmod(ADS112C14_DELAY_= MAX); + s64 start_us, step_us, stop_us; + + start_us =3D DIV_ROUND_CLOSEST_ULL(start_tmod * USEC_PER_SEC, fmod_Hz); + step_us =3D DIV_ROUND_CLOSEST_ULL(step_tmod * USEC_PER_SEC, fmod_Hz); + stop_us =3D DIV_ROUND_CLOSEST_ULL(stop_tmod * USEC_PER_SEC, fmod_Hz); + + avail =3D data->fir_settling_time_range_available[i][j]; + + iio_val_s64_decompose(start_us, &avail[0][0], &avail[0][1]); + iio_val_s64_decompose(step_us, &avail[1][0], &avail[1][1]); + iio_val_s64_decompose(stop_us, &avail[2][0], &avail[2][1]); + } + } +} + static void ads112c14_populate_tables(struct ads112c14_data *data) { u32 full_scale, fsr_bits; @@ -2004,6 +2327,7 @@ static void ads112c14_populate_tables(struct ads112c1= 4_data *data) ads112c14_populate_scale_available(data->sys_mon_chan_short_scale_availab= le, full_scale, fsr_bits); ads112c14_populate_odr_tables(data); + ads112c14_populate_settling_range_tables(data); } =20 static int ads112c14_probe(struct i2c_client *client) --=20 2.43.0 From nobody Fri Sep 25 19:20:32 2026 Received: from mail-oi1-f169.google.com (mail-oi1-f169.google.com [209.85.167.169]) (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 A212A42A144 for ; Thu, 10 Sep 2026 21:14:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074902; cv=none; b=jETZLI5HwjBwAnx8h9YdW/lQNloujtaIROoKiTm4FLyfAaLCH0cwqko6P1yyzNJpVrKQ/7blnA+wWZAZn5VHJcg+DqCToo7NHH++mszta9zQhwfe+Qsi7u4C4shbUHup5KaSY8mVZcLYsny4FIEeaGVuM5P9X3Xoud1/emQJ84M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789074902; c=relaxed/simple; bh=oco3EQSldSQddBQlm8Qmhp6JJwlywX+YHfTrmsrsHkU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Lx9TGZuntSyspsUtgof4VFTlr0ft06WPr1H+tS8uxjkNRtrk9LHuyVL2ywsPEGFohODH//1X7AMnRfF/NdM3WMaT3bNC4fZufOvYpzOIzMHTgfgCTVaPO7mu/EHHpDKgzl1vhpF4z/96521hCddq9hIius3s7eVN5G0q0peC3pY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=bjEhUQXY; arc=none smtp.client-ip=209.85.167.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="bjEhUQXY" Received: by mail-oi1-f169.google.com with SMTP id 5614622812f47-4c18e5e9745so236975b6e.2 for ; Thu, 10 Sep 2026 14:14:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1789074885; x=1789679685; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HcroCnoY8IYvdQg62Y2Lq302IyLGTvPMvxJQS19q0o0=; b=bjEhUQXYFJhxC0wuBGuak6QkGAWrC/KZTvdoNPQC/K2vXOACyamcp6ZeGzqMgQGy7i yzMcqjzhdbtB8OP6b1efUZ+D1/MYRTxXrEA9laC9Maw+H0v3qks2N0bYmnfVLS9P7J3o WNZ3M2VF+EF+P/yt0EaIPdpPQUHREJKMxxOcEcm1YZ7WHgeSFJ7+CC+RbB6DCBLBLPgW ayYGOIwaMjpdVDiBScbfrTZUpWPqOKiTkVQ/9RIrWUlZjkdjoY9me1I8O5tefBSAKRXA lh+ZVpSlXxsAq7EjKdpiV6tRSxAkmb809ILyykY4QxMFz+7z03XdphL8ny9MKv1YCIay 918w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789074885; x=1789679685; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=HcroCnoY8IYvdQg62Y2Lq302IyLGTvPMvxJQS19q0o0=; b=MIAyrY2MFJlIDisEdPeQIEe8gExD9nhBbbECpC2Xm1Z1D6Tyym8Aki8aESwWE73qHM r611ZzaDT7e1exhucRmCrt1tgRj5sgWgFw5oWWfsswhiH7STi7Aw7V4poNdqcXF791bH cqy6LsYmlbV0IUpIep2ITXe9uxnzrF64+oXFWWiB8fz1cMfxOyaiOJwUluqVxfc0kxS3 9AkGw1kfFN2A0bjZ3ARC62UzIxL6NzOFLh32TEqRt6OznX5pxFOhN5K5B6pZRd2w4xYF qdkmV2RcFUyrM1qYuIh7SXx0MtK4mu9fA3K7qMMYxEwpnLslLA6xhC/BJoLNEukOdNkY GpUQ== X-Forwarded-Encrypted: i=1; AKwUvBzz/++MMScUnacOa8SK6EbYodCK4Su2qYUGc5uWm/8rMqztaa4lYR6cF1KFupVL8hxwSvrT9YEofjayt2s=@vger.kernel.org X-Gm-Message-State: AFuF++lGBRmZVlx4jUztiziRZqt3HEALfH5GshQC85cAdxB53OIGy8Ks aZG3kCE3ugOmo24h9IRtlKWal0j1Jtzx5SV6T2n3x8/ipFSdJ3u8HhblvxQL9d13TLYuE9x6600 +sf1d X-Gm-Gg: AYBFou0AGq536YtHNGFZPIIS8NXXvdN0DxNPLzU1nWYPSFpKzvlR3BRfzcNf71HBfAR vGvjVeKxEiNmVI1BDZxSS2z0/PtZBDzkjAc1cOp1/i7A+SbhAsbH2x0SAzFCBRLFI8dj0Vshh4W 0isn97X9F8+07Y0Iy5rjdp/f8Kr53nY5ipDzHvNSO1Svu+DXJaKAP72aFN8/WT2g2NeOjvgneE8 UoFiMwTr2TZCJVg9GD1veC+9ITGXUvvxR6eow7tvNz9DJrI1J6z/Ldl7VGEa/hPSN4QM6vV3fWe mrpeniUDbAq19IjfT2Ddxnabus7246B3Edycsb3LTQCBhop8953BmzZa4oPnsLSB140yHJzdyoG SmVBwl8ZzSgabjBhcPHNc73E6fI9J92J3A8ewl6L/8mGXhNUmCkTQZKkzjEAsjju4SepX6XsJyK ERT3eFJYoFS8bxFFXPpdr7ry6lclS2DGeaE/qUmleSLVo9jzxfkWw2H1P33N0b0kHIwHCyJOkpg SIm X-Received: by 2002:a05:6808:1784:b0:4b9:e5fa:8a24 with SMTP id 5614622812f47-4c31c61d3f9mr849699b6e.41.1789074885486; Thu, 10 Sep 2026 14:14:45 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:fbf1:d0da:69e0:11a0]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330daa42esm347315b6e.4.2026.09.10.14.14.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Sep 2026 14:14:45 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 10 Sep 2026 16:13:09 -0500 Subject: [PATCH v3 10/10] iio: ABI: add settlingtime attributes 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 Message-Id: <20260910-iio-adc-ti-ads112c14-filter-support-v3-10-e5a9b27ddb1a@baylibre.com> References: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> In-Reply-To: <20260910-iio-adc-ti-ads112c14-filter-support-v3-0-e5a9b27ddb1a@baylibre.com> To: Jonathan Cameron , =?utf-8?q?Nuno_S=C3=A1?= , Andy Shevchenko Cc: Chris Hall , Patrick Edwards , Kurt Borja , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, "David Lechner (TI)" X-Mailer: b4 0.17-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=3263; i=dlechner@baylibre.com; h=from:subject:message-id; bh=oco3EQSldSQddBQlm8Qmhp6JJwlywX+YHfTrmsrsHkU=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqox2u9xy7hKQq4y/ZNMUSyRLQFZyDbjhu/7DMF ntmFQ2pqf2JATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCaqMdrgAKCRDCzCAB/wGP wGqXB/4poy/o1/G42PpjjK9/keZcPcGPomxyMJlvUWnGUPtqaSxpA01IOf3Z1Dro4FPelFR8KEw dNyzByo8st3amG4/8de2OdQ/WIB037nbnWbsJXko6RrJcDuyidZ4x5uR+PsfW444agkckR3Zda2 2PdrTh4Lsr1uG20X3OPIQkaUV50V+lwF/+pRV1cFdWwIqUQxttZiqjclafvA+t+gFt+DVP3dzo6 RYRQsi5CKjTg8US9rr7l9LdKb462XLCeks6rVcwQLGphcGMUykHdBeHRRTcog547dzJp1Rr7HuK fUdc74rWQndt7RsRuXJ8ptatZOdz1e9oMC1ZnfgZhlYn7t/o X-Developer-Key: i=dlechner@baylibre.com; a=openpgp; fpr=8A73D82A6A1F509907F373881F8AF88C82F77C03 Add new generic attributes for input settling time introduced in the ti-ads122c14 driver. Usually, in IIO the output data rate is 1 / sampling_frequency. There are known devices (generally ones with filtering and oversampling) where the first conversion takes longer than 1 / sampling_frequency to allow the input to settle in order to have a valid conversion result. Then, any subsequent conversions in a continuous sampling mode would be done at the regular interval defined by 1 / sampling_frequency. This attribute is intended to allow controlling that settling time duration. The total settling time is used rather than the difference between the time needed for the first sample and subsequent samples so that it can be read back directly via settlingtime_available without also reading sampling_frequency to compute a delta. The available range's minimum value represents the fixed, always-present portion of the delay (which typically already includes the time for a normal conversion), so requesting that minimum is equivalent to no additional settling delay. A device that has input chopping enabled would see this settling time on every conversion since the device setting (i.e. the input mux) changes on every conversion. Signed-off-by: David Lechner (TI) --- Documentation/ABI/testing/sysfs-bus-iio | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/te= sting/sysfs-bus-iio index a8e1cb8e7490..045589058655 100644 --- a/Documentation/ABI/testing/sysfs-bus-iio +++ b/Documentation/ABI/testing/sysfs-bus-iio @@ -2402,6 +2402,32 @@ Description: Specifies which filter type apply to the channel. The possible values are given by the filter_type_available attribute. =20 +What: /sys/bus/iio/devices/iio:deviceX/in_resistanceY_settlingtime +What: /sys/bus/iio/devices/iio:deviceX/in_tempY_settlingtime +What: /sys/bus/iio/devices/iio:deviceX/in_voltageY_settlingtime +What: /sys/bus/iio/devices/iio:deviceX/in_voltageY-voltageZ_settlingtime +KernelVersion: 7.4 +Contact: linux-iio@vger.kernel.org +Description: + Set/read total settling time in seconds for a device to settle + after starting the first conversion after any settings have + changed. The data for the conversion is outputted at the end of + this time. + + Depending on the device and how it is used, this settling time + may apply to more than just the first conversion, e.g. to every + conversion in a single-shot conversion mode or when a device + setting changes after each conversion (input chopping). + +What: /sys/bus/iio/devices/iio:deviceX/in_resistanceY_settlingtime_availa= ble +What: /sys/bus/iio/devices/iio:deviceX/in_tempY_settlingtime_available +What: /sys/bus/iio/devices/iio:deviceX/in_voltageY_settlingtime_available +What: /sys/bus/iio/devices/iio:deviceX/in_voltageY-voltageZ_settlingtime_= available +KernelVersion: 7.4 +Contact: linux-iio@vger.kernel.org +Description: + Available settlingtime values in IIO range or list format. + What: /sys/.../events/in_proximity_thresh_either_runningperiod KernelVersion: 6.6 Contact: linux-iio@vger.kernel.org --=20 2.43.0