From nobody Tue Sep 29 11:58:31 2026 Received: from mail-oa1-f47.google.com (mail-oa1-f47.google.com [209.85.160.47]) (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 5CEF037A85B for ; Fri, 7 Aug 2026 21:20:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786137630; cv=none; b=s0VBYRL1oL6yOsglX0Xoe9jaMer0Fh5Rr0M/pLDHq77mR9AIru+5f5c/ZRG3zTFuL8nn+LNvtHVE+LkKloLQy/ack3Yt2TuQfMBkR9RSa+sN1/k1cr3E/1ha0lcWZTi8MfQ4/eRFfRamTljIdaHj2gLn7yYMXlph+D+aLcokTYI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786137630; c=relaxed/simple; bh=LOXD6lQpsc5v2fDlCt96BEWcT+3USpZ3SEh817UiXVw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jHJZcUfiMx8W6SNnD0EhNn7kO+rCT5FHUGMcMo2GevGtM6OgNhz8rjF4V2XcuZoZeN560IHKsQr/FNb/q6QUVChN4WvSV5UbTdpF8Gy8Htmmn7AkgebbYmS8D3TgB7gZH1XCI5XX57imQzBmAQhORhMz45WZ7q/eV1yy8FzgmRw= 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=ow5XCauQ; arc=none smtp.client-ip=209.85.160.47 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="ow5XCauQ" Received: by mail-oa1-f47.google.com with SMTP id 586e51a60fabf-456d267da8cso1665581fac.2 for ; Fri, 07 Aug 2026 14:20:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1786137627; x=1786742427; 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=TQNemVwVlgoGHybAoiu8NfPpD2hESMvFryh6aBFSse4=; b=ow5XCauQHDBqjLyB2BWItxe7HRQvTnOZYOJIW97CvY1HLbQE/3OKTHOoUnU68uETL2 7fKcspPcG7Bat4NLj6T3mQi33t8Xg8R8NknqZQ+RPyypZjIwSdFTDhfLZcMq/1VZZqYa Nb0z0gupn01KwhUhq5RhBwbsDquva/NJBxTno+z5G2FxkAHFAXb6GFd1SRVi6lG78IHr Of3wIRp4tmsLA5+v9wThHbUoxv1nHEX7BxTWN7kkxvt3MFfQaA3iep4YzHramye/UVcC gOIWB9eIzpsUUiEDmVObiv8/GUD14/i9IZwao8Haa5VmEpbNJStuZW3GXCP3UnsDy/l5 B/HQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786137627; x=1786742427; 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=TQNemVwVlgoGHybAoiu8NfPpD2hESMvFryh6aBFSse4=; b=Dcz8/7PPZMTpCqCqqw0+DxJ1GD349FfR/fiwlq/ZmA5gvJsrQtOUtrjZwAxkjurXiN hKxgQsJvIgnIXSS2KXcmqgPKExx293VDEiZrj0tshSUe62ceRp7VzVnMdYgEpgnfyx2+ IvqC0Cj3EEmzlDjMDZlXfEKuaotnvj3p1tVZ/g7MF4ogNlPqleLlu3KHFGZ9gBqhpmC5 mRsQMyuc1l7VX9va/lWTEmBHx+PtLI/iuk3EUec3PJtAe6eiVskLxzbZw/WY5v+Bd24p DvvAM9vD75KhzIAihQdnV+RsbDw52i9pZLiGKu3ARTLjIMYldD97/NC7F+lsobpCZDfj LBCA== X-Forwarded-Encrypted: i=1; AHgh+RoMZxVQ+aD9nP6NuomKx8U936opX9casgmcS4wLp5BH58lXG0GAgkSOkBRi6IOuqipiuWCXKTZC4U9NgY4=@vger.kernel.org X-Gm-Message-State: AOJu0YxudkLLpXThUL8GlWnNcbaed254YbDaekxkWpZukXOv9nXPFO+g 6EdUtovslJmlKhvqlIpEISmt9n4ZFxsEWP+qRJ+3lnGoVZBt7hXASyhl3bJmkTAlIBc= X-Gm-Gg: AR+sD13JHSwxIWvAwdVEe2HLf4efElq2rhu741g1QU4ViT/bCquJ/i3uClpwWkETUd0 KZGE07jyeHrMsRktu9nunHs8bIi9GVwy4aWwjTaGfN0V/TqCSv1SRnM6JDOFxxR2RymBlsO7hY5 afK0weZiZOgOdc77Z13eEKSk1Ff0iU0ovz3vxlzLwNur1vSb8lCwmxedaYZQkwvbczR0MZLuz+a pqbsHPtE9kG1FY3um2G+i5wcfreXPpkFADX9qIMs+2CmsXuG9jPm/+fFB8AjabFJmLGH54BHYNr W9H1WEFZC+sm1xRlRks5KhHOnLCUz0SRyPrspuwugQEXAIMmlB30noo5XuzWfaHu++Pf+VkFN+U zdiXu2Wsjh9odqWqeiU2zBjJ8r6vyYvq+L522iiJQiX6jb5F9F8Qc//TR7fP+4QPhK5TidYFe5x DCL/Uc4k0hcRR3JJbYeOfu5X91E4gR6TwNfnKQUvjvnBJIlLI07mgkWjprUb7Jxdx6SD75StcpI LY= X-Received: by 2002:a05:6808:2507:b0:495:f67c:d96a with SMTP id 5614622812f47-4b1ab96cf62mr1661945b6e.12.1786137627228; Fri, 07 Aug 2026 14:20:27 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:b714:88c:313d:dee2]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4b1af0bafa1sm508068b6e.7.2026.08.07.14.20.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Aug 2026 14:20:25 -0700 (PDT) From: "David Lechner (TI)" Date: Fri, 07 Aug 2026 16:19:46 -0500 Subject: [PATCH v3 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: <20260807-iio-adc-ti-ads112c14-continuous-mode-v3-1-76e0d30e6c6b@baylibre.com> References: <20260807-iio-adc-ti-ads112c14-continuous-mode-v3-0-76e0d30e6c6b@baylibre.com> In-Reply-To: <20260807-iio-adc-ti-ads112c14-continuous-mode-v3-0-76e0d30e6c6b@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=6042; i=dlechner@baylibre.com; h=from:subject:message-id; bh=LOXD6lQpsc5v2fDlCt96BEWcT+3USpZ3SEh817UiXVw=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqdkv8nw46oZ11cbi+i0AWM1bCN8+ycW0fGrBXU 87/JcTovaSJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCanZL/AAKCRDCzCAB/wGP wI2PCACVi9GZ6joum7tbm2Vqgwu5UUAShfZFj30FlvSqkZPh5Dz9qk3h80AxQ5hoNd75dp4rI+z 4B5LVHCWAIrsBtFJoolANNk+nU+tMGe7tgzG+NReY47n5DxJQ8IQ+s45z0s62OkJLUG+Qpqaqr2 Feitmxy6Ldp8pjDpgTs7ykCDwF8g2prxx5btRnhzTnwuqzlvHj+SGslRhqN8PC0MjenPfIaMc4D c7M/S/9kePk1R0LGgMGdZuI7k/YAUTiLUYF801OXqfZqOBaN6IRn5d6X34GHlrFF4d1IALxi8vn IsdVZUi7R9t0tiJD3iqgVxN6vx2pGzZxYnXDKDSo+E/gyLmm 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..457d2db28d3f 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, "interrupts")) { + 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 Tue Sep 29 11:58:31 2026 Received: from mail-oa1-f50.google.com (mail-oa1-f50.google.com [209.85.160.50]) (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 6580240DB3C for ; Fri, 7 Aug 2026 21:20:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786137631; cv=none; b=cgaKK/blDSRfoYaBxzav5T1HCuU9Pd3ZPCVIgKHx+l7F/RI0j1ThilssRE3YRJboo9UcV7ywGCWR0VCM0OhB034QpKMY3j6yww9tlc90DuupUiGNd/2Y3DZh0RSa3mqBhJOEf38eOJI1GPF5QIol+LhkLVHrRdJnr9qTnUudLZ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786137631; c=relaxed/simple; bh=YVVtnr0A9jYmk/5Usqe+bn6itPUyapVzTFfPGrl90gg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JN/dhEeyWHbAQZTWC9uHXFWl3T9SNw54nJgW4/a4J/yuh1DcqM+OQlkMxlBXHXLEyW3JuQ+w8mgAInrP5AQeVWGOtMXmenF6V2aJUEfFccnljPjLWQVdVW0Qnr77VvhPrEXR74ordKqM2H5+YtbqOEIoHu8Ua1QwEe0Tm4qx35E= 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=IDaFnoMm; arc=none smtp.client-ip=209.85.160.50 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="IDaFnoMm" Received: by mail-oa1-f50.google.com with SMTP id 586e51a60fabf-446f87b6de1so2396310fac.3 for ; Fri, 07 Aug 2026 14:20:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1786137629; x=1786742429; 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=hciBT8CJBuG+LRuJCBFyHKaU7nB64CsMQkGbuYhQTKM=; b=IDaFnoMmiYfF5VwBo67dpprDYmO83utYGFSopu1sx22brTbC4J+PrzfQDLeIuctQFy cpS0aiAJXwAdNvVX3ZYcr/05/s6PaH/txcV+9inGy/4N30Dk5yc1UHCu5FZ9DH8Wm6/D TpUL/tWZUKv46/NLcdGIIwoXocZtNlzyw9Ru+YcDLc+DE/JDb0ModZ1uuSRBqjIpE6oi k/WaZ4rpQ8OGpOwVLvvwGTAzVZit0AR0mHhv2gINBZWFd9M0l8eX4EJaDL/MMww86ook dIblvnjoTTvUCceK76E3p0bJb45uLLnX0tDSHjq3L6fcrMiKKOTziOu+SmZxEU689vuI Xunw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786137629; x=1786742429; 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=hciBT8CJBuG+LRuJCBFyHKaU7nB64CsMQkGbuYhQTKM=; b=GPVdI0m7w9D2mdSn+06WA6RHBHfuEyJGJuVQtfd2iw0zFr7pvWUE08fUzqp6g4CsSj wzbigT0FzpGRu5gUAh5nT5WfbCeYqMWP5woj8zkYT+6lQ3SbHdzJ+OqCj1Y10ewH9BNp B43jFiHklx0d27KPzc0PfLwBqe/LrZ8Lo+Bw1/2wo65jwVNEufx1+fRZldIuowO+w6hA bSCnB0622bx6J0A+9tsnROIaajGl+uH568H8LRJPaRZH7oAbRO6Mi+MOOFMFfQEOKc4v z95sh9poowjhyIderJOveqIkgg+l3gdrZHEjPeUhvOoKwWQDMXozVdKc0fMidPsaIsbc 3cLw== X-Forwarded-Encrypted: i=1; AHgh+RqKmQf0KHguwE5Y4C47zOoJQSja4kvor1uqUUYf1a+Q9ro4U6VTexAwfcLq90HTxpiKs5r2bHVd3+VzjMw=@vger.kernel.org X-Gm-Message-State: AOJu0YyDZoq6irXlnk6a6IMk9v+8jr2BkX8ODCIwPHVRCKvQU5eF0n5q SSOY3L+mryj2NoVCfGt/o1Vh1+WwniywzWBSpNU1GvYndGT7Zx4Ad/RmzUxZebqaT2Y= X-Gm-Gg: AR+sD13BKz/1bTu8mtZB37DnjU82f7Z0iShA1gy/poUBczHDHwlzgqo4qI6//ZH5KgG hAI5lmYGk7GX/9f8NHeWUw24CTmLsGkmebSxxezRGyyR9rWRl2nPwLGLX46yJt04P4UyQj0s2iE 1UCFwg9OOp4b7d1arLFKmzzzeGZYEwIGTWErCl/yP91n8bNMOwbPddvasnNvaKj9PSFnAYqK1Wn OIQISfRn9ZnvtfRh/6whIRUR9NDQIcROwnx45PeHY/FJ0pBV6owI7whmPVy185PwPDaBQDErK4U gq/YAIOVOd/RazT5AtaCuWIri5U94yBDJ2chrpnrqkXUOoMweqYQU5eIaNnXQ+RxBm+2vpVTtCn xokUA6M/UjuJ0pf6mVJETxECuTJ0Kv3o7M4Z3ydEAgl8WBx0T/KH2OUiqGTc3bnj9OJooP5Pdcw d9hlefK7wDHmUkQJ3olDPDaEA3f+7ED1IewlphaoswyXAbHcOeNKDT7Vs4ZtjH3A9P X-Received: by 2002:a05:6808:1986:b0:4a3:fb6c:9adf with SMTP id 5614622812f47-4afae067fe6mr16133623b6e.12.1786137629212; Fri, 07 Aug 2026 14:20:29 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:b714:88c:313d:dee2]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4b1af0bafa1sm508068b6e.7.2026.08.07.14.20.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Aug 2026 14:20:28 -0700 (PDT) From: "David Lechner (TI)" Date: Fri, 07 Aug 2026 16:19:47 -0500 Subject: [PATCH v3 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: <20260807-iio-adc-ti-ads112c14-continuous-mode-v3-2-76e0d30e6c6b@baylibre.com> References: <20260807-iio-adc-ti-ads112c14-continuous-mode-v3-0-76e0d30e6c6b@baylibre.com> In-Reply-To: <20260807-iio-adc-ti-ads112c14-continuous-mode-v3-0-76e0d30e6c6b@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=YVVtnr0A9jYmk/5Usqe+bn6itPUyapVzTFfPGrl90gg=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqdkwD3Y5HUVzc0t++GLovebvO/JMdDgOSD919Q 0yGW6sgQUuJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCanZMAwAKCRDCzCAB/wGP wLvkB/kBS41YEs/bpaovaBkybq6qa+d6y7ZqxGOwZtYJv1arqjKRcPju5ztLcA4V7LdIQmEQXYF H17zonptRwKZ6VhpBJpzq6d5OXxoL0nIogJr4iZt6a5Ft6s4GTRjUWEmDoUUxIY1A4wlktKva+3 BK9B39J/pn8xgbcv7WaLRJR464c7BIbRhTaJonfrkHYgU0RZV/2dNUVKC7USwEW4nyoEY6GHvkz OwAx4OutiIwhdCNjbhSQqCJma/z9hu8ln3QjtLMkzCtXLPNBsAt6pBYkXsHce22UHohYx0Jh++m MUJIui3Ccxg8GHnbi8Bo5xJaU4x0JXs57w+CUDpzNf9SSFVB 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 457d2db28d3f..8481012c9e3d 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 Tue Sep 29 11:58:31 2026 Received: from mail-oi1-f174.google.com (mail-oi1-f174.google.com [209.85.167.174]) (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 7D1F24189AD for ; Fri, 7 Aug 2026 21:20:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786137634; cv=none; b=dytJYOxT+GCWf4VHlSDMNPM4MAPeSOzZNioxZHGLih3pjidrkmTgVMV19/ACv0Xqw2QNg5WGXkIwvfNwO6IJA3f2bJUZkCX6nbMehEXuOYc3+C7wllpeP3J7IvcjCQUSTP0xbJUjk7Spxu7SZjCdJYwnY4y34eM37BIJ+tDS0AM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786137634; c=relaxed/simple; bh=MYu4KxURi0kEu9JyX7YNixCr2LSeVCPXKFGnl80k+OI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AtsdIWfR9zOp+/Rte4MyeGmM+A0SNLaAGEpbMM/Wc4koPvEeF5gX6bOXeTw+fVNRbaNlulwQW2WKeVDYDoKArGny61HUMDTXyXz3oEluzlhi+aG5njjV3OkcWdjgzYjRqyi90nVcLkbfG44Dz0ZcpBZlFolNnTGW870+t072iVg= 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=Q4DU8ioj; arc=none smtp.client-ip=209.85.167.174 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="Q4DU8ioj" Received: by mail-oi1-f174.google.com with SMTP id 5614622812f47-4af173320f9so963b6e.2 for ; Fri, 07 Aug 2026 14:20:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1786137631; x=1786742431; 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=nZUPZxX06G+USAOFyqtgdGfXpR2hkqtdlH21kk8KCjY=; b=Q4DU8iojzN6WeLM2eYTiJK6V3bKIFQy2e7Hh9GXe4HjqUJytlq9xpYj/gYXohPif4y AMeZDVR0ggtbeBvlU2iQLJu7mSZlfO6oz1DOChhAcCpkpkpDD943YhQ/kqVVo5nZc/D0 uRYhaG3y76f+VSTOO/gFsMwKccke30eLEf8abRQES7klq4HKAVU8sUv8xzfB5p09mjop cIV/KqFxL9J+L4pQ5DrWVLcoGBS/s+FcxDYaDm4o/r+M3hCMmbfzSTx7xBC9dcqwO9dS eCFc18BsSyfuYtTtxWl2yHONwq7RCYz2weSdvWa/N28ESWeEgLJ35H036ULLJHD0RwAq E8lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786137631; x=1786742431; 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=nZUPZxX06G+USAOFyqtgdGfXpR2hkqtdlH21kk8KCjY=; b=scXxHKlZZbzH1av2//WzURHj+koqxkvsPmQnIjboRMTXQVjJAsGP47hrfdhBtNCVco nqux7DDI+i/edyNaokH2Ph3szSbAJPGK0VCEqf/bJJMPyZcOE8tO1YEwPPAElU9i+LEw 5FtsN6u9byId0lXPC1atID4hXzsy5kKhTcPOqaUIotPMF6As1TTyDEDpOWdtm5tcP1M+ odQYZInoORGi06v0wk1lEP0KkcDR0jxUWlcIKOb0vLGdEIYtJpxbDhdsvEYfUP9Usq4R rF9CLSl2wpDGMdHmWIXA9NWJtDlXh31uFLj/cG9r6ygP8DACdN79ygi4f6e8ZtVhfPr2 VeHg== X-Forwarded-Encrypted: i=1; AHgh+Rq7SPVssWYI4HebU23N/2kCA+sGnqfcCQ3yM+Ynh5Ar/Z32LbRuTKIECYgCCD2bw61EQwgTn22Cf8Y/ibc=@vger.kernel.org X-Gm-Message-State: AOJu0YzxkVPAZOLzs8dTaUsKShGYtZZHKd9RXTM/3fbwgtM8lVI2J5kn qZCKflJBYx/rPzioIp806sTPyEunE/oEMv89nD4WtZvSi2vTHIc7nqs98YJddwoiyv6I88y6AMh dEF1Csco= X-Gm-Gg: AR+sD101oV97GbS4N+/AXSUBD8ljzviOif+ll3uhBK516ExKhhjfmLDwKwNuTbVhIag vUG3LHsuQpZFtT4Dyp0Ga/BWxmLt2LltPspvk2U9M0hxD4m4rZEGhMBunjuRFAuUW4wp/cN21oT JPcgEq6C41nkJ/H7+rMp34ajJHGnuTOFVTcCsT6srJuaQtQ5uPlH65gNomDeXmTM9UZzcQdbB6X MykykYqtGNjBH3TOfHM2Mg9uEN4PAtINjxEiXQPztgcuSszDu9x8BC3jEbRSlrDJBxHGUv0cSAy V0+hzZC8TOqyz4HtlSIcvgK4zryrqacWqM+Cx6neEHJ5KYHoHtpOMd0hhef82Bf4TgiP7ttzzu0 JYN7jzhPsDcBqlJdKYJT4Vs3rcmHTRG+nV0bSQitaGo/LWp2XXZfboaa0jRuGTejBnisInlENQh owEftag+gfL+4NdSo6IJNPOkLmQD4ZzqEljHmP1S5vzKp0/nK908+fNzB4ClilKnCa8lmES7AdA Zw= X-Received: by 2002:a05:6808:f08:b0:495:f223:bcdb with SMTP id 5614622812f47-4b118e2d52amr7950867b6e.0.1786137631257; Fri, 07 Aug 2026 14:20:31 -0700 (PDT) Received: from [127.0.1.1] ([2600:8803:e7e4:500:b714:88c:313d:dee2]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4b1af0bafa1sm508068b6e.7.2026.08.07.14.20.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Aug 2026 14:20:29 -0700 (PDT) From: "David Lechner (TI)" Date: Fri, 07 Aug 2026 16:19:48 -0500 Subject: [PATCH v3 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: <20260807-iio-adc-ti-ads112c14-continuous-mode-v3-3-76e0d30e6c6b@baylibre.com> References: <20260807-iio-adc-ti-ads112c14-continuous-mode-v3-0-76e0d30e6c6b@baylibre.com> In-Reply-To: <20260807-iio-adc-ti-ads112c14-continuous-mode-v3-0-76e0d30e6c6b@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=6724; i=dlechner@baylibre.com; h=from:subject:message-id; bh=MYu4KxURi0kEu9JyX7YNixCr2LSeVCPXKFGnl80k+OI=; b=owEBbQGS/pANAwAKAcLMIAH/AY/AAcsmYgBqdkwQNvEfO6Oo3mp2GMItXZQmjm9eKH9ym8cGG FUeXVdtXwuJATMEAAEKAB0WIQTsGNmeYg6D1pzYaJjCzCAB/wGPwAUCanZMEAAKCRDCzCAB/wGP wGzNB/4gfcAepkiU/2MwiEjBoMSB4ZFwHqfSVkpmEm5t+6zjXIAfQJtn+MnVOm5+CO7nl5/84h5 ufdPC6j1qZyWewykRGlSmKATx0EO9xoSqRCT5sy4p50GegvTKgnmz0kTgZ6XNDGDTufv/yxiOBq Q4eEY/QYQqctAh41uRIhzLAx5O83QMDQZN/8Gt7EtSJh5zBGZSOCw3HBM4xvyiYSWzSUXlE+j0z njzczKbaiChHkCRtmIL+lFYaSZp6dVnd5sUGfvayHYElX51DPh0pOPCl72awZ+bNNSYhxaPK3fd YIukclr4Baj9+DAoQO5k+fwWCWW57asTDtW4Z8c63uQkbai+ 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 | 132 +++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 130 insertions(+), 2 deletions(-) diff --git a/drivers/iio/adc/ti-ads112c14.c b/drivers/iio/adc/ti-ads112c14.c index 8481012c9e3d..160ee306d4a6 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) { @@ -957,10 +967,31 @@ static irqreturn_t ads112c14_trigger_handler(int irq,= void *private) struct iio_poll_func *pf =3D private; struct iio_dev *indio_dev =3D pf->indio_dev; struct ads112c14_data *data =3D iio_priv(indio_dev); + unsigned int scan_mask_len =3D iio_get_masklength(indio_dev); u32 offset =3D 0; u32 i; int ret; =20 + if (iio_trigger_using_own(indio_dev)) { + i =3D find_first_bit(indio_dev->active_scan_mask, scan_mask_len); + if (i >=3D scan_mask_len) + goto out; + + ret =3D ads112c14_scan_read(data, (u8 *)&data->scan[0]); + if (ret) { + const struct iio_chan_spec *chan =3D &indio_dev->channels[i]; + + 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 +1023,89 @@ 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) +{ + unsigned int scan_mask_len =3D iio_get_masklength(indio_dev); + struct ads112c14_data *data =3D iio_priv(indio_dev); + const struct iio_chan_spec *chan; + unsigned int i; + int ret; + + if (!ads112c14_using_drdy_trigger(indio_dev)) + return 0; + + i =3D find_first_bit(indio_dev->active_scan_mask, scan_mask_len); + if (i >=3D scan_mask_len) + return -EINVAL; + + chan =3D &indio_dev->channels[i]; + + guard(mutex)(&data->lock); + + ret =3D ads112c14_prepare_channel(data, chan); + if (ret) + return ret; + + ret =3D regmap_assign_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + 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_assign_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + 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_assign_bits(data->regmap, ADS112C14_REG_DEVICE_CFG, + 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 +1594,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 +1617,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