From nobody Sun Sep 27 00:40:30 2026 Received: from mail-oa1-f43.google.com (mail-oa1-f43.google.com [209.85.160.43]) (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 4CCA23CF209 for ; Thu, 27 Aug 2026 22:23:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787869421; cv=none; b=NDnzDZSXuAUB/R16SrOKuzuGpX0G2oUzHS8/5NUglk16mUue1RTlmwWgF47yEes5o2yYVZus/bs7dg7fx5wCltYHto4zONupn1yTA+PndaHsipYVWQvLY5SVtF1Jx0BvM+zqXlm1HkFFHj2Mk3qMX8XHW7nyj5hFO0X65XCu+Ag= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787869421; c=relaxed/simple; bh=NDSDpivYarXePwTSDpiVgkViP53hrWoSMytekojHNS0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LwV8L/u1jXIpJqWJf780XzHZQeR/cpShs+YymXpqhwGqRGb+9VIrvRM5vVAhIRcpLGi++8/MnJjEYu7zLci5cQpGU7VCLRBXX2MCaU+qQaYY34IR7ESxn9R48P5b3Et65py2iib5UQJXcA1re3gUmDqB3E9Dir2Uz48HWbYmXAM= 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=Bj9n86/4; arc=none smtp.client-ip=209.85.160.43 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="Bj9n86/4" Received: by mail-oa1-f43.google.com with SMTP id 586e51a60fabf-448b69cfc6dso513555fac.3 for ; Thu, 27 Aug 2026 15:23:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1787869411; x=1788474211; 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=iNTRuf05CTvv6ajYQ262DYaZCyLOnZ0DLR4E2AczWeM=; b=Bj9n86/454/r0A5Rz30RgYmgEUzHeIJZ/uje9shf9gzih+oovpz6r40xX11R63es+k UszRfDxw0Zj9M1q2nDgPST4DEvUaU5Zenzd3qHA/0aZsC2C8d1R+eTe2OWdJe0RAJBKt n2UKoE3Owz7bcZeWTIJWKDZKfGCQzN9gcUtykeQSc3aYscSZwg957OB3qcbFSb1Ql2jq my5UowA7++8OL+0jWxrs1RADhUXJ2OXcgiJKDPWhzC12E9G1NaqvKIUH7piyl4bBzJtb DqaTQ7gB5wEnpWeei6TX63m7GjfpcSTQ+6XJWScjtnpYy9adSCxUqDJJ/XsiA+PkkySn oNMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787869411; x=1788474211; 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=iNTRuf05CTvv6ajYQ262DYaZCyLOnZ0DLR4E2AczWeM=; b=J3L2zHq1zAXhr4F7lvSr6zmgAB4GT9Rau4i+fJ2F+LyOJB11NQU1/QvdhkUbgymo15 EF5JAoZhLr0hjLcrh/q3+Y+VMC4WxBdW3ZCoATFUhElUDOEg9LA0AKVjixBFVyn/nzvA whBV5Ea/eKe5cbIPv356FxkpiagjoXKJcwvT7sbvgaYeNzNcbnJ1PxNYgyiH27O0r8Sf n2uMn09/IfuVyQxHfh15NgjCX+JCclfKBnGTwpOcwOdZY8EEjqMedy2nlattXBR/Joib cIQorbezVkW6fTfzRW6xf1lFkhMxER7+wZrzzizcUTHkxqbARGtnzRQP1jNRM+riNkcG dHRw== X-Forwarded-Encrypted: i=1; AHgh+RqQxEJDFWZsyV7TUxvOyrkkBZYFL7amPI8zOckXCmD+ZUrGCN3NPPbbTdsO6hDy+LAgtO0seMLPBAtYzAo=@vger.kernel.org X-Gm-Message-State: AFuF++klsDwWyXwGWBxNGF6ttqm1eqZnoOdR0z7wi36S6lkdiMDY8qD8 UV0/iZq3y3Crrnh5F+gagX7xfNcxEhAfdnzBHnwGSF979CeFn/xEVjRAY4kS6LQisMo= X-Gm-Gg: AR+sD126a9uRIRJzvZZAOJFAd3WvqMKmzGRPaKF2xnID3PbqbXDlevYz52qkSTQ4J4o YZj2OOJDWSZCxO9SOF+bSibCdVS/vufB+P8M9V7fAsyDPdx8myFE+gMSqUonzCi7BraBw2qjSeo IvEt6LowcvQ97qIlYB4K3ODUFCdY00RaRW1/siNvKClEXDNXNPoKzC+66g1hk5SkRdChi+AnMLt 3jLHgq/tCp+L2rEPLkOq0Vaz55bprEMiNwoL1zBIGpctFNjj63zCjhNowkKj3Ya2GUTpTNCuhZg jawEtrhhqqlERRqKDV8NpbYID3a+P7MYfKYfS2+5O1m72Ni+fwFUu0l5KlYhZJo9/FJURPdl2L3 rSmdqW22zYNxIzHGtmIXfffe3DXlTjruqVsuDbUjDwdMs+5I5hPrXf+3TSHfXYXNoseQ8O3M32g QOwE0D4gG12vV85KKRbkj7apAf9M0OkDYriFE46G0Tq8QGq0bNjSAJMRc8H8zP1OzWTt2TGsg1x Hyc X-Received: by 2002:a05:6870:340c:b0:417:4693:ca0 with SMTP id 586e51a60fabf-46837336748mr3287799fac.14.1787869411000; Thu, 27 Aug 2026 15:23:31 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:d288:6f77:e285:6925]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-46736445d6csm3176880fac.2.2026.08.27.15.23.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 15:23:30 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 27 Aug 2026 17:22:53 -0500 Subject: [PATCH v4 1/3] 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: <20260827-iio-adc-ti-ads112c14-continuous-mode-v4-1-1e51a6e20a69@baylibre.com> References: <20260827-iio-adc-ti-ads112c14-continuous-mode-v4-0-1e51a6e20a69@baylibre.com> In-Reply-To: <20260827-iio-adc-ti-ads112c14-continuous-mode-v4-0-1e51a6e20a69@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=6047; i=dlechner@baylibre.com; h=from:subject:message-id; bh=NDSDpivYarXePwTSDpiVgkViP53hrWoSMytekojHNS0=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqkLjL4zBRwoqqPUTVf7uUQ/AGhhA7trbe/0MLE jXD4Q5bhk2JATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCapC4ywAKCRDCzCAB/wGP wI9VB/wOUhPd+nshKlotSaCWLOXFgUr+QeZ7Sf1Pt/vGSoCOcObHFrujg3gPRKNUbl5yncXYgpj BybatK1G3EV/fcQgWRVOJ5iTT2czeznwN4rubcXiBJRb4MDehx2eI0sPEB+8aT8ncwEAEiikiVw z9vvY0LnW8DwPMbyo33WZI2zkiGG2gGN9CXqGgwgvSWJWK0f6O0ryipEYOfh8ix8JL7HgZsJvtr nXLgDb6+R2O6LFQLveVOmE40F+33FnNRgW8bjtlPTib1/xS/oIU5obhJijpglRZ5vJi+vO+IBgz 5Vxqry0Gedl5kuBneT8zkvh4Aro1p8H2CcvNLkAeNKd134Us 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..63b819339788 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 (device_property_present(dev, "interrupt-names")) { + 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 Sun Sep 27 00:40:30 2026 Received: from mail-ot1-f44.google.com (mail-ot1-f44.google.com [209.85.210.44]) (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 30C963CAA25 for ; Thu, 27 Aug 2026 22:23:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787869422; cv=none; b=f3MdSmSt0Jd2k9Q/y3xodlp8fkI3GH1iXDXQ1aE6T4S0ifEZMsYcJhvVwUaX7kWQqTY+qS3zlfTLjDTENZHKFN1s9xEhbZYfzj14OdSpoSfArdjIH66WIhZ778TFMXLj/ffKXWMAwcLKiAmGwR2FNXMNdy+QZ7QNzcWrNq4/NXc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787869422; c=relaxed/simple; bh=0jleKfSV4x8zSuizbp6O6ni4ujngh47YqjL22y19AbA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nYlP9+j/xb2Lp2msKHmKtWGSw9gF9LrfSfuXK92Vv1lQULLgLR3qVzzCQgDX4YY3Xa29OzveU55cPaRZZkfZBqIHUfWfRD7upGTuGmEvuiYifCM/pxJHaD0CpZcW+UOEAj6u/i2Isnvh4asvWr/xm+bKqaXEXL3fxSwi61ZwG5U= 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=d/gLtfZp; arc=none smtp.client-ip=209.85.210.44 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="d/gLtfZp" Received: by mail-ot1-f44.google.com with SMTP id 46e09a7af769-7f4cc6797b7so76124a34.0 for ; Thu, 27 Aug 2026 15:23:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1787869413; x=1788474213; 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=cEY7r8lduCT2nc4feVvWUral7NtsjaDfgRTqImYybck=; b=d/gLtfZpjDN8EUweE9273ciG25S1rmPJvfzppvj0Vus1u5l3PaRs3lpqLFwXEdAzEV 5MN16BefFFNhZIwZBL4AI6erYIq943I31Gaeicc45s0Fu+uAjuM8odFHknbZMYDoPXAC K0dIBoHYiXP09f/LEF8jxDGER3JUfZRg0y5ehy7B1Rq+t2Jaq+6woUyxvJHmNzdHEsKB riZCGU4TjaQk6U2ySaaEpUjoDvm9xTuAehG9rmMiMtmYp3s6tm0tMOU3hhfW4nykgISV 8umfZsTE6EdoP3yOzPDGtEvYetQr6TIUpAqmdNTvBUDvVFzcE4fK0YCS1SkdAa9bzgSZ VkHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787869413; x=1788474213; 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=cEY7r8lduCT2nc4feVvWUral7NtsjaDfgRTqImYybck=; b=tOGvRk2HOsN2e+MdDZHIQdYI50TjgU+oSNEhhUY7eRoLhTC02+EUo/H5ay5s1Xk5rx /SS7K8PPZxbFUyTy2VeaL9xqCgAtq76j8PSJgR+OIs6+xA5QG0Oo8KWye+FrtK3Hm20j j9SxiOetbTABotDc9U3GibOD34YF0yE3qhgka5zPnGr3YtZHi0Ehsb5oXElUzy5KRA1L cAEYqaVWFvzqqJBOiADtrJJ+gokhQs3lBQltz/7TZcVIpNM62i8ieUMMdL+lKkNW/Jbf ksRoFsQSgjMkXA7DO08Nm4cmjvJEDtQ8zklI/irTCRuLIeLJJnEa8QCv5FpN8OnaXi8j CNxw== X-Forwarded-Encrypted: i=1; AHgh+RqEV6+ZZe5kw0Mia8ApjKkGMcP39Y5DPUwiv1bC7yZe1AmB/y1eGqSD6r218JqTY6HAoQnFkqqRYJtlNOI=@vger.kernel.org X-Gm-Message-State: AFuF++mZtae/cMLYiAxqiSs/1O4bcHrhHW0ruXfO2qZniz0QEGS6ysDj fIs9WzJVQDSghL7u9ltSi/KunTfn5N6JXA1IPIJKxegPGg/jyeywR8A9Bni/k3abbKE= X-Gm-Gg: AR+sD13GqgJ7NwExlffqR4aypDEpDuHaiG2UqZlbKMLJiBqh7cwZB/pNYb0XdzXZBue jzCnHAft5TbBdWfyk30mwa7ERJ5UWj3x80jokDsYmkivcM88u2GcAcwAUx2YFGJmOf/KCb9pw6Z BVZRI+cc2u6Z/VVqnpG6qaLMBZLfP1M0oPATrSFG9w69aFpGm+Qx657FZxlbWF4eQ+/Lf4ijgvQ jtj+R2bHmf9rcz13R2zWnWxo1yHSgNeR9SVWC1sEcwPDzJjul+Ts73ArH8jbHtlOtfu+TgFBBBu beD2FQVLLyljB0jRM7u+e0meZy3ydr+Zy2C9xtaoUsiSlzA2jqeK4L13Nq4viuc8tnwO5XKIdEo WTrXy0W6LNiuUauLImK+2B1QNB+ckx+9+RJecCAV0uR1TrUZpLzT2S6Ik8mWX88nPD8gcNmtJ1Z 8ym+Jl08Xh5+2+Ef/GhNF9E9gfiJ+/gVPgoSde4KVavkzLEPbvVZ68Gc7B0HVntXDI7w== X-Received: by 2002:a05:6820:180d:b0:6b0:589e:42f4 with SMTP id 006d021491bc7-6b1c66b745cmr2087523eaf.20.1787869412938; Thu, 27 Aug 2026 15:23:32 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:d288:6f77:e285:6925]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-46736445d6csm3176880fac.2.2026.08.27.15.23.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 15:23:32 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 27 Aug 2026 17:22:54 -0500 Subject: [PATCH v4 2/3] 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: <20260827-iio-adc-ti-ads112c14-continuous-mode-v4-2-1e51a6e20a69@baylibre.com> References: <20260827-iio-adc-ti-ads112c14-continuous-mode-v4-0-1e51a6e20a69@baylibre.com> In-Reply-To: <20260827-iio-adc-ti-ads112c14-continuous-mode-v4-0-1e51a6e20a69@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=0jleKfSV4x8zSuizbp6O6ni4ujngh47YqjL22y19AbA=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqkLjRt+57QHCBq9DY1dUxKl9CAbewfpRgKexdv ATvT2wVQuOJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCapC40QAKCRDCzCAB/wGP wG1rB/4/YNCn57DiCj4OkZtFS5CtosxGX9k49ZBaandtp7f/c5scfN6rjqMEVPYLN9phPgMJbwt PddvBwQNGNA1EHRDaXztfOgXS9HKzzOlpr7TVft3t80+DscmbpnNoI8zKZz5tiYONnemJKZgtw4 4F+HHBVAyDW+sD2ck2btRdnZECy0RIP7dxNbgrSFQ499dPKFw8f/mRnGSd6lRf7EULMqP7DXOtK Hv5Z1CDaBcaTA7du0Xga9QrW6+MtC6rWOA1XLsI5IZjeutdv/oABHw7Fs4+sKeeHP01PieburaD aoCZm4ptT0JbA4POrRHgALL9fwoiYYIpl2snU60pVdp9lvr0 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 63b819339788..23f15be303fb 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 Sun Sep 27 00:40:30 2026 Received: from mail-oa1-f46.google.com (mail-oa1-f46.google.com [209.85.160.46]) (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 50F37391E59 for ; Thu, 27 Aug 2026 22:23:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787869428; cv=none; b=fXQNF3aMTFR0RLtGMv+1ClnHIYGCixCWiGMVBEL2sr0U0YOliJc9zNk+yk1zjlAgLWFYGEp8o4RRIZQ/lBU4XZwocmcFLdRKrkgL+39aBzl6N9SH1zWAokKW+2o90u++AZjK7scDS8H4JMoD8Ot1rmbxhlZwbSfNpIvxDgHXuUU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787869428; c=relaxed/simple; bh=TwIhk0gHwdW74C9n7Lk9ObmxhDawcmqBJgUdPP9yn14=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tu8I5LjhSmK/qNj4wL4EKQyZDW6a0w7uIKXel5ckkO1zKJJMCGslhSoVxM4dWFSD15PQFnv9VXlAt4JTRNkNgyvOOEjxgCC3kUz/fMF8Da12oW0c7uuKYR7eAtz0c/Oy/wNsG1DbHZvsPe00exd9anTT1fo5g0djPCcJ0k3N0io= 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=NCA+oCyR; arc=none smtp.client-ip=209.85.160.46 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="NCA+oCyR" Received: by mail-oa1-f46.google.com with SMTP id 586e51a60fabf-448b0ff4a57so772775fac.2 for ; Thu, 27 Aug 2026 15:23:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1787869415; x=1788474215; 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=hl/XEo5fNZ0wthCiWH8FBPhlGjw4oj7mSGF4lVQ3i5k=; b=NCA+oCyRTH/aCnGQnSCLfBrWHc5ElmYjgeM0oerqaIeISDJEDdrkuPi+dPdjGg7FA2 E7xIqR4aRRnksp9hhvJVNs8yGnrwwfRvKj6An+pn1KLeoIMun9kZzit2rQPT++vi8Z1d Yz4L/5JQrkpXmSFyzI7l27XfdkvsanZuONCdmqtDIF4yf9y9DqZrI63QLrRe3sK8/UUx JVnXOM69RWUNh5sjbqyNuvlj9ut766qMKOtODPeV6zfXwc8Nvl0s3rHSrwyBWKxzSY0W DGyX07WKEq/Q0h0QP4loG3I/XraWK1e8kHN8lJzhVH2Zr8mrXfpjz9sp7cZ/ExFGZR4f RLgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787869415; x=1788474215; 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=hl/XEo5fNZ0wthCiWH8FBPhlGjw4oj7mSGF4lVQ3i5k=; b=tRP1G6M93QQnLy6UO+xgkf6OlSPSxjQTa6slCQpfd3BqMUDEN+xBxuDe1QsWZc+WZ/ U3chAHUQQg6Ff+Q2jGzuJkkmQvD3v9h5i5qPX0yAL26fLHQyGr0QjBK0l2//XZEMuqIn JbGwDhHnHzggeeg0jWrgmolda1RKOM4T8i7NGNxcsK5d+OH+3V0MiT9qU0Jlni0Q+h+3 +NhVLtbvuKi84t1enm1SWIcepwEwBmFbf1MQ1PfCWj/9d9YSU7Zd+XV+em19j/6/G5zv 8fBRFJT0VDNtnm2NWWgPoYQWyhc435N1tdldU+EkYwou2mAYNRMGEvZFmRXmNLicwa70 rgEg== X-Forwarded-Encrypted: i=1; AHgh+Rrtfi2wna1t6oNf7cdGdWgjIL/JOxH+ay2ddOtMZhnOmhZzDgw7H+IbMudWLpMs4T/g1XhWY2aW6MhreA8=@vger.kernel.org X-Gm-Message-State: AFuF++kfp5ufU1wD7+KsZZ1ydvke9uwsxxAtiF0eeKp6PDXjm5Bl7QOl NTYLSArFmLPfJN2GOZd2akr+uV1QxQwmTi/pqRPILpAX88lLygeFGNRFKl41DGPsm4Y= X-Gm-Gg: AR+sD10sa6PC8wLP6dOhZswoYf1telA1e0XVnULDGeQRYZk/EZS1pGoxO6u+bUiQ9Q/ pt2UYJH053dOVp0zmwrqbVVgssAbXI8C19YvMeVSVUjwL4HIeg4qjbWpa3Jvpmdyn6b530iwyFs 5knT2B/hrMkTuLN66Ua/mu0fboOyD1qDX1A7BZlzyAwrR5kv9PPk04ZWUlY/z8BXdNTLBwFXh76 l8ccSgemAdfuCV6Q+d2Q9/ueKYOQLkrL9fxGO+2ey7EhE84/Sge4hmGBhRZY1JEzz0u6YYvgyQN OvM/S+mIeMcs2Yk0f73WaPwKo2WtZ7nGxZnZjrXnEAh9ELfdICB3D/a+9WloSazJEkEyKWRQtpD 0Gp1PlZ2IhZzepb/Ulq16vNMQl6878OsOkxCJnk87sIacyb8lflAuj2G3qOZvjVdu1+CQyAyRuM sdG9P2FEdToxyDFmZnu2y+9uVtErMRow7LFSxbPmVTYbLS/ie7E4eszb4honyzCrrZVQ== X-Received: by 2002:a05:6820:708c:20b0:6b1:4cfe:ea6 with SMTP id 006d021491bc7-6b1c672778emr1621661eaf.32.1787869414852; Thu, 27 Aug 2026 15:23:34 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:d288:6f77:e285:6925]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-46736445d6csm3176880fac.2.2026.08.27.15.23.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 15:23:33 -0700 (PDT) From: "David Lechner (TI)" Date: Thu, 27 Aug 2026 17:22:55 -0500 Subject: [PATCH v4 3/3] 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: <20260827-iio-adc-ti-ads112c14-continuous-mode-v4-3-1e51a6e20a69@baylibre.com> References: <20260827-iio-adc-ti-ads112c14-continuous-mode-v4-0-1e51a6e20a69@baylibre.com> In-Reply-To: <20260827-iio-adc-ti-ads112c14-continuous-mode-v4-0-1e51a6e20a69@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=7065; i=dlechner@baylibre.com; h=from:subject:message-id; bh=TwIhk0gHwdW74C9n7Lk9ObmxhDawcmqBJgUdPP9yn14=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqkLjYvaFd8ahyjKFx5Etej4HhFqXGgX/mXsDzg QeewpL8h2yJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCapC42AAKCRDCzCAB/wGP wHygB/4nhIIc01sxoqHqrN9oeeyKm1kdRc/CbA6KyejQdrouRaFLzVKJunc/idzj0Cd42Nf45QV APSty9oihjNhbBDvn/R4/+I18+UIdy48W1lUV4X73g76W+maVFeRRjuRrpvoAYHsA3IvEIlK+Ml PJEArJ39qwSn482uYaEdKoMPoZzecOYMhQ4iSXblV0U3a7F9OsMlwnQ6oIFfbw/OEgUTYVZ7iUy +YIkQQzq2SSYblvb4TcsJO7CIvx+hZYXrLGNOTT98MLpjfBPTGAu6iGRMBouxNEFBJ20aqIN/1v 8RlCKAIvoMyXUs80iI0vSvctWnZ0cvVoijYXP6waVY9WLQlh 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 | 143 +++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 141 insertions(+), 2 deletions(-) diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c index 23f15be303fb..878764deffc5 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,6 +259,7 @@ 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; @@ -280,11 +283,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 (indio_dev->trig && iio_trigger_using_own(indio_dev)) + 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) { @@ -952,6 +962,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 +984,26 @@ static irqreturn_t ads112c14_trigger_handler(int irq, = void *private) u32 i; int ret; =20 + if (iio_trigger_using_own(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 @@ -992,6 +1035,88 @@ static const struct iio_info ads112c14_info =3D { .read_label =3D ads112c14_read_label, }; =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 bool ads112c14_validate_scan_mask(struct iio_dev *indio_dev, + const unsigned long *mask) +{ + if (!ads112c14_using_drdy_trigger(indio_dev)) + return true; + + return iio_validate_scan_mask_onehot(indio_dev, mask); +} + +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; + + ret =3D regmap_write(data->regmap, ADS112C14_REG_CONVERSION_CTRL, + ADS112C14_CONVERSION_CTRL_START); + if (ret) { + 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); + + 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, + .validate_scan_mask =3D ads112c14_validate_scan_mask, +}; + static int ads112c14_populate_idac_mag(u32 current_nA, u8 *idac_mag) { u32 current_uA =3D current_nA / (NANO / MICRO); @@ -1480,6 +1605,19 @@ static int ads112c14_probe(struct i2c_client *client) 0, dev_name(dev), indio_dev); if (ret) return ret; + + 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; } =20 ads112c14_populate_tables(data); @@ -1490,7 +1628,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