From nobody Fri Apr 17 06:13:56 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 864FE3659E6; Mon, 23 Feb 2026 11:59:58 +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=1771847999; cv=none; b=ffG2zRMiBf4Grokeb4J7iEMIZZJ2ykPK7l2jE77pYvcg4HI61/t+BWl1shpovnb/iIDt4eJH+nPVK7/6W9MxWcCnfVLa5gYyHWQoqbBJ3jbl2aqCe54XlMuTNt7ARc9fK5oMRbkSvex5rW8tIGsN6mzhSPNs4oCqODC24yObxr8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771847999; c=relaxed/simple; bh=XfySPrOJqSjT/SEKYyjp0Pg4NScYW7xZ70lfnKpKcsk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=RjGHCiPXAamH/bZbYQmBBkLNEZzwJ2vO0GFBJM9noEspxnZrYMbLjPFQq6+cuboSdb7XS8ZAkKLjUCLLdfafgpk3cAv740KAdJQA571jRAsPDfma7CbMO8fO3CF5YNSE9dQTrF9xR4xIQHNfobH6+09dffuBYgE+lcHxnsvdaM4= 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=V/SFFbzL; 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="V/SFFbzL" Received: from pps.filterd (m0516787.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61N6nDbY1743194; Mon, 23 Feb 2026 06:59:43 -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=spBj1 xSbF+uHZ7QWpbXQzjgBtsnrv/ctoVAx4Gq+fvQ=; b=V/SFFbzLnHN/pGHWag7cx 07ust527JHazftTjU+lvx8cbdCjkurGqO3oJkrTVmdrpjB7Ut1bgsx+SfZEyifkq VA5xA1tMZDYGGqAHBUEf74QhiVp6Bw/Y+KUqJjLzrgujtOAF7Q8k1Wld/OtyQSDJ LkzqPwR+wLQ7MbHXclZgv9yTMXrjXyL3eaQQDWenKv+lT9SenuUcL/2Ekidz69BY jIlkZWIHNkokm3AsVZfg0he+4MVEz1tDyIFehMh7usMxRsa5CcQalV1BFwSHSgDL cgwq+3kn5RZpSTrj3bU/h1Qb1syohGyNYflhGbtHGJzghiP0ai3nTVT9I8vcpMHn g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4cg7p4jvb4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 23 Feb 2026 06:59:43 -0500 (EST) Received: from ASHBMBX8.ad.analog.com (ASHBMBX8.ad.analog.com [10.64.17.5]) by nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 61NBxgeq000989 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 23 Feb 2026 06:59:42 -0500 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBMBX8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Mon, 23 Feb 2026 06:59:42 -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; Mon, 23 Feb 2026 06:59:42 -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 61NBxQi5017964; Mon, 23 Feb 2026 06:59:29 -0500 From: Jonathan Santos To: , CC: Jonathan Santos , , , , , , , Subject: [PATCH v2 1/4] iio: adc: ad7768-1: fix one-shot mode data acquisition Date: Mon, 23 Feb 2026 08:59:26 -0300 Message-ID: <37b4d283b247d9078b75bee0b203d44df8d45f8c.1771362939.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-Spam-Details-Enc: AW1haW4tMjYwMjIzMDEwMiBTYWx0ZWRfX28b5dbEO9CTs EIEhM/4hfGThsVcbQqBfBYx6x4xu2kn/TY74IztPIHKVNXJvCelUNPys8uDRQSmC2HRGtYGicF/ 857mJDaS82sMSnP5Blw50V/Gca010wUrXNbKgnQreMapY/j/EBNopz4wOm2PbXXZ3qHxRLlASMC jESN5MxPFOTbi4a33yJPx4TIHK1c9LSrB3ZCdwmRC9yzs5LQsITc8hDTYNnnyGPo+jvpnqgc59G oBHmsgDwDNUDP4cU6v9GF349QTTSqMZpD72d/9dV5NsXO43Nqwj7DD/HbHYuG5tw67N7NmLB/Lv LMFY6l9uKv1p7NrEGRtuQZ8fmIFVGav55qQGrQPUHKkknG4LqYwpx4SlkFHeDx93wz8UWJf2aua fb6PBdrhWOtUdRbinYSOXx7AQq3IsvMIrpqcouDpU/6IrjS7GuNa0gBzwqtIGSHdFR97K+JjIBX PtdILguiYY1NR0P6ZRQ== X-Proofpoint-ORIG-GUID: j64q-tvd10JvZBD-VQKqMrbu-pibT65c X-Authority-Analysis: v=2.4 cv=LfgxKzfi c=1 sm=1 tr=0 ts=699c412f cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=uXKFMexyRkwL0ZmDwxwA:9 X-Proofpoint-GUID: j64q-tvd10JvZBD-VQKqMrbu-pibT65c 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-23_02,2026-02-20_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 spamscore=0 phishscore=0 clxscore=1015 adultscore=0 bulkscore=0 malwarescore=0 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2602230102 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 reinit_completion() 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 Reviewed-by: David Lechner --- Changes in v2: * reinit_completion() is now called before sending the SYNC pulse, to ensure that the completion is properly reset before waiting for the conversion to complete. * Patch kept for backporting, even though superseded by next patch. --- 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..4cb63ab4768a 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 + reinit_completion(&st->completion); + + /* One-shot mode requires a SYNC pulse to generate a new sample */ + ret =3D ad7768_send_sync_pulse(st); + if (ret) + return ret; + ret =3D wait_for_completion_timeout(&st->completion, msecs_to_jiffies(1000)); if (!ret) --=20 2.34.1 From nobody Fri Apr 17 06:13:56 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 2D99B35B64E; Mon, 23 Feb 2026 12:00:06 +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=1771848008; cv=none; b=PUjeYFZvP2T9pnuZSXQgJk9v8smjX+3WGm5x/l3q3blSIPMT87DDjRveROg2eHkKvwat3DO1PszrxmoegpHBNgCbXuUoNVKFYZV40L3foIuyjorAaZvE/5i2S1dzSmK5c0KMghprUOSuNF+Kl/nBIpgFwp0SzvgJju0H5c///gs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771848008; c=relaxed/simple; bh=TSHi2QcPjsTf3sTc6kT7lrBBkZuicJfI9Uvo/EGLq6Q=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=NeWa3DtXiHLazpjiBtmOK/d9qHzNTxLq+j1ssBmDl10KyNXSawwVj46BUjBCiUQypcIVcbfB5MU1TvDz5Qo7eZEA/FbBl4umPJntrYBsvyBgmWjOHRHxM6cphBN30l8YoXpCO/QEzpVGoSyGi11+Tzb3qqvVWROI6VQoX4KNgW0= 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=GwmQn9dx; 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="GwmQn9dx" Received: from pps.filterd (m0516787.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61N6nDba1743194; Mon, 23 Feb 2026 06:59:52 -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=Jf7Og tSVNZ2cNvuLt9zMrBs6tKnGFvMZwtNRhbnZSPI=; b=GwmQn9dxbyT8Twu1I9qGR KB5pig15axMwDLfb8QNV5R5A55KZ8mvo4mTTJ0sb0WxSiL6A52ffELYHGiwsB53y CwaPA5brrAFhL2DZX+sbNlNID7dMlj7nwMOie86LAgknWNMxyIj1CSrECX98IrR5 jIvOct+DZv3RE/6781pXfZ0TKGX9Zsvf0JI/u58M9+3wHwOJ4e+7KmM4kK5NqprY 8L10XNgxuOqAWzQe+N9DQFYlYRifHoBzWxrZherKVqlYD422OPbqXGHKIVvnLgYw i3XGX7jysCEyYy81e5lAF5pnG1rc67RhAnV7y6HFkvGtzWG/sfJXMzr271ISovpw Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4cg7p4jvb9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 23 Feb 2026 06:59:51 -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 61NBxofR000995 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 23 Feb 2026 06:59:50 -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; Mon, 23 Feb 2026 06:59:50 -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; Mon, 23 Feb 2026 06:59:50 -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; Mon, 23 Feb 2026 06:59:50 -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 61NBxZX8017968; Mon, 23 Feb 2026 06:59:38 -0500 From: Jonathan Santos To: , CC: Jonathan Santos , , , , , , , Subject: [PATCH v2 2/4] iio: adc: ad7768-1: remove switch to one-shot mode Date: Mon, 23 Feb 2026 08:59:35 -0300 Message-ID: <19d4a44bae3561ca7a3e608dd657de0480f35391.1771362939.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-Spam-Details-Enc: AW1haW4tMjYwMjIzMDEwMiBTYWx0ZWRfXz7s1OdZKfX/o W6Prsnhj5Do8+KH+lDfB4T9v5Um1SnbSHiH1uGm1EMsvmbqEDQeNVbbPmkqLJ2m9QtWZSQkYIOO z7B7Y4FgYELZNfeRgw0Fc4CRDIoAh2MzA1ry3mFhnYw2oKXQTFk/K3Ke+GItVI/LOUDB0Vzm19l JmbSKMAxejr0hOTx5z/ndBqLCXnzE4KV94m7cwc1ZgOpMkT1FaTVU7ECRHNEtOov49ZuarFz9XW brdiHzrZ23AcWfy4WXP6EqD5eLPYnolUv5ngZTYkc7H3d1Hv9LiN930IIgcZwgc0a5GCdhw61DL XOcoXzzK12OBlqGfR76cDbj/hhc7Jd3grh1fgOgcH3mV6/SUCb/Q726l3dgBBmX/2HOuc99Afh9 o7GbKknd0PRiTIb0kJ1Ic8VWHa+USp4gJ1WanA029YyJE6tJ1wnvMBgQTbN5kbWFUXaKfvxyh6Q VV/E1vhxkeRJE7+rHkg== X-Proofpoint-ORIG-GUID: dhXIv5dA1W7UvOCcHgiMbajKMAbo1nAb X-Authority-Analysis: v=2.4 cv=LfgxKzfi c=1 sm=1 tr=0 ts=699c4137 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=NJqpzZaRi1aEPO-UgL0A:9 X-Proofpoint-GUID: dhXIv5dA1W7UvOCcHgiMbajKMAbo1nAb 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-23_02,2026-02-20_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 spamscore=0 phishscore=0 clxscore=1015 adultscore=0 bulkscore=0 malwarescore=0 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2602230102 Content-Type: text/plain; charset="utf-8" wideband low ripple FIR Filter is not available in one-shot mode. In order to make direct reads work for all filter options, remove the switch for one-shot mode and guarantee device is always in continuous conversion mode. Fixes: fb1d3b24ebf5 ("iio: adc: ad7768-1: add filter type and oversampling = ratio attributes") Signed-off-by: Jonathan Santos Reviewed-by: David Lechner --- * Instead of restricting the one-shot mode for some filter types, remove it completely and guarantee the device is always in continuous=20 conversion mode. --- drivers/iio/adc/ad7768-1.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/drivers/iio/adc/ad7768-1.c b/drivers/iio/adc/ad7768-1.c index 4cb63ab4768a..a927ae288fbb 100644 --- a/drivers/iio/adc/ad7768-1.c +++ b/drivers/iio/adc/ad7768-1.c @@ -463,17 +463,8 @@ static int ad7768_scan_direct(struct iio_dev *indio_de= v) 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; - reinit_completion(&st->completion); =20 - /* One-shot mode requires a SYNC pulse to generate a new sample */ - ret =3D ad7768_send_sync_pulse(st); - if (ret) - return ret; - ret =3D wait_for_completion_timeout(&st->completion, msecs_to_jiffies(1000)); if (!ret) @@ -492,14 +483,6 @@ static int ad7768_scan_direct(struct iio_dev *indio_de= v) if (st->oversampling_ratio =3D=3D 8) readval >>=3D 8; =20 - /* - * 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; - return readval; } =20 @@ -1248,6 +1231,10 @@ static int ad7768_setup(struct iio_dev *indio_dev) return ret; } =20 + ret =3D ad7768_set_mode(st, AD7768_CONTINUOUS); + if (ret) + return ret; + /* For backwards compatibility, try the adi,sync-in-gpios property */ st->gpio_sync_in =3D devm_gpiod_get_optional(&st->spi->dev, "adi,sync-in", GPIOD_OUT_LOW); --=20 2.34.1 From nobody Fri Apr 17 06:13:56 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 6A01F364EBD; Mon, 23 Feb 2026 12:00:16 +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=1771848017; cv=none; b=qyPc1in+J2DLJhah99VjcEoC1D08xIsRsyiHCoZlALW6xJqIoqPrsLfekaUQnzY8IqC84kPILoxvzVUkzR9vUEyB1yaablkfqVaWD/sTy+azPIWHCE/67YRfofWuOTqEP9wu+CmsE2L51ESfLrMDatHpfTvIKGqpxgSG+UWLdGo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771848017; c=relaxed/simple; bh=KhNou8ylLjGov58N8u/85/gX5GHEEpbh+3bYNl8Ijw0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CezE5TcR8AtJLkqo0fLxm7G1WHTKDNMhCnMQXe0RWzOKAEFf0CdKJyegreKO7xHRy/gRKJoPc9sHx0UklWSfeVMG3k89sbvCwZV6C1SE8n+/hUTb0ibpcE59HiIveVbPv0De4X9carwlrxDXC5ddmUQYSZmZ7KTmNGuRUeiRffI= 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=RIRXsscP; 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="RIRXsscP" Received: from pps.filterd (m0516787.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61N5sqO91742937; Mon, 23 Feb 2026 07:00: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=VharO nPKVkW3uF39fpdPNTpSKL53JTJCvSylw8rYqXs=; b=RIRXsscPgbOgjqdUcudfs T/H2GSU+naIUWjZj/wN5L2+JKC4SZ8BKfR/HEANB4mpTKsEXkY1uRxwQLs677Bcx jUOVophdKODrUiPM3ad0AtCoXfTVA1g8EMnWzSkNncDktT8gJYVgahMlU9qa0h/Y jqur9Dj2ihJHVG71RRHuKBd/Tyly1kD9bSfoNoSt4BPDgW6l7u/mLY/TrNw47GFq XFMhXEq6TdkSHTRr9k43RmD1S0ztcHFejEIw777Mhejh/+98pc6CYH571Km+LULR GaYy8YY/J9noqrQQz0StfGaw/5V7WlBRz02fYoNe7sek3g/9mVbfhvSgZNGaTAB+ A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4cg7p4jvbe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 23 Feb 2026 07:00: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 61NC00cM001001 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 23 Feb 2026 07:00: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; Mon, 23 Feb 2026 07:00: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; Mon, 23 Feb 2026 07:00: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; Mon, 23 Feb 2026 07:00: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 61NBxjvO017977; Mon, 23 Feb 2026 06:59:47 -0500 From: Jonathan Santos To: , CC: Jonathan Santos , , , , , , , Subject: [PATCH v2 3/4] iio: adc: ad7768-1: disable IRQ autoenable Date: Mon, 23 Feb 2026 08:59:44 -0300 Message-ID: <5722c9ca8e3889459dfad1233f607d990aa7284d.1771362939.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-Spam-Details-Enc: AW1haW4tMjYwMjIzMDEwMiBTYWx0ZWRfX4vaaqWuVlrrd dc+fJdcgpRjfW93el0x34CEg965aBPqi3WzHBYz1ciSTstqR00a5Cypx4JW2jriIfA4hQVVZawj kTOAw6KEBoiT2O1YOY7dN4hf8Wtbxjbf0xKTyqkha5CW8LG9/5KVokKF+WNArBWx+iIoz6j1cn6 gEgaLjyaw1I0jEUhFU/qWpRNKdB5f696jUJTt8hr3z5AnIEK3ycRayyrZwpgVf2CX0XljSJGIpx OGAYkZBTYVvtvB5VuCaggRpRbbmxDI0TtK4ouWhM4nDXy4vvLlcsGvpHm3/C/hJRxJZbNQa/d+j OASkqnAgixnff1YlvuI91BvNl8jCydH/1mQGsCl1kUfPHr6c6Y6bDaxVGynPG4WcaVLty1ACxvi FhyF0zjkG3DX5u+4Q2+PtB+oYFRVZK/FDNfut5MDWxGx19V7FZcw3JzOo82h+9Ji1pBTsOKCUH1 yKwpFLBhsbpj6wSdewg== X-Proofpoint-ORIG-GUID: mKUi0z584sjZS5oTfxRDMtYqj3btG-cR X-Authority-Analysis: v=2.4 cv=LfgxKzfi c=1 sm=1 tr=0 ts=699c4141 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=VwQbUJbxAAAA:8 a=gAnH3GRIAAAA:8 a=gy7Ta6SMeDADBy3mfWkA:9 X-Proofpoint-GUID: mKUi0z584sjZS5oTfxRDMtYqj3btG-cR 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-23_02,2026-02-20_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 spamscore=0 phishscore=0 clxscore=1015 adultscore=0 bulkscore=0 malwarescore=0 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2602230102 Content-Type: text/plain; charset="utf-8" The device continuously converts data while powered up, generating interrupts in the background. Configure the IRQ to be enabled and disabled manually as needed to avoid unnecessary CPU load. Signed-off-by: Jonathan Santos Reviewed-by: David Lechner --- Changes in v2: * New patch. It solves the excessive CPU load issue and addresses David's suggestion of having the interrupt disabled when using offload. * This is a reproduction of and old patch sent last year. please refer=20 to the thread [1]. [1]: https://lore.kernel.org/linux-iio/20250718013307.153281-1-Jonathan.San= tos@analog.com/T/#t/ --- drivers/iio/adc/ad7768-1.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/iio/adc/ad7768-1.c b/drivers/iio/adc/ad7768-1.c index a927ae288fbb..b77523393a18 100644 --- a/drivers/iio/adc/ad7768-1.c +++ b/drivers/iio/adc/ad7768-1.c @@ -464,9 +464,11 @@ static int ad7768_scan_direct(struct iio_dev *indio_de= v) int readval, ret; =20 reinit_completion(&st->completion); + enable_irq(st->spi->irq); =20 ret =3D wait_for_completion_timeout(&st->completion, msecs_to_jiffies(1000)); + disable_irq(st->spi->irq); if (!ret) return -ETIMEDOUT; =20 @@ -1339,8 +1341,22 @@ static const struct iio_buffer_setup_ops ad7768_buff= er_ops =3D { .predisable =3D &ad7768_buffer_predisable, }; =20 +static int ad7768_set_trigger_state(struct iio_trigger *trig, bool enable) +{ + struct iio_dev *indio_dev =3D iio_trigger_get_drvdata(trig); + struct ad7768_state *st =3D iio_priv(indio_dev); + + if (enable) + enable_irq(st->spi->irq); + else + disable_irq(st->spi->irq); + + return 0; +} + static const struct iio_trigger_ops ad7768_trigger_ops =3D { .validate_device =3D iio_trigger_validate_own_device, + .set_trigger_state =3D ad7768_set_trigger_state, }; =20 static int ad7768_set_channel_label(struct iio_dev *indio_dev, @@ -1704,7 +1720,7 @@ static int ad7768_probe(struct spi_device *spi) return ret; =20 ret =3D devm_request_irq(&spi->dev, spi->irq, &ad7768_interrupt, - IRQF_TRIGGER_RISING | IRQF_NO_THREAD, + IRQF_TRIGGER_RISING | IRQF_NO_THREAD | IRQF_NO_AUTOEN, indio_dev->name, indio_dev); if (ret) return ret; --=20 2.34.1 From nobody Fri Apr 17 06:13:56 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 6F54034EF05; Mon, 23 Feb 2026 12:00:29 +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=1771848030; cv=none; b=K33tqrpxe4JHZnDax5RIe8QtzzunWvzvcPKoegViGFoVaPHfcAuzocSEngdrS53px1fBxIUL//yQsXTqanAwhO/TKLUjeGMw58pDhQ0Y8EZYg2ZbPupjlYoVV5RM9OjfX5xDVgRtXdEZyIMlVlCujjdJahkCZXFJl1YCGpsPGt4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771848030; c=relaxed/simple; bh=2R2xy/w74RwHiUGGRRo01Q25jBxIUgz/3hIUSjS4/xo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UBvw2d98O+tJTh2V9JemwqWJp9/Z/2vyYNFMPT+4K4U31T8WsW/ePR5eyVFbJAbrTvVGyl6EnnAFR4zPVSDxGw2j2YIz1Fw+z4QGG2m25+2f+2wrQosBmrexZsX8kOFp21zBLdfp3lgzhicffwsMkMN0i4WWDkDHucz9Ku/YRsI= 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=o73Ysatr; 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="o73Ysatr" 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 61N6geR02668062; Mon, 23 Feb 2026 07:00:13 -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=Y32PL KqeQmyMwEuOCod+DtSJnzdaYxFB1d7IUXoV3ew=; b=o73Ysatr+irem/2unT89Q bftrMhP2fKWBzyPFIg2JRZ7ViGudhoGeb2ItSmXMsUhGqA8fOrBYsmh/fHfSrqHM ILlPtsJlsekqxk2TiwAFr+vqhj8No5mN8WZ0mS8O3hwemQ30pLR0QSoxeuB+b24D c7JmPvmLtwhsV3km77pTLi43+KPjYR0xKazPABcBQvc7UO/jgGHx38pscQ00gKh6 opyqC6MLpO+xdKJ03bp6B7MFHhpPXrcSo2OHGJl/MyzRj6UA5EbBVMjaxuSHAeNC 1oT91113IAKodPPFdxphmkORfxEF5syJx4odQJ7MFq1/rrDXQWaC2Beyiz4nKtQb Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4cg7pbatnh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 23 Feb 2026 07:00:12 -0500 (EST) Received: from ASHBMBX8.ad.analog.com (ASHBMBX8.ad.analog.com [10.64.17.5]) by nwd2mta4.analog.com (8.14.7/8.14.7) with ESMTP id 61NC0BwJ001055 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 23 Feb 2026 07:00:11 -0500 Received: from ASHBCASHYB4.ad.analog.com (10.64.17.132) by ASHBMBX8.ad.analog.com (10.64.17.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Mon, 23 Feb 2026 07:00:10 -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; Mon, 23 Feb 2026 07:00:10 -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; Mon, 23 Feb 2026 07:00:10 -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 61NBxuAF017992; Mon, 23 Feb 2026 06:59:58 -0500 From: Jonathan Santos To: , CC: Jonathan Santos , , , , , , , Subject: [PATCH v2 4/4] iio: adc: ad7768-1: add support for SPI offload Date: Mon, 23 Feb 2026 08:59:53 -0300 Message-ID: <79e1004bd9e618f9376a9ed40389510066b91d1c.1771362939.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: eFunLOcZ0Qba69BsA-p9XoEZYP7iivhN X-Authority-Analysis: v=2.4 cv=RPK+3oi+ c=1 sm=1 tr=0 ts=699c414c cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2:22 a=VwQbUJbxAAAA:8 a=QyXUC8HyAAAA:8 a=gAnH3GRIAAAA:8 a=tgav_aEpjPthpoIVNhMA:9 X-Proofpoint-ORIG-GUID: eFunLOcZ0Qba69BsA-p9XoEZYP7iivhN X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjIzMDEwMiBTYWx0ZWRfXz7K0hqj2aYkY c6NH9i9aFLXbxs0pW2d55s2EW7E6euteA5RK8sl6w2sXloYQUBtCSSe4YsGLmIbCxKfWtpEvlHc t29Kg9DFio63jD4PN9fnow5gNsb6CM0BX7oyW5VQn3LNp3nCKpdAOkrLUkgTpU3PDy5a3BmzEs3 XkUe/U/BYbR3u+8RGgZixJMzR3I8TeUyRw7GOtJJNPd0irD5dRvFDqggOitIYUg79H1DY7QUaBT rs7BSZAjbIBGwegc+vUnQvTRPr+ocQY1W2Jp+c8iPgSG8ATNi3O3CeVDTjiIV0B5EMq5tDMsGRv B0hjuGExcpa5epCQxSoB1DaOKL2yfRUAXu69m0S5TdfakpGOxlPFSQHgWenE8tDln8XlShaEPAx ZN+PW/ZtE3rHpc4R8CratRj4GKOQDnnM7WqB+uO3iRfFNGdy636VfoFLHb+svjnv60jzQQ83rbY pmLXTLnH+Gl77FfKyzA== 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-23_02,2026-02-20_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 impostorscore=0 adultscore=0 priorityscore=1501 spamscore=0 malwarescore=0 lowpriorityscore=0 bulkscore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2602230102 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 Reviewed-by: David Lechner --- Changes in v2: * Removed offload_en element in ad7768_state. * Refactored ad7768_offload_buffer_postenable() to undo continuous read=20 mode in case something fails afterwards. * Allow 1 or 2 arguments in the offload trigger, instead of only 1. * Fixed indentation issues suggested by the Andy. * Import IIO_DMAENGINE_BUFFER namespace (Reported by kernel test robot). * Fixed error pointer reported in https://lore.kernel.org/all/202602051234.= 5gArzLyZ-lkp@intel.com/ It was supposed to return ret instead of the rx_dma pointer. --- drivers/iio/adc/Kconfig | 2 + drivers/iio/adc/ad7768-1.c | 186 ++++++++++++++++++++++++++++++++++++- 2 files changed, 185 insertions(+), 3 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 b77523393a18..da8b0bbeaec9 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,6 +325,8 @@ 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; struct mutex pga_lock; /* protect device internal state (PGA) */ @@ -1119,6 +1140,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) + return st->oversampling_ratio =3D=3D 8 ? + AD7768_SCAN_TYPE_OFFLOAD_HIGH_SPEED : AD7768_SCAN_TYPE_OFFLOAD_NO= RMAL; + return st->oversampling_ratio =3D=3D 8 ? AD7768_SCAN_TYPE_HIGH_SPEED : AD7768_SCAN_TYPE_NORMAL; } @@ -1341,6 +1366,78 @@ 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; + unsigned int unused; + 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 spi_bpw_to_bytes(scan_type->realbits); + st->offload_xfer.bits_per_word =3D scan_type->realbits; + st->offload_xfer.offload_flags =3D SPI_OFFLOAD_XFER_RX_STREAM; + + 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; + } + + /* + * 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) + goto err_unoptimize_message; + + ret =3D spi_offload_trigger_enable(st->offload, st->offload_trigger, + &config); + if (ret) + goto err_exit_continuous_read_mode; + + return 0; + +err_exit_continuous_read_mode: + regmap_read(st->regmap24, AD7768_REG24_ADC_DATA, &unused); + +err_unoptimize_message: + spi_unoptimize_message(&st->offload_msg); + + return ret; +} + +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 int ad7768_set_trigger_state(struct iio_trigger *trig, bool enable) { struct iio_dev *indio_dev =3D iio_trigger_get_drvdata(trig); @@ -1589,6 +1686,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 or 2 args to indicate the trigger output signal */ + if (nargs =3D=3D 0 || nargs > 2 || args[0] !=3D AD7768_TRIGGER_SOURCE_DRD= Y) + 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=3D 0 || nargs > 2) + 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, @@ -1626,10 +1753,51 @@ static const struct ad7768_chip_info adaq7769_chip_= info =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_dm= a, + IIO_BUFFER_DIRECTION_IN); + if (ret) + return dev_err_probe(dev, ret, "failed to setup offload RX DMA\n"); + + indio_dev->setup_ops =3D &ad7768_offload_buffer_ops; + + return 0; +} + static int ad7768_probe(struct spi_device *spi) { struct ad7768_state *st; struct iio_dev *indio_dev; + struct device *dev =3D &spi->dev; int ret; =20 indio_dev =3D devm_iio_device_alloc(&spi->dev, sizeof(*st)); @@ -1725,9 +1893,20 @@ 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(dev, spi, &ad7768_spi_offload_config= ); + ret =3D PTR_ERR_OR_ZERO(st->offload); + if (ret =3D=3D -ENODEV) { + /* If not using SPI offload, fall back to low speed usage */ + ret =3D ad7768_triggered_buffer_alloc(indio_dev); + if (ret) + return ret; + } else if (ret) { + return dev_err_probe(dev, ret, "failed to get SPI offload\n"); + } else { + ret =3D ad7768_spi_offload_probe(indio_dev, st); + if (ret) + return ret; + } =20 return devm_iio_device_register(&spi->dev, indio_dev); } @@ -1763,3 +1942,4 @@ module_spi_driver(ad7768_driver); MODULE_AUTHOR("Stefan Popa "); MODULE_DESCRIPTION("Analog Devices AD7768-1 ADC driver"); MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS("IIO_DMAENGINE_BUFFER"); --=20 2.34.1