From nobody Sat Feb 7 15:09:59 2026 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E69133F0768; Wed, 4 Feb 2026 12:33:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770208396; cv=none; b=XbfkOE3SNxb2IVfOBHNqkFbWvr2Eot22MwMjf3QkXSB1xUTZ70uk8MsrE9mGueN0SEXZJ16srGBoH2Yzt7s+SbNQsVJ41GUZLYDyam/ghYLPcUq4z/C4voS8YeixMbZ4CIFYJMhALB/wv0QLenMWbwY9HUQ1Ue9uRqzS/Tz5u5c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770208396; c=relaxed/simple; bh=uJC8XXS3KsVyFF9bm/ubPZ5NWIzB9Z6ymsM8ef+DUQI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=A18tKJNk3b1cVL9fpY4wYnOBi6K/RBMEGZXe9CHhC8TclwXFNXZMXsQ/pOwS6s17VoSB0SXuPZY5xydU9iSU1mF3e+BfAuQ16lrgN8KuWWafjxWPT12wgSubvFbC54yBf2UASNUeLjEIe2TdkFK7jPF/UDZN7I0ru+nSPRN6uNo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=bgfncYhu; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="bgfncYhu" Received: from pps.filterd (m0167089.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6147mdAC230803; Wed, 4 Feb 2026 07:33:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=zLoHY UvqbPgXnu8tEki5OU+3L0xmkIG3uD4x8wb7TfM=; b=bgfncYhuZ2tsmmhrCmbRk VJP6d/HpnR6fl5HuONjyQwkLsWY2YTtsqZYzyWMqedY76Bg4/3weJKSfo9zRc4rh u5YlhtYX8behVHeA+7VOHpqFrnGsnO/hYdWCl9oZ2RwTBg2/PZaTUplSgr0m4jJm EWtf45VTuafVSnJxaukWPnzSUEP/YLp/FLMOICNzAZ9wefgjuQGPIOcVZelZUJGD Nh0BX31T/V3n3+4QuPjsf6uWDrflh8Ump7Rrm1PuIFFH4F4QgHrjS+Ai/N8uDAV0 Fu19f3JIXl7uedbt9ji/o97HfZ+a3YAEr3SqRXfB+OFF0tR7+/UNhYuMlYbg6QSY w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4c3vyba45c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 04 Feb 2026 07:33:01 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 614CX0E6055426 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 4 Feb 2026 07:33:00 -0500 Received: from ASHBCASHYB4.ad.analog.com (10.64.17.132) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Wed, 4 Feb 2026 07:33:00 -0500 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBCASHYB4.ad.analog.com (10.64.17.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Wed, 4 Feb 2026 07:33:00 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Wed, 4 Feb 2026 07:33:00 -0500 Received: from JSANTO12-L01.ad.analog.com ([10.65.60.206]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 614CWnTO007389; Wed, 4 Feb 2026 07:32:51 -0500 From: Jonathan Santos To: , CC: Jonathan Santos , , , , , , Subject: [PATCH 1/3] iio: adc: ad7768-1: fix one-shot mode data acquisition Date: Sat, 31 Jan 2026 22:35:20 -0300 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: bQqkvfvQ8Zz3QMCjPfwXHNECz70_yZRK X-Authority-Analysis: v=2.4 cv=XLI9iAhE c=1 sm=1 tr=0 ts=69833c7d cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=gAnH3GRIAAAA:8 a=uXKFMexyRkwL0ZmDwxwA:9 X-Proofpoint-ORIG-GUID: bQqkvfvQ8Zz3QMCjPfwXHNECz70_yZRK X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA0MDA5NCBTYWx0ZWRfX0hliEqxdKPGi EoZxLq9SLynQtE3Xm8Exb4yvMD4/AoIFSV8rTmyYvJ3Cb/qSmOew+REdUMf/fo665jkePPZ52cm /GrQPqvkz0MLgVS1zxM1iDzozEZ3mC1a0SygpGL6q3vk5O6NFNSa3s7f1wXKbDEjd/8rD2GP6y1 M95O/Rq0+szxL+77Wojp2q81aiE//rok/EpOTEZN0qM6aiK0KcG7aEV1JVenrPH1wmUfmwdzzop nc1kPu4VJejJe+snUPFQwvBJ+VzDcZKqXkQjttb+qEs12i0SJA1iLceeAuyIE3UjKDNNIY3i5Eb KgyQvNrdJONF9MCIPUt3AfWt/cYgRUuYqNaLwJ1nXNqIFgbviB3G9usqlR3DPYLxwZwmlILsNZC 3LZgUALI+8JaSb5Wh5uXOsX2Tmfu6DwnI8+RS3VKBPxC9OMOhYA1lP8YdmlEygIr93x5x7XEndG uu+giA02mHksNjVwO6Q== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-04_03,2026-02-04_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 suspectscore=0 bulkscore=0 malwarescore=0 spamscore=0 adultscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602040094 Content-Type: text/plain; charset="utf-8" According to the datasheet, one-shot mode requires a SYNC_IN pulse to trigger a new sample conversion. In the current implementation, No sync pulse was sent after switching to one-shot mode and reinit_completion() was called before mode switching, creating a race condition where spurious interrupts during mode change could trigger completion prematurely. Fix by sending a sync pulse after configuring one-shot mode and moving reinit_completion() after the pulse to ensure it only waits for the actual conversion completion. Fixes: a5f8c7da3dbe ("iio: adc: Add AD7768-1 ADC basic support") Signed-off-by: Jonathan Santos --- drivers/iio/adc/ad7768-1.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/iio/adc/ad7768-1.c b/drivers/iio/adc/ad7768-1.c index fcd8aea7152e..8d39b71703ae 100644 --- a/drivers/iio/adc/ad7768-1.c +++ b/drivers/iio/adc/ad7768-1.c @@ -463,12 +463,17 @@ static int ad7768_scan_direct(struct iio_dev *indio_d= ev) struct ad7768_state *st =3D iio_priv(indio_dev); int readval, ret; =20 - reinit_completion(&st->completion); - ret =3D ad7768_set_mode(st, AD7768_ONE_SHOT); if (ret < 0) return ret; =20 + /* One-shot mode requires a SYNC pulse to generate a new sample */ + ret =3D ad7768_send_sync_pulse(st); + if (ret) + return ret; + + reinit_completion(&st->completion); + ret =3D wait_for_completion_timeout(&st->completion, msecs_to_jiffies(1000)); if (!ret) --=20 2.34.1 From nobody Sat Feb 7 15:09:59 2026 Received: from mx0b-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC4C43F0760; Wed, 4 Feb 2026 12:33:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770208404; cv=none; b=SMqI5U1KQ9/EuOQSvUdM2/hgqj6kOPltFlB0PNkEIV58jK3D+7lFVu5u4Xj2rmyC56k/Ml512tPC6YW5s52tq0pu2dg4H6kosfQFU3FhoirHtjK/7IepXD/E+JJeE0mt564F/Doopbb78HoNaORNfQzwkfidDRG7+qW3ZHZwhgo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770208404; c=relaxed/simple; bh=R3fiKQEtgOH0p2CWteOz/QfZorCaiPr1CPgCood4cOE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TdsoPhrOAxjJTs8UtV0HjLdrSyaZ4BidzeCjZuDQ3dR7wWCNUoenUHLGG7w+49kgNs2q5TOoMSSZHiMvbD5o/ZVIfRONpZuFCPK5tklvbEiGKvC1XuEaDviWFUeGV2mKeLkcwYVMRFHEa6AqPduXJKk6plp4pGsPbi66L4ZVPV4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=ieTF6Pos; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="ieTF6Pos" Received: from pps.filterd (m0375855.ppops.net [127.0.0.1]) by mx0b-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6147bFVk2906882; Wed, 4 Feb 2026 07:33:10 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=uKJhy dLlEyQtiuHUlSKGy0PCLN1MjCYGwCzhx+75FKE=; b=ieTF6Pos0e/Yz4IYgqpdP 5hd2edokWcTCQli3SaqE2RYIMTiFc4aCbcKp+ir9OFkdsdKsMWvvzdZFxuy/ENG8 GNeRoGDSPxm/S120WWJiUvDd3/RN1gT93FwoDjpXRQkGYuBRwNZyevD04v1fNBHi kxr4enB6D72uqDYhib4b3sldGLyQ5JdIPrYl2UUliM+La1DPr63a9atE5RjGmv2t hG0SJZrNw1s0EdKN2AFp+eUnj2yEO3rrfYQN64xRTXEhaSTNLYBu9TfaehXjos7x iumkglAMxoTUji6ZpA/WdFx3r05PofkR/DClcpAR+rTtotAcJOTmTVPzF9IAsEY5 A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4c3vxva46n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 04 Feb 2026 07:33:10 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 614CX9ix055435 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 4 Feb 2026 07:33:09 -0500 Received: from ASHBCASHYB5.ad.analog.com (10.64.17.133) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Wed, 4 Feb 2026 07:33:09 -0500 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBCASHYB5.ad.analog.com (10.64.17.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Wed, 4 Feb 2026 07:33:09 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Wed, 4 Feb 2026 07:33:09 -0500 Received: from JSANTO12-L01.ad.analog.com ([10.65.60.206]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 614CWwtb007398; Wed, 4 Feb 2026 07:33:00 -0500 From: Jonathan Santos To: , CC: Jonathan Santos , , , , , , Subject: [PATCH 2/3] iio: adc: ad7768-1: prevent one-shot mode with wideband filter Date: Sat, 31 Jan 2026 22:35:29 -0300 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: X-uuf4-VoyZfQ9pnzN_SxBKZycPq1odJ X-Proofpoint-ORIG-GUID: X-uuf4-VoyZfQ9pnzN_SxBKZycPq1odJ X-Authority-Analysis: v=2.4 cv=OrdCCi/t c=1 sm=1 tr=0 ts=69833c86 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=gAnH3GRIAAAA:8 a=-hccp5cQjjF6FW3WzvAA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA0MDA5NCBTYWx0ZWRfX1T7etph2YHok 1IQVlI7Pw8z3nQAXanaHrCmDjC+RxPr3j2nBXKxcnNRpvGSwBYgyGARHny+ZPEpfGW/aG/q8UaK sMgzO2ebLTsfcSsj9MSYsvXBomjUofg7PRVkRwBxp1Fo0xvD2DtmDk/kof8m4P++33oD9VLAkJ2 oqh9/7IJxfENcKP9xlouVErG57EK+VjF/vwbgfGbTRmIfsCA/Hf8/5xLxVDeBad1TWYwFFc1Q49 KBzzRR/owVAh+4Q/0LZMk+k/PMcYP9MXY8hPyouvc0C6C4ZYkRH0rZsp8savZiuZBGDx8BWe7F5 9PVZCDVm/f+LSXASH02Et7F5d2wToKNgshlKFB1NcQFpc0t8ir8C8xr9gyRr8ySWMmajNWTGcky 7aBjPQBNSPZIs/85s9oe7rktwbh8TmaQbsb3AqrrmZoXJjAQ8cQwk7fp/NenClb25SpGEO66jjg Ykc3dYnmeQ9T4ek3AVA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-04_03,2026-02-04_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 suspectscore=0 phishscore=0 impostorscore=0 malwarescore=0 bulkscore=0 lowpriorityscore=0 spamscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602040094 Content-Type: text/plain; charset="utf-8" The AD7768-1 datasheet specifies that the wideband low ripple FIR filter is only available in continuous conversion mode and should not be used with one-shot mode to avoid malfunction and incorrect data. Add filter type checks in ad7768_scan_direct() to skip one-shot mode switching when wideband filter is configured. Signed-off-by: Jonathan Santos --- drivers/iio/adc/ad7768-1.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/drivers/iio/adc/ad7768-1.c b/drivers/iio/adc/ad7768-1.c index 8d39b71703ae..374614ea97ac 100644 --- a/drivers/iio/adc/ad7768-1.c +++ b/drivers/iio/adc/ad7768-1.c @@ -463,14 +463,17 @@ static int ad7768_scan_direct(struct iio_dev *indio_d= ev) struct ad7768_state *st =3D iio_priv(indio_dev); int readval, ret; =20 - ret =3D ad7768_set_mode(st, AD7768_ONE_SHOT); - if (ret < 0) - return ret; + /* Wideband filter is not available in One-Shot conversion mode */ + if (st->filter_type !=3D AD7768_FILTER_WIDEBAND) { + ret =3D ad7768_set_mode(st, AD7768_ONE_SHOT); + if (ret < 0) + return ret; =20 - /* One-shot mode requires a SYNC pulse to generate a new sample */ - ret =3D ad7768_send_sync_pulse(st); - if (ret) - return ret; + /* One-shot mode requires a SYNC pulse to generate a new sample */ + ret =3D ad7768_send_sync_pulse(st); + if (ret) + return ret; + } =20 reinit_completion(&st->completion); =20 @@ -496,9 +499,11 @@ static int ad7768_scan_direct(struct iio_dev *indio_de= v) * Any SPI configuration of the AD7768-1 can only be * performed in continuous conversion mode. */ - ret =3D ad7768_set_mode(st, AD7768_CONTINUOUS); - if (ret < 0) - return ret; + if (st->filter_type !=3D AD7768_FILTER_WIDEBAND) { + ret =3D ad7768_set_mode(st, AD7768_CONTINUOUS); + if (ret < 0) + return ret; + } =20 return readval; } --=20 2.34.1 From nobody Sat Feb 7 15:09:59 2026 Received: from mx0b-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3B34F153598; Wed, 4 Feb 2026 12:33:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770208413; cv=none; b=uPMj5c3S3F9ktrVtJM7UzMQIoP68RIzt6C+1UWrZIAl26RjpNxCEgoEO8dXSPXwP8pcrdgI3pveFwSg70npG8e5/ekf619OlWJ7us2mfrIxTKdfXZllgyRxAASY/N51LBeSkSJa2FQVcRiFD0bBfCjHGwKHJ75K8qjr2cz4EsdY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770208413; c=relaxed/simple; bh=IgV/DU6YxXOg4vs7YlSibBcIh+madLf5wAWuPfG0pEM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=awGD02ySrncm+KeaKhqE2KDjrWUXuKTpv+0OCpNmw8sFbQLl6doPmDQielvQv2dV0l3JnWW9wkEBlxO80TOVVZ9aaVZBJ1pXAsigeVZcUFrsw85LVi/LtwhecmKsEgd0x3PoIRxVSE1cQeUGqBNSdFNiNsZOLhl1olFRjJEttes= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=ShDLRpc3; arc=none smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="ShDLRpc3" Received: from pps.filterd (m0375855.ppops.net [127.0.0.1]) by mx0b-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6147ZTqG2906777; Wed, 4 Feb 2026 07:33:18 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=LaCR1 Oiz99cnCqbhnowostw8uBxcemc9MVjMJiyJXEQ=; b=ShDLRpc3aCPkjXUDMV5/u A7nBroxYHg/q+rDo8J4CTq+v/LMoDnmRWu+XpgUGSfV09QU/EgkUt1vOKgNLdhKX /rFeKUtVxXVo5fB+vpU1Ktw9v3bj9tZLqZZXthT8RtbWI6Y1dQFJ+vsduOPXV302 fcxcUXV/L10B386hpMM4ZTSBi+cM8TK63lODAHMdv5vIiaTmqj/0GV4wCyrSuJ78 IPIduBjvgBnmLZisHjuO31sxATdhH1GQO+2bVDlOb7rh5cpJdjBfTCCR3Edsjehs Tu8+YmLTMZu3EsT4h38lenxZrfNVvlS2b6CecGabuIqzXHCL7sbi+PFIxorK9ODf w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4c3vxva474-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 04 Feb 2026 07:33:18 -0500 (EST) Received: from ASHBMBX9.ad.analog.com (ASHBMBX9.ad.analog.com [10.64.17.10]) by nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 614CXHe5055447 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 4 Feb 2026 07:33:17 -0500 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBMBX9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Wed, 4 Feb 2026 07:33:17 -0500 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Wed, 4 Feb 2026 07:33:17 -0500 Received: from JSANTO12-L01.ad.analog.com ([10.65.60.206]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 614CX71i007401; Wed, 4 Feb 2026 07:33:09 -0500 From: Jonathan Santos To: , CC: Jonathan Santos , , , , , , Subject: [PATCH 3/3] iio: adc: ad7768-1: add support for SPI offload Date: Sat, 31 Jan 2026 22:35:39 -0300 Message-ID: <9f9aedbe374461e48f1f1e64d5487b5b6c1fc992.1769889074.git.Jonathan.Santos@analog.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: 7dfl1rKuLqWrCuMZANxwSvcDtvCnrHl6 X-Proofpoint-ORIG-GUID: 7dfl1rKuLqWrCuMZANxwSvcDtvCnrHl6 X-Authority-Analysis: v=2.4 cv=OrdCCi/t c=1 sm=1 tr=0 ts=69833c8e cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=gAnH3GRIAAAA:8 a=XwM87tFdlOxRk03B94YA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA0MDA5NCBTYWx0ZWRfXyIxoRfy9wT5V WQZzFEgr9ue7+7gz37DZZiA8LSmOec2OJNJjkqyGgimzGdsr3+bAT9QuEeYQTu+0WAVObvoX0cs HJ5B8M9mFs0LuJOUJSoi1n7Rcw3TbiDsUofIxbVKb28apafRKnGe6jqfVfVMqZYgf0dQNqUhnyZ DRwdADGP7+gwJSuQMpXWHsVVOchS9xuLCEp3/NMcafDiWVFZddfszbM3YQS0YxFJpRTeQZXoyrZ tvw8q/ixsKy/EdluYJjfCgNu8amDOMV6xyHHvlqVpUR0TwZ2lgPkh3mi4Hrko5yXgYVeK5Ife7x smPLk3y+aH/sfsJksz9kqmXF/ut/SowHlYZR6QG9KYihcuB848Pb1UlEJm3+CZWiMa+pDjhROq+ 18jOfbgyqTYYuDNZXHWBeAzH/ZdJcUyN4JCGqL0WybLUItjF/zJgfRnj1PDjoxvLRFWj2X9dR6G ez/arfytCuyOKd96SMA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-04_03,2026-02-04_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 suspectscore=0 phishscore=0 impostorscore=0 malwarescore=0 bulkscore=0 lowpriorityscore=0 spamscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602040094 Content-Type: text/plain; charset="utf-8" The AD7768-1 family supports sampling rates up to 1 MSPS, which exceeds the capabilities of conventional triggered buffer operations due to SPI transaction overhead and interrupt latency. Add SPI offload support to enable hardware-accelerated data acquisition that bypasses software SPI transactions using continuous data streaming. Signed-off-by: Jonathan Santos --- drivers/iio/adc/Kconfig | 2 + drivers/iio/adc/ad7768-1.c | 187 ++++++++++++++++++++++++++++++++++++- 2 files changed, 185 insertions(+), 4 deletions(-) diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 60038ae8dfc4..a1c3226c3631 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -413,8 +413,10 @@ config AD7768_1 select REGMAP_SPI select RATIONAL select IIO_BUFFER + select IIO_BUFFER_DMAENGINE select IIO_TRIGGER select IIO_TRIGGERED_BUFFER + select SPI_OFFLOAD help Say yes here to build support for Analog Devices AD7768-1 SPI simultaneously sampling sigma-delta analog to digital converter (ADC). diff --git a/drivers/iio/adc/ad7768-1.c b/drivers/iio/adc/ad7768-1.c index 374614ea97ac..fc497fb639d0 100644 --- a/drivers/iio/adc/ad7768-1.c +++ b/drivers/iio/adc/ad7768-1.c @@ -25,12 +25,15 @@ #include #include #include +#include +#include #include #include #include #include =20 #include +#include #include #include #include @@ -161,6 +164,8 @@ enum ad7768_filter_regval { enum ad7768_scan_type { AD7768_SCAN_TYPE_NORMAL, AD7768_SCAN_TYPE_HIGH_SPEED, + AD7768_SCAN_TYPE_OFFLOAD_NORMAL, + AD7768_SCAN_TYPE_OFFLOAD_HIGH_SPEED, }; =20 enum { @@ -266,6 +271,18 @@ static const struct iio_scan_type ad7768_scan_type[] = =3D { .storagebits =3D 16, .endianness =3D IIO_BE, }, + [AD7768_SCAN_TYPE_OFFLOAD_NORMAL] =3D { + .sign =3D 's', + .realbits =3D 24, + .storagebits =3D 32, + .endianness =3D IIO_CPU, + }, + [AD7768_SCAN_TYPE_OFFLOAD_HIGH_SPEED] =3D { + .sign =3D 's', + .realbits =3D 16, + .storagebits =3D 32, + .endianness =3D IIO_CPU, + }, }; =20 struct ad7768_chip_info { @@ -283,6 +300,8 @@ struct ad7768_chip_info { =20 struct ad7768_state { struct spi_device *spi; + struct spi_offload *offload; + struct spi_offload_trigger *offload_trigger; struct regmap *regmap; struct regmap *regmap24; int vref_uv; @@ -306,8 +325,11 @@ struct ad7768_state { struct gpio_desc *gpio_reset; const char *labels[AD7768_MAX_CHANNELS]; struct gpio_chip gpiochip; + struct spi_transfer offload_xfer; + struct spi_message offload_msg; const struct ad7768_chip_info *chip; bool en_spi_sync; + bool offload_en; struct mutex pga_lock; /* protect device internal state (PGA) */ /* * DMA (thus cache coherency maintenance) may require the @@ -1139,6 +1161,10 @@ static int ad7768_get_current_scan_type(const struct= iio_dev *indio_dev, { struct ad7768_state *st =3D iio_priv(indio_dev); =20 + if (st->offload_en) + return st->oversampling_ratio =3D=3D 8 ? + AD7768_SCAN_TYPE_OFFLOAD_HIGH_SPEED : AD7768_SCAN_TYPE_OFFLOAD_NORMAL; + return st->oversampling_ratio =3D=3D 8 ? AD7768_SCAN_TYPE_HIGH_SPEED : AD7768_SCAN_TYPE_NORMAL; } @@ -1320,7 +1346,7 @@ static irqreturn_t ad7768_interrupt(int irq, void *de= v_id) struct iio_dev *indio_dev =3D dev_id; struct ad7768_state *st =3D iio_priv(indio_dev); =20 - if (iio_buffer_enabled(indio_dev)) + if (iio_buffer_enabled(indio_dev) && !st->offload_en) iio_trigger_poll(st->trig); else complete(&st->completion); @@ -1357,6 +1383,72 @@ static const struct iio_buffer_setup_ops ad7768_buff= er_ops =3D { .predisable =3D &ad7768_buffer_predisable, }; =20 +static int ad7768_offload_buffer_postenable(struct iio_dev *indio_dev) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + struct spi_offload_trigger_config config =3D { + .type =3D SPI_OFFLOAD_TRIGGER_DATA_READY, + }; + const struct iio_scan_type *scan_type; + int ret; + + scan_type =3D iio_get_current_scan_type(indio_dev, &indio_dev->channels[0= ]); + if (IS_ERR(scan_type)) + return PTR_ERR(scan_type); + + st->offload_xfer.len =3D roundup_pow_of_two(BITS_TO_BYTES(scan_type->real= bits)); + st->offload_xfer.bits_per_word =3D scan_type->realbits; + st->offload_xfer.offload_flags =3D SPI_OFFLOAD_XFER_RX_STREAM; + + /* + * Write a 1 to the LSB of the INTERFACE_FORMAT register to enter + * continuous read mode. Subsequent data reads do not require an + * initial 8-bit write to query the ADC_DATA register. + */ + ret =3D regmap_write(st->regmap, AD7768_REG_INTERFACE_FORMAT, 0x01); + if (ret) + return ret; + + spi_message_init_with_transfers(&st->offload_msg, &st->offload_xfer, 1); + st->offload_msg.offload =3D st->offload; + + ret =3D spi_optimize_message(st->spi, &st->offload_msg); + if (ret) { + dev_err(&st->spi->dev, "failed to prepare offload, err: %d\n", ret); + return ret; + } + + ret =3D spi_offload_trigger_enable(st->offload, + st->offload_trigger, + &config); + if (ret) { + spi_unoptimize_message(&st->offload_msg); + return ret; + } + + return 0; +} + +static int ad7768_offload_buffer_predisable(struct iio_dev *indio_dev) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + unsigned int unused; + + spi_offload_trigger_disable(st->offload, st->offload_trigger); + spi_unoptimize_message(&st->offload_msg); + + /* + * To exit continuous read mode, perform a single read of the ADC_DATA + * reg (0x2C), which allows further configuration of the device. + */ + return regmap_read(st->regmap24, AD7768_REG24_ADC_DATA, &unused); +} + +static const struct iio_buffer_setup_ops ad7768_offload_buffer_ops =3D { + .postenable =3D ad7768_offload_buffer_postenable, + .predisable =3D ad7768_offload_buffer_predisable, +}; + static const struct iio_trigger_ops ad7768_trigger_ops =3D { .validate_device =3D iio_trigger_validate_own_device, }; @@ -1591,6 +1683,36 @@ static int ad7768_parse_aaf_gain(struct device *dev,= struct ad7768_state *st) return 0; } =20 +static bool ad7768_offload_trigger_match(struct spi_offload_trigger *trigg= er, + enum spi_offload_trigger_type type, + u64 *args, u32 nargs) +{ + if (type !=3D SPI_OFFLOAD_TRIGGER_DATA_READY) + return false; + + /* Requires 1 arg to indicate the trigger output signal */ + if (nargs !=3D 1 || args[0] !=3D AD7768_TRIGGER_SOURCE_DRDY) + return false; + + return true; +} + +static int ad7768_offload_trigger_request(struct spi_offload_trigger *trig= ger, + enum spi_offload_trigger_type type, + u64 *args, u32 nargs) +{ + /* Should already be validated by match, but just in case. */ + if (nargs !=3D 1) + return -EINVAL; + + return 0; +} + +static const struct spi_offload_trigger_ops ad7768_offload_trigger_ops =3D= { + .match =3D ad7768_offload_trigger_match, + .request =3D ad7768_offload_trigger_request, +}; + static const struct ad7768_chip_info ad7768_chip_info =3D { .name =3D "ad7768-1", .channel_spec =3D ad7768_channels, @@ -1628,6 +1750,51 @@ static const struct ad7768_chip_info adaq7769_chip_i= nfo =3D { .has_variable_aaf =3D true, }; =20 +static const struct spi_offload_config ad7768_spi_offload_config =3D { + .capability_flags =3D SPI_OFFLOAD_CAP_TRIGGER | + SPI_OFFLOAD_CAP_RX_STREAM_DMA, +}; + +static int ad7768_spi_offload_probe(struct iio_dev *indio_dev, + struct ad7768_state *st) +{ + struct device *dev =3D &st->spi->dev; + struct spi_offload_trigger_info trigger_info =3D { + .fwnode =3D dev_fwnode(dev), + .ops =3D &ad7768_offload_trigger_ops, + .priv =3D st, + }; + struct dma_chan *rx_dma; + int ret; + + ret =3D devm_spi_offload_trigger_register(dev, &trigger_info); + if (ret) + return dev_err_probe(dev, ret, + "failed to register offload trigger\n"); + + st->offload_trigger =3D devm_spi_offload_trigger_get(dev, st->offload, + SPI_OFFLOAD_TRIGGER_DATA_READY); + if (IS_ERR(st->offload_trigger)) + return dev_err_probe(dev, PTR_ERR(st->offload_trigger), + "failed to get offload trigger\n"); + + rx_dma =3D devm_spi_offload_rx_stream_request_dma_chan(dev, st->offload); + if (IS_ERR(rx_dma)) + return dev_err_probe(dev, PTR_ERR(rx_dma), + "failed to get offload RX DMA\n"); + + ret =3D devm_iio_dmaengine_buffer_setup_with_handle(dev, indio_dev, + rx_dma, IIO_BUFFER_DIRECTION_IN); + if (ret) + return dev_err_probe(dev, PTR_ERR(rx_dma), + "failed to setup offload RX DMA\n"); + + indio_dev->setup_ops =3D &ad7768_offload_buffer_ops; + st->offload_en =3D true; + + return 0; +} + static int ad7768_probe(struct spi_device *spi) { struct ad7768_state *st; @@ -1727,9 +1894,21 @@ static int ad7768_probe(struct spi_device *spi) if (ret) return ret; =20 - ret =3D ad7768_triggered_buffer_alloc(indio_dev); - if (ret) - return ret; + st->offload =3D devm_spi_offload_get(&spi->dev, spi, &ad7768_spi_offload_= config); + ret =3D PTR_ERR_OR_ZERO(st->offload); + if (ret && ret !=3D -ENODEV) + return dev_err_probe(&spi->dev, ret, "failed to get SPI offload\n"); + + /* If not using SPI offload, fall back to low speed usage. */ + if (ret =3D=3D -ENODEV) { + ret =3D ad7768_triggered_buffer_alloc(indio_dev); + if (ret) + return ret; + } else { + ret =3D ad7768_spi_offload_probe(indio_dev, st); + if (ret) + return ret; + } =20 return devm_iio_device_register(&spi->dev, indio_dev); } --=20 2.34.1