From nobody Fri Sep 25 16:03:01 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 142E33ADBAC; Thu, 10 Sep 2026 17:37:22 +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=1789061849; cv=none; b=V8H4zFzvic8LIm6dvnU0fsP0YkXWz28SFnx/Yey+TTI8Jf6znDyL63TN71X+t/vg81veSyRxLEZmj1Mdzyp8RlMNumTb7w2Gfgum+V2DRjTb9WgZWVLhsy/Ga4EbPjw07nonC2mgKIfGQjaH/R751mKt1EqDZqV1zZ8DBFAFNa0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061849; c=relaxed/simple; bh=FGQG3DmM+7X/giTmbo/iKtzgJp69jhePuib7JGtlpCY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=uhrAhgHk208SikNbx0VJzeoAxpoofYbchqn9Lukr1BAYCHsO0tgDti31rwmq5Uozces0V18SLVDUlGwAZtqkkJ4eIB8q53cty+HIMwPwPi8T7BLCAAWlCaHnEszQUgNv5AxNAlAzURHJGaHMdlc8TFedcFvCL9R6CdOa0F2FyMg= 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=krKuU1jQ; 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="krKuU1jQ" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68AF7Qqc343094; Thu, 10 Sep 2026 13:37:00 -0400 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=rxmPy wnjcLCbFsxSJFUDwnHHA1K7/8xkNzN+tJwpQgI=; b=krKuU1jQuTQHwIxyyTp8o /iQvMUZSKMoMjXuADw17L9ZJAu+iCqXLRgCuANx3++3+PQ0bJN8DgY8hdWobK+Lg kOvA2t/fYjctaveO3SIchsZfbaVcfuIRYcfVK6TKKekUsBdCbAcppzp62QSeKdJP EFPNXR2WW1RGC9CoGyfCAYHtDCH9l8xNxHALifxGfwwWbf8Ey/QTBKT3/YDAEm9T iK1vkqoL5OiVzMSx8icXzszRIK0pKplE/3jwMsvwnAKQ2YVW5AY1i9OEixcLX6Ut BA+8zgo2jztm63aQ6bbCY6Rf7K2LgBDUOg/2pFyyVS4rvHqkQjdoLGxmtxbWMkh4 Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcx95208-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:00 -0400 (EDT) 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 68AHaxee038715 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:36:59 -0400 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; Thu, 10 Sep 2026 13:36:58 -0400 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; Thu, 10 Sep 2026 13:36:58 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSX018832; Thu, 10 Sep 2026 13:36:52 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:19 +0200 Subject: [PATCH v7 01/17] iio: adc: adi-axi-adc: Initialize state mutex Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-1-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , David Lechner , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=1021; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=FGQG3DmM+7X/giTmbo/iKtzgJp69jhePuib7JGtlpCY=; b=ikdrHkLi7LigpgtvEANLNAzH3UjvZSeMxDQadwXUSUmoSoN2srISV75UUdPaJrv/gHAKIXFFd Z6YHPrBLRhtBHvbBnFcILjE301mNcLJ9/SznKBhb6RwnZLkMeTYW/Ft X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX7AZbYrIMQ0Y5 dC8/8p8oXKpQ/cQctWdPpG2FZd1a+m37AASC4b/I8JY2LxQxdU2br+LXt9tKhE/MNRnVKYIcaWJ AGeFhmWwJuMp1xnrgUNkopy1joY6titkUfO4LHic/Tt1gEH2ye16 X-Proofpoint-GUID: aAFZ89kUa_HfB6yo4fCbFgJkjEPtb-VX X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX+vL5uyYpWjOx 8a3riQyAZ+Zt7HuzGWypzpqu3acjXKiSbw1OCApm+VK7b/mltnIfzI0VI9BR2/S0m9ndNblCwqa v8nrPABMRqT9tPROBvbkLH7vWDQUDdvp/nA+5VA8yJKQR4ujowLZe0x6o+SlxTUGb286rHNLTgm of2izkRiE2UUU9unJmkalG1C42Dia6mI1EGSiYHEN1CohOkhYkgxRRskLcUWKWeGWJoHtHzb8k6 Oxf5eY+rTOqXIf8kZ8aB40P85UmwDQX6rvQISHV6o0h41AbjUubT04biwFeUCMyFN9TNLBzwHRA L/Xka0nC1sllcc4PcnzGadYy/KKt3E27HvhfqoJupYLZGl4M4IXFNcaIbmi2EoJTtocqBA3ohOd lnJsiqBfNmCl4j8YPwmaOQeR3wciJzGclYIVHJMQaynJTUwL9pUYgZ29hE3yoH5bMjkkR8b4h1K a0S9Nu2h09hWwsKUlgQ== X-Authority-Analysis: v=2.4 cv=G8CJgNk5 c=1 sm=1 tr=0 ts=6aa2eabc cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=uXIjobp8t2wMuQ0fPvqm:22 a=gAnH3GRIAAAA:8 a=_ljTvifiVFBlT2kRk7cA:9 a=QEXdDO2ut3YA:10 a=zZCYzV9kfG8A:10 X-Proofpoint-ORIG-GUID: aAFZ89kUa_HfB6yo4fCbFgJkjEPtb-VX X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 adultscore=0 malwarescore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 The AXI ADC register access paths serialize transactions with st->lock, but probe does not initialize it. Initialize the mutex before registering the backend. Fixes: 7ecb8ee5c93b ("iio: adc: adi-axi-adc: support digital interface cali= bration") Signed-off-by: Janani Sunil --- This patch is already queued in the IIO fixes-togreg branch as commit 040c2514b25b ("iio: adc: adi-axi-adc: Initialize state mutex"). --- drivers/iio/adc/adi-axi-adc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c index 589f03618ecf..fc7cc92b35f0 100644 --- a/drivers/iio/adc/adi-axi-adc.c +++ b/drivers/iio/adc/adi-axi-adc.c @@ -714,6 +714,10 @@ static int adi_axi_adc_probe(struct platform_device *p= dev) if (!st) return -ENOMEM; =20 + ret =3D devm_mutex_init(dev, &st->lock); + if (ret) + return ret; + base =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(base)) return PTR_ERR(base); --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 6520E55C1D8; Thu, 10 Sep 2026 17:37:26 +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=1789061854; cv=none; b=oJS8+Tn+BqGH4rt0+1E7woZdjZmHcYX8tVCF+Cq3w+9LPOmAEV1Vr4Bu5A8u4q5N2YNEyhpY4w9ag3W4J8wWTj39pjxd4U7hyu4ldp0fk8zbykhzwIyiD5OkPEiRHb8Fqcy8xoNCoy9RaUHPEJxiXrIlDmfDoXmHD2wF5a1b+zc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061854; c=relaxed/simple; bh=EY9EQOsYu3byjN8DF1RDw1X9mPDT9Oos2yz7fB3CVXQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=bp9bcgzWB/Kxsm8yCD2NS2H/AQlftEXrahAuA9iVnLISmpiJeGaVnWLTQ8ZUZ0DIiwHZw6nd5rSjO9N4aqAoPXrszGQ3U78q7aQYsKpTT6otzIKbqOFbHLH+8OSNm0nXpHTQ6039kp/B2P5++/5CpX9NEldblhcHHU9Eww7O7pA= 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=YPVFtp3a; 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="YPVFtp3a" 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 68AF80ga3830376; Thu, 10 Sep 2026 13:37:05 -0400 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=YWLkw rmIsJPC7lBdXegzKTfcm8lQwZoUuePW2xNN/v8=; b=YPVFtp3aW29JdZrCHdPpl V+jyBzGmHZkcr7vmBYjkL61Xwf9G7bHgEckGCAI82oEWJ7J8SvhMBAHSkGiGyBeB jEGmFq3/B4RpfGZI8vHg5DZxvaRVKrLLCZHSyPu7M1mglBjmrNZSR2LaKk/nOscE Ul373kb6WbxbTzJGI/OOYHC1LFhwpphoSspQYg8u2Vjj7Oe4PBrIGRzeMUDcUCOU rLp7dfyajxx7f+I6hVB7M1RI6Qo7JBkkv5BdWwlqYRVnxO9oVhRg0WCgWdhHBnID JxOWC5zWT+Cw1MU40xaDWJke4Rga6Vb/qdLir7bg9g1j3YePcp3X20DU+3GD/Lej A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxad2bv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:04 -0400 (EDT) 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 68AHb351038753 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:03 -0400 Received: from ASHBCASHYB5.ad.analog.com (10.64.17.133) 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; Thu, 10 Sep 2026 13:37:03 -0400 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; Thu, 10 Sep 2026 13:37:02 -0400 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; Thu, 10 Sep 2026 13:37:02 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSY018832; Thu, 10 Sep 2026 13:36:56 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:20 +0200 Subject: [PATCH v7 02/17] dt-bindings: iio: adc: Add AD7768 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-2-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron , Conor Dooley X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=9168; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=EY9EQOsYu3byjN8DF1RDw1X9mPDT9Oos2yz7fB3CVXQ=; b=5Dq7VHdQzWJfDA3cPmYK/XOD9AN86JAqEB5m6zA3/ncpm1dn0qyqFqLCSxa2Xj1dq4c9Vvb8Z btrP/JSFuyxAg1rlaAwxV8aojEmUC4MbaOCK02M9O//Ve3d/6bAxqZ9 X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX/pv87gAmF1xt PpzxngNEMNrbP7zTiyu0wKmaT3IHrcH24JxSmYf0iIgGYvqeoqad+8SHNJ+YB1aAqBtImfn2pJl hL/4JS3wtGTbjNcVXOL7B/CdZQ3UmNyJDYNpvYHAigNsJJM4/EiQ X-Authority-Analysis: v=2.4 cv=Ao17T+9P c=1 sm=1 tr=0 ts=6aa2eac0 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=gEfo2CItAAAA:8 a=gAnH3GRIAAAA:8 a=NEAV23lmAAAA:8 a=XYAwZIGsAAAA:8 a=VwQbUJbxAAAA:8 a=pGLkceISAAAA:8 a=qd1CiYGdZHjR4DSY3K8A:9 a=QEXdDO2ut3YA:10 a=sptkURWiP4Gy88Gu7hUp:22 a=E8ToXWR_bxluHZ7gmE-Z:22 X-Proofpoint-GUID: Wzv8-kIXZ234voGxjP420XMFVY8pU8B3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX7V1zS/R2/Zv3 38YQCugMrEz8fePpOVRCQlL9ZegHGJb7pVOcvlur0ZZHKSOuz3LYhuOz+EyUmVv+XXrzVO6yQSH wRAS/vvlumwy8sGq5WYcp/1V7pAzYQCc3lgPFwM6oWf73y7fui8gs94uEoFts9pBVko/wZ9qx73 qvj/s1iu8hLPjYpkQmvMwXM9ZCwMjG22eoF3270qZUdmMGmrN+7n1eKd6vq87LvAi01/60kkJ1y Uyu64eo6itsI7ZnJ3D1ibf+Q/N0vWArGsN6vTlbRzZdXGD9D7H7lp0Q9eoKZQlchzM17SHOSrQB 02hWo8qWGYSlvq/EUOEbUKKOIZEpeHvvWXlQooumNw1buXWbey3BX8phN89exDKwyzou8mrMxFO kZ297iSA0I+X5Wf8YFeKjlOjM9cSOeN53DEziNSgQGG3FJv0gV/WW9AnI/24xIuy+acF6bPT9t8 x8FdBJ6Ozfuv6YjV1Ug== X-Proofpoint-ORIG-GUID: Wzv8-kIXZ234voGxjP420XMFVY8pU8B3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 spamscore=0 phishscore=0 lowpriorityscore=0 suspectscore=0 impostorscore=0 adultscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Devicetree Bindings for AD7768-4 (4 channel) and AD7768 (8 channel) simultaneous sampling ADCs. Acked-by: Conor Dooley Signed-off-by: Janani Sunil --- .../devicetree/bindings/iio/adc/adi,ad7768.yaml | 270 +++++++++++++++++= ++++ MAINTAINERS | 7 + 2 files changed, 277 insertions(+) diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7768.yaml b/Do= cumentation/devicetree/bindings/iio/adc/adi,ad7768.yaml new file mode 100644 index 000000000000..d8e489fa1f6f --- /dev/null +++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7768.yaml @@ -0,0 +1,270 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/adc/adi,ad7768.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Analog Devices AD7768 and AD7768-4 ADC + +maintainers: + - Janani Sunil + +description: | + The AD7768 is an 8-channel, 24-bit simultaneous sampling ADC with config= urable + power and performance modes. The AD7768-4 is a 4-channel version. + + This binding covers SPI mode only (register access via SPI). Pin control= mode, + where configuration is set via hardware pins rather than SPI registers, = is not + supported. + + The io-backend represents the high-speed data output interface, consumin= g the + DOUTx data lines, DCLK (data clock), and DRDY (data ready) signals. + + Datasheet at: + https://www.analog.com/media/en/technical-documentation/data-sheets/ad= 7768-ad7768-4.pdf + + HDL reference design: + https://github.com/analogdevicesinc/hdl/tree/main/projects/ad7768evb + +properties: + compatible: + enum: + - adi,ad7768 + - adi,ad7768-4 + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + clock-names: + description: + Describes the type of master clock (MCLK) attached to the XTAL1 and + XTAL2/MCLK pins. A CMOS clock is supplied on the XTAL2/MCLK pin, a + crystal oscillator is connected between the XTAL1 and XTAL2 pins, an= d an + LVDS differential clock is supplied on the XTAL1/XTAL2 pin pair. CMO= S and + LVDS clocks must operate from 1.15 MHz to 34 MHz. Crystals must oper= ate + from 8 MHz to 34 MHz. + enum: + - mclk + - xtal + - lvds + + avdd1-supply: + description: + Analog supply. Its voltage is used to derive the supply-dependent VCM + output level, so it must be a regulator that can report its voltage. + + avss-supply: + description: + Negative analog supply. If omitted, AVSS is assumed to be at system + ground. + + avdd2-supply: true + + iovdd-supply: true + + ref1p-supply: true + + ref1n-supply: + description: + Negative reference input supply for REF1. If omitted, REF1- is assum= ed + to be connected to ground. + + ref2p-supply: true + + ref2n-supply: + description: + Negative reference input supply for REF2. If omitted, REF2- is assum= ed + to be connected to ground. + + reset-gpios: + maxItems: 1 + description: GPIO connected to the active-low RESET pin + + start-gpios: + maxItems: 1 + description: + GPIO connected to the START pin. An active-low pulse on this pin + synchronizes the device to other AD7768 devices. When not used, this + pin must be tied to a logic high level through a pull-up resistor. + When used, SYNC_OUT must be wired back to SYNC_IN on all devices in + the synchronization chain. + + sync-in-gpios: + maxItems: 1 + description: + GPIO connected to the SYNC_IN pin. Receives the synchronization pulse + generated on SYNC_OUT in response to a START pulse. Must be synchron= ous + to the MCLK clock domain. In multi-device or daisy-chained systems, + two successive synchronization pulses must be applied to guarantee a= ll + ADCs are synchronized. + + gpio-controller: true + + '#gpio-cells': + const: 2 + + adi,data-lines-number: + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [1, 2, 4, 8] + description: + Number of DOUTx lines used for the high-speed data output interface + (distinct from the SPI control interface). AD7768 supports 1, 2, or 8 + lines; AD7768-4 supports 1 or 4 lines. Defaults to the maximum number + of lines for the selected variant if omitted. + + regulators: + type: object + description: Container for the on-chip VCM regulator. + additionalProperties: false + + properties: + vcm-output: + type: object + description: + Buffered common-mode voltage output on the VCM pin. Use + regulator-always-on when no consumer node references this output. + Channel 0 must be present and enabled while VCM is used, since + putting channel 0 in standby disables the VCM output. + $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false + + io-backends: + maxItems: 1 + + '#address-cells': + const: 1 + + '#size-cells': + const: 0 + +patternProperties: + "^channel@[0-7]$": + type: object + description: + Represents the external channels which are connected to the device. + AD7768 supports channels 0-7, AD7768-4 supports channels 0-3. + + properties: + reg: + minimum: 0 + maximum: 7 + description: The channel number + + adi,prechargebuf-pos-enable: + type: boolean + description: Enable positive input precharge buffer + + adi,prechargebuf-neg-enable: + type: boolean + description: Enable negative input precharge buffer + + adi,refbuf-pos-enable: + type: boolean + description: Enable positive reference buffer + + adi,refbuf-neg-enable: + type: boolean + description: Enable negative reference buffer + + required: + - reg + + additionalProperties: false + +required: + - compatible + - reg + - clocks + - clock-names + - avdd1-supply + - avdd2-supply + - iovdd-supply + - ref1p-supply + - ref2p-supply + - io-backends + +allOf: + - $ref: /schemas/spi/spi-peripheral-props.yaml# + - if: + properties: + compatible: + contains: + const: adi,ad7768-4 + then: + properties: + adi,data-lines-number: + enum: [1, 4] + patternProperties: + "^channel@[0-3]$": + properties: + reg: + maximum: 3 + "^channel@[4-7]$": false + else: + properties: + adi,data-lines-number: + enum: [1, 2, 8] + +unevaluatedProperties: false + +examples: + - | + #include + + spi { + #address-cells =3D <1>; + #size-cells =3D <0>; + + adc@0 { + compatible =3D "adi,ad7768"; + reg =3D <0>; + spi-max-frequency =3D <1000000>; + + avdd1-supply =3D <&avdd1_regulator>; + avss-supply =3D <&avss_regulator>; + avdd2-supply =3D <&avdd2_regulator>; + iovdd-supply =3D <&iovdd_regulator>; + ref1p-supply =3D <&ref1p_regulator>; + ref1n-supply =3D <&ref1n_regulator>; + ref2p-supply =3D <&ref2p_regulator>; + ref2n-supply =3D <&ref2n_regulator>; + reset-gpios =3D <&gpio0 86 GPIO_ACTIVE_LOW>; + + clocks =3D <&ad7768_mclk>; + clock-names =3D "mclk"; + + adi,data-lines-number =3D <8>; + gpio-controller; + #gpio-cells =3D <2>; + + io-backends =3D <&iio_backend>; + + #address-cells =3D <1>; + #size-cells =3D <0>; + + channel@0 { + reg =3D <0>; + adi,prechargebuf-pos-enable; + adi,refbuf-pos-enable; + }; + + channel@1 { + reg =3D <1>; + adi,prechargebuf-pos-enable; + adi,prechargebuf-neg-enable; + adi,refbuf-pos-enable; + adi,refbuf-neg-enable; + }; + + channel@7 { + reg =3D <7>; + adi,prechargebuf-pos-enable; + adi,refbuf-pos-enable; + }; + }; + }; + +... diff --git a/MAINTAINERS b/MAINTAINERS index 3a19da74d00c..f05e7f4d364a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1657,6 +1657,13 @@ F: Documentation/devicetree/bindings/iio/adc/adi,ad7= 768-1.yaml F: drivers/iio/adc/ad7768-1.c F: include/dt-bindings/iio/adc/adi,ad7768-1.h =20 +ANALOG DEVICES INC AD7768 DRIVER +M: Janani Sunil +L: linux-iio@vger.kernel.org +S: Supported +W: https://ez.analog.com/linux-software-drivers +F: Documentation/devicetree/bindings/iio/adc/adi,ad7768.yaml + ANALOG DEVICES INC AD7780 DRIVER M: Michael Hennerich M: Renato Lui Geh --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 D8968503BCF; Thu, 10 Sep 2026 17:37:31 +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=1789061857; cv=none; b=Q9f+ftyiEgqkxgWiDEhfwRiuBOnIshLmQ8Mjlw20DHp37gNOx0MgWzZndeOf4Ei1xgq6Us2UQ4m1z6n0rG8IJxQ30/EhbmzSFPAgzKao4wXAW0vG1HfEED80Kn3sol4H3BqWFQoc+27opJQ/Bonjj9TIoUqc0j3kRQEj7jCHA+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061857; c=relaxed/simple; bh=h8rpUQCVfSyFWZ0W5MDo7rp1yKN/O8pCD8GN49kfEBA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=uJEObK1YMFyFP8d8A5h6WHohKMUNcOdVbD9/wtxrj0zJQ1y0RAcxcHs4GhJxm26NTv0ANo3FFM+AH8wDpXd/blvWnQETOHPJEBqionxBYLSLIxPRHCRDN7DYbYqsYq8BUbd6JHWQ9Wb2YPEiQ1wzF7u0CoVDzgKbk0D91T4THJM= 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=krU9emvF; 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="krU9emvF" 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 68AF80xW3830389; Thu, 10 Sep 2026 13:37:08 -0400 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=HaZi5 4XuvSGwwXAOvLRMGXBSqS/rduiS4tFlnN5D9gU=; b=krU9emvFdwxWZ9TwT0X0u LVmLqwyEgGGMKtfU9v0kqobGjwVpTsNJixJGqov6C6hQKxUTrGBBgIpdRhavoq7B LFfFjGAofb31WNJqGCIUBhc88sFGxGAKZVJsNDg9mzObwWx5mbvhmfnljA9piX84 +2ljCgl9hPVlGUspMeWYvwCuAFwOkAxl+EPG+1PdoHFw3MoWlXes3sG2Ii9ZxiZv 3IwTiRoWWzUxzbBi4lOqfdGwp8dgIcntV5yOoJruDinQai8ATBYqqRcBV60MUrEu dChlKiXpA2Ad0RGF8CvCCA/2dBXvQv5Sg+c1quU9vmG4x3d0smNe96l//dZS8uXu Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxad2cf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:07 -0400 (EDT) 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 68AHb6pZ038770 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:06 -0400 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; Thu, 10 Sep 2026 13:37:06 -0400 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; Thu, 10 Sep 2026 13:37:06 -0400 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; Thu, 10 Sep 2026 13:37:06 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSZ018832; Thu, 10 Sep 2026 13:37:00 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:21 +0200 Subject: [PATCH v7 03/17] iio: backend: Add support for CRC Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-3-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=3821; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=h8rpUQCVfSyFWZ0W5MDo7rp1yKN/O8pCD8GN49kfEBA=; b=IF6o5ZHZVBNGG9RIMjL0nKvFMTrnN5gZcCvqKOyTMHMd16s5aHCriCaomTcwgIxkUXNY6MLzg OhjiS3BSl/wBukE0/OAKkCJgMXQSZWbX7jkCs/wIXzoMAZ4RskMwcNt X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX5wgg1DlnXUni a7tc0s9/2ftrTFc99CKs/2z2iGqUGy+Rkvb8jxXFdmCTJM/i/OCMI2sbw4ZEGYgghJWgfpu7Ypl 2xnSYfGp71s8Qr8Eabi9yM+611KcLUhukppn+bfNTfW9OEpmXlAm X-Authority-Analysis: v=2.4 cv=Ao17T+9P c=1 sm=1 tr=0 ts=6aa2eac3 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=IpJZQVW2AAAA:8 a=gAnH3GRIAAAA:8 a=O6R5dNVUA00TSld12QQA:9 a=QEXdDO2ut3YA:10 a=IawgGOuG5U0WyFbmm1f5:22 X-Proofpoint-GUID: MKDThIqtr7XmxGEUvr9pt0L3pv_phg4w X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX3jBzA4ZRuQqg 9PBJuOilokVcVtFx1vae7W9Q+crufKGuhqGX0YO2q9sRxjnEKpCmMQKgJglZanmTwXsiAEFpyJ3 ty+9A8oNpFGw1SEOBLXoISbo00tQ4qoDUEoHzaW1AkiP2K69Zpc2/wjj7/XGfki/O3ZI07HRiA4 ryd3LuBauMQ8mXqq+rgexVQ/oE7eoQBBVcd4ChUKsqMRQjqriIYSx3SilzCnKDbPhNsMBWGmk8Q xX+7hCmEnl5R0ctrkgyFSJVc2zuJOJWgv7camhcrYqzPdIdkQ7QK+zTOJOc2KAdNyjx15nM2J3d emHmjrloxCT3UUSTDWBBSlJ6iEsRJeGDqOVPfL1nJSOXpK1n9D00m6y6kb1OPz2ma5b97HXlmVW WyWoagbNe8bgWDFWDghMNwFAODhJClVRnJbIzjew3GZXeC74da9zul+0k9u/eQN9ZmtQeaAh3An 1PkhqzeMBaGMm2ihJkw== X-Proofpoint-ORIG-GUID: MKDThIqtr7XmxGEUvr9pt0L3pv_phg4w X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 spamscore=0 phishscore=0 lowpriorityscore=0 suspectscore=0 impostorscore=0 adultscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Add a backend operation to enable or disable direction-specific CRC handling. On input data paths, the backend handles CRC data generated by the frontend. On output data paths, the backend generates CRC data for the frontend to verify. Reviewed-by: David Lechner Signed-off-by: Janani Sunil Reviewed-by: Andy Shevchenko --- drivers/iio/industrialio-backend.c | 33 +++++++++++++++++++++++++++++++++ include/linux/iio/backend.h | 6 ++++++ 2 files changed, 39 insertions(+) diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio-= backend.c index f7a4be8ec320..fbf5c39d7655 100644 --- a/drivers/iio/industrialio-backend.c +++ b/drivers/iio/industrialio-backend.c @@ -886,6 +886,39 @@ int iio_backend_num_lanes_set(struct iio_backend *back= , unsigned int num_lanes) } EXPORT_SYMBOL_NS_GPL(iio_backend_num_lanes_set, "IIO_BACKEND"); =20 +/** + * iio_backend_crc_enable - Enable CRC handling + * @back: Backend device + * + * On input data paths, enable backend handling of CRC data generated by t= he + * frontend. On output data paths, enable the backend to generate CRC data= for + * the frontend to verify. + * + * RETURNS: + * 0 on success, negative error number on failure. + */ +int iio_backend_crc_enable(struct iio_backend *back) +{ + return iio_backend_op_call(back, crc_enable); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_crc_enable, "IIO_BACKEND"); + +/** + * iio_backend_crc_disable - Disable CRC handling + * @back: Backend device + * + * On input data paths, disable backend handling of CRC data generated by = the + * frontend. On output data paths, disable CRC generation by the backend. + * + * RETURNS: + * 0 on success, negative error number on failure. + */ +int iio_backend_crc_disable(struct iio_backend *back) +{ + return iio_backend_op_call(back, crc_disable); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_crc_disable, "IIO_BACKEND"); + /** * iio_backend_ddr_enable - Enable interface DDR (Double Data Rate) mode * @back: Backend device diff --git a/include/linux/iio/backend.h b/include/linux/iio/backend.h index 3f95ed1fdf9e..9c16b695a602 100644 --- a/include/linux/iio/backend.h +++ b/include/linux/iio/backend.h @@ -133,6 +133,8 @@ enum iio_backend_capabilities { * @filter_type_set: Set filter type. * @interface_data_align: Perform the data alignment process. * @num_lanes_set: Set the number of lanes enabled. + * @crc_enable: Enable direction-specific CRC handling. + * @crc_disable: Disable direction-specific CRC handling. * @ddr_enable: Enable interface DDR (Double Data Rate) mode. * @ddr_disable: Disable interface DDR (Double Data Rate) mode. * @data_stream_enable: Enable data stream. @@ -189,6 +191,8 @@ struct iio_backend_ops { enum iio_backend_filter_type type); int (*interface_data_align)(struct iio_backend *back, u32 timeout_us); int (*num_lanes_set)(struct iio_backend *back, unsigned int num_lanes); + int (*crc_enable)(struct iio_backend *back); + int (*crc_disable)(struct iio_backend *back); int (*ddr_enable)(struct iio_backend *back); int (*ddr_disable)(struct iio_backend *back); int (*data_stream_enable)(struct iio_backend *back); @@ -237,6 +241,8 @@ int iio_backend_filter_type_set(struct iio_backend *bac= k, enum iio_backend_filter_type type); int iio_backend_interface_data_align(struct iio_backend *back, u32 timeout= _us); int iio_backend_num_lanes_set(struct iio_backend *back, unsigned int num_l= anes); +int iio_backend_crc_enable(struct iio_backend *back); +int iio_backend_crc_disable(struct iio_backend *back); int iio_backend_ddr_enable(struct iio_backend *back); int iio_backend_ddr_disable(struct iio_backend *back); int iio_backend_data_stream_enable(struct iio_backend *back); --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 E961A568550; Thu, 10 Sep 2026 17:37:31 +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=1789061861; cv=none; b=sgpj/JcFGOUVYiFmu/0UEmMxjCOhLijohoVAfIbftIa0YHv3pYG33VrGIhvNVuK6JzPqAFPTve4Z0vL5K+WNUNhiNgTvR8MiewzmaRvaoVeqetiy3FqOJ4lGboATdRPIUWx43F9VnIizYaQmEEMVrZMw/HUbDt7DLwACI3yn36M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061861; c=relaxed/simple; bh=9U3ZkBZOT0Bl66QSM9ctgUcEGlj948n+eirxEEksq7c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=tM3+67ToScd5Ta9Yi3dePS5YwCDBHlFSPoUOjQwkotAWDMcbx72deleh1RmDDS/ThqMN/sH3kOdHnJJVeCUWKIlk8iKvirA9Kts9PJPPJBNl6eir7aAywKu4m524Djjn5cgUOgpcWs87wMCLKOzYzrP6X5/SGaxyAdhu9cTuL5c= 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=eMfS/s1E; 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="eMfS/s1E" 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 68AF7G6O3263777; Thu, 10 Sep 2026 13:37:11 -0400 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=/fLlw wIH4FuW6mKbSN23ldhiq5zEMnS/TMI1O212qdc=; b=eMfS/s1EaupP2uo24W7Ip 4e01/gDxo5NalshNdJTvXNKEd2pRMfSU3jpD/zzaHW2SzVj/9WD4RWItlPgV/k4g wF+rnP/C6K+KTyGJgZ78CXWWM4ivqfzvHej2Nt/ofHb1UfXs2AANIP6qD4AD/3QH gNpo+YfiOJ3DfHljZkFgHgMNo57WDqWeywYZvUca+PtIZgsi6SG+39gpMQDwxMPO wN+oLaO8Vblw9JPXK2zDbgcAPnAWSiWQ41h0eWqDiQndIv4s/o5VvdPs/HkAarxI 15qAeR5PGuyl30tJuqHFErzSNN/hkwan+Udjnc2q3hjWocaEuDmNDVVFtGI9VFlx g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxcd0v7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:10 -0400 (EDT) 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 68AHb9Em038776 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:09 -0400 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; Thu, 10 Sep 2026 13:37:09 -0400 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; Thu, 10 Sep 2026 13:37:09 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSa018832; Thu, 10 Sep 2026 13:37:03 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:22 +0200 Subject: [PATCH v7 04/17] iio: adc: adi-axi-adc: Add support for CRC Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-4-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , David Lechner , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=2263; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=9U3ZkBZOT0Bl66QSM9ctgUcEGlj948n+eirxEEksq7c=; b=RhzyMQx7Q8mUvSf8YnF39oys+nR0JkWZ6tiUbqDp2GORB/aFyFS4uI8wx5x4HfWIcoQnLubAm l4km2a8Xf7EC0JvRKbTsSy1fFzEEH0trFsrCh//B0y3RM8DA4TtHcNv X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Authority-Analysis: v=2.4 cv=PZFqFShd c=1 sm=1 tr=0 ts=6aa2eac7 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2:22 a=IpJZQVW2AAAA:8 a=gAnH3GRIAAAA:8 a=xcMXqGzQfnDy9uQaBxsA:9 a=QEXdDO2ut3YA:10 a=IawgGOuG5U0WyFbmm1f5:22 X-Proofpoint-GUID: oJ1odNfbFKkZH7jYTYOZC-W4wpkU5vG7 X-Proofpoint-ORIG-GUID: oJ1odNfbFKkZH7jYTYOZC-W4wpkU5vG7 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfXwAjcUVNdQZa7 5lj4T5podBrQmmdSvfw2lwlpKRUCxCuU8RYVFRXvhUEwJC/rRMARLe3DM9aIAlKy5AnZbHzBHYg S90nL3rpmGB+gJPjlOl+8eBG/bUPrgFxUaeEOKp/1KKOs2afdYlJYSeWFFBhETyPlap1SrAX9KM shGzH8t2CBIG2WOdhgsq9iKvcnUsG6u2u/P4ZEPY+6nlMwkOi9xy94zCVx6OdYQ2JzjbItMGmSQ a0tzz1l+mrrurBepw7Vs5/d9YQkNDhzhOMpUIuiJ7J9T7vV1WQQJ72xV3T/5wGII2dTib/LlmLr 2pl7uGejQYY4/zVSbM60EgaV9YcJRi47PnrNEgabf6xq2L/cvsklKvUzuzOD8gGskI0RTo2iLkV 8VIOba4fqHTBfhqhRzm88jXtTKX5hxAjBwzqZEn2YiR6L22DyICEHm/C2huNTO1SSW2c1m7T1De bc94fCZFmKJN580q4xw== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX8Pc0WBfJzHFg 9sdoB8oxoqmNbovIk/FwnovK1meAMq8Lg+fDGfaCfjHq1MwtoG7r3ah+JrX73rwASemJ3+FFyKL BslwgCmTczMQtyjiqzGa0pZ5gohGC9gYHMNDHhPnlK1Jr2VlKKOP X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 suspectscore=0 spamscore=0 clxscore=1015 priorityscore=1501 bulkscore=0 phishscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Add support for enabling and disabling Cyclic Redundancy Check (CRC) processing in the AXI ADC backend. CRC provides data integrity verification for high-speed ADC data streams, ensuring reliable data transfer between the ADC frontend and backend processing systems. Reviewed-by: David Lechner Signed-off-by: Janani Sunil Reviewed-by: Andy Shevchenko --- drivers/iio/adc/adi-axi-adc.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c index fc7cc92b35f0..8b7c45d51dbe 100644 --- a/drivers/iio/adc/adi-axi-adc.c +++ b/drivers/iio/adc/adi-axi-adc.c @@ -47,6 +47,9 @@ #define ADI_AXI_ADC_CTRL_DDR_EDGESEL_MASK BIT(1) =20 #define ADI_AXI_ADC_REG_CNTRL_3 0x004c +/* Bit 8 is common to all AXI ADC cores; bits 7-0 are per-HDL-project. */ +#define ADI_AXI_ADC_CNTRL_3_CRC_EN_MASK BIT(8) + #define AXI_AD485X_CNTRL_3_OS_EN_MSK BIT(2) #define AXI_AD485X_CNTRL_3_PACKET_FORMAT_MSK GENMASK(1, 0) #define AXI_AD485X_PACKET_FORMAT_20BIT 0x0 @@ -596,6 +599,22 @@ static int axi_adc_reg_access(struct iio_backend *back= , unsigned int reg, return regmap_write(st->regmap, reg, writeval); } =20 +static int axi_adc_crc_enable(struct iio_backend *back) +{ + struct adi_axi_adc_state *st =3D iio_backend_get_priv(back); + + return regmap_set_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, + ADI_AXI_ADC_CNTRL_3_CRC_EN_MASK); +} + +static int axi_adc_crc_disable(struct iio_backend *back) +{ + struct adi_axi_adc_state *st =3D iio_backend_get_priv(back); + + return regmap_clear_bits(st->regmap, ADI_AXI_ADC_REG_CNTRL_3, + ADI_AXI_ADC_CNTRL_3_CRC_EN_MASK); +} + static const struct regmap_config axi_adc_regmap_config =3D { .val_bits =3D 32, .reg_bits =3D 32, @@ -644,6 +663,8 @@ static const struct iio_backend_ops adi_axi_adc_ops =3D= { .num_lanes_set =3D axi_adc_num_lanes_set, .debugfs_reg_access =3D iio_backend_debugfs_ptr(axi_adc_reg_access), .debugfs_print_chan_status =3D iio_backend_debugfs_ptr(axi_adc_debugfs_pr= int_chan_status), + .crc_enable =3D axi_adc_crc_enable, + .crc_disable =3D axi_adc_crc_disable, }; =20 static const struct iio_backend_info adi_axi_adc_generic =3D { --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 3A44149E5D2; Thu, 10 Sep 2026 17:37:37 +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=1789061871; cv=none; b=a7auZDFHHSrq3KvW/aVRz96pxdMlk/aau/Ia4eiwU8R9KcI/cVOpGWzwvX0C4o8G9GjKQHql+vBxqGvnGBeIfHWbQfKC6it+H/iuLa5EzPd7bodNzKe6+mSEtXO++QyolvY/n3bBMKSr5GVOu8jQ7qdj0WYgqzlvKgu9es1rgkk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061871; c=relaxed/simple; bh=k7hK/1dYtWhMnTCnXN/3OikHsOG+8e/Lb2mH0MNTet8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=U2C8Lew7mG90hx42HHWAnShHZW261uGuqyBOPen6v8CWl5+k0oMYc2uqGyceiIHy+K1Z9vS1Fn9rXQpGvBnhz4vt7Yp88AS1NC3a2xIaFzByRG4Ob8uKAJuTr6VUKsm4Nxwv7j3tH45OkXTYKhz2TqC009GxqjyP0FBHj/5ywi0= 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=P27x4pxb; 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="P27x4pxb" 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 68AF7CXo3263705; Thu, 10 Sep 2026 13:37:15 -0400 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=5zMks cKfzeerxjAwePJad9dtriLAdh/FB0EtEVEMEPs=; b=P27x4pxbMXsQTtzyJyEwz beUVK0646rAsM9dTwiDoJNT/gmgS8hAzdaIwx/uoSRWJe5wK/fydBhzuoZRhLKbS CBCjgZMNalYV7IK1kidY4VsjTrtm9FXjvGhJZBbY/vbGVbmDfvLFQRuUvAy3WW4E CuXIBFOKZWeaUA4V9l9e6nAUgG1Mfz/9nF66nGz4Hi8EajX2gpDJVnSEEXhx0teJ fU9tcL1gNvExqtjcEw6IyEY5Vc6qZkBHA9Gqh2OcXK3Vw3gSsjINyOCMiI68+mWa QdUNLK67Xj/n2UrpV04wEn3HleYbbZuVWLuxXdTfDNspQbNHEvgISDfWnzx7aMAx A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxcd0vb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:14 -0400 (EDT) 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 68AHbDlp038785 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:13 -0400 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; Thu, 10 Sep 2026 13:37:13 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Thu, 10 Sep 2026 13:37:13 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Thu, 10 Sep 2026 13:37:13 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSb018832; Thu, 10 Sep 2026 13:37:07 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:23 +0200 Subject: [PATCH v7 05/17] iio: adc: Add AD7768 and AD7768-4 core support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-5-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=31858; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=k7hK/1dYtWhMnTCnXN/3OikHsOG+8e/Lb2mH0MNTet8=; b=dOwhMYEWeebrstPqyHD/NIYzvwX/XrdpG8eSJ5kM/360SqiZt1YdlPMeKQkugRh3YT9R4rHqi biDL1+PWsTQCSGKhy0mrxrYR/OuadpQUlgVBseN7HBlv12oJrcdwK90 X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Authority-Analysis: v=2.4 cv=PZFqFShd c=1 sm=1 tr=0 ts=6aa2eacb cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2:22 a=gAnH3GRIAAAA:8 a=VwQbUJbxAAAA:8 a=xaEP9h1eQhWwnVAwg-4A:9 a=QEXdDO2ut3YA:10 X-Proofpoint-GUID: 0ARX6PNWRfA7qRIEBH_QK2raUy4dy_c9 X-Proofpoint-ORIG-GUID: 0ARX6PNWRfA7qRIEBH_QK2raUy4dy_c9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX6JZqqetfV2/9 TZVveQ9Mce36tABJfl30q0FrFZVvOpMkNqSEuMx8k6mRhkTXfvMpRSphYbTAy4wuWofgMVmLb4a Zb/Yk4qRdFiZdpnQnlAIrySz/bfAymWziYUcKlU2rwl9UTTGtc0tH0FyKncW7br5qj5erMen51A MWY4X1Jgi0F+lXYbnh+kq6hhKif5x87S/XKhfA7yz5XrnuQK+7c0QGzDdRynXH3TDgt/+gyt3Q/ C57ThuiO0sx+xIac3PtO8TkpXNPIUtWldSVaMTVFNQ6w9c5vAWXCh11qDVwVTgvxxgn4sierm/w xOcGDCvM8jJclntA6DWZ8VdgE/SSaKvZMxFkh1f9XGJGh+KIkMBMhkHHeQwTECgwvVq9tNwODmj HF2vnvhB780avYkxDCgKxJF3TbW1gl9cH5A2nREmT+3b1buWsWQMyQ84ezKiF5ngOvj189h09w8 DasU3ipwu85oRPflPZA== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX4Ugor2qFdcRQ 0EZlJ+vplXmfHxRoRbn4odBkfMK/CyAXeWLvwcf65sP7+07ynUMNtyddEZp4F1JMyqZFEskzoTc FcwJVHOUn4epKQ92hWx2lmnnFWhB02mumESqy48KO9WD6TDC8W60 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 suspectscore=0 spamscore=0 clxscore=1015 priorityscore=1501 bulkscore=0 phishscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Add core support for the AD7768 and AD7768-4 simultaneous sampling ADCs. Configure supplies, clock and reset, use a custom regmap bus for the SPI protocol, and parse the enabled channels and input buffer settings from devicetree. Connect the converter to an IIO backend for buffered capture with CRC, provide a fixed safe wideband sampling configuration and add runtime power management. Signed-off-by: Janani Sunil --- MAINTAINERS | 1 + drivers/iio/adc/Kconfig | 14 + drivers/iio/adc/Makefile | 1 + drivers/iio/adc/ad7768.c | 1033 ++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 1049 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index f05e7f4d364a..de91903b0b45 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1663,6 +1663,7 @@ L: linux-iio@vger.kernel.org S: Supported W: https://ez.analog.com/linux-software-drivers F: Documentation/devicetree/bindings/iio/adc/adi,ad7768.yaml +F: drivers/iio/adc/ad7768.c =20 ANALOG DEVICES INC AD7780 DRIVER M: Michael Hennerich diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 415e519ad4eb..5164608fa418 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -431,6 +431,20 @@ config AD7766 To compile this driver as a module, choose M here: the module will be called ad7766. =20 +config AD7768 + tristate "Analog Devices AD7768/AD7768-4 ADC driver" + depends on SPI + depends on REGULATOR || COMPILE_TEST + select IIO_BUFFER + select IIO_BACKEND + select REGMAP + help + Say yes here to build support for Analog Devices AD7768 and AD7768-4 + SPI analog to digital converters. + + To compile this driver as a module, choose M here: the module will be + called ad7768. + config AD7768_1 tristate "Analog Devices AD7768-1 ADC driver" depends on SPI diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index dcec0abb03b7..c84f1a5eeac0 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile @@ -39,6 +39,7 @@ obj-$(CONFIG_AD7606_IFACE_SPI) +=3D ad7606_spi.o obj-$(CONFIG_AD7606) +=3D ad7606.o obj-$(CONFIG_AD7625) +=3D ad7625.o obj-$(CONFIG_AD7766) +=3D ad7766.o +obj-$(CONFIG_AD7768) +=3D ad7768.o obj-$(CONFIG_AD7768_1) +=3D ad7768-1.o obj-$(CONFIG_AD7779) +=3D ad7779.o obj-$(CONFIG_AD7780) +=3D ad7780.o diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c new file mode 100644 index 000000000000..3cb58c2554a3 --- /dev/null +++ b/drivers/iio/adc/ad7768.c @@ -0,0 +1,1033 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Analog Devices AD7768 ADC driver + * + * Copyright 2018-2026 Analog Devices Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define AD7768_REG_CH_STANDBY 0x00 + +#define AD7768_REG_CH_MODE(x) (0x01 + (x)) +#define AD7768_CH_MODE_FILTER_TYPE_MSK BIT(3) +#define AD7768_CH_MODE_FILTER_TYPE_WIDEBAND 0x0 +#define AD7768_CH_MODE_DEC_RATE_MSK GENMASK(2, 0) +#define AD7768_CH_MODE_DEC_RATE_64 0x1 + +#define AD7768_REG_CH_MODE_SEL 0x03 + +#define AD7768_REG_POWER_MODE 0x04 +#define AD7768_SLEEP_MODE_MSK BIT(7) +#define AD7768_POWER_MODE_POWER_MODE_MSK GENMASK(5, 4) +#define AD7768_POWER_MODE_POWER_MODE_FAST 0x3 +#define AD7768_POWER_MODE_LVDS_ENABLE BIT(3) +#define AD7768_POWER_MODE_MCLK_DIV_MSK GENMASK(1, 0) + +#define AD7768_REG_DATA_CONTROL 0x06 +#define AD7768_DATA_CONTROL_SPI_RESET_1 0x03 +#define AD7768_DATA_CONTROL_SPI_RESET_2 0x02 +#define AD7768_DATA_CONTROL_SPI_SYNC BIT(7) + +#define AD7768_REG_INTERFACE_CFG 0x07 +#define AD7768_INTERFACE_CFG_CRC_SELECT_MSK GENMASK(3, 2) +#define AD7768_INTERFACE_CFG_CRC_SELECT_4 0x1 +#define AD7768_INTERFACE_CFG_DCLK_DIV_MSK GENMASK(1, 0) +#define AD7768_INTERFACE_CFG_DCLK_DIV_8 0x0 +#define AD7768_INTERFACE_CFG_DCLK_DIV_4 0x1 +#define AD7768_INTERFACE_CFG_DCLK_DIV_2 0x2 +#define AD7768_INTERFACE_CFG_DCLK_DIV_1 0x3 + +#define AD7768_REG_REV_ID 0x0A +#define AD7768_REV_ID_VAL 0x06 + +#define AD7768_REG_GPIO_CONTROL 0x0E +#define AD7768_GPIO_UGPIO_ENABLE BIT(7) +#define AD7768_GPIO4_OUTPUT_ENABLE BIT(4) + +#define AD7768_REG_GPIO_WRITE 0x0F + +#define AD7768_REG_PRECHARGE_BUF1 0x11 +#define AD7768_REG_PRECHARGE_BUF2 0x12 +#define AD7768_PREBUF_POS_EN(ch) BIT((ch) * 2 + 0) +#define AD7768_PREBUF_NEG_EN(ch) BIT((ch) * 2 + 1) + +#define AD7768_REG_REFP_BUF 0x13 +#define AD7768_REG_REFN_BUF 0x14 + +#define AD7768_REG_OFFSET_BASE 0x1E +#define AD7768_REG_GAIN_BASE 0x36 +#define AD7768_REG_PHASE_BASE 0x4E +#define AD7768_REG_OFFSET(ch) (AD7768_REG_OFFSET_BASE + 3 * (ch)) +#define AD7768_REG_GAIN(ch) (AD7768_REG_GAIN_BASE + 3 * (ch)) +#define AD7768_REG_PHASE(ch) (AD7768_REG_PHASE_BASE + (ch)) + +#define AD7768_REG_DIAGNOSTIC_RX 0x56 + +#define AD7768_REG_CHOP_CTRL 0x59 + +#define AD7768_SPI_READ_CMD BIT(15) +#define AD7768_SPI_REG_MASK GENMASK(14, 8) +#define AD7768_SPI_DATA_MASK GENMASK(7, 0) + +#define AD7768_MAX_CHANNEL 8 + +enum ad7768_clock_source { + AD7768_CLOCK_SOURCE_MCLK, + AD7768_CLOCK_SOURCE_XTAL, + AD7768_CLOCK_SOURCE_LVDS, +}; + +struct ad7768_precharge_config { + bool prebufp_en; + bool prebufn_en; + bool refbufp; + bool refbufn; +}; + +struct ad7768_chip_info { + const char *name; + const struct regmap_config *regmap_config; + const unsigned int *available_datalines; + unsigned int num_datalines; + unsigned int num_channels; + const u8 *chan_map; + u8 prebuf_split; +}; + +struct ad7768_state { + struct regmap *regmap; + struct clk *mclk; + unsigned int datalines; + enum ad7768_clock_source clock_source; + const struct ad7768_chip_info *chip_info; + struct iio_backend *back; + unsigned int vref_uV[2]; + + __be16 d16 __aligned(IIO_DMA_MINALIGN); +}; + +static const unsigned int ad7768_available_datalines[] =3D { + 1, 2, 8, +}; + +static const unsigned int ad7768_4_available_datalines[] =3D { + 1, 4, +}; + +static const u8 ad7768_chan_map[] =3D { + 0, 1, 2, 3, 4, 5, 6, 7, +}; + +static const u8 ad7768_4_chan_map[] =3D { + 0, 1, 4, 5, +}; + +static const char * const ad7768_supply_names[] =3D { + "avdd2", "iovdd", +}; + +static const char * const ad7768_vref_supply_names[][2] =3D { + { "ref1p", "ref1n" }, + { "ref2p", "ref2n" }, +}; + +static const char * const ad7768_clock_names[] =3D { + [AD7768_CLOCK_SOURCE_MCLK] =3D "mclk", + [AD7768_CLOCK_SOURCE_XTAL] =3D "xtal", + [AD7768_CLOCK_SOURCE_LVDS] =3D "lvds", +}; + +static u8 ad7768_channel_mask(const struct ad7768_state *st, u8 ch) +{ + return BIT(st->chip_info->chan_map[ch]); +} + +static u8 ad7768_all_standby_mask(const struct ad7768_state *st) +{ + return GENMASK(st->chip_info->num_channels - 1, 0); +} + +static u8 ad7768_precharge_buf1_mask(const struct ad7768_state *st, u16 va= l) +{ + return val & GENMASK(st->chip_info->prebuf_split - 1, 0); +} + +static u8 ad7768_precharge_buf2_mask(const struct ad7768_state *st, u16 va= l) +{ + unsigned int split =3D st->chip_info->prebuf_split; + + return field_get(GENMASK(2 * split - 1, split), val); +} + +static int ad7768_regmap_read(void *context, const void *reg_buf, + size_t reg_size, void *val_buf, size_t val_size) +{ + struct ad7768_state *st =3D spi_get_drvdata(context); + struct spi_device *spi =3D context; + struct spi_transfer t[] =3D { + { + .tx_buf =3D &st->d16, + .len =3D sizeof(st->d16), + .cs_change =3D 1, + }, { + /* + * Register responses are delayed by one CS frame. While + * receiving the response to this read, the device also + * decodes another command on SDI. Repeat the read + * command to avoid sending an unspecified dummy + * command. + */ + .tx_buf =3D &st->d16, + .rx_buf =3D &st->d16, + .len =3D sizeof(st->d16), + }, + }; + u8 *data_val =3D val_buf; + unsigned int reg; + int ret; + + reg =3D *(const u8 *)reg_buf; + + st->d16 =3D be16_replace_bits(cpu_to_be16(AD7768_SPI_READ_CMD), reg, + AD7768_SPI_REG_MASK); + + ret =3D spi_sync_transfer(spi, t, ARRAY_SIZE(t)); + if (ret) + return ret; + + *data_val =3D be16_get_bits(st->d16, AD7768_SPI_DATA_MASK); + + return 0; +} + +static int ad7768_regmap_write(void *spi, const void *data, size_t count) +{ + return spi_write(spi, data, count); +} + +static const struct regmap_bus ad7768_regmap_bus =3D { + .read =3D ad7768_regmap_read, + .write =3D ad7768_regmap_write, + .reg_format_endian_default =3D REGMAP_ENDIAN_BIG, + .val_format_endian_default =3D REGMAP_ENDIAN_BIG, +}; + +static bool ad7768_readable_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case AD7768_REG_CH_STANDBY ... AD7768_REG_REV_ID: + case AD7768_REG_GPIO_CONTROL ... AD7768_REG_REFN_BUF: + case AD7768_REG_OFFSET(0) ... AD7768_REG_OFFSET(7) + 2: + case AD7768_REG_GAIN(0) ... AD7768_REG_GAIN(7) + 2: + case AD7768_REG_PHASE(0) ... AD7768_REG_PHASE(7): + case AD7768_REG_DIAGNOSTIC_RX ... AD7768_REG_CHOP_CTRL: + return true; + default: + return false; + } +} + +static bool ad7768_4_readable_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case AD7768_REG_CH_STANDBY ... AD7768_REG_REV_ID: + case AD7768_REG_GPIO_CONTROL ... AD7768_REG_REFN_BUF: + case AD7768_REG_OFFSET(0) ... AD7768_REG_OFFSET(1) + 2: + case AD7768_REG_OFFSET(4) ... AD7768_REG_OFFSET(5) + 2: + case AD7768_REG_GAIN(0) ... AD7768_REG_GAIN(1) + 2: + case AD7768_REG_GAIN(4) ... AD7768_REG_GAIN(5) + 2: + case AD7768_REG_PHASE(0) ... AD7768_REG_PHASE(1): + case AD7768_REG_PHASE(4) ... AD7768_REG_PHASE(5): + case AD7768_REG_DIAGNOSTIC_RX ... AD7768_REG_CHOP_CTRL: + return true; + default: + return false; + } +} + +static const struct regmap_config ad7768_regmap_config =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .max_register =3D AD7768_REG_CHOP_CTRL, + /* + * Regmap bulk transfers use one starting address, while each register + * access requires a separate 16-bit SPI frame and reads use an off-frame + * response. Split bulk transfers into individual register accesses. + */ + .use_single_read =3D true, + .use_single_write =3D true, + .readable_reg =3D ad7768_readable_reg, +}; + +static const struct regmap_config ad7768_4_regmap_config =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .max_register =3D AD7768_REG_CHOP_CTRL, + /* + * Regmap bulk transfers use one starting address, while each register + * access requires a separate 16-bit SPI frame and reads use an off-frame + * response. Split bulk transfers into individual register accesses. + */ + .use_single_read =3D true, + .use_single_write =3D true, + .readable_reg =3D ad7768_4_readable_reg, +}; + +static int ad7768_reg_access(struct iio_dev *indio_dev, + unsigned int reg, + unsigned int writeval, + unsigned int *readval) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + int ret; + + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(regmap_get_device(st->regmap), pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + + if (readval) + return regmap_read(st->regmap, reg, readval); + + return regmap_write(st->regmap, reg, writeval); +} + +static int ad7768_sync(struct ad7768_state *st) +{ + int ret; + + ret =3D regmap_clear_bits(st->regmap, AD7768_REG_DATA_CONTROL, + AD7768_DATA_CONTROL_SPI_SYNC); + if (ret) + return ret; + + return regmap_set_bits(st->regmap, AD7768_REG_DATA_CONTROL, + AD7768_DATA_CONTROL_SPI_SYNC); +} + +static int ad7768_update_scan_mode(struct iio_dev *indio_dev, + const unsigned long *scan_mask) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + unsigned long channel_mask; + unsigned long standby_mask; + int ret; + + channel_mask =3D ad7768_all_standby_mask(st); + standby_mask =3D channel_mask & ~*scan_mask; + + /* + * Crystal excitation requires channel 4 on AD7768 or channel 2 on + * AD7768-4 to remain active. + */ + if (st->clock_source =3D=3D AD7768_CLOCK_SOURCE_XTAL) + __clear_bit(st->chip_info->num_channels / 2, &standby_mask); + + ret =3D regmap_update_bits(st->regmap, AD7768_REG_CH_STANDBY, + channel_mask, standby_mask); + if (ret) + return ret; + + for (unsigned int ch =3D 0; ch < st->chip_info->num_channels; ch++) { + if (test_bit(ch, scan_mask)) + ret =3D iio_backend_chan_enable(st->back, ch); + else + ret =3D iio_backend_chan_disable(st->back, ch); + if (ret) + return ret; + } + + return 0; +} + +static const struct ad7768_chip_info ad7768_chip_info =3D { + .name =3D "ad7768", + .num_channels =3D 8, + .regmap_config =3D &ad7768_regmap_config, + .available_datalines =3D ad7768_available_datalines, + .num_datalines =3D ARRAY_SIZE(ad7768_available_datalines), + .chan_map =3D ad7768_chan_map, + .prebuf_split =3D 8, +}; + +static const struct ad7768_chip_info ad7768_4_chip_info =3D { + .name =3D "ad7768-4", + .num_channels =3D 4, + .regmap_config =3D &ad7768_4_regmap_config, + .available_datalines =3D ad7768_4_available_datalines, + .num_datalines =3D ARRAY_SIZE(ad7768_4_available_datalines), + .chan_map =3D ad7768_4_chan_map, + .prebuf_split =3D 4, +}; + +static int ad7768_buffer_preenable(struct iio_dev *indio_dev) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + + return pm_runtime_resume_and_get(regmap_get_device(st->regmap)); +} + +static int ad7768_buffer_postdisable(struct iio_dev *indio_dev) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + + pm_runtime_put_autosuspend(regmap_get_device(st->regmap)); + return 0; +} + +static const struct iio_buffer_setup_ops ad7768_buffer_ops =3D { + .preenable =3D ad7768_buffer_preenable, + .postdisable =3D ad7768_buffer_postdisable, +}; + +static int ad7768_read_scale(struct ad7768_state *st, + const struct iio_chan_spec *chan, + int *val, int *val2) +{ + unsigned int vref_idx; + + vref_idx =3D chan->channel >=3D st->chip_info->num_channels / 2; + *val =3D 2 * st->vref_uV[vref_idx] / (MICRO / MILLI); + *val2 =3D chan->scan_type.realbits; + + return IIO_VAL_FRACTIONAL_LOG2; +} + +static int ad7768_read_raw(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + int *val, int *val2, long info) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + + switch (info) { + case IIO_CHAN_INFO_SCALE: + return ad7768_read_scale(st, chan, val, val2); + default: + return -EINVAL; + } +} + +static const struct iio_info ad7768_info =3D { + .debugfs_reg_access =3D ad7768_reg_access, + .read_raw =3D ad7768_read_raw, + .update_scan_mode =3D ad7768_update_scan_mode, +}; + +static int ad7768_configure_precharge_buffers(struct iio_dev *indio_dev, + struct ad7768_precharge_config *precharge_cfg) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + u8 prebuf1_val, prebuf2_val; + u16 prebuf_mask =3D 0; + u8 refbufp_val =3D 0; + u8 refbufn_val =3D 0; + int ret; + + for (unsigned int ch =3D 0; ch < indio_dev->num_channels; ch++) { + u8 channel =3D indio_dev->channels[ch].channel; + + if (precharge_cfg[channel].prebufp_en) + prebuf_mask |=3D AD7768_PREBUF_POS_EN(channel); + + if (precharge_cfg[channel].prebufn_en) + prebuf_mask |=3D AD7768_PREBUF_NEG_EN(channel); + + if (precharge_cfg[channel].refbufp) + refbufp_val |=3D ad7768_channel_mask(st, channel); + + if (precharge_cfg[channel].refbufn) + refbufn_val |=3D ad7768_channel_mask(st, channel); + } + + prebuf1_val =3D ad7768_precharge_buf1_mask(st, ~prebuf_mask); + prebuf2_val =3D ad7768_precharge_buf2_mask(st, ~prebuf_mask); + + ret =3D regmap_write(st->regmap, AD7768_REG_PRECHARGE_BUF1, prebuf1_val); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD7768_REG_PRECHARGE_BUF2, prebuf2_val); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD7768_REG_REFP_BUF, refbufp_val); + if (ret) + return ret; + + return regmap_write(st->regmap, AD7768_REG_REFN_BUF, refbufn_val); +} + +static int ad7768_configure_capture(struct ad7768_state *st) +{ + unsigned int dclk_div_reg; + unsigned int mode_config; + unsigned int dclk_div; + int ret; + + ret =3D regmap_update_bits(st->regmap, AD7768_REG_POWER_MODE, + AD7768_POWER_MODE_POWER_MODE_MSK | + AD7768_POWER_MODE_MCLK_DIV_MSK, + FIELD_PREP(AD7768_POWER_MODE_POWER_MODE_MSK, + AD7768_POWER_MODE_POWER_MODE_FAST) | + FIELD_PREP(AD7768_POWER_MODE_MCLK_DIV_MSK, + AD7768_POWER_MODE_POWER_MODE_FAST)); + if (ret) + return ret; + + /* + * Start with the wideband filter and a decimation rate of 64. This + * supports every valid data-line configuration at the maximum MCLK. + */ + mode_config =3D FIELD_PREP(AD7768_CH_MODE_FILTER_TYPE_MSK, + AD7768_CH_MODE_FILTER_TYPE_WIDEBAND) | + FIELD_PREP(AD7768_CH_MODE_DEC_RATE_MSK, + AD7768_CH_MODE_DEC_RATE_64); + ret =3D regmap_update_bits(st->regmap, AD7768_REG_CH_MODE(0), + AD7768_CH_MODE_FILTER_TYPE_MSK | + AD7768_CH_MODE_DEC_RATE_MSK, + mode_config); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD7768_REG_CH_MODE_SEL, 0); + if (ret) + return ret; + + /* + * DCLK(min) is ODR * channels per DOUTx * 32. With fast mode + * (fMOD =3D MCLK / 4) and x64 decimation, this gives: + * MCLK / DCLK =3D 8 * data lines / channels. + */ + dclk_div =3D 8 * st->datalines / st->chip_info->num_channels; + switch (dclk_div) { + case 1: + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_1; + break; + case 2: + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_2; + break; + case 4: + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_4; + break; + case 8: + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_8; + break; + default: + return -EINVAL; + } + + ret =3D regmap_update_bits(st->regmap, AD7768_REG_INTERFACE_CFG, + AD7768_INTERFACE_CFG_DCLK_DIV_MSK, + FIELD_PREP(AD7768_INTERFACE_CFG_DCLK_DIV_MSK, + dclk_div_reg)); + if (ret) + return ret; + + return ad7768_sync(st); +} + +static int ad7768_parse_config(struct iio_dev *indio_dev, + struct device *dev) +{ + struct ad7768_precharge_config precharge_cfg[AD7768_MAX_CHANNEL] =3D { }; + struct ad7768_state *st =3D iio_priv(indio_dev); + const unsigned int *available_datalines; + bool datalines_valid =3D false; + struct iio_chan_spec *chan; + unsigned int num_channels; + unsigned long standby_mask; + unsigned int len; + int chan_idx =3D 0; + int ret; + + num_channels =3D device_get_named_child_node_count(dev, "channel"); + + if (num_channels =3D=3D 0) + return dev_err_probe(dev, -ENOENT, "No channel specified\n"); + + if (num_channels > st->chip_info->num_channels) + return dev_err_probe(dev, -ENOSPC, "Invalid number of channels\n"); + + chan =3D devm_kcalloc(dev, num_channels, sizeof(*chan), GFP_KERNEL); + if (!chan) + return -ENOMEM; + + indio_dev->channels =3D chan; + indio_dev->num_channels =3D num_channels; + + standby_mask =3D ad7768_all_standby_mask(st); + + /* + * Crystal excitation requires channel 4 on AD7768 or channel 2 on + * AD7768-4 to remain active. + */ + if (st->clock_source =3D=3D AD7768_CLOCK_SOURCE_XTAL) + __clear_bit(st->chip_info->num_channels / 2, &standby_mask); + + ret =3D regmap_write(st->regmap, AD7768_REG_CH_STANDBY, standby_mask); + if (ret) + return ret; + + device_for_each_named_child_node_scoped(dev, child, "channel") { + u32 channel; + + ret =3D fwnode_property_read_u32(child, "reg", &channel); + if (ret) + return dev_err_probe(dev, ret, + "Failed to parse reg of %pfwP\n", + child); + + if (channel >=3D st->chip_info->num_channels) + return dev_err_probe(dev, -ECHRNG, + "Invalid channel %u in firmware\n", + channel); + + ret =3D regmap_clear_bits(st->regmap, AD7768_REG_CH_STANDBY, + BIT(channel)); + if (ret) + return ret; + + precharge_cfg[channel].prebufp_en =3D + fwnode_property_read_bool(child, + "adi,prechargebuf-pos-enable"); + precharge_cfg[channel].prebufn_en =3D + fwnode_property_read_bool(child, + "adi,prechargebuf-neg-enable"); + precharge_cfg[channel].refbufp =3D + fwnode_property_read_bool(child, + "adi,refbuf-pos-enable"); + precharge_cfg[channel].refbufn =3D + fwnode_property_read_bool(child, + "adi,refbuf-neg-enable"); + + chan[chan_idx] =3D (struct iio_chan_spec) { + .type =3D IIO_VOLTAGE, + .info_mask_separate =3D BIT(IIO_CHAN_INFO_SCALE), + .indexed =3D 1, + .channel =3D channel, + .scan_index =3D channel, + .scan_type =3D { + .sign =3D 's', + .realbits =3D 24, + .storagebits =3D 32, + }, + }; + chan_idx++; + } + + ret =3D ad7768_configure_precharge_buffers(indio_dev, precharge_cfg); + if (ret) + return ret; + + available_datalines =3D st->chip_info->available_datalines; + len =3D st->chip_info->num_datalines; + if (device_property_present(dev, "adi,data-lines-number")) { + ret =3D device_property_read_u32(dev, "adi,data-lines-number", + &st->datalines); + if (ret) + return dev_err_probe(dev, ret, + "Invalid adi,data-lines-number property\n"); + } else { + st->datalines =3D available_datalines[len - 1]; + } + + for (unsigned int i =3D 0; i < len; i++) { + if (available_datalines[i] =3D=3D st->datalines) { + datalines_valid =3D true; + break; + } + } + + if (!datalines_valid) + return dev_err_probe(dev, -EINVAL, + "Invalid data-lines-number %d for %s\n", + st->datalines, st->chip_info->name); + + return ad7768_configure_capture(st); +} + +static int ad7768_reset(struct ad7768_state *st) +{ + struct device *dev =3D regmap_get_device(st->regmap); + struct reset_control *reset_ctrl; + unsigned long reset_low_us; + unsigned long mclk; + int ret; + + reset_ctrl =3D devm_reset_control_get_optional_exclusive(dev, NULL); + if (IS_ERR(reset_ctrl)) + return PTR_ERR(reset_ctrl); + + if (reset_ctrl) { + mclk =3D clk_get_rate(st->mclk); + if (!mclk) + return -EINVAL; + + /* + * Minimum RESET low pulse width: 2 x tMCLK + * (datasheet Table 1). + */ + reset_low_us =3D DIV_ROUND_UP_ULL(2ULL * USEC_PER_SEC, mclk); + + ret =3D reset_control_assert(reset_ctrl); + if (ret) + return ret; + + fsleep(max(1UL, reset_low_us)); + + ret =3D reset_control_deassert(reset_ctrl); + if (ret) + return ret; + } else { + ret =3D regmap_write(st->regmap, AD7768_REG_DATA_CONTROL, + AD7768_DATA_CONTROL_SPI_RESET_1); + if (ret) + return ret; + + ret =3D regmap_write(st->regmap, AD7768_REG_DATA_CONTROL, + AD7768_DATA_CONTROL_SPI_RESET_2); + if (ret) + return ret; + } + + /* ADC start-up time after reset: 1.66 ms max (datasheet Table 1) */ + fsleep(1660); + + return 0; +} + +static void ad7768_disable_clk(void *clk) +{ + clk_disable_unprepare(clk); +} + +static int ad7768_configure_xtal_clock(struct ad7768_state *st) +{ + int ret; + + ret =3D regmap_set_bits(st->regmap, AD7768_REG_GPIO_WRITE, BIT(4)); + if (ret) + return ret; + + return regmap_set_bits(st->regmap, AD7768_REG_GPIO_CONTROL, + AD7768_GPIO_UGPIO_ENABLE | + AD7768_GPIO4_OUTPUT_ENABLE); +} + +static int ad7768_enable_lvds_clock(struct ad7768_state *st) +{ + struct device *dev =3D regmap_get_device(st->regmap); + int ret; + + ret =3D regmap_clear_bits(st->regmap, AD7768_REG_GPIO_WRITE, BIT(4)); + if (ret) + return ret; + + ret =3D regmap_set_bits(st->regmap, AD7768_REG_GPIO_CONTROL, + AD7768_GPIO_UGPIO_ENABLE | + AD7768_GPIO4_OUTPUT_ENABLE); + if (ret) + return ret; + + ret =3D regmap_set_bits(st->regmap, AD7768_REG_POWER_MODE, + AD7768_POWER_MODE_LVDS_ENABLE); + if (ret) + return ret; + + ret =3D clk_prepare_enable(st->mclk); + if (ret) + return ret; + + return devm_add_action_or_reset(dev, ad7768_disable_clk, st->mclk); +} + +static int ad7768_get_enable_vref(struct device *dev, unsigned int index) +{ + const char * const *supply =3D ad7768_vref_supply_names[index]; + int refp_uV; + int refn_uV; + + refp_uV =3D devm_regulator_get_enable_read_voltage(dev, supply[0]); + if (refp_uV < 0) + return dev_err_probe(dev, refp_uV, + "Failed to get %s supply voltage\n", supply[0]); + + refn_uV =3D devm_regulator_get_enable_read_voltage(dev, supply[1]); + if (refn_uV =3D=3D -ENODEV) + refn_uV =3D 0; + else if (refn_uV < 0) + return dev_err_probe(dev, refn_uV, + "Failed to get %s supply voltage\n", supply[1]); + + if (refp_uV <=3D refn_uV) + return dev_err_probe(dev, -EINVAL, + "Invalid reference %u voltage\n", index + 1); + + return refp_uV - refn_uV; +} + +static int ad7768_enter_sleep(struct ad7768_state *st) +{ + return regmap_set_bits(st->regmap, AD7768_REG_POWER_MODE, + AD7768_SLEEP_MODE_MSK); +} + +static void ad7768_power_off(void *data) +{ + struct ad7768_state *st =3D data; + struct device *dev; + int ret; + + dev =3D regmap_get_device(st->regmap); + + ret =3D ad7768_enter_sleep(st); + if (ret) + dev_err(dev, "Failed to put device to sleep\n"); +} + +static int ad7768_probe(struct spi_device *spi) +{ + unsigned int spi_readback, rev_id; + struct device *dev =3D &spi->dev; + struct iio_dev *indio_dev; + struct ad7768_state *st; + const char *clock_name; + int ret; + + indio_dev =3D devm_iio_device_alloc(dev, sizeof(*st)); + if (!indio_dev) + return -ENOMEM; + + st =3D iio_priv(indio_dev); + spi_set_drvdata(spi, st); + + st->chip_info =3D spi_get_device_match_data(spi); + if (!st->chip_info) + return dev_err_probe(dev, -ENODATA, "Failed to get match data\n"); + + ret =3D devm_regulator_get_enable_optional(dev, "avss"); + if (ret =3D=3D -ENODEV) { + /* AVSS may be tied directly to ground instead of a regulator. */ + } else if (ret) { + return dev_err_probe(dev, ret, + "Failed to enable AVSS supply\n"); + } + + ret =3D devm_regulator_get_enable(dev, "avdd1"); + if (ret) + return dev_err_probe(dev, ret, + "Failed to enable AVDD1 supply\n"); + + ret =3D devm_regulator_bulk_get_enable(dev, + ARRAY_SIZE(ad7768_supply_names), + ad7768_supply_names); + if (ret) + return ret; + + for (unsigned int i =3D 0; i < ARRAY_SIZE(ad7768_vref_supply_names); i++)= { + ret =3D ad7768_get_enable_vref(dev, i); + if (ret < 0) + return ret; + + st->vref_uV[i] =3D ret; + } + + ret =3D device_property_match_property_string(dev, "clock-names", + ad7768_clock_names, + ARRAY_SIZE(ad7768_clock_names)); + if (ret < 0) + return dev_err_probe(dev, ret, "Invalid clock source\n"); + + st->clock_source =3D ret; + clock_name =3D ad7768_clock_names[st->clock_source]; + + /* + * The device must start on its internal clock. Keep the LVDS clock + * disabled until GPIO4 is driven low and the LVDS input is enabled in + * the power mode register. + */ + switch (st->clock_source) { + case AD7768_CLOCK_SOURCE_MCLK: + case AD7768_CLOCK_SOURCE_XTAL: + st->mclk =3D devm_clk_get_enabled(dev, clock_name); + break; + case AD7768_CLOCK_SOURCE_LVDS: + st->mclk =3D devm_clk_get(dev, clock_name); + break; + } + + if (IS_ERR(st->mclk)) + return dev_err_probe(dev, PTR_ERR(st->mclk), + "Failed to get master clock\n"); + + st->regmap =3D devm_regmap_init(dev, &ad7768_regmap_bus, spi, + st->chip_info->regmap_config); + if (IS_ERR(st->regmap)) + return PTR_ERR(st->regmap); + + ret =3D ad7768_reset(st); + if (ret) + return ret; + + /* Discard the reset response with a dummy SPI register read. */ + ret =3D regmap_read(st->regmap, AD7768_REG_REV_ID, &spi_readback); + if (ret) + return ret; + + ret =3D regmap_read(st->regmap, AD7768_REG_REV_ID, &rev_id); + if (ret) + return ret; + + if (rev_id !=3D AD7768_REV_ID_VAL) + dev_info(dev, "Unexpected revision ID 0x%02x\n", rev_id); + + switch (st->clock_source) { + case AD7768_CLOCK_SOURCE_MCLK: + break; + case AD7768_CLOCK_SOURCE_XTAL: + ret =3D ad7768_configure_xtal_clock(st); + if (ret) + return dev_err_probe(dev, ret, + "Failed to configure crystal clock\n"); + break; + case AD7768_CLOCK_SOURCE_LVDS: + ret =3D ad7768_enable_lvds_clock(st); + if (ret) + return dev_err_probe(dev, ret, + "Failed to enable LVDS clock\n"); + break; + } + + ret =3D devm_add_action_or_reset(dev, ad7768_power_off, st); + if (ret) + return ret; + + ret =3D ad7768_parse_config(indio_dev, dev); + if (ret) + return ret; + + /* + * Hardware supports CRC every 4 or 16 samples; the backend supports only + * 4-sample CRC. + */ + ret =3D regmap_update_bits(st->regmap, AD7768_REG_INTERFACE_CFG, + AD7768_INTERFACE_CFG_CRC_SELECT_MSK, + FIELD_PREP(AD7768_INTERFACE_CFG_CRC_SELECT_MSK, + AD7768_INTERFACE_CFG_CRC_SELECT_4)); + if (ret) + return ret; + + indio_dev->name =3D st->chip_info->name; + indio_dev->info =3D &ad7768_info; + indio_dev->setup_ops =3D &ad7768_buffer_ops; + + st->back =3D devm_iio_backend_get(dev, NULL); + if (IS_ERR(st->back)) + return PTR_ERR(st->back); + + ret =3D devm_iio_backend_request_buffer(dev, st->back, indio_dev); + if (ret) + return ret; + + ret =3D iio_backend_num_lanes_set(st->back, st->datalines); + if (ret) + return ret; + + ret =3D iio_backend_crc_enable(st->back); + if (ret) + return ret; + + ret =3D devm_iio_backend_enable(dev, st->back); + if (ret) + return ret; + + pm_runtime_set_autosuspend_delay(dev, 2000); + pm_runtime_use_autosuspend(dev); + ret =3D devm_pm_runtime_set_active_enabled(dev); + if (ret) + return ret; + + return devm_iio_device_register(dev, indio_dev); +} + +static int ad7768_runtime_suspend(struct device *dev) +{ + struct ad7768_state *st =3D dev_get_drvdata(dev); + + return ad7768_enter_sleep(st); +} + +static int ad7768_runtime_resume(struct device *dev) +{ + struct ad7768_state *st =3D dev_get_drvdata(dev); + int ret; + + ret =3D regmap_clear_bits(st->regmap, AD7768_REG_POWER_MODE, + AD7768_SLEEP_MODE_MSK); + if (ret) + return ret; + + /* + * The datasheet does not specify a wake-up time. Allow 20 ms for the + * ADC and digital clocks to restart. + */ + fsleep(20 * USEC_PER_MSEC); + + return 0; +} + +static DEFINE_RUNTIME_DEV_PM_OPS(ad7768_pm_ops, ad7768_runtime_suspend, + ad7768_runtime_resume, NULL); + +static const struct of_device_id ad7768_of_match[] =3D { + { .compatible =3D "adi,ad7768", .data =3D &ad7768_chip_info }, + { .compatible =3D "adi,ad7768-4", .data =3D &ad7768_4_chip_info }, + { } +}; +MODULE_DEVICE_TABLE(of, ad7768_of_match); + +static const struct spi_device_id ad7768_spi_id[] =3D { + { "ad7768", (kernel_ulong_t)&ad7768_chip_info }, + { "ad7768-4", (kernel_ulong_t)&ad7768_4_chip_info }, + { } +}; +MODULE_DEVICE_TABLE(spi, ad7768_spi_id); + +static struct spi_driver ad7768_driver =3D { + .probe =3D ad7768_probe, + .driver =3D { + .name =3D "ad7768", + .of_match_table =3D ad7768_of_match, + .pm =3D pm_ptr(&ad7768_pm_ops), + }, + .id_table =3D ad7768_spi_id, +}; +module_spi_driver(ad7768_driver); + +MODULE_AUTHOR("Stefan Popa "); +MODULE_AUTHOR("Janani Sunil "); +MODULE_DESCRIPTION("Analog Devices AD7768 ADC driver"); +MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS("IIO_BACKEND"); --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 7E3204A2A64; Thu, 10 Sep 2026 17:37:38 +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=1789061866; cv=none; b=pn+wegxNhcXM39CcD1dikuSVv3ryKeWIa8G4OGVV8Pq9d08lytXnTyL894TI7CZtuBjSLT+ze9HO+DVMTy6MyLb2jxiJeXYgI32uyWVQv5ah9DafgCC6wAjP52cC9/PyjC7D34nvqOp1PVkkB98LsgJYIuuGzoV0KG4d6MJpn/4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061866; c=relaxed/simple; bh=TL+k5c8jqO8OjcLK7T4JJ1/BN2LBdR+pUwCAsxAiVhQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=nFZwqIm1hIO1jhkaT8yNdBgD56lPVq+VhjUg/ixH2kQzbRfRYCWHPFXXHwtOfcUu8iqALTRHCyo3P3Y5JwO4hODe02/mTe35axK6Ui1IBtdw/Qe77TtHorSfYA0M0+4DfMwcLbwygRLBk+UvAPKvQyLmRO3AZk16Mlsygp+d3Cw= 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=DRNxIVRS; 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="DRNxIVRS" 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 68AF7FgA3263734; Thu, 10 Sep 2026 13:37:18 -0400 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=mLbDO BtZ6KqRd2nsycqox6v3dTROHs7fImith9hBPFA=; b=DRNxIVRSw3pv/OaWhLqaS ua2JonIqmHiKX57IDZ/3DVcsVUYy7JAwxkY4iFTVx6IAuDq7YIH9GH3y3cBQpoSj PDaWollzneH5WwkXCzn8MKg7OGEUAb5V7DcXaa+zyHK5psJmaV8KWJKnl0UkUphg aJAuDLFVNAOg3K+aELufmhV5kYvqsfRyxDpOWO8SpriAIi2b3IZeY4i0E2eL/GCr SYJFFEx6nxFtMm7BGnNl2CW6pIyAeX4/sCwZuy3OV3kG0jOFa2KKxmUiMjLo4WVk 4seKpItblSFgqM8N4x1XyvRNDuYSx2DN1qc6ZkapM+MZXg49VBJZbMcHCkgY1gse Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxcd0vg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:18 -0400 (EDT) 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 68AHbGYE038788 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:16 -0400 Received: from ASHBCASHYB5.ad.analog.com (10.64.17.133) 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; Thu, 10 Sep 2026 13:37:16 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Thu, 10 Sep 2026 13:37:16 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Thu, 10 Sep 2026 13:37:16 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSc018832; Thu, 10 Sep 2026 13:37:10 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:24 +0200 Subject: [PATCH v7 06/17] iio: adc: ad7768: Validate master clock rate Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-6-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=1985; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=TL+k5c8jqO8OjcLK7T4JJ1/BN2LBdR+pUwCAsxAiVhQ=; b=eNAKrTcA34yyrBF3CgauPbjHwliIWEUrZLXTeiHp09x5Zof+krsxCMIhZ/gSB4lgCLDkB8C/s 1ISUSRokG6uDt7EEsRPHDEWyUEBleTaTbJqEa5ni8xSRtz1FIgUolj+ X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Authority-Analysis: v=2.4 cv=PZFqFShd c=1 sm=1 tr=0 ts=6aa2eace cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2:22 a=gAnH3GRIAAAA:8 a=FJaljikgz40-E1eqKLcA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-GUID: 5oaTmD6Ut7AAKuKwUNyW0tDMx_g2z3Ji X-Proofpoint-ORIG-GUID: 5oaTmD6Ut7AAKuKwUNyW0tDMx_g2z3Ji X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfXwHlcyRwDuq+V 5kZIMqUQsOvQcx4+cHk5ybkIhR0PoRYvGMJco+vWmwLsawAHGJcnHoZHlnfA/rz4dtyzdiu25KK 5Nbv40z3A6xFIDUC00blsOTX+yQmlz8pnIqOBblIMEO4LVTD1FnYUH9tBxqjZmCppEbCnK9F2Zx 9M2w23CK7Tc9428hMqT70nujmFtYY55J8mXuFcFcxixw9iHkvSD5KdoKfEh4hmuSO0qfSpqEdlC R0uTbsuopL3NdRNwMhNQi7g84oPtnMauFK1RWUqonNII3WR4JTpjoqjtmnQrsAqeFd+sblEokuN kUNw3M9Pfc5hUWCvS5p7y4E3IWgmVV6VSFBZPWYdjCIndw6//nlY/Pccy9jfEdfT8lDwfnTsrmi xGz0bUe5qDbeGDkCyqs8m5jM1hIhx97DnHHUzutjCOY71TWwc34S6oN2rpkPhKh8DKYmRAi+mBF ZHciPFHt+eYQeaKGnsQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX4BjgUAt5bY6q krhKXfR8pbZsvjiCbode/1Bpx4nzFKRSsBUKijdHYT27HEsfhrpn607pwnsffEoe0iCYp0b3r93 Z4Ga2J8xqH2mi9yYKxCilVP6e6sNzNdqpyQjInoJ+Pb/pDfK464z X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 suspectscore=0 spamscore=0 clxscore=1015 priorityscore=1501 bulkscore=0 phishscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Reject master clock rates outside the limits specified by the device. External CMOS and LVDS clocks support 1.15 MHz to 34 MHz, while a crystal requires 8 MHz to 34 MHz. Signed-off-by: Janani Sunil Reviewed-by: Andy Shevchenko --- drivers/iio/adc/ad7768.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 3cb58c2554a3..44ba19fb2096 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -91,6 +91,9 @@ #define AD7768_SPI_REG_MASK GENMASK(14, 8) #define AD7768_SPI_DATA_MASK GENMASK(7, 0) =20 +#define AD7768_MIN_MCLK_FREQ_HZ (1150 * HZ_PER_KHZ) +#define AD7768_MIN_XTAL_FREQ_HZ (8 * HZ_PER_MHZ) +#define AD7768_MAX_MCLK_FREQ_HZ (34 * HZ_PER_MHZ) #define AD7768_MAX_CHANNEL 8 =20 enum ad7768_clock_source { @@ -807,6 +810,23 @@ static void ad7768_power_off(void *data) dev_err(dev, "Failed to put device to sleep\n"); } =20 +static int ad7768_validate_mclk_rate(struct device *dev, + const struct ad7768_state *st) +{ + unsigned long min_rate =3D AD7768_MIN_MCLK_FREQ_HZ; + unsigned long rate =3D clk_get_rate(st->mclk); + + if (st->clock_source =3D=3D AD7768_CLOCK_SOURCE_XTAL) + min_rate =3D AD7768_MIN_XTAL_FREQ_HZ; + + if (rate < min_rate || rate > AD7768_MAX_MCLK_FREQ_HZ) + return dev_err_probe(dev, -EINVAL, + "MCLK rate %lu Hz outside %lu-%lu Hz\n", + rate, min_rate, AD7768_MAX_MCLK_FREQ_HZ); + + return 0; +} + static int ad7768_probe(struct spi_device *spi) { unsigned int spi_readback, rev_id; @@ -882,6 +902,10 @@ static int ad7768_probe(struct spi_device *spi) return dev_err_probe(dev, PTR_ERR(st->mclk), "Failed to get master clock\n"); =20 + ret =3D ad7768_validate_mclk_rate(dev, st); + if (ret) + return ret; + st->regmap =3D devm_regmap_init(dev, &ad7768_regmap_bus, spi, st->chip_info->regmap_config); if (IS_ERR(st->regmap)) --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 4370556E043; Thu, 10 Sep 2026 17:37:41 +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=1789061870; cv=none; b=DAZUcQ7b4gE5ns9k6Ka+Z3iuaTOL+rDx5gsoHcc3gM3yqMM54sotzm0ZDFcyhO27l5qFpbdZnpAopAbYKB5XDlj3f3zgUmCJM3+tmX8aj9mniGDUrIjVvqXKTbVki5PMSm+MdAhrl6rAE8MGK1Oc1xyb1nQ0CsL51BxmTuL3dwg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061870; c=relaxed/simple; bh=3x7Wgo0kEm2BblffQYiq1d+jLEVI476bgnfkgy7twhw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=cNZnyquYnczvXV51c6wqlbJjmj4N/bvuDJM9crJxAmM4H8Guy6OVMBPeEqDvXdOlf1rdaVp4c6rxsmErkVHi22KbMIWzLJb9V1nMGgPkVoUzpXOOhduwwA0SFDFjBN/s+eQWUIZFeNOLwazHM8gTejMT+G5vdK9R2vMlOPDlIwM= 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=ljoDUPXD; 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="ljoDUPXD" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68AF7OqU343068; Thu, 10 Sep 2026 13:37:21 -0400 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=WyZ6G X+aD0b0dCK+Y0sWnOmEUEYsziXle+FAYqfNjHw=; b=ljoDUPXDte28yRJyYKaOw CXvpGJ3sBInNne5GQH5Kt0Kka4KBG1OHTQmmN856wP6ufyrx3NuNLs9ptuHtbhga 497+FAkTU0CF9zVZ5SJHrezgcCnxxZ6koYcIstlqNHGTiwUZZZkgKPBD/SBkpi5H GyntI+ohsxY/trTSu5HSERzYbPfClAO1hLrYwGgYHicx44LSjlQlcuEWiEDwKqJN AEgRMWavfrWcWcpNRj+4jOmuTOTMelsUHON7yUykKLLzItwO6v8FaRzxLSSrTjUJ Qamx1arbFD7ptNZZ5vg8fxMuW4DgYYZnGMAFCssAdwgZCCD4X+Z6vCHhg8HEHwam w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcx9521d-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:21 -0400 (EDT) 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 68AHbKjl038791 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:20 -0400 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; Thu, 10 Sep 2026 13:37:20 -0400 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; Thu, 10 Sep 2026 13:37:20 -0400 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; Thu, 10 Sep 2026 13:37:20 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSd018832; Thu, 10 Sep 2026 13:37:14 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:25 +0200 Subject: [PATCH v7 07/17] iio: adc: ad7768: Add power mode helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-7-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=3222; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=3x7Wgo0kEm2BblffQYiq1d+jLEVI476bgnfkgy7twhw=; b=XZRYvLAIs4PRBlVl63TpOgRAvlVGaU5gzY5KKdt1zMP/L8dJmgxD/NaihDGkZMANGrULb5wEM V1c9ZPSX9o+CbT0c7j7CMRONHSloekGo6JTVkHF9Ts8jOd6kUAnCils X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfXwwnFKr8v4lVV /UfEr+wasipV7X/ZRN/6Rn1qJ9DROGEP4CBSClQ29dX34Senb29Qi9NVNcBajsva24oMiSBjeQT Ufb+bTh/spVJdOKS96WSwwjHjN9Z1G4TA+OZJrLXFA2CxanyBRb+ X-Proofpoint-GUID: RxO-cN6h24SP40Go1Tj6bF8sCbq5lftR X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX7YvPWCSmOkKJ Pj9A8krdz4TBVWLiAKesfykTSdIilM7INSDVrw/XanjmCJd1B5Q0STk5p2Ol0JGWMP5vApP3e0N Y94poVR96KYSKW+bI0oL7e1ASBiDQHExbhApqPTlp3VgxAlHWa7zbrxtCE8VROj/wPRZVVZweoD qh1oP9xQHwnc7M+uN1CytTWa/LZbSHXjFHjudnrQ1cbzR8UnZ6Zbl31grTY+fFRB4nQG9ChbXDU tjPMmaU8mauR7OIkQSI5sU+A4Jo6NP3N7OleYw37dpmkDj/JU0gJrGtxGEq8j2CtKLgftKxXz+e U4I24CGaGTG2vXyJ4uw1Y/4++ylPi/+wpSBXDP8VeylwKso8sxCrlSZSeEnto00fnDvGXky9gfR jcSXpK7qT/pApCpbzdmmyKtgo9KTkPg72R4K/7frgGwahqOKjQDkayLYe8lc2/5/UuMKVu1CyzM /6Yc+LMhwTvjbzCfLHA== X-Authority-Analysis: v=2.4 cv=G8CJgNk5 c=1 sm=1 tr=0 ts=6aa2ead1 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=uXIjobp8t2wMuQ0fPvqm:22 a=gAnH3GRIAAAA:8 a=ouHy9IwMRfQpid4n9IYA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: RxO-cN6h24SP40Go1Tj6bF8sCbq5lftR X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 adultscore=0 malwarescore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Describe each power mode and its internal master-clock divisor in a table. Replace the open-coded fast-mode setup with a helper that records the active mode, preparing for dynamic mode selection. Signed-off-by: Janani Sunil Reviewed-by: Andy Shevchenko --- drivers/iio/adc/ad7768.c | 48 +++++++++++++++++++++++++++++++++++++++++---= ---- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 44ba19fb2096..be815b8c6766 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -41,6 +41,8 @@ #define AD7768_REG_POWER_MODE 0x04 #define AD7768_SLEEP_MODE_MSK BIT(7) #define AD7768_POWER_MODE_POWER_MODE_MSK GENMASK(5, 4) +#define AD7768_POWER_MODE_POWER_MODE_LOW 0x0 +#define AD7768_POWER_MODE_POWER_MODE_MEDIAN 0x2 #define AD7768_POWER_MODE_POWER_MODE_FAST 0x3 #define AD7768_POWER_MODE_LVDS_ENABLE BIT(3) #define AD7768_POWER_MODE_MCLK_DIV_MSK GENMASK(1, 0) @@ -102,6 +104,17 @@ enum ad7768_clock_source { AD7768_CLOCK_SOURCE_LVDS, }; =20 +struct ad7768_power_mode_info { + unsigned int mode; + unsigned int mclk_div; +}; + +static const struct ad7768_power_mode_info ad7768_power_modes[] =3D { + { .mode =3D AD7768_POWER_MODE_POWER_MODE_LOW, .mclk_div =3D 32 }, + { .mode =3D AD7768_POWER_MODE_POWER_MODE_MEDIAN, .mclk_div =3D 8 }, + { .mode =3D AD7768_POWER_MODE_POWER_MODE_FAST, .mclk_div =3D 4 }, +}; + struct ad7768_precharge_config { bool prebufp_en; bool prebufn_en; @@ -127,6 +140,7 @@ struct ad7768_state { const struct ad7768_chip_info *chip_info; struct iio_backend *back; unsigned int vref_uV[2]; + unsigned int power_mode_idx; =20 __be16 d16 __aligned(IIO_DMA_MINALIGN); }; @@ -330,6 +344,32 @@ static int ad7768_sync(struct ad7768_state *st) AD7768_DATA_CONTROL_SPI_SYNC); } =20 +static int ad7768_set_power_mode(struct ad7768_state *st, + unsigned int mode_idx) +{ + const struct ad7768_power_mode_info *mode_info; + int ret; + + mode_info =3D &ad7768_power_modes[mode_idx]; + ret =3D regmap_update_bits(st->regmap, AD7768_REG_POWER_MODE, + AD7768_POWER_MODE_POWER_MODE_MSK | + AD7768_POWER_MODE_MCLK_DIV_MSK, + FIELD_PREP(AD7768_POWER_MODE_POWER_MODE_MSK, + mode_info->mode) | + FIELD_PREP(AD7768_POWER_MODE_MCLK_DIV_MSK, + mode_info->mode)); + if (ret) + return ret; + + ret =3D ad7768_sync(st); + if (ret) + return ret; + + st->power_mode_idx =3D mode_idx; + + return 0; +} + static int ad7768_update_scan_mode(struct iio_dev *indio_dev, const unsigned long *scan_mask) { @@ -489,13 +529,7 @@ static int ad7768_configure_capture(struct ad7768_stat= e *st) unsigned int dclk_div; int ret; =20 - ret =3D regmap_update_bits(st->regmap, AD7768_REG_POWER_MODE, - AD7768_POWER_MODE_POWER_MODE_MSK | - AD7768_POWER_MODE_MCLK_DIV_MSK, - FIELD_PREP(AD7768_POWER_MODE_POWER_MODE_MSK, - AD7768_POWER_MODE_POWER_MODE_FAST) | - FIELD_PREP(AD7768_POWER_MODE_MCLK_DIV_MSK, - AD7768_POWER_MODE_POWER_MODE_FAST)); + ret =3D ad7768_set_power_mode(st, ARRAY_SIZE(ad7768_power_modes) - 1); if (ret) return ret; =20 --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 C671A57D220; Thu, 10 Sep 2026 17:37:48 +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=1789061882; cv=none; b=DA/RIvJPxIthzJdMQwvL/Vhzp27qlMtqxuOAQO1zsKUm5HEFYD47cQAt83RMrg0kaGGkbV1rsTmbIa5DdtB0Sf6fbxUprX+O7V6yBEL+2NEheYFr0Na8t1CXeSEBpgxX4cj513U4cwubpHiWeWkzKGU2S8TupS4Ys/LuC9MZO7M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061882; c=relaxed/simple; bh=qVuILco+twJH/KRROi5KmCdDcp8DabUY6ghiig+F5UE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=daWeyjA6DSno4yU4Ldo6bOXxj59ol3PCd+uQuBxYQvHyP4NTdUFpKdBPw+6vo2OFZXTjSkmJw2SyvCRrd9GUH1gv7E5H3PnMlydb+Ncs65ig3Yla1R84/43l5JAtMPOCMo76jTlAbwXCsmJ1mgNnMnMStXvDeDOeyn64T6Y/jlw= 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=mbL4fdXV; 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="mbL4fdXV" 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 68AF7uhV3830297; Thu, 10 Sep 2026 13:37:25 -0400 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=55vuD GiirK/N+Ajt+G/7AqCz0JMW1y+ogsr8SADAlWE=; b=mbL4fdXVwKzFGi2d2D958 LPBHXBxSBkn2vaSkM9yPxyTCWOK4TQuZQ0mw/ob5JAq2xyCe/wISpmGx2Ln1TlCA F1kv0ORbequU8RKU+lxcBTNaW0GYOeahIhAeNhvzpl9vEHiGi5Wh/bDyQX5d9xao nryPbcKZ0vbra6WMQtdVxDomdtHujozBpCzLNUsm25xC6lq6CYUUTJfvJaWjJiF/ UQo9nCsvQv2Vdl7WisCTY/upMkm3F8WxvFN1VWHBd8Ep26Wntg9dKwRNycnaec2B NrVALvwU+fvmS0ve69/Feg1H9xqAM47qIwWJJqGq6nG5K4vRHY6/LmJMXuIVZWDQ w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxad2dg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:25 -0400 (EDT) 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 68AHbNLr038797 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:24 -0400 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; Thu, 10 Sep 2026 13:37:23 -0400 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; Thu, 10 Sep 2026 13:37:23 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSe018832; Thu, 10 Sep 2026 13:37:18 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:26 +0200 Subject: [PATCH v7 08/17] iio: adc: ad7768: Derive output data rates Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-8-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , David Lechner , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=8861; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=qVuILco+twJH/KRROi5KmCdDcp8DabUY6ghiig+F5UE=; b=oOVcK7uEAASIkUVE4bUrbvSH5Yhz/R3BA6k12RTbxjbdOnkeaD/3bkzu1j8gGguHrDrM4obqB Q4g8XBBfGhMA0RWevEDDY5qG7EN3STIx4S7XyX5JWVhkiDruM2EFv4W X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfXwD7Qc9sMkBI/ PtjrDMsL6S/lxLUagGcFjdr7DT5pyfT5KQ4juJ+qKzzV3V1/VcOuyiERno7zUL+csq6E/AapGAf U2Ij/XA3oyuLvvjJjSvQ8zFCq6i1lseemSSQ6YA7na+4PS0PZB5I X-Authority-Analysis: v=2.4 cv=Ao17T+9P c=1 sm=1 tr=0 ts=6aa2ead5 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=gAnH3GRIAAAA:8 a=OojgcuAE7MSTGQlOCucA:9 a=QEXdDO2ut3YA:10 a=br55WurUj89AL1qEz8Q6:22 X-Proofpoint-GUID: 6b3-NKz6S9XztxDUDw4A53j0gi4oEEiU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX+OsUVEdIa0vF r2x1Pf8EA82aNSuVkhe2y29o4/snSqzmztbr2nITFcvZZDQZ9tmPOGG2xIPvKaxrW+iwdVu3oY6 S7jbGseC8LmwPj2cdI/xfNkdsTRjXm6rgdB4AzFR++u+XOVyWvgu8irre6SpcCJyjZY/ni8bY3f HATBdDKK4JkA0PanI0mLGf7ekO/iqqDT1sGNfAogTFawHdDze62D3W0i2f2IDxwwCx/wLXPLNAA Ba2YBPw2vwrVX+MzpRg4EKhJ5ugdXTPLxiq3mTb2YP/ddGYTXrCugo8iKAhWDqWPoMWov3gAmTy trCE6O5b0R7sQOiTgQ//zyId4lu+ISfOMTqbO0sAWD2SR9J8YYEJh7Ic2zQPbJDMRJmr63FhaAk u/OlKBK1ovWaHmhE+bJEdtqkzJ9aeADCZEvQsgo0Fw9YcSCf6l0+ofC1jqUrdIb8lK40Ypd8Kc7 tL03tv2jY7rnrtAYBVg== X-Proofpoint-ORIG-GUID: 6b3-NKz6S9XztxDUDw4A53j0gi4oEEiU X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 spamscore=0 phishscore=0 lowpriorityscore=0 suspectscore=0 impostorscore=0 adultscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Derive valid output data rates from the master clock, power mode and decimation ratio. Replace the fixed x64 decimation and open-coded DCLK divider in ad7768_configure_capture() with the derived default output rate and the new decimation and clock-divider helpers. Select the maximum rate supported by the configured data interface for the initial capture configuration. Signed-off-by: Janani Sunil --- drivers/iio/adc/ad7768.c | 180 +++++++++++++++++++++++++++++++++++++------= ---- 1 file changed, 141 insertions(+), 39 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index be815b8c6766..03ba48be3153 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -34,7 +35,6 @@ #define AD7768_CH_MODE_FILTER_TYPE_MSK BIT(3) #define AD7768_CH_MODE_FILTER_TYPE_WIDEBAND 0x0 #define AD7768_CH_MODE_DEC_RATE_MSK GENMASK(2, 0) -#define AD7768_CH_MODE_DEC_RATE_64 0x1 =20 #define AD7768_REG_CH_MODE_SEL 0x03 =20 @@ -93,9 +93,12 @@ #define AD7768_SPI_REG_MASK GENMASK(14, 8) #define AD7768_SPI_DATA_MASK GENMASK(7, 0) =20 +#define AD7768_SAMPLE_SIZE 32 +#define AD7768_MAX_DCLK_DIV 8 #define AD7768_MIN_MCLK_FREQ_HZ (1150 * HZ_PER_KHZ) #define AD7768_MIN_XTAL_FREQ_HZ (8 * HZ_PER_MHZ) #define AD7768_MAX_MCLK_FREQ_HZ (34 * HZ_PER_MHZ) +#define AD7768_MAX_FREQ_PER_MODE 6 #define AD7768_MAX_CHANNEL 8 =20 enum ad7768_clock_source { @@ -122,6 +125,16 @@ struct ad7768_precharge_config { bool refbufn; }; =20 +struct ad7768_freq_config { + unsigned int freq_hz; + unsigned int dec_rate; +}; + +struct ad7768_avail_freq { + unsigned int n_freqs; + struct ad7768_freq_config freq_cfg[AD7768_MAX_FREQ_PER_MODE]; +}; + struct ad7768_chip_info { const char *name; const struct regmap_config *regmap_config; @@ -138,6 +151,8 @@ struct ad7768_state { unsigned int datalines; enum ad7768_clock_source clock_source; const struct ad7768_chip_info *chip_info; + struct ad7768_avail_freq avail_freq[ARRAY_SIZE(ad7768_power_modes)]; + unsigned int ch_freq[AD7768_MAX_CHANNEL]; struct iio_backend *back; unsigned int vref_uV[2]; unsigned int power_mode_idx; @@ -145,6 +160,10 @@ struct ad7768_state { __be16 d16 __aligned(IIO_DMA_MINALIGN); }; =20 +static const unsigned int ad7768_dec_rate[AD7768_MAX_FREQ_PER_MODE] =3D { + 32, 64, 128, 256, 512, 1024, +}; + static const unsigned int ad7768_available_datalines[] =3D { 1, 2, 8, }; @@ -370,6 +389,83 @@ static int ad7768_set_power_mode(struct ad7768_state *= st, return 0; } =20 +static const struct ad7768_freq_config * +ad7768_find_freq_config(const struct ad7768_state *st, + unsigned int mode_idx, unsigned int freq) +{ + const struct ad7768_avail_freq *avail_freq =3D &st->avail_freq[mode_idx]; + + for (unsigned int i =3D 0; i < avail_freq->n_freqs; i++) { + if (freq =3D=3D avail_freq->freq_cfg[i].freq_hz) + return &avail_freq->freq_cfg[i]; + } + + return NULL; +} + +static int ad7768_set_clk_divs(struct ad7768_state *st, unsigned int freq) +{ + const struct ad7768_freq_config *freq_cfg; + unsigned int mclk, dclk, dclk_div; + unsigned int chan_per_doutx; + unsigned int dclk_div_reg; + + freq_cfg =3D ad7768_find_freq_config(st, st->power_mode_idx, freq); + if (!freq_cfg) + return -EINVAL; + + mclk =3D clk_get_rate(st->mclk); + chan_per_doutx =3D st->chip_info->num_channels / st->datalines; + if (!chan_per_doutx) + return -EINVAL; + + dclk =3D freq_cfg->freq_hz * AD7768_SAMPLE_SIZE * chan_per_doutx; + if (dclk > mclk) + return -EINVAL; + + dclk_div =3D DIV_ROUND_CLOSEST(mclk, dclk); + + /* Set the divider to the next-lowest supported power of two. */ + dclk_div =3D rounddown_pow_of_two(min(dclk_div, AD7768_MAX_DCLK_DIV)); + + switch (dclk_div) { + case 1: + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_1; + break; + case 2: + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_2; + break; + case 4: + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_4; + break; + case 8: + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_8; + break; + default: + return -EINVAL; + } + + return regmap_update_bits(st->regmap, AD7768_REG_INTERFACE_CFG, + AD7768_INTERFACE_CFG_DCLK_DIV_MSK, + FIELD_PREP(AD7768_INTERFACE_CFG_DCLK_DIV_MSK, + dclk_div_reg)); +} + +static int ad7768_set_mode_decimation(struct ad7768_state *st, + unsigned int freq, unsigned int mode) +{ + const struct ad7768_freq_config *freq_cfg; + + freq_cfg =3D ad7768_find_freq_config(st, st->power_mode_idx, freq); + if (!freq_cfg) + return -EINVAL; + + return regmap_update_bits(st->regmap, AD7768_REG_CH_MODE(mode), + AD7768_CH_MODE_DEC_RATE_MSK, + FIELD_PREP(AD7768_CH_MODE_DEC_RATE_MSK, + freq_cfg->dec_rate)); +} + static int ad7768_update_scan_mode(struct iio_dev *indio_dev, const unsigned long *scan_mask) { @@ -522,28 +618,58 @@ static int ad7768_configure_precharge_buffers(struct = iio_dev *indio_dev, return regmap_write(st->regmap, AD7768_REG_REFN_BUF, refbufn_val); } =20 +static void ad7768_set_available_sampling_freqs(struct ad7768_state *st) +{ + unsigned int n_power_modes =3D ARRAY_SIZE(ad7768_power_modes); + unsigned int mclk =3D clk_get_rate(st->mclk); + + for (unsigned int mode_idx =3D 0; mode_idx < n_power_modes; mode_idx++) { + unsigned int dec =3D ARRAY_SIZE(ad7768_dec_rate); + struct ad7768_avail_freq *avail_freq; + unsigned int div; + + avail_freq =3D &st->avail_freq[mode_idx]; + div =3D ad7768_power_modes[mode_idx].mclk_div; + while (dec--) { + struct ad7768_freq_config *freq_cfg; + + freq_cfg =3D &avail_freq->freq_cfg[avail_freq->n_freqs++]; + freq_cfg->dec_rate =3D dec; + freq_cfg->freq_hz =3D mclk / (ad7768_dec_rate[dec] * div); + } + } + + /* One DOUT line cannot carry the AD7768 fast-mode x32 output rate. */ + if (st->datalines =3D=3D 1 && + st->chip_info->num_channels =3D=3D AD7768_MAX_CHANNEL) + st->avail_freq[n_power_modes - 1].n_freqs--; +} + static int ad7768_configure_capture(struct ad7768_state *st) { - unsigned int dclk_div_reg; + const struct ad7768_avail_freq *avail_freq; + unsigned int default_freq; unsigned int mode_config; - unsigned int dclk_div; int ret; =20 ret =3D ad7768_set_power_mode(st, ARRAY_SIZE(ad7768_power_modes) - 1); if (ret) return ret; =20 - /* - * Start with the wideband filter and a decimation rate of 64. This - * supports every valid data-line configuration at the maximum MCLK. - */ + avail_freq =3D &st->avail_freq[st->power_mode_idx]; + default_freq =3D avail_freq->freq_cfg[avail_freq->n_freqs - 1].freq_hz; + for (unsigned int channel =3D 0; + channel < st->chip_info->num_channels; channel++) + st->ch_freq[channel] =3D default_freq; + + ret =3D ad7768_set_mode_decimation(st, default_freq, 0); + if (ret) + return ret; + mode_config =3D FIELD_PREP(AD7768_CH_MODE_FILTER_TYPE_MSK, - AD7768_CH_MODE_FILTER_TYPE_WIDEBAND) | - FIELD_PREP(AD7768_CH_MODE_DEC_RATE_MSK, - AD7768_CH_MODE_DEC_RATE_64); + AD7768_CH_MODE_FILTER_TYPE_WIDEBAND); ret =3D regmap_update_bits(st->regmap, AD7768_REG_CH_MODE(0), - AD7768_CH_MODE_FILTER_TYPE_MSK | - AD7768_CH_MODE_DEC_RATE_MSK, + AD7768_CH_MODE_FILTER_TYPE_MSK, mode_config); if (ret) return ret; @@ -552,33 +678,7 @@ static int ad7768_configure_capture(struct ad7768_stat= e *st) if (ret) return ret; =20 - /* - * DCLK(min) is ODR * channels per DOUTx * 32. With fast mode - * (fMOD =3D MCLK / 4) and x64 decimation, this gives: - * MCLK / DCLK =3D 8 * data lines / channels. - */ - dclk_div =3D 8 * st->datalines / st->chip_info->num_channels; - switch (dclk_div) { - case 1: - dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_1; - break; - case 2: - dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_2; - break; - case 4: - dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_4; - break; - case 8: - dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV_8; - break; - default: - return -EINVAL; - } - - ret =3D regmap_update_bits(st->regmap, AD7768_REG_INTERFACE_CFG, - AD7768_INTERFACE_CFG_DCLK_DIV_MSK, - FIELD_PREP(AD7768_INTERFACE_CFG_DCLK_DIV_MSK, - dclk_div_reg)); + ret =3D ad7768_set_clk_divs(st, default_freq); if (ret) return ret; =20 @@ -702,6 +802,8 @@ static int ad7768_parse_config(struct iio_dev *indio_de= v, "Invalid data-lines-number %d for %s\n", st->datalines, st->chip_info->name); =20 + ad7768_set_available_sampling_freqs(st); + return ad7768_configure_capture(st); } =20 --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 418AF54CF4A; Thu, 10 Sep 2026 17:37:48 +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=1789061880; cv=none; b=Ij9ma0niGaWeGdIdRtRX0vBsxBJ+LYtJLLTWqiDmwXTc49VlfzQuLph/PWllPHJ9O+rXp0dMi+HfASyEkxzV39nDT9pULPkUU7ldRta9DP9qjg8cpSGRHYZMpVwNuz277soPK5m55onvGjihs4xIH7KeDMI0h9kbsP/dPzfXbTY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061880; c=relaxed/simple; bh=QACP0/ytA4mDRxdmoQAW9IVbtFEg6cSRsqBOH6rmdmY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=qj+btV5VPEINohf+KtxGRuRQbFB47fzogOHz0PSn4fRT5DUuaOYGoVcA48jXOIf1W6NAg0anBbumWrFqt0PXRr06rgv3/40MhN1CU0rMA6KBu5vmbSUkh/NlkeUQDPf8IIrFzJ7x/z9w4iMq0TkEZYclM+HgJ0xXJVhXu6J1qQo= 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=xyNL5Gs+; 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="xyNL5Gs+" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68AF7Mo2343054; Thu, 10 Sep 2026 13:37:28 -0400 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=1W4uK 0DRg+CN7TW+o96MTnpjyTo+lsa2WyLgVI7iNsA=; b=xyNL5Gs+H7AXsIPiA2O5A T/uQmHP1eT+ONXPrx9vDx6pz39OquGCawnZA9cC3kPZ4iKEUMowYSTZZS8yk+ODO Mpq8sTwXUcs4kfW++QRh3sAKmprrES1u3V0A8gwKjbWwx9kDKOZA+Km/r/IHdMsd +z6DYOkOyil1Z7dgqolKhKZCo0GaBYDHQaoLS5lk95gBhK5GcIbFOckMY62B0SFO OjRiqSzxDQwjmM6kexqpnO1KV/zUMfPPt43eJl0cpkCwhhBCeXlKgvuCqlbBbEQh OKFNSxH9rfWyw8Z0onTPJwnHs6Szn/MjE0/T87x7FqQvSmUWeb6gHKyvwDCbFRQG A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcx9521q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:28 -0400 (EDT) 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 68AHbRWZ038804 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:27 -0400 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; Thu, 10 Sep 2026 13:37:27 -0400 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; Thu, 10 Sep 2026 13:37:27 -0400 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; Thu, 10 Sep 2026 13:37:27 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSf018832; Thu, 10 Sep 2026 13:37:21 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:27 +0200 Subject: [PATCH v7 09/17] iio: adc: ad7768: Configure channel sampling profiles Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-9-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=8484; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=QACP0/ytA4mDRxdmoQAW9IVbtFEg6cSRsqBOH6rmdmY=; b=29cW6xIZ4U0jHCGuKmyM7XUItXWaCQiXSzAVEhBKjsJqeNCFzyYPg8+gZYcQM+hV0hqELYCEf zGMEPpnL7NDA6O9O5lqVWbf5ThRAsvR0sc7p5zWLcV/vXOCvLtDdYHb X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX+DbG/zbYP0ME qK+BJORCICYHAsZslGMITcnBc3r1NDeLSQGRoLRtVaFbVFMyVqR+GpZHNOCHG21FEmuA6JYWmcz B4ru38Xc5ycXoWTLT+9OUMUfQ3338C+alc1HhoX6ZuYQ1SgBgHv2 X-Proofpoint-GUID: nH4mUfwufm2tEznadet0e1hw_BGYT5Iy X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX6eZJHuPHUPnM LL87K6N399fccJMrW0oMjvp42XT8T014zmVwBxSzsrgaczlA2GElvjD92UNkL58MnqxQ8Cwv4Db B6xYYnu+yjg2czfo7l/5X6j/SYtSwcgGBn+98h8Bnoy/n28M2z14brO5WhkkYGaWDtOt6iQ8UmU KtwaCXNk/J4x+RHN28mV3wejrANhyr6bJXUHHqkBuKWJkfwQJopFWPr+oPtQYVPJUnpv++tuOoy BtyXdr0PC2Brvi9VI32ysWAHbfRrquyRfJwcWqcM8gECLQhPg3QH/y58WrpNjkrJPLQ16y8CIxr fwCfT+fnw18ocdB+IKx4xKsUo1VXHSVe/k3X2mS7PYpLZhsVzbCCIY5S8ipaGBtXE5xPf0ZysyH VnVjxdSdQRGTXzV0iYkdlsa3UVoEKbt8sniRdmDHjSAkq1gteNp/QvFNiSPihk6rDPfDpe4dBSK OwxXMj3shZv/UfD8Inw== X-Authority-Analysis: v=2.4 cv=G8CJgNk5 c=1 sm=1 tr=0 ts=6aa2ead8 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=uXIjobp8t2wMuQ0fPvqm:22 a=gAnH3GRIAAAA:8 a=YaUG07iyn5Nj4qywQSYA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: nH4mUfwufm2tEznadet0e1hw_BGYT5Iy X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 adultscore=0 malwarescore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 At buffered capture setup, select the fastest compatible power mode for the enabled channel rates. Group channels into the two hardware mode profiles and program their decimation, mode selection, and data clock. Signed-off-by: Janani Sunil --- drivers/iio/adc/ad7768.c | 168 +++++++++++++++++++++++++++++++++++++++----= ---- 1 file changed, 141 insertions(+), 27 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 03ba48be3153..a957bd8e0d6f 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -7,7 +7,9 @@ =20 #include #include +#include #include +#include #include #include #include @@ -16,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -33,7 +36,6 @@ =20 #define AD7768_REG_CH_MODE(x) (0x01 + (x)) #define AD7768_CH_MODE_FILTER_TYPE_MSK BIT(3) -#define AD7768_CH_MODE_FILTER_TYPE_WIDEBAND 0x0 #define AD7768_CH_MODE_DEC_RATE_MSK GENMASK(2, 0) =20 #define AD7768_REG_CH_MODE_SEL 0x03 @@ -100,6 +102,7 @@ #define AD7768_MAX_MCLK_FREQ_HZ (34 * HZ_PER_MHZ) #define AD7768_MAX_FREQ_PER_MODE 6 #define AD7768_MAX_CHANNEL 8 +#define AD7768_NUM_CHANNEL_MODES 2 =20 enum ad7768_clock_source { AD7768_CLOCK_SOURCE_MCLK, @@ -147,6 +150,8 @@ struct ad7768_chip_info { =20 struct ad7768_state { struct regmap *regmap; + /* Protects device register access and configuration. */ + struct mutex lock; struct clk *mclk; unsigned int datalines; enum ad7768_clock_source clock_source; @@ -200,6 +205,17 @@ static u8 ad7768_channel_mask(const struct ad7768_stat= e *st, u8 ch) return BIT(st->chip_info->chan_map[ch]); } =20 +static u8 ad7768_channel_mode_mask(const struct ad7768_state *st, u8 ch) +{ + /* + * AD7768-4 channels 2 and 3 use bits 4 and 5 for CH_x_MODE, while + * their CH_x_MDE_EN fields are in bits 2 and 3 and must be programmed + * to the same value. On AD7768, chan_map[] is an identity map, so the + * OR produces a single bit. + */ + return BIT(ch) | ad7768_channel_mask(st, ch); +} + static u8 ad7768_all_standby_mask(const struct ad7768_state *st) { return GENMASK(st->chip_info->num_channels - 1, 0); @@ -466,14 +482,70 @@ static int ad7768_set_mode_decimation(struct ad7768_s= tate *st, freq_cfg->dec_rate)); } =20 -static int ad7768_update_scan_mode(struct iio_dev *indio_dev, - const unsigned long *scan_mask) +static int ad7768_set_lowest_noise_mode(struct ad7768_state *st, + const unsigned long *scan_mask) +{ + unsigned int mode_idx =3D ARRAY_SIZE(ad7768_power_modes); + + /* + * The output data rate ranges overlap between the power modes. At a + * common ODR, the faster mode has lower noise, so prefer the fastest + * mode that supports every enabled channel. + */ + while (mode_idx--) { + bool supported =3D true; + unsigned int channel; + + for_each_set_bit(channel, scan_mask, + st->chip_info->num_channels) { + if (!ad7768_find_freq_config(st, mode_idx, + st->ch_freq[channel])) { + supported =3D false; + break; + } + } + + if (supported) + return ad7768_set_power_mode(st, mode_idx); + } + + return -EINVAL; +} + +static int ad7768_find_matching_mode(const bool *mode_used, + const unsigned int *mode_freq, + unsigned int freq) { + for (unsigned int mode =3D 0; mode < AD7768_NUM_CHANNEL_MODES; mode++) { + if (!mode_used[mode] || mode_freq[mode] =3D=3D freq) + return mode; + } + + return -EINVAL; +} + +static int ad7768_apply_channel_modes(struct iio_dev *indio_dev, + const unsigned long *scan_mask) +{ + unsigned int mode_freq[AD7768_NUM_CHANNEL_MODES] =3D { }; + bool mode_used[AD7768_NUM_CHANNEL_MODES] =3D { }; struct ad7768_state *st =3D iio_priv(indio_dev); + struct device *dev =3D indio_dev->dev.parent; unsigned long channel_mask; unsigned long standby_mask; + unsigned int max_freq; + unsigned int c; int ret; =20 + guard(mutex)(&st->lock); + + ret =3D ad7768_set_lowest_noise_mode(st, scan_mask); + if (ret =3D=3D -EINVAL) + return dev_err_probe(dev, ret, + "No power mode supports all ODRs\n"); + if (ret) + return ret; + channel_mask =3D ad7768_all_standby_mask(st); standby_mask =3D channel_mask & ~*scan_mask; =20 @@ -484,11 +556,66 @@ static int ad7768_update_scan_mode(struct iio_dev *in= dio_dev, if (st->clock_source =3D=3D AD7768_CLOCK_SOURCE_XTAL) __clear_bit(st->chip_info->num_channels / 2, &standby_mask); =20 + for_each_set_bit(c, scan_mask, st->chip_info->num_channels) { + unsigned int mask; + int mode; + + mode =3D ad7768_find_matching_mode(mode_used, mode_freq, + st->ch_freq[c]); + if (mode < 0) + return dev_err_probe(dev, -EINVAL, + "Over %d channel modes required\n", + AD7768_NUM_CHANNEL_MODES); + + mode_freq[mode] =3D st->ch_freq[c]; + mode_used[mode] =3D true; + + mask =3D ad7768_channel_mode_mask(st, c); + ret =3D regmap_assign_bits(st->regmap, AD7768_REG_CH_MODE_SEL, + mask, mode); + if (ret) + return ret; + } + ret =3D regmap_update_bits(st->regmap, AD7768_REG_CH_STANDBY, channel_mask, standby_mask); if (ret) return ret; =20 + max_freq =3D 0; + for (unsigned int mode =3D 0; mode < AD7768_NUM_CHANNEL_MODES; mode++) { + if (!mode_used[mode]) + continue; + + ret =3D ad7768_set_mode_decimation(st, mode_freq[mode], mode); + if (ret) + return ret; + + ret =3D regmap_clear_bits(st->regmap, AD7768_REG_CH_MODE(mode), + AD7768_CH_MODE_FILTER_TYPE_MSK); + if (ret) + return ret; + + max_freq =3D max(max_freq, mode_freq[mode]); + } + + ret =3D ad7768_set_clk_divs(st, max_freq); + if (ret) + return ret; + + return ad7768_sync(st); +} + +static int ad7768_update_scan_mode(struct iio_dev *indio_dev, + const unsigned long *scan_mask) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + int ret; + + ret =3D ad7768_apply_channel_modes(indio_dev, scan_mask); + if (ret) + return ret; + for (unsigned int ch =3D 0; ch < st->chip_info->num_channels; ch++) { if (test_bit(ch, scan_mask)) ret =3D iio_backend_chan_enable(st->back, ch); @@ -645,11 +772,10 @@ static void ad7768_set_available_sampling_freqs(struc= t ad7768_state *st) st->avail_freq[n_power_modes - 1].n_freqs--; } =20 -static int ad7768_configure_capture(struct ad7768_state *st) +static int ad7768_init_sampling_freqs(struct ad7768_state *st) { const struct ad7768_avail_freq *avail_freq; unsigned int default_freq; - unsigned int mode_config; int ret; =20 ret =3D ad7768_set_power_mode(st, ARRAY_SIZE(ad7768_power_modes) - 1); @@ -662,27 +788,7 @@ static int ad7768_configure_capture(struct ad7768_stat= e *st) channel < st->chip_info->num_channels; channel++) st->ch_freq[channel] =3D default_freq; =20 - ret =3D ad7768_set_mode_decimation(st, default_freq, 0); - if (ret) - return ret; - - mode_config =3D FIELD_PREP(AD7768_CH_MODE_FILTER_TYPE_MSK, - AD7768_CH_MODE_FILTER_TYPE_WIDEBAND); - ret =3D regmap_update_bits(st->regmap, AD7768_REG_CH_MODE(0), - AD7768_CH_MODE_FILTER_TYPE_MSK, - mode_config); - if (ret) - return ret; - - ret =3D regmap_write(st->regmap, AD7768_REG_CH_MODE_SEL, 0); - if (ret) - return ret; - - ret =3D ad7768_set_clk_divs(st, default_freq); - if (ret) - return ret; - - return ad7768_sync(st); + return 0; } =20 static int ad7768_parse_config(struct iio_dev *indio_dev, @@ -804,7 +910,11 @@ static int ad7768_parse_config(struct iio_dev *indio_d= ev, =20 ad7768_set_available_sampling_freqs(st); =20 - return ad7768_configure_capture(st); + ret =3D ad7768_init_sampling_freqs(st); + if (ret) + return dev_err_probe(dev, ret, "Failed to set power mode\n"); + + return 0; } =20 static int ad7768_reset(struct ad7768_state *st) @@ -979,6 +1089,10 @@ static int ad7768_probe(struct spi_device *spi) st =3D iio_priv(indio_dev); spi_set_drvdata(spi, st); =20 + ret =3D devm_mutex_init(dev, &st->lock); + if (ret) + return ret; + st->chip_info =3D spi_get_device_match_data(spi); if (!st->chip_info) return dev_err_probe(dev, -ENODATA, "Failed to get match data\n"); --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 DD9CB562609; Thu, 10 Sep 2026 17:37:56 +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=1789061882; cv=none; b=CQPCL6Vvl6/6o5yxD7Nm6tq5UlBoLgJwvTz8ZOVP2kdzJyyjY7BYSo9+3/PZQ0jXH3S+ew/C4vAzBXbgq3RxZz9MyIvmkiYtinfgmxJqQXDVLb8FC37uisUZrpPMHxKg+dgYOPZqpuxyfSDCOEwrfx4yXvY766RkM8BxF8CeDe4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061882; c=relaxed/simple; bh=JzLGwF4GNdfnWfVfgNQ41pa0YGlM7SlBhitI7Ee8BYs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=id9K7Uia6ugf68h81+hxH0Dkx++g+3o8CsaLRE7ccQnnJzW9soOY9WYOOXPrUgs6oEQvn89S9FIJTgvlL0U6GfSiaiS9tLXetptXkJX75APDe9QghPJbTvy+UMz0HidIoFoT7FrYA/XuUSZm1ESQhekGTxO1Ye8bvnEym4rK4X0= 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=Rj5VrGpY; 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="Rj5VrGpY" 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 68AF7uVq3830296; Thu, 10 Sep 2026 13:37:35 -0400 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=s754L rMJhHhIXzeKWmqCAGus7RIzyNike/JCi3YDr3g=; b=Rj5VrGpYsEsIhUcrk7YI6 8MC3dSDyFUyxxiF+Eyggn9OcOItqHs6X8ew1rN0ebzD4/9Q75hKs6RHVDH43nLKs Tj6HNOQN4Ny2+bA5ldwdRgMcdKeFH+2JjidAL7pBLiPmIQQ76gBzQXnFaqoeHXFu nD0wYQGOrYXsWmn1aNtUv/CamoI1WOtxNCFDy0wuqGHLClAfU18nwTXWHXy1mJz/ sfABHwcrui1kkVbHY0HWdmRojdYdGgWPryOyRlslJp7YNtVlG5pcMFwfQ4gBcuCe hHamiVFRWhwPdCkUeZqf6S8rlM8kNvMj8Ud4WyzN/sS6CW3YkWBuZpi+A76Ahdj+ w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxad2ed-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:34 -0400 (EDT) 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 68AHbXAO038820 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:33 -0400 Received: from ASHBCASHYB5.ad.analog.com (10.64.17.133) 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; Thu, 10 Sep 2026 13:37:33 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Thu, 10 Sep 2026 13:37:33 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Thu, 10 Sep 2026 13:37:33 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSg018832; Thu, 10 Sep 2026 13:37:25 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:28 +0200 Subject: [PATCH v7 10/17] iio: adc: ad7768: Add sampling frequency controls Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-10-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=5135; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=JzLGwF4GNdfnWfVfgNQ41pa0YGlM7SlBhitI7Ee8BYs=; b=E604Whctt/PCPE5tVJ6hbopDMiKUM/eACEcpV/6LgjVTuXTdJlx5+yreyGAZK8l68l5nYJk48 HPGekrK8HDpBW8P5hBnviMA4xpDCSEb4vIHB9mWMpdEMQjicFC1QJfp X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX3gfo1XAZaGw0 XcCvnIo2y51F/mTf1WoU5eC7jZd84tchd7RvfGoClFb6d2pyrTGTAFOgi10o78dfP4w10vWQMYq xd1xxJZJvS3ywH5o8vume5uVzPs65koBZpHUvskEP/rRMieuiiqB X-Authority-Analysis: v=2.4 cv=Ao17T+9P c=1 sm=1 tr=0 ts=6aa2eade cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=gAnH3GRIAAAA:8 a=LMPk9M2IzwWsjleXqZQA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-GUID: R5cwsKbAFOaMVrlSf0JOgdTCfKL765WS X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX6VXaRKORbm8m Jn5atx3/JDHWnb5K+0US5XVvm8YMpDCJuvXvuHmSrv7EQceKKu5CyWqDMSsBfcTIKNSbZMGg7it pLPkZxdRMRiXIgNIkSAr089XGrzbOAgUYelvSQFR0l17bWpo1HtvcA4eNpx/nse5l4zinGry3oK Z6dVHuO0bB/lvg0Ky6f8aSuu2Brv1NGVdMkoPSKsqEipDcM3O2DkQznykC03sbW0f6YAVEkvqaX hnFA4q5i3b54p0POzQI88sVxb1Xbrgmpw4C9VxJC49dkPsRwM2ZgTnjk3/PTmkk84zLhKzbfwnG x2fpdHx4ai0JzviKnQjPd4VFSCqtHk4eHgyz2QF9XNgsCmjUtTQwum8mITr7OJojpj2PStP6suf PXZADrLNAeqeWkRXZhvDN56naMWkkYlk9QLk313yAZB0z7R/jS8S2Xxe20FZYO5SEjQGWWCuaRI ry1Cpf0cXUUrUusmHcg== X-Proofpoint-ORIG-GUID: R5cwsKbAFOaMVrlSf0JOgdTCfKL765WS X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 spamscore=0 phishscore=0 lowpriorityscore=0 suspectscore=0 impostorscore=0 adultscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Expose the requested sampling frequency and available rates for each channel. Validate requests against the rates supported by the power mode tables and apply them when buffered capture starts. Signed-off-by: Janani Sunil --- drivers/iio/adc/ad7768.c | 101 +++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 99 insertions(+), 2 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index a957bd8e0d6f..36df678bd00f 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -121,6 +121,9 @@ static const struct ad7768_power_mode_info ad7768_power= _modes[] =3D { { .mode =3D AD7768_POWER_MODE_POWER_MODE_FAST, .mclk_div =3D 4 }, }; =20 +#define AD7768_MAX_FREQS \ + (AD7768_MAX_FREQ_PER_MODE + ARRAY_SIZE(ad7768_power_modes)) + struct ad7768_precharge_config { bool prebufp_en; bool prebufn_en; @@ -157,10 +160,12 @@ struct ad7768_state { enum ad7768_clock_source clock_source; const struct ad7768_chip_info *chip_info; struct ad7768_avail_freq avail_freq[ARRAY_SIZE(ad7768_power_modes)]; + unsigned int n_freqs; + int freqs[AD7768_MAX_FREQS]; unsigned int ch_freq[AD7768_MAX_CHANNEL]; + unsigned int power_mode_idx; struct iio_backend *back; unsigned int vref_uV[2]; - unsigned int power_mode_idx; =20 __be16 d16 __aligned(IIO_DMA_MINALIGN); }; @@ -512,6 +517,32 @@ static int ad7768_set_lowest_noise_mode(struct ad7768_= state *st, return -EINVAL; } =20 +static bool ad7768_freq_supported_in_any_mode(const struct ad7768_state *s= t, + unsigned int freq) +{ + for (unsigned int mode_idx =3D 0; + mode_idx < ARRAY_SIZE(ad7768_power_modes); mode_idx++) { + if (ad7768_find_freq_config(st, mode_idx, freq)) + return true; + } + + return false; +} + +static int ad7768_set_sampling_freq(struct iio_dev *indio_dev, + unsigned int freq, unsigned int channel) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + + if (!freq || !ad7768_freq_supported_in_any_mode(st, freq)) + return -EINVAL; + + guard(mutex)(&st->lock); + st->ch_freq[channel] =3D freq; + + return 0; +} + static int ad7768_find_matching_mode(const bool *mode_used, const unsigned int *mode_freq, unsigned int freq) @@ -690,14 +721,63 @@ static int ad7768_read_raw(struct iio_dev *indio_dev, switch (info) { case IIO_CHAN_INFO_SCALE: return ad7768_read_scale(st, chan, val, val2); + case IIO_CHAN_INFO_SAMP_FREQ: { + guard(mutex)(&st->lock); + *val =3D st->ch_freq[chan->channel]; + + return IIO_VAL_INT; + } default: return -EINVAL; } } =20 +static int ad7768_write_raw_get_fmt(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, long info) +{ + if (info =3D=3D IIO_CHAN_INFO_SAMP_FREQ) + return IIO_VAL_INT; + + return -EINVAL; +} + +static int ad7768_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int val, int val2, long info) +{ + IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); + if (IIO_DEV_ACQUIRE_FAILED(claim)) + return -EBUSY; + + if (info =3D=3D IIO_CHAN_INFO_SAMP_FREQ) + return ad7768_set_sampling_freq(indio_dev, val, chan->channel); + + return -EINVAL; +} + +static int ad7768_read_avail(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + const int **vals, int *type, int *length, + long info) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + + if (info !=3D IIO_CHAN_INFO_SAMP_FREQ) + return -EINVAL; + + *vals =3D st->freqs; + *type =3D IIO_VAL_INT; + *length =3D st->n_freqs; + + return IIO_AVAIL_LIST; +} + static const struct iio_info ad7768_info =3D { .debugfs_reg_access =3D ad7768_reg_access, .read_raw =3D ad7768_read_raw, + .write_raw_get_fmt =3D ad7768_write_raw_get_fmt, + .write_raw =3D ad7768_write_raw, + .read_avail =3D ad7768_read_avail, .update_scan_mode =3D ad7768_update_scan_mode, }; =20 @@ -770,6 +850,20 @@ static void ad7768_set_available_sampling_freqs(struct= ad7768_state *st) if (st->datalines =3D=3D 1 && st->chip_info->num_channels =3D=3D AD7768_MAX_CHANNEL) st->avail_freq[n_power_modes - 1].n_freqs--; + + for (unsigned int mode_idx =3D 0; mode_idx < n_power_modes; mode_idx++) { + const struct ad7768_avail_freq *avail_freq; + + avail_freq =3D &st->avail_freq[mode_idx]; + for (unsigned int i =3D 0; i < avail_freq->n_freqs; i++) { + unsigned int freq =3D avail_freq->freq_cfg[i].freq_hz; + + if (st->n_freqs && st->freqs[st->n_freqs - 1] >=3D freq) + continue; + + st->freqs[st->n_freqs++] =3D freq; + } + } } =20 static int ad7768_init_sampling_freqs(struct ad7768_state *st) @@ -867,7 +961,10 @@ static int ad7768_parse_config(struct iio_dev *indio_d= ev, =20 chan[chan_idx] =3D (struct iio_chan_spec) { .type =3D IIO_VOLTAGE, - .info_mask_separate =3D BIT(IIO_CHAN_INFO_SCALE), + .info_mask_separate =3D BIT(IIO_CHAN_INFO_SCALE) | + BIT(IIO_CHAN_INFO_SAMP_FREQ), + .info_mask_separate_available =3D + BIT(IIO_CHAN_INFO_SAMP_FREQ), .indexed =3D 1, .channel =3D channel, .scan_index =3D channel, --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 633CD4F054B; Thu, 10 Sep 2026 17:37: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=1789061889; cv=none; b=g95ixtbBBlT7WferUT0Gl03+KOxCMBnHnvGL9MM6B0oClZHerR2qrGlwFtKfOrx7Eb7dve4vpMdS0rIa4YqF8ggfiER9wxw13WvL4xlzY5r9XVCjEczgP15h23/qcdAkFm2xZjKd6axbKXBTg10GWAYoKsIS9hiALPWq9TcVdWk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061889; c=relaxed/simple; bh=qFBDlxtBYcHhwsTePHahJ96kK93Jlnvb1qN6fWu6fMg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=ayANtz4ymHQyu/FTNC8JSz7+2RkEHGFPWoiurfkcDQsiM/dqtFvwhvL80k3O7ZOm65xNpeCHmcuPJd3kd/mVLzhDelLPv6bYEx81o6dDHGUDfGq9WAdpDfNr6uhyNIM7J0RZWp0VFKjHM+N9khZqnE9rqox4cY5HNM+vY1boEn8= 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=TGvC0L7B; 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="TGvC0L7B" 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 68AF8G7P094914; Thu, 10 Sep 2026 13:37:38 -0400 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=m9BvK IxXV2qazgFlLu3MO5DwNYgIdhLmZk1CZefSIAs=; b=TGvC0L7B6M7lZgIUXTuuq 9oT3SzgKbaTsNuXr+plM0FuR709gQ7U/gBSCTPUzjJtcfg9BHuvqJilSCJIJOS8F 5wV/oSSGaAMsvvV4DQDeK+IJZMKR1eq0IZkFeyIMMAcENK8d4hBi1AnSVUOfr1qa 5L1cD93ULRgJUPR7GBp0i9nA/13NfCrs9OI3WFP91YgraGLnkJktPrR7HhGdPnfZ /ict0uHLH/EYFMAsqX1nVCxUHZ4Jgb+lnBiKIRIrWTcuBDzsJSQTLIdJr95ZiD9o OTU/vSitksvX3rAH+hPEsWZpPBm0nga4o4C7OcRYCNDpwS+vudfNjjeLhQ7cjYvv w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxcw1ru-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:37 -0400 (EDT) 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 68AHbaRo038829 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:36 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Thu, 10 Sep 2026 13:37:36 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Thu, 10 Sep 2026 13:37:36 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSh018832; Thu, 10 Sep 2026 13:37:28 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:29 +0200 Subject: [PATCH v7 11/17] iio: adc: ad7768: Add per-channel filter controls Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-11-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , David Lechner , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=5046; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=qFBDlxtBYcHhwsTePHahJ96kK93Jlnvb1qN6fWu6fMg=; b=7ZXf2WfB7cMrWXsjOSRBKw/4esuTLM947C1TFwt/tYDgRGWF5hfEbFKno3z+iLFWoif8vVqos gCELWftCDVSDzWq6MZ7KwX4TPze1bsaTJ2kYqa+Oh7lbH6fVVhWG9uX X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX4TGFZIsiLy/5 r8i9AHQ/BXhX/zYIpP1iX8PTMUkSXtXVgSFhDJjqG6PHrmUKvbJsYi9sfaNAyvDtJFSAHFDFVXw ITIWsh768RTr3cvfAhfo6ia9xedRZZil287XBL0WpEnKF2o6su8XYstmZ9tTw0ZyjSqJNutsz/M tZ7l4KuTsdlaUdcnzcWv3iolABWjlrYcrc/HcSt+nB2J7lpg8uSVdQnuJT5eJlPdzswoZx4ny4V qsVnJTvQ/KV9lkW5aA+Rz1IP1YcLUD5U3WhenzGFBaSdLRCBro+mq0zrwLM0Ft/vK8q6abH/hy7 X2QB+j73gCNTI7wz6LWMSrsnHSosWWiKDuQef3GFkD65f0bVR01sj5AjsM/fKqfVI4kohWbLQ0W 0CRaylVlQPZ3cSP0GSeVU2xeQa8zuc/K64AuSNpKxA15u24d5Kturih7pNP2fpSJnij0pmphR8W QALqqjuk5Zr5IVikhng== X-Authority-Analysis: v=2.4 cv=GoTXaU1C c=1 sm=1 tr=0 ts=6aa2eae1 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=u1yhE7RKQyILiklAgKsA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX5fSoezhe5Wls e2ezpDhox4BGsat7K4YgNoNnCaYgUrWZEugFeXQCi7qwBB705rmx1cITKgdgs2KMgndWMN0Pxd+ dEXasOTxR+4/CVMvF79w0d6hrsfYZybNwq2IjNIAY73+GTs9zazJ X-Proofpoint-GUID: fMWEiXTLGpT5PD0lvpbbsk26ACoCpNAk X-Proofpoint-ORIG-GUID: fMWEiXTLGpT5PD0lvpbbsk26ACoCpNAk X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 phishscore=0 adultscore=0 priorityscore=1501 spamscore=0 clxscore=1015 impostorscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Expose wideband and sinc5 filter selection for each channel. Group enabled channels by their requested sampling frequency and filter pairs and program each pair into one of the two hardware mode profiles. Signed-off-by: Janani Sunil --- drivers/iio/adc/ad7768.c | 72 ++++++++++++++++++++++++++++++++++++++++++++= ---- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 36df678bd00f..2ff8a8569c0e 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -104,6 +104,11 @@ #define AD7768_MAX_CHANNEL 8 #define AD7768_NUM_CHANNEL_MODES 2 =20 +enum ad7768_filter_type { + AD7768_FILTER_TYPE_WIDEBAND, + AD7768_FILTER_TYPE_SINC5, +}; + enum ad7768_clock_source { AD7768_CLOCK_SOURCE_MCLK, AD7768_CLOCK_SOURCE_XTAL, @@ -164,6 +169,7 @@ struct ad7768_state { int freqs[AD7768_MAX_FREQS]; unsigned int ch_freq[AD7768_MAX_CHANNEL]; unsigned int power_mode_idx; + enum ad7768_filter_type ch_filter[AD7768_MAX_CHANNEL]; struct iio_backend *back; unsigned int vref_uV[2]; =20 @@ -543,12 +549,59 @@ static int ad7768_set_sampling_freq(struct iio_dev *i= ndio_dev, return 0; } =20 +static int ad7768_set_filter_mode(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + unsigned int mode) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + + IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); + if (IIO_DEV_ACQUIRE_FAILED(claim)) + return -EBUSY; + + guard(mutex)(&st->lock); + st->ch_filter[chan->channel] =3D mode; + + return 0; +} + +static int ad7768_get_filter_mode(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan) +{ + struct ad7768_state *st =3D iio_priv(indio_dev); + + guard(mutex)(&st->lock); + + return st->ch_filter[chan->channel]; +} + +static const char *const ad7768_filter_types[] =3D { + [AD7768_FILTER_TYPE_WIDEBAND] =3D "wideband", + [AD7768_FILTER_TYPE_SINC5] =3D "sinc5", +}; + +static const struct iio_enum ad7768_filter_types_enum =3D { + .items =3D ad7768_filter_types, + .num_items =3D ARRAY_SIZE(ad7768_filter_types), + .set =3D ad7768_set_filter_mode, + .get =3D ad7768_get_filter_mode, +}; + +static struct iio_chan_spec_ext_info ad7768_ext_info[] =3D { + IIO_ENUM("filter_type", IIO_SEPARATE, &ad7768_filter_types_enum), + IIO_ENUM_AVAILABLE("filter_type", IIO_SEPARATE, &ad7768_filter_types_enum= ), + { } +}; + static int ad7768_find_matching_mode(const bool *mode_used, const unsigned int *mode_freq, - unsigned int freq) + const enum ad7768_filter_type *mode_filter, + unsigned int freq, + enum ad7768_filter_type filter) { for (unsigned int mode =3D 0; mode < AD7768_NUM_CHANNEL_MODES; mode++) { - if (!mode_used[mode] || mode_freq[mode] =3D=3D freq) + if (!mode_used[mode] || + (mode_freq[mode] =3D=3D freq && mode_filter[mode] =3D=3D filter)) return mode; } =20 @@ -558,6 +611,7 @@ static int ad7768_find_matching_mode(const bool *mode_u= sed, static int ad7768_apply_channel_modes(struct iio_dev *indio_dev, const unsigned long *scan_mask) { + enum ad7768_filter_type mode_filter[AD7768_NUM_CHANNEL_MODES] =3D { }; unsigned int mode_freq[AD7768_NUM_CHANNEL_MODES] =3D { }; bool mode_used[AD7768_NUM_CHANNEL_MODES] =3D { }; struct ad7768_state *st =3D iio_priv(indio_dev); @@ -592,13 +646,15 @@ static int ad7768_apply_channel_modes(struct iio_dev = *indio_dev, int mode; =20 mode =3D ad7768_find_matching_mode(mode_used, mode_freq, - st->ch_freq[c]); + mode_filter, st->ch_freq[c], + st->ch_filter[c]); if (mode < 0) return dev_err_probe(dev, -EINVAL, "Over %d channel modes required\n", AD7768_NUM_CHANNEL_MODES); =20 mode_freq[mode] =3D st->ch_freq[c]; + mode_filter[mode] =3D st->ch_filter[c]; mode_used[mode] =3D true; =20 mask =3D ad7768_channel_mode_mask(st, c); @@ -622,8 +678,9 @@ static int ad7768_apply_channel_modes(struct iio_dev *i= ndio_dev, if (ret) return ret; =20 - ret =3D regmap_clear_bits(st->regmap, AD7768_REG_CH_MODE(mode), - AD7768_CH_MODE_FILTER_TYPE_MSK); + ret =3D regmap_assign_bits(st->regmap, AD7768_REG_CH_MODE(mode), + AD7768_CH_MODE_FILTER_TYPE_MSK, + mode_filter[mode]); if (ret) return ret; =20 @@ -879,8 +936,10 @@ static int ad7768_init_sampling_freqs(struct ad7768_st= ate *st) avail_freq =3D &st->avail_freq[st->power_mode_idx]; default_freq =3D avail_freq->freq_cfg[avail_freq->n_freqs - 1].freq_hz; for (unsigned int channel =3D 0; - channel < st->chip_info->num_channels; channel++) + channel < st->chip_info->num_channels; channel++) { st->ch_freq[channel] =3D default_freq; + st->ch_filter[channel] =3D AD7768_FILTER_TYPE_WIDEBAND; + } =20 return 0; } @@ -973,6 +1032,7 @@ static int ad7768_parse_config(struct iio_dev *indio_d= ev, .realbits =3D 24, .storagebits =3D 32, }, + .ext_info =3D ad7768_ext_info, }; chan_idx++; } --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 3164656B861; Thu, 10 Sep 2026 17:38:00 +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=1789061890; cv=none; b=bh9CL0Q6k2Ohx0PRxl4PT413nIqof16JRikRoIH6pLk0TOmuVyNvLE/0wAHNaPa3TDEGijYp0PN6RToi7ZcsrmBSMmgkfeHNgSuovkBF4k6WYzprfR/wdSACwBvO4ulp3hVBnWHPH2bLvv4ejf7vYed1UZHEci5XOJzG0wY0tVI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061890; c=relaxed/simple; bh=h5qK61XToBChPWnzc7k/ar18hPjhP95D8yaf0+jW2JA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=pt0VixQ2LwjEGLyNVAXxbujAQd3FR1qAKzoi1GYnFVdUxCOJJk0socCrphtHvmfDQ9PVftPvPYzYZxk89JLDlcC/ddwIednBrArvVMDEhTBVEKpRYCvQEhjv+0J4lt4Lj9jrlERuXQrXvd3v+vVMShb8HzvavFL18xVUm9LoCBk= 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=TIn4b0zF; 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="TIn4b0zF" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68AF7OqX343068; Thu, 10 Sep 2026 13:37:41 -0400 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=pLWvQ Ak76s98XK2T2f2SnvdcbszkyvSZsmmNdB1tBWQ=; b=TIn4b0zF+4yXws69FURYu RhYg+uoW94nRlBj76EwSMqeW0WtABd/0dil6q8A61+tuh04/pag3YPCYllZ5ZaiD xOZ6GYFfzp4cPJcqCxjO/YibaqVpCGGykmuTRNHWTeJuoaZIPDHK+u3x8B7jsfP7 SFySHD4ZvsLyWiHjioPnLP34xtmLji0THbRBAZHN9WuGHenGNvwzxbkqaZF+mSbk vKgnnXL38Vcbb1oauQN2T9Id4EZQSm9/9iTZRChdBROJIgebN+k+y6aU5eLiBdgH T67MBnawYphZWTg4FfyvlSdNRyjbHr9uZC8lKII/9gfdHPaz0wBMUIOnqS+nEu0K A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcx95228-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:41 -0400 (EDT) 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 68AHbe1v038841 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:40 -0400 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; Thu, 10 Sep 2026 13:37:40 -0400 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; Thu, 10 Sep 2026 13:37:40 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSi018832; Thu, 10 Sep 2026 13:37:32 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:30 +0200 Subject: [PATCH v7 12/17] iio: adc: ad7768: Wait for digital filters to settle Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-12-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , David Lechner , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=2279; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=h5qK61XToBChPWnzc7k/ar18hPjhP95D8yaf0+jW2JA=; b=nbddVFKru94WNsbNNAOhJP+yM1tYs0iP8oA4GIiP8wYfOdnD5io06ZCGvuJ4/7xLzgI8NfX5g 81R3ww7I3EjByCMLm95k1NNvU9HKhsjw3gho9/gFVsDyn/tJAcZE0Ej X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX0CXQQt2w+J/7 zog3A6uzNFSqr1zmwDXi1HOOoQVj4u1eR6UYq+f3Lq364g6+cu0PP7nUgstsaFiH6+876j5HOK0 hcYyaJK4MkPM7eQbY498coxyIf09qUG4vDbfdrBTWECy5fmC7ISO X-Proofpoint-GUID: Qmcafwb--QaZIPEnp6vjG2-EEgSUMWU- X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfXwXf2afOlOmp1 Sx504g9RSxuattI9W2NsyiUPL0SE7vqnDr6B8MjOyhIBhe7X5tHTLGyqGR2xnzVIYfO3aPEJs4n zhyjj/hg7/n/VKOpzjvWAUXfPn0tQNQicdQ3W+zTiwBtKJvB4RxCjP0fm3nNhSeBD1NOpNsPNNE qLnMuejZcny40ag9OCcGiXPV2817Q/Itbgw63/V6HKVyILd85A+ItcY5PeuVhwti29FGIHmxWdC GqR/Pa6I6drsWOrDH3W12e7/HaBYE1TsPqO7EMpeyKT3DO9ZoZaGA2Guwe+HG2wCt1sStuZFAHk GRXbSix3dCXPUIY6SpK4dHaiF30f4nLNc3mxSlBc/C8P2bCBz492gI0Dx0Ytbyz6D3dTOhRG26K 45ruqG8VOp+wuPOOVmtSlGN7vC+3G2oOU/MYI7XbjqcocsP98mT1v/P2Tp/ZhvpmV5zMJcXZ82j Hdy/ZmGNFVySqvvur1w== X-Authority-Analysis: v=2.4 cv=G8CJgNk5 c=1 sm=1 tr=0 ts=6aa2eae5 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=uXIjobp8t2wMuQ0fPvqm:22 a=gAnH3GRIAAAA:8 a=meB-weNJVlBEWY6-UGIA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: Qmcafwb--QaZIPEnp6vjG2-EEgSUMWU- X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 adultscore=0 malwarescore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 After synchronizing the channel mode configuration, wait for the longest settling period required by the active profiles. Derive the delay from the selected output data rate and the datasheet filter-settling limits. Signed-off-by: Janani Sunil --- drivers/iio/adc/ad7768.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 2ff8a8569c0e..5d576fffad80 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -103,6 +103,8 @@ #define AD7768_MAX_FREQ_PER_MODE 6 #define AD7768_MAX_CHANNEL 8 #define AD7768_NUM_CHANNEL_MODES 2 +#define AD7768_WIDEBAND_SETTLING_SAMPLES 68 +#define AD7768_SINC5_SETTLING_SAMPLES 7 =20 enum ad7768_filter_type { AD7768_FILTER_TYPE_WIDEBAND, @@ -608,6 +610,33 @@ static int ad7768_find_matching_mode(const bool *mode_= used, return -EINVAL; } =20 +static void ad7768_filter_wait(const unsigned int *mode_freq, + const enum ad7768_filter_type *mode_filter, + const bool *mode_used) +{ + unsigned int t_settle_us =3D 0; + + for (unsigned int mode =3D 0; mode < AD7768_NUM_CHANNEL_MODES; mode++) { + unsigned int t_mode_us; + u8 settling_samples; + + if (!mode_used[mode] || !mode_freq[mode]) + continue; + + if (mode_filter[mode] =3D=3D AD7768_FILTER_TYPE_SINC5) + settling_samples =3D AD7768_SINC5_SETTLING_SAMPLES; + else + settling_samples =3D AD7768_WIDEBAND_SETTLING_SAMPLES; + + t_mode_us =3D DIV_ROUND_UP(settling_samples * USEC_PER_SEC, + mode_freq[mode]); + t_settle_us =3D max(t_settle_us, t_mode_us); + } + + if (t_settle_us) + fsleep(t_settle_us); +} + static int ad7768_apply_channel_modes(struct iio_dev *indio_dev, const unsigned long *scan_mask) { @@ -691,7 +720,14 @@ static int ad7768_apply_channel_modes(struct iio_dev *= indio_dev, if (ret) return ret; =20 - return ad7768_sync(st); + ret =3D ad7768_sync(st); + if (ret) + return ret; + + /* Apply a filter settling time (datasheet Tables 28 and 29). */ + ad7768_filter_wait(mode_freq, mode_filter, mode_used); + + return 0; } =20 static int ad7768_update_scan_mode(struct iio_dev *indio_dev, --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 4F3E5585974; Thu, 10 Sep 2026 17:38:03 +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=1789061901; cv=none; b=D0I7wDrV/Uh9jBj5NFQmNXmEo9VKzp7E+XTUx+TZhDIOg/1OulFu57xNgcLH88d7Bi7K144q24H/D1DTpp4NMXWCdruiU24gt0gqphD/yw8eLfcNp5AZzKBWRv0XElCvRKiLF+QxIuisXROxBKumnsnpHnh7QSS671kPaMDLJIY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061901; c=relaxed/simple; bh=I1mKaxKEAyp9gq6cUp4BXfT/L8nwybmrRghZ9fu8iAQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=VqhrVF/M0rI0g9W+vAM5oS4aTKlRYjdiFXm+liQTPBtKAkwGWGEs9EJpAKxx53i/gxIB294VfLaRAeJP4gtMYgx1ZpL8vWwPIVUeMaKodiLhO7hKoIEnL4XcPNNStUC7tYXp4siAPWDdXNlRtubxQlcZB0nnucVlDVMVPfc4JQ8= 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=WK3HA12C; 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="WK3HA12C" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68AF7OqY343068; Thu, 10 Sep 2026 13:37:45 -0400 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=w78ev UcMatvI7FlsI1/oc0c33SOPqEEJUfUZJXJOu80=; b=WK3HA12C1j9TOhBXvD2TS DRWr97htseMtWFQXeY5ldBkJXNQzhTJfAt3v2qDeaTrCbph3SfyYvwuVxR4LtBtr e4Sr82fB2uHUlfZs1XGsVFy4V0B0Zw40xMLFOj4oYSoVByIXAybETuUPTIKi4rhE 0YiYspma4kJOAJP9Pj44GW9aaVDyGbYmwK4xfNiDB44IE9hsRX4jjKAA7XLwcUFt rJFD/VnukUUEF4LRyhy156e3jjkUckgKdvYbfoKCv4cnsIGMziWeduBjcFw5CT6x 1SU52JlUjWnHziFqqM92+TGbqlxc7xmdpAa5TTXzAi3xcxZ+gqo6t5knMtvKuvYP Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcx9522e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:45 -0400 (EDT) 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 68AHbitJ038853 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:44 -0400 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; Thu, 10 Sep 2026 13:37:44 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Thu, 10 Sep 2026 13:37:44 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Thu, 10 Sep 2026 13:37:44 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSj018832; Thu, 10 Sep 2026 13:37:35 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:31 +0200 Subject: [PATCH v7 13/17] iio: adc: ad7768: Add calibration controls Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-13-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=5912; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=I1mKaxKEAyp9gq6cUp4BXfT/L8nwybmrRghZ9fu8iAQ=; b=J3uPWNVUW95gFBtgk8CFHWtC4DGBro1hVHjorc+9lNx1tzGvRz1Fo1e7s9Sqn8JnF5cQ/mLyp EVv4lFrlSMEC4NBeV0pkv3WPFTp/bMgLhivAiC5lS4YW4HZdwsSHvDo X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX7P7kidUAmxtX cCKKwDOLf02UZPiKdI26Z7+JP7FHTf2fgaHo5J3FCAsZWogJLwOfVRiLfAQXWiQZplr5Cp3dgHB A6Ie1UZ+FxlJnyOcVPrO9vNlBFw4MyQuJW7LqCWuGeBGEEQg6UPJ X-Proofpoint-GUID: MyU3YKvXrKpvBlDHBmZMpoRW3WNmWezC X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX6mb0tlzRNHKL QaiGXdTtczLuhMTBBRrSR7GHtmnh+VnRX7OAoTQbILWYraQB6gSdXCX5Bj+6UgaLgAt9T25oEHo icDFTjSo2KtuOay6Vd5JadwtC5//yj5WOJiwVJ7dwTKiXp8TyJFQ6wfRT3ddkYP0DARIbNxH4Jc aWhfQ1OM9M1Iq/3JPMjr8OOK/5/3IBFuqVInZy9sNir6xzjmcFkmLkDVyToa9K/4Gddk4HHXk7z /BA5r7W7H6B/aQRzoFtoX7SGwhJHQUf36BrHDZx+EOcSiHztgnqyV6naE9eVN0235Xu+E+UkU5z d3sSOg5Q3q0kaCGMBqWBl+P2y7voZOEsOIfIdTmqVhCBaYvh1bOTfRlKG6P2t4u5SaHvUC/K2OH khOcDnLv11RcRLqnpTjezpf0B8K092ZSbTs2b29g6465PuVQhJ7R09bJW0JdaybCW/fC4ncCel9 PR7AGiW0EYcC4MyS79Q== X-Authority-Analysis: v=2.4 cv=G8CJgNk5 c=1 sm=1 tr=0 ts=6aa2eae9 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=uXIjobp8t2wMuQ0fPvqm:22 a=gAnH3GRIAAAA:8 a=u7vyrQcF4N0oJoUPIfgA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: MyU3YKvXrKpvBlDHBmZMpoRW3WNmWezC X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 adultscore=0 malwarescore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Expose the per-channel offset and gain calibration registers through the IIO calibbias and calibscale attributes. Signed-off-by: Janani Sunil --- drivers/iio/adc/ad7768.c | 119 +++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 113 insertions(+), 6 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 5d576fffad80..ab82355c839a 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -27,6 +27,7 @@ #include #include #include +#include #include =20 #include @@ -103,6 +104,8 @@ #define AD7768_MAX_FREQ_PER_MODE 6 #define AD7768_MAX_CHANNEL 8 #define AD7768_NUM_CHANNEL_MODES 2 +#define AD7768_CALIB_SIGN_BIT 23 +#define AD7768_CALIB_REG_MSK GENMASK(AD7768_CALIB_SIGN_BIT, 0) #define AD7768_WIDEBAND_SETTLING_SAMPLES 68 #define AD7768_SINC5_SETTLING_SAMPLES 7 =20 @@ -234,6 +237,18 @@ static u8 ad7768_all_standby_mask(const struct ad7768_= state *st) return GENMASK(st->chip_info->num_channels - 1, 0); } =20 +static unsigned int ad7768_offset_reg(const struct ad7768_state *st, + unsigned int ch) +{ + return AD7768_REG_OFFSET(st->chip_info->chan_map[ch]); +} + +static unsigned int ad7768_gain_reg(const struct ad7768_state *st, + unsigned int ch) +{ + return AD7768_REG_GAIN(st->chip_info->chan_map[ch]); +} + static u8 ad7768_precharge_buf1_mask(const struct ad7768_state *st, u16 va= l) { return val & GENMASK(st->chip_info->prebuf_split - 1, 0); @@ -360,6 +375,67 @@ static const struct regmap_config ad7768_4_regmap_conf= ig =3D { .readable_reg =3D ad7768_4_readable_reg, }; =20 +static unsigned int ad7768_get_calib_reg_base(struct ad7768_state *st, + const struct iio_chan_spec *chan, + bool is_gain) +{ + if (is_gain) + return ad7768_gain_reg(st, chan->channel); + + return ad7768_offset_reg(st, chan->channel); +} + +static int ad7768_read_calib_value(struct ad7768_state *st, + unsigned int base_reg, bool is_signed, + int *val) +{ + unsigned int regval; + u8 data[3]; + int ret; + + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(regmap_get_device(st->regmap), pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + + guard(mutex)(&st->lock); + + ret =3D regmap_bulk_read(st->regmap, base_reg, data, sizeof(data)); + if (ret) + return ret; + + regval =3D get_unaligned_be24(data); + *val =3D is_signed ? sign_extend32(regval, AD7768_CALIB_SIGN_BIT) : regva= l; + + return 0; +} + +static int ad7768_write_calib_value(struct ad7768_state *st, + unsigned int base_reg, bool is_signed, + int val) +{ + u8 data[3]; + int ret; + + if (is_signed && + val !=3D sign_extend32(val, AD7768_CALIB_SIGN_BIT)) + return -EINVAL; + + if (!is_signed && (val < 0 || val > AD7768_CALIB_REG_MSK)) + return -EINVAL; + + put_unaligned_be24(val, data); + + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(regmap_get_device(st->regmap), pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + + guard(mutex)(&st->lock); + + return regmap_bulk_write(st->regmap, base_reg, data, sizeof(data)); +} + static int ad7768_reg_access(struct iio_dev *indio_dev, unsigned int reg, unsigned int writeval, @@ -810,6 +886,7 @@ static int ad7768_read_raw(struct iio_dev *indio_dev, int *val, int *val2, long info) { struct ad7768_state *st =3D iio_priv(indio_dev); + int ret; =20 switch (info) { case IIO_CHAN_INFO_SCALE: @@ -820,6 +897,19 @@ static int ad7768_read_raw(struct iio_dev *indio_dev, =20 return IIO_VAL_INT; } + + case IIO_CHAN_INFO_CALIBBIAS: + case IIO_CHAN_INFO_CALIBSCALE: { + bool is_gain =3D info =3D=3D IIO_CHAN_INFO_CALIBSCALE; + unsigned int base_reg; + + base_reg =3D ad7768_get_calib_reg_base(st, chan, is_gain); + ret =3D ad7768_read_calib_value(st, base_reg, !is_gain, val); + if (ret) + return ret; + + return IIO_VAL_INT; + } default: return -EINVAL; } @@ -828,24 +918,39 @@ static int ad7768_read_raw(struct iio_dev *indio_dev, static int ad7768_write_raw_get_fmt(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, long info) { - if (info =3D=3D IIO_CHAN_INFO_SAMP_FREQ) + switch (info) { + case IIO_CHAN_INFO_SAMP_FREQ: + case IIO_CHAN_INFO_CALIBBIAS: + case IIO_CHAN_INFO_CALIBSCALE: return IIO_VAL_INT; - - return -EINVAL; + default: + return -EINVAL; + } } =20 static int ad7768_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long info) { + struct ad7768_state *st =3D iio_priv(indio_dev); + unsigned int base_reg; + IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); if (IIO_DEV_ACQUIRE_FAILED(claim)) return -EBUSY; =20 - if (info =3D=3D IIO_CHAN_INFO_SAMP_FREQ) + switch (info) { + case IIO_CHAN_INFO_SAMP_FREQ: return ad7768_set_sampling_freq(indio_dev, val, chan->channel); - - return -EINVAL; + case IIO_CHAN_INFO_CALIBBIAS: + base_reg =3D ad7768_get_calib_reg_base(st, chan, false); + return ad7768_write_calib_value(st, base_reg, true, val); + case IIO_CHAN_INFO_CALIBSCALE: + base_reg =3D ad7768_get_calib_reg_base(st, chan, true); + return ad7768_write_calib_value(st, base_reg, false, val); + default: + return -EINVAL; + } } =20 static int ad7768_read_avail(struct iio_dev *indio_dev, @@ -1057,6 +1162,8 @@ static int ad7768_parse_config(struct iio_dev *indio_= dev, chan[chan_idx] =3D (struct iio_chan_spec) { .type =3D IIO_VOLTAGE, .info_mask_separate =3D BIT(IIO_CHAN_INFO_SCALE) | + BIT(IIO_CHAN_INFO_CALIBBIAS) | + BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ), .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SAMP_FREQ), --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 8BA8E583AA8; Thu, 10 Sep 2026 17:38:08 +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=1789061913; cv=none; b=QbXAcSRcwZFQWA2eoDlepgjuuyM+zJW3pfWe8aZokNQ+kWef2ZUe5Rmd6tIoJSsFTxJgS1csGy6Yz0tGz3pXzUALvIioVBYgyxLpNxXIOFCLpNiD4nb/5P/NZ0j87pezs/MbaVzNodi6q3xCDWj3Q0wHa0C/b/q1Le5+o5ZlK7E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061913; c=relaxed/simple; bh=/VcY3CjOlmZJf5G7BG8OojUcmtvwrGQrV4aA2S/NBK8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=FIWVeM/UEYa1CtA/xvdFpJbMkSei812ZTcoZTD6wjyuBoClaBjmTPmmGfX59fVZjuOi2LzK5BHQfz/YHnMmtwsZUolGSjWM8U2LCzHcB3OkzIBCt7qL5j1wWuTpne6xHbsnCmvQokzTHZF5NdKbGzvjxP0X/nbW+41V0kYI5ocY= 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=vUI7YX+5; 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="vUI7YX+5" 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 68AF8Gkg094915; Thu, 10 Sep 2026 13:37:49 -0400 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=TaJLM cW9sz7V12rkFKur5T4gS/+VztAzbvh7/TTZOo0=; b=vUI7YX+5vzrej2UNUl49Y 6/okbsJ4Lc3yc8grXqvFaPtcN6b9woaUFaXe2/KJHDWH8q5UGlSq8fPFU5mCOjHK RLkb7hhWveb92wC9pAloHE8+JoopOZRPqmufrJvF1VaSGkVrEdjiPXdqmctMN5Xa KYd6+eKGPl/3TqjSjvw9kswutJrk67pZpJq9jaBfoe6Vfwe91NvJ/J6WRFRSjJd0 txqM4etvAtHgHfDjht7+7VSEboT+7/2Qw+da16uQRYI4SNOF28hG5VS3+Kiyz+ZV RgrLDG+XwBKUC6CJrdbb7qkWUbfvmnB0AhQCwc9wZ3HZQANF5jLhB2/2k5Air/2k A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxcw1sd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:48 -0400 (EDT) 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 68AHblQ0038859 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:47 -0400 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; Thu, 10 Sep 2026 13:37:47 -0400 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; Thu, 10 Sep 2026 13:37:47 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSk018832; Thu, 10 Sep 2026 13:37:39 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:32 +0200 Subject: [PATCH v7 14/17] iio: adc: ad7768: Add per-channel conversion delay Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-14-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , David Lechner , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=6551; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=/VcY3CjOlmZJf5G7BG8OojUcmtvwrGQrV4aA2S/NBK8=; b=1rl/Y7VFhaz5KRyuPPiLMtyv/Q25kPYzgcAW/Ue4Rj/ZHaLSfUo+TJ4zNclfVyvdQKnH8VLsX hfLFtnWkpkFAqI5tvdT7//fjeyO5fSgxnd37zwyLPVrqFJLQ375B1Qd X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX1kHM+uNcBbpA RlPHVrAXJueZgxZd6Yl7qQNBXicvDeL4as7RegwciT4KyKq7Vwz4SsCNMV5gzu+4Y9CHpRxFBLc Qcy02XResanFc2asfZjMsg7Bc1Y9I86ez3HNjY6q6TKvFPzi79aZqs3ATauvmUE5Swduy3mr7LM 6a14qi5ojBeLv9w0Gu7KRZkJjwbsykZas8Owx5IYKp4RoBNETv+65oSVcoaKjGgYqUKOrHclmKZ vbUVU6kz/80ex0owO/+U9c8LKYvvtdfc/WCNrt1TXNVJxxpBE9eQuCpDJxa2LcaWJkmRtJcHtJP 027SXZYsNJGjhWQbGeJwvC6M9DRzPaEnieoYqBxY+ewlWj/NTiADE4LL4S4QnU7beKuv//HPuRS I+V+L0Bsosm3+c0OM/EzJvIjMNbPdD2UIIOZh/MCoobukPSai2SNn4OR5V4bUd06lMUS7KGQJny o2fpG4I6h3RNfM/nQzg== X-Authority-Analysis: v=2.4 cv=GoTXaU1C c=1 sm=1 tr=0 ts=6aa2eaec cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=g92PuHId75YPrMRR_n4A:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX1vP/rj+b3w7u SZEYyJ9vKQQcGwN0wWCQmMbHjUM8Ih+0hAFgKlq+RJBQ/Kx+448K26SI4ydW63vzpANzO8ec7qm Dn9F0rdTVltyqxQ85osNzkx6QD49/7S7VdC3ZDmXip7B44Ubsz0j X-Proofpoint-GUID: _TZJoTvptRxXVp30NOw9cBXHj7y0Qtsf X-Proofpoint-ORIG-GUID: _TZJoTvptRxXVp30NOw9cBXHj7y0Qtsf X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 phishscore=0 adultscore=0 priorityscore=1501 spamscore=0 clxscore=1015 impostorscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Expose the per-channel synchronization phase offset through the IIO conversion-delay attribute. Derive the delay resolution from MCLK, power mode and decimation rate. Validate the requested delay and program the corresponding phase register when applying the active channel configuration. Signed-off-by: Janani Sunil --- drivers/iio/adc/ad7768.c | 136 +++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 136 insertions(+) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index ab82355c839a..941fdac634a6 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -146,6 +146,12 @@ struct ad7768_freq_config { unsigned int dec_rate; }; =20 +struct ad7768_convdelay_params { + unsigned int shift; + unsigned int max_raw; + u64 step_ps; +}; + struct ad7768_avail_freq { unsigned int n_freqs; struct ad7768_freq_config freq_cfg[AD7768_MAX_FREQ_PER_MODE]; @@ -172,6 +178,7 @@ struct ad7768_state { struct ad7768_avail_freq avail_freq[ARRAY_SIZE(ad7768_power_modes)]; unsigned int n_freqs; int freqs[AD7768_MAX_FREQS]; + u64 ch_convdelay_ps[AD7768_MAX_CHANNEL]; unsigned int ch_freq[AD7768_MAX_CHANNEL]; unsigned int power_mode_idx; enum ad7768_filter_type ch_filter[AD7768_MAX_CHANNEL]; @@ -249,6 +256,12 @@ static unsigned int ad7768_gain_reg(const struct ad776= 8_state *st, return AD7768_REG_GAIN(st->chip_info->chan_map[ch]); } =20 +static unsigned int ad7768_phase_reg(const struct ad7768_state *st, + unsigned int ch) +{ + return AD7768_REG_PHASE(st->chip_info->chan_map[ch]); +} + static u8 ad7768_precharge_buf1_mask(const struct ad7768_state *st, u16 va= l) { return val & GENMASK(st->chip_info->prebuf_split - 1, 0); @@ -686,6 +699,99 @@ static int ad7768_find_matching_mode(const bool *mode_= used, return -EINVAL; } =20 +static int ad7768_get_convdelay_params(struct ad7768_state *st, unsigned i= nt ch, + struct ad7768_convdelay_params *params) +{ + const struct ad7768_freq_config *freq_cfg; + unsigned int dec_rate; + unsigned int mclk_div; + unsigned long mclk; + u64 mult; + + freq_cfg =3D ad7768_find_freq_config(st, st->power_mode_idx, + st->ch_freq[ch]); + if (!freq_cfg) + return -EINVAL; + + dec_rate =3D ad7768_dec_rate[freq_cfg->dec_rate]; + switch (dec_rate) { + case 32: + params->shift =3D 3; + params->max_raw =3D 31; + mult =3D 1; + break; + case 64: + params->shift =3D 2; + params->max_raw =3D 63; + mult =3D 1; + break; + case 128: + params->shift =3D 1; + params->max_raw =3D 127; + mult =3D 1; + break; + case 256: + params->shift =3D 0; + params->max_raw =3D 255; + mult =3D 1; + break; + case 512: + params->shift =3D 0; + params->max_raw =3D 255; + mult =3D 2; + break; + case 1024: + params->shift =3D 0; + params->max_raw =3D 255; + mult =3D 4; + break; + default: + return -EINVAL; + } + + mclk =3D clk_get_rate(st->mclk); + if (!mclk || mclk > U32_MAX) + return -EINVAL; + + mclk_div =3D ad7768_power_modes[st->power_mode_idx].mclk_div; + params->step_ps =3D + DIV_ROUND_CLOSEST_ULL(mult * PSEC_PER_SEC * mclk_div, (u32)mclk); + if (params->step_ps > U32_MAX) + return -EINVAL; + + return 0; +} + +static int ad7768_set_channel_convdelay(struct ad7768_state *st, + unsigned int ch) +{ + u64 delay_ps =3D st->ch_convdelay_ps[ch]; + struct ad7768_convdelay_params params; + u64 max_delay_ps; + u64 raw; + int ret; + + ret =3D ad7768_get_convdelay_params(st, ch, ¶ms); + if (ret) + return ret; + + /* + * Validate the requested delay before rounding so an out-of-range value + * cannot round down into the valid range. Then verify that the rounded + * value fits in the hardware register. + */ + max_delay_ps =3D (u64)params.max_raw * params.step_ps; + if (delay_ps > max_delay_ps) + return -EINVAL; + + raw =3D DIV_ROUND_CLOSEST_ULL(delay_ps, (u32)params.step_ps); + if (raw > params.max_raw) + return -EINVAL; + + return regmap_write(st->regmap, ad7768_phase_reg(st, ch), + raw << params.shift); +} + static void ad7768_filter_wait(const unsigned int *mode_freq, const enum ad7768_filter_type *mode_filter, const bool *mode_used) @@ -792,6 +898,16 @@ static int ad7768_apply_channel_modes(struct iio_dev *= indio_dev, max_freq =3D max(max_freq, mode_freq[mode]); } =20 + for_each_set_bit(c, scan_mask, st->chip_info->num_channels) { + ret =3D ad7768_set_channel_convdelay(st, c); + if (ret =3D=3D -EINVAL) + return dev_err_probe(regmap_get_device(st->regmap), ret, + "Invalid conversion delay for channel %u\n", + c); + if (ret) + return ret; + } + ret =3D ad7768_set_clk_divs(st, max_freq); if (ret) return ret; @@ -910,6 +1026,13 @@ static int ad7768_read_raw(struct iio_dev *indio_dev, =20 return IIO_VAL_INT; } + case IIO_CHAN_INFO_CONVDELAY: { + guard(mutex)(&st->lock); + iio_val_s64_decompose(st->ch_convdelay_ps[chan->channel], + val, val2); + + return IIO_VAL_DECIMAL64_PICO; + } default: return -EINVAL; } @@ -923,6 +1046,8 @@ static int ad7768_write_raw_get_fmt(struct iio_dev *in= dio_dev, case IIO_CHAN_INFO_CALIBBIAS: case IIO_CHAN_INFO_CALIBSCALE: return IIO_VAL_INT; + case IIO_CHAN_INFO_CONVDELAY: + return IIO_VAL_DECIMAL64_PICO; default: return -EINVAL; } @@ -934,6 +1059,7 @@ static int ad7768_write_raw(struct iio_dev *indio_dev, { struct ad7768_state *st =3D iio_priv(indio_dev); unsigned int base_reg; + s64 delay_ps; =20 IIO_DEV_ACQUIRE_DIRECT_MODE(indio_dev, claim); if (IIO_DEV_ACQUIRE_FAILED(claim)) @@ -948,6 +1074,15 @@ static int ad7768_write_raw(struct iio_dev *indio_dev, case IIO_CHAN_INFO_CALIBSCALE: base_reg =3D ad7768_get_calib_reg_base(st, chan, true); return ad7768_write_calib_value(st, base_reg, false, val); + case IIO_CHAN_INFO_CONVDELAY: { + delay_ps =3D iio_val_s64_compose(val, val2); + if (delay_ps < 0) + return -EINVAL; + + guard(mutex)(&st->lock); + st->ch_convdelay_ps[chan->channel] =3D delay_ps; + return 0; + } default: return -EINVAL; } @@ -1164,6 +1299,7 @@ static int ad7768_parse_config(struct iio_dev *indio_= dev, .info_mask_separate =3D BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_CALIBSCALE) | + BIT(IIO_CHAN_INFO_CONVDELAY) | BIT(IIO_CHAN_INFO_SAMP_FREQ), .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SAMP_FREQ), --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 9BE44577E24; Thu, 10 Sep 2026 17:38:14 +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=1789061906; cv=none; b=tRoCtTe+ts1Tz/1EoTHMC11w6y0HGrMXWenrNRvnwLaZ4CFfgNEhKxXuyTrbfl66M/V1ddGOR8MBxjmVePq3weNm0yTqizf6rNcKdDTlbMO4S72tL3mc4fdcFsEye1uojq1BLmGm+Dzzh5wFqn3QusgcsPdzNyPqKWFnGB53yXU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061906; c=relaxed/simple; bh=WVOEdN4MgnzT99O6n7M//fUnp014UcOJ1KRFTnPWbNY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=O4Q5V49Nv60nllxBUb3M2fvvjO9ZZ+uIcTOa1V9pfWCy8F51wicJ1umXjxmxugLqCzOtFjH3mlj8EUCSGv1tgnSgDkBW/gpD6S4tlscNkab8TjgfgppQfetQcs5qOVdebT2/oZUxw02C1p7LQlqU9ycHMxamNjXvq4uDTzg+j0M= 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=nOnUA3Hd; 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="nOnUA3Hd" 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 68AF83Ov3830565; Thu, 10 Sep 2026 13:37:52 -0400 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=CDVX/ iJm5rKIuFkqHWJuT5VeMLQnpDTBaPnX/snVg5Y=; b=nOnUA3HdF0Ai7bpRy8tq5 fv3jqiOi4ie1xmp1JAFCUspvtlap/D84V96Jqqhfyy8WGJFWKe3FfPZyQE5ToBoV odJn/+VR5P0hiIqUoV4gr09ElYR8r+dLYYu2omZWZjBia+JHXg0LMfEKLVwWTR4O 4p6UJbCelcsgUMl7AnFvf3Uw88apOSNUozIL/Ieef/22yoh0vjdfeiORHfdgm9Bk bY7b7yyKu0fIdH3fiFdjFFQ7c/6URSOvT0lINnP2HYntx7soBDm7v+HusquzuTED KfvFFSCqj9v3a1FlcXAdOh4jjZQzM+KqeLEP8Dp+7pp2EBKgSqbzWPGW+mKGRotF g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxad2fu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:52 -0400 (EDT) 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 68AHbo9E038865 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:51 -0400 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; Thu, 10 Sep 2026 13:37:50 -0400 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; Thu, 10 Sep 2026 13:37:50 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSl018832; Thu, 10 Sep 2026 13:37:45 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:33 +0200 Subject: [PATCH v7 15/17] iio: adc: ad7768: Add VCM regulator support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-15-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , David Lechner , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=6843; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=WVOEdN4MgnzT99O6n7M//fUnp014UcOJ1KRFTnPWbNY=; b=m3mmQdXgTsZ8RppAUqXA22f1wSgP+Pi7sDd5P1T2m2/uaY5YxVPZFTLb5AzyphTA/WrB71T8M aOjX/Qg1VKyCjRL8nTySuJu0fMe1Jn2h019sdtMpS+mE/JG4Qtbi8SA X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX0ERXRBmx6kQr o53zswGBEIdTVCyylBY4bVdAnw780brtW4v7ltujU5wD4KdvYEMMqzcTdFak1Rm/JIaxc8MWjFT SJaCi6CqShBbGwEkO2zUgJqskxVqScw5UxXpMvWooEOoIFfqcc7v X-Authority-Analysis: v=2.4 cv=Ao17T+9P c=1 sm=1 tr=0 ts=6aa2eaf0 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=gAnH3GRIAAAA:8 a=-yOam_tWmGQwaYRI1VcA:9 a=QEXdDO2ut3YA:10 a=br55WurUj89AL1qEz8Q6:22 X-Proofpoint-GUID: gpBlCU2_yOrcTjveZc9ezhW-ABHjGBct X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX5cvYezukk6Rh kAjFwb74reCoK5zNsZkguscl2kbhmBMsYUK9gc0vXjaomet9m7zQGh8JVWBlmTnt8Uc854u2IX4 Z9RvD0fByoCwOnXIbafwqZe32nBAgWKiu0q1Okg5wcCZZLHfXkKtSyxjxJ6RyLXlKJqeRinWyW3 5KBlmd9QvU5iRGF4AYjoteXnGH/gNblPIXM6AtUrNSuiooYuSK3b9w9m8hPE5FsaKHaTHW1yXF3 lD0Ves/NLNW7SIoKV+JBmJYTSeq+OFgtMJqeKuhdsRORgJ+JW1rQXFrGsFbThwLkVCqQwIvfMj+ HnWlahCYITICOxR8v9bZ8hi24DMHiDiXqZL+eZ7J5Het+jAXAN/YzKDeuFxdGZcUnBbHYagDVbE 3y5FLd2ddexFBSLbmPA+bH5odc3hEqVxFTpF9cmnNO1v+ehg6ElH/b9bEDyufZpaDKoZu2QzZ2G E3HfhgVVqEDM8Yf6SqA== X-Proofpoint-ORIG-GUID: gpBlCU2_yOrcTjveZc9ezhW-ABHjGBct X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 spamscore=0 phishscore=0 lowpriorityscore=0 suspectscore=0 impostorscore=0 adultscore=0 clxscore=1015 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Expose the on-chip common mode voltage output through the regulator framework. Support the three fixed output levels and the supply-dependent AVDD1/2 setting. Keep the ADC runtime active while VCM is enabled and release the runtime PM reference when the output is disabled. Signed-off-by: Janani Sunil --- drivers/iio/adc/Kconfig | 2 +- drivers/iio/adc/ad7768.c | 162 +++++++++++++++++++++++++++++++++++++++++++= +++- 2 files changed, 161 insertions(+), 3 deletions(-) diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 5164608fa418..c784bee0fd65 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -434,7 +434,7 @@ config AD7766 config AD7768 tristate "Analog Devices AD7768/AD7768-4 ADC driver" depends on SPI - depends on REGULATOR || COMPILE_TEST + select REGULATOR select IIO_BUFFER select IIO_BACKEND select REGMAP diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 941fdac634a6..b854c10467a2 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,10 @@ #define AD7768_POWER_MODE_LVDS_ENABLE BIT(3) #define AD7768_POWER_MODE_MCLK_DIV_MSK GENMASK(1, 0) =20 +#define AD7768_REG_GENERAL_CONFIG 0x05 +#define AD7768_GEN_CONFIG_VCM_SEL_MSK GENMASK(1, 0) +#define AD7768_GEN_CONFIG_VCM_PD BIT(4) + #define AD7768_REG_DATA_CONTROL 0x06 #define AD7768_DATA_CONTROL_SPI_RESET_1 0x03 #define AD7768_DATA_CONTROL_SPI_RESET_2 0x02 @@ -183,11 +188,157 @@ struct ad7768_state { unsigned int power_mode_idx; enum ad7768_filter_type ch_filter[AD7768_MAX_CHANNEL]; struct iio_backend *back; + struct regulator_dev *vcm_rdev; + unsigned int avdd1_uV; unsigned int vref_uV[2]; =20 __be16 d16 __aligned(IIO_DMA_MINALIGN); }; =20 +static const unsigned int ad7768_vcm_voltage_table[] =3D { + 0, 1650000, 2500000, 2140000, +}; + +static int ad7768_vcm_list_voltage(struct regulator_dev *rdev, + unsigned int selector) +{ + struct ad7768_state *st =3D rdev_get_drvdata(rdev); + + if (selector >=3D ARRAY_SIZE(ad7768_vcm_voltage_table)) + return -EINVAL; + + if (!selector) + return DIV_ROUND_CLOSEST(st->avdd1_uV, 2); + + return ad7768_vcm_voltage_table[selector]; +} + +static int ad7768_vcm_enable(struct regulator_dev *rdev) +{ + struct ad7768_state *st =3D rdev_get_drvdata(rdev); + int ret; + + ret =3D pm_runtime_resume_and_get(regmap_get_device(st->regmap)); + if (ret < 0) + return ret; + + ret =3D regmap_clear_bits(st->regmap, AD7768_REG_GENERAL_CONFIG, + AD7768_GEN_CONFIG_VCM_PD); + if (ret) + pm_runtime_put_autosuspend(regmap_get_device(st->regmap)); + + return ret; +} + +static int ad7768_vcm_disable(struct regulator_dev *rdev) +{ + struct ad7768_state *st =3D rdev_get_drvdata(rdev); + int ret; + + ret =3D regmap_set_bits(st->regmap, AD7768_REG_GENERAL_CONFIG, + AD7768_GEN_CONFIG_VCM_PD); + if (ret) + return ret; + + pm_runtime_put_autosuspend(regmap_get_device(st->regmap)); + + return 0; +} + +static int ad7768_vcm_is_enabled(struct regulator_dev *rdev) +{ + struct ad7768_state *st =3D rdev_get_drvdata(rdev); + int ret; + + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(regmap_get_device(st->regmap), pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + + ret =3D regmap_test_bits(st->regmap, AD7768_REG_GENERAL_CONFIG, + AD7768_GEN_CONFIG_VCM_PD); + if (ret < 0) + return ret; + + return !ret; +} + +static int ad7768_vcm_set_voltage_sel(struct regulator_dev *rdev, + unsigned int selector) +{ + struct ad7768_state *st =3D rdev_get_drvdata(rdev); + int ret; + + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(regmap_get_device(st->regmap), pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + + return regmap_update_bits(st->regmap, AD7768_REG_GENERAL_CONFIG, + AD7768_GEN_CONFIG_VCM_SEL_MSK, + FIELD_PREP(AD7768_GEN_CONFIG_VCM_SEL_MSK, + selector)); +} + +static int ad7768_vcm_get_voltage_sel(struct regulator_dev *rdev) +{ + struct ad7768_state *st =3D rdev_get_drvdata(rdev); + unsigned int val; + int ret; + + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(regmap_get_device(st->regmap), pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + + ret =3D regmap_read(st->regmap, AD7768_REG_GENERAL_CONFIG, &val); + if (ret) + return ret; + + return FIELD_GET(AD7768_GEN_CONFIG_VCM_SEL_MSK, val); +} + +static const struct regulator_ops ad7768_vcm_ops =3D { + .enable =3D ad7768_vcm_enable, + .disable =3D ad7768_vcm_disable, + .is_enabled =3D ad7768_vcm_is_enabled, + .list_voltage =3D ad7768_vcm_list_voltage, + .set_voltage_sel =3D ad7768_vcm_set_voltage_sel, + .get_voltage_sel =3D ad7768_vcm_get_voltage_sel, +}; + +static const struct regulator_desc ad7768_vcm_desc =3D { + .name =3D "vcm", + .of_match =3D "vcm-output", + .regulators_node =3D "regulators", + .n_voltages =3D ARRAY_SIZE(ad7768_vcm_voltage_table), + .ops =3D &ad7768_vcm_ops, + .type =3D REGULATOR_VOLTAGE, + .owner =3D THIS_MODULE, +}; + +static int ad7768_register_vcm_regulator(struct device *dev, + struct ad7768_state *st) +{ + struct regulator_config config =3D { + .dev =3D dev, + .driver_data =3D st, + }; + int ret; + + /* + * Start with VCM disabled so each enabled state is paired with the + * runtime PM reference acquired by ad7768_vcm_enable(). + */ + ret =3D regmap_set_bits(st->regmap, AD7768_REG_GENERAL_CONFIG, + AD7768_GEN_CONFIG_VCM_PD); + if (ret) + return ret; + + st->vcm_rdev =3D devm_regulator_register(dev, &ad7768_vcm_desc, &config); + return PTR_ERR_OR_ZERO(st->vcm_rdev); +} + static const unsigned int ad7768_dec_rate[AD7768_MAX_FREQ_PER_MODE] =3D { 32, 64, 128, 256, 512, 1024, }; @@ -1541,11 +1692,13 @@ static int ad7768_probe(struct spi_device *spi) "Failed to enable AVSS supply\n"); } =20 - ret =3D devm_regulator_get_enable(dev, "avdd1"); - if (ret) + ret =3D devm_regulator_get_enable_read_voltage(dev, "avdd1"); + if (ret < 0) return dev_err_probe(dev, ret, "Failed to enable AVDD1 supply\n"); =20 + st->avdd1_uV =3D ret; + ret =3D devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(ad7768_supply_names), ad7768_supply_names); @@ -1679,6 +1832,11 @@ static int ad7768_probe(struct spi_device *spi) if (ret) return ret; =20 + ret =3D ad7768_register_vcm_regulator(dev, st); + if (ret) + return dev_err_probe(dev, ret, + "Failed to register VCM regulator\n"); + return devm_iio_device_register(dev, indio_dev); } =20 --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 583FD525A6C; Thu, 10 Sep 2026 17:38:20 +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=1789061911; cv=none; b=lbT07FJZCQyNXgSOwjHl3P4Tkx8zyvLu0D/45KU9r9ACQRFkp7f+dgYFAMtJ5PEZVBvLehECrygFBSk4y1kHhuOaeRusUF7DxkjemkE0iPGNkq8ov9INhEJwCAjPzKzXVoB9FPv/rXB5mKc/OECMzR38SJypjdvb5DJV/12YehQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061911; c=relaxed/simple; bh=ZbahpWduP8YHLKbdzErxK/72k0S/dRZzxcd0QQoIieo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=eJZhE9LXFOFhOfwaFoOBz66iYNbESdlBAoHXjSPXRh6fP4duyuo5i1mi8fgChBiYzc2YypAeaT45pcTJnOD7riH2+P6UgLBMuy2LqsW0gK4ybulpI5bYgZSU2s5A8m5naRo2U44IH+LfRQlyevqkpvncyBNtrOXNp0duDxWHNtk= 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=Yhoy2ReB; 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="Yhoy2ReB" Received: from pps.filterd (m0167088.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68AF7Oqb343068; Thu, 10 Sep 2026 13:37:56 -0400 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=K/kyT eZY3WfeTT8Uo+RlAB3ohPlOAbMLgtjBlui0QKA=; b=Yhoy2ReBh4gcWDJulZekQ 8Z8fQlhpp+5nCmueK0+6MQyIQdcmnfE4OhAQUiYNQQrEUQTIxXCtd88SItd0RwIH TXXrQH7ktSsroGNAUMvEEhQH8MWyXdk1tUnlJZWYKK1JtcJI/fuGxnuRZUCQziBF oZZcP6xqakE5VkzQDS63iCh61afHIzPPhNL3sB0fs4V5/lHDZB8bysDJJKxisHpR 3nEpqxyED2ZB/mwFHD07WRpMCNPjRN9kC8iXnRm1+mPe7xadP0LswvTldgS/tE1I 10NwF4W5priPxQBlHDWr81LfuR30BfLJSozWRkmK8OKz1upzoC5XYf6/GtCO8QM5 w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcx9522v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:55 -0400 (EDT) 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 68AHbsKs038874 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:54 -0400 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; Thu, 10 Sep 2026 13:37:54 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Thu, 10 Sep 2026 13:37:54 -0400 Received: from zeus.spd.analog.com (10.66.68.11) by ashbmbx9.ad.analog.com (10.64.17.10) with Microsoft SMTP Server id 15.2.1748.37 via Frontend Transport; Thu, 10 Sep 2026 13:37:54 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSm018832; Thu, 10 Sep 2026 13:37:48 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:34 +0200 Subject: [PATCH v7 16/17] iio: adc: ad7768: Register GPIO auxiliary device Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-16-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=2350; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=ZbahpWduP8YHLKbdzErxK/72k0S/dRZzxcd0QQoIieo=; b=T6GH9KF6QJhJ/k8j42XnBEtJdRRGRnCkhGvD8g8+7NyGTMdG85SBRBPyvjAMNRPNdrOZcuzYF kZ1KiMxtHpCDnWlgzMLYMfW0ZwODMb9H+YjWik9fR5Ma7Ynq0ZW3w15 X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX4pInyLisYso6 tStmaX4cXjm+JhO+25XfLc8eFMZqXwHXoqzEbWmPOAZtKkWZvU48uBefzFWvQ7tivwIva22Rmv/ /RObHVolPzHvSh6uppFI/mFpYS1c1KZIf0t2gDwMQCLbxnSvA2Th X-Proofpoint-GUID: -5vwwUgNt0gd0Wi6smcz5BViGZx78E5i X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX1F37ljvhX6IA yCjSu08e5UF18obLZRM+3PzSqbKYyMtmzc0U55/ENgWLTl+Tl8rFRZSifXQ5qAAl5789nAQ286J +57XDvjR0+mV8a6j4HIrTp8LfZBUxiWpMDZVdR6jscsVpflyvnVTc9rx8qU2fqQLlqmadAjCCHu bwvbMY3sehCWt5PeCK7eNbzbc9+MO0WgKwyYCXFJkFJiXU8krF0yFTba5xlGrFRdyvVX3xD29i4 yytDBW11wUj132BOmf/aTOz7whQchewKaFCsWTTdcqK2+Ii3KxpoNMR4WjOOlE1ujkKw9z15Wdf 8DK7vXVzTXkLuSsDS4qcSOH2h1hlBR+HiNZsBF79DZUmJE4ap8tJPpXTYvhwfCQRFU53YSnbbId gzCzyJZR3uCOLiyGgcSDy5zDOZGmsW9FnSA7LTb73THyXM6RdWY55Rb7148b9Z5Xp6YzxtIk30j L8Ixpi7bo8LpBbVoBzQ== X-Authority-Analysis: v=2.4 cv=G8CJgNk5 c=1 sm=1 tr=0 ts=6aa2eaf3 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=uXIjobp8t2wMuQ0fPvqm:22 a=gAnH3GRIAAAA:8 a=uS1bAgcam2TDL027Z10A:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: -5vwwUgNt0gd0Wi6smcz5BViGZx78E5i X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 adultscore=0 malwarescore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Register an auxiliary device when the AD7768 is described as a GPIO controller. This allows the GPIO driver to share the parent regmap and runtime power-management state. Signed-off-by: Janani Sunil Reviewed-by: Bartosz Golaszewski --- drivers/iio/adc/Kconfig | 1 + drivers/iio/adc/ad7768.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index c784bee0fd65..dea25315ed20 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -435,6 +435,7 @@ config AD7768 tristate "Analog Devices AD7768/AD7768-4 ADC driver" depends on SPI select REGULATOR + select AUXILIARY_BUS select IIO_BUFFER select IIO_BACKEND select REGMAP diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index b854c10467a2..24a963ad2bf4 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -6,6 +6,7 @@ */ =20 #include +#include #include #include #include @@ -1265,6 +1266,30 @@ static const struct iio_info ad7768_info =3D { .update_scan_mode =3D ad7768_update_scan_mode, }; =20 +static int ad7768_gpio_adev_init(struct ad7768_state *st) +{ + struct device *dev =3D regmap_get_device(st->regmap); + struct spi_device *spi =3D to_spi_device(dev); + struct auxiliary_device *adev; + int id; + + if (!device_property_read_bool(dev, "gpio-controller")) + return 0; + + /* + * Use the SPI bus number and chip select to derive a stable per-device + * ID. + */ + id =3D (spi->controller->bus_num << 8) | spi_get_chipselect(spi, 0); + adev =3D __devm_auxiliary_device_create(dev, KBUILD_MODNAME, "gpio", + NULL, id); + if (!adev) + return dev_err_probe(dev, -ENODEV, + "Failed to create GPIO auxiliary device\n"); + + return 0; +} + static int ad7768_configure_precharge_buffers(struct iio_dev *indio_dev, struct ad7768_precharge_config *precharge_cfg) { @@ -1837,6 +1862,10 @@ static int ad7768_probe(struct spi_device *spi) return dev_err_probe(dev, ret, "Failed to register VCM regulator\n"); =20 + ret =3D ad7768_gpio_adev_init(st); + if (ret) + return ret; + return devm_iio_device_register(dev, indio_dev); } =20 --=20 2.43.0 From nobody Fri Sep 25 16:03:01 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 6ACFD585978; Thu, 10 Sep 2026 17:38:25 +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=1789061918; cv=none; b=TrxCkCksqE8pOOjhX7dHhPh7tpUEOH+j2+OFAPHnldO7thLj8vIJm1CQBuBW1QQAcVpUxwrwugCXePM2kt76X8M4Yim//rviVzVIUgpeH0gWK9tFOVuugWNNMZeyPTNL1qRYo6VMi0UZmvcnRPvowAAdNUTPGI+0c3vYdpa/fFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789061918; c=relaxed/simple; bh=tzRY5nrJO2KTVSeB9QULgOWbwI/W1n2fMQ1Z833e8BQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=UDB+wcxcN4lSa0nmsOpcuBLXQBX8taIp9hm6qj+XqXu1BGohZB+h+fbwsr+M2dbeOcZW+QfgVpL98BeCJBPJpXTaE3NGlDTQhalme6JgbTCNVk7RevuuFci+l7mfjptHR2B7o7K0jCTDf/JCbdVieCoiVHdaq7fm8hDsoZYYzFM= 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=QceQMsXr; 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="QceQMsXr" 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 68AF8MlM095022; Thu, 10 Sep 2026 13:37:59 -0400 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=sFjAF kLx0BC+vbr+1e/B5dKb3R4oWKjR60aDBAgsF/I=; b=QceQMsXr74a5dr7d1ApP/ koRtdHx3c3FUXkzqLBI+eR1HdaeKs+bhHpR7gvMKnIxCs96ozGhit9mTCqOrKjWy lx66agDQARUGmqDAaS31ApmgtedPb24llQ+gITPgstPcYBjedag9WQ/iHZw+zQDN Lu/JiEksVE9WmMiEe2Byu0ePCOoW7yyvpzM4zzaXL81lBzDRLDvz5c4aCiSwxwgK eDH55x2sXr1apmgwM778tcX+F/YG5jgdFGpMWITZXnAXFR2mr2xmYZm8hAWj0LbU 4ZS37iEOUCt/3n1YYoy090Gf/8sJuQCzCZks4IJa+mL3OvJXUwvpudysC6Tz6W27 w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxcw1t2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 10 Sep 2026 13:37:59 -0400 (EDT) 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 68AHbwYq038877 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 10 Sep 2026 13:37:58 -0400 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; Thu, 10 Sep 2026 13:37:58 -0400 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; Thu, 10 Sep 2026 13:37:58 -0400 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; Thu, 10 Sep 2026 13:37:58 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.225.204]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 68AHaSSn018832; Thu, 10 Sep 2026 13:37:52 -0400 From: Janani Sunil Date: Thu, 10 Sep 2026 19:36:35 +0200 Subject: [PATCH v7 17/17] Documentation: iio: Add AD7768 Documentation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260910-ad7768-driver-v7-17-7f70b07627e1@analog.com> References: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> In-Reply-To: <20260910-ad7768-driver-v7-0-7f70b07627e1@analog.com> To: =?utf-8?q?Nuno_S=C3=A1?= , Michael Hennerich , Jonathan Cameron , "David Lechner" , Andy Shevchenko , "Rob Herring" , Krzysztof Kozlowski , "Conor Dooley" , Olivier Moysan , Philipp Zabel , Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Shuah Khan , Michael Walle , Randy Dunlap CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Jonathan Cameron X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789061788; l=10828; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=tzRY5nrJO2KTVSeB9QULgOWbwI/W1n2fMQ1Z833e8BQ=; b=IEiy81uIK+FU70ikY+PEla4zmOKyRqkNL5+bzBLAhmP9XcAEemJAWwVs1LiGRb3CoH8BujH0z U1ERuM4SLfEA4uvb08bCGwYVhPZPQ7oeqsYYTrBl+HKFk1tAG0NX5MD X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX2aPe2jCz8JiG 1lnnVTX4lSwg/08wYl8WrDfjFjqXVSeeugnoOKo4uqZLA8n1uu2xKbWvzOX+WmAPC1ldiclDRv7 dLm+UAnYPFidEuoIQkPNXRdvLL1kEh2uJu2lFTHCqL9R1Pfa0rwuN1qbCzVHui4Dj0sSs0dA+WP aEIJb3Y2o3KK9wWPMAzGuJjqUmD/Jg78YeiDw/Q481OPcvFA42f35Lsfahwv9/T4SJxZjFnxt43 RzcffzdRUjzRxhbE2/rmhFhKhHY/76wW8bnI7pJnDh7kQmjb5jivU5K+WM1jAQvsBfGitIkPjP3 XSKHuQmynMyTsPBcIep1yQySYc6WZiv9NHEgamF9ngJt1ETDaPWccT1dZLCipAxNgGIonqZqLZ0 cn4hOsdsZdaRTvIvSDlnClqQZ9TdFi4nyx8Kfwy2YVtn94mig2YZt6f750cODvickl66aljjLSC x/NSBjzn/cOBxlI4zKQ== X-Authority-Analysis: v=2.4 cv=GoTXaU1C c=1 sm=1 tr=0 ts=6aa2eaf7 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=VwQbUJbxAAAA:8 a=inOgBn_CUzjBGpagQP8A:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTEwMDIxNSBTYWx0ZWRfX+b6kmmFn3AR4 neo/U5NsRpSvwv4m277oHEGbT4gmq+XDOjzyZ2IHz+GqS2vVbiM5Y5DE+2vfN0NPbcF55dr1LQQ eMEQVj25F4jEXu2ETKS7BdOg/+Jxk4CJSxwtmBQfvR6L3WdQalYA X-Proofpoint-GUID: jxDjQW-msA4ErNwqT9xsZld9DfK8MWy0 X-Proofpoint-ORIG-GUID: jxDjQW-msA4ErNwqT9xsZld9DfK8MWy0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-10_05,2026-09-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 phishscore=0 adultscore=0 priorityscore=1501 spamscore=0 clxscore=1015 impostorscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609100215 Add driver documentation for AD7768. Signed-off-by: Janani Sunil --- Documentation/iio/ad7768.rst | 275 +++++++++++++++++++++++++++++++++++++++= ++++ Documentation/iio/index.rst | 1 + MAINTAINERS | 1 + 3 files changed, 277 insertions(+) diff --git a/Documentation/iio/ad7768.rst b/Documentation/iio/ad7768.rst new file mode 100644 index 000000000000..9f5fbcae7173 --- /dev/null +++ b/Documentation/iio/ad7768.rst @@ -0,0 +1,275 @@ +.. SPDX-License-Identifier: GPL-2.0-only + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +AD7768 driver +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +ADC driver for Analog Devices Inc. AD7768 and AD7768-4 devices. The module= name +is ``ad7768``. + +Supported devices +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The following chips are supported by this driver: + +* `AD7768 `_ - + 8-channel, 24-bit simultaneous sampling ADC +* `AD7768-4 `_ - + 4-channel, 24-bit simultaneous sampling ADC + +Supported features +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Clock sources +------------- + +The master clock source is selected using the ``clock-names`` device tree +property: + +* ``mclk`` selects a CMOS clock on XTAL2/MCLK. CLK_SEL must be low and XTA= L1 + must be connected to DGND. +* ``xtal`` selects a crystal connected between XTAL1 and XTAL2. CLK_SEL mu= st + be high. The driver drives FILTER/GPIO4 high and keeps channel 4 on the + AD7768 or channel 2 on the AD7768-4 enabled to maintain crystal excitati= on. +* ``lvds`` selects a differential clock on XTAL1 and XTAL2. CLK_SEL must be + high. The driver drives FILTER/GPIO4 low before enabling the LVDS input. + +GPIO4 is reserved when ``xtal`` or ``lvds`` is selected. + +Power modes +----------- + +The AD7768 family supports three power and performance modes: + +* **Low power mode** - Optimized for lowest power consumption +* **Median mode** - Balanced power and performance +* **Fast mode** - Highest performance with maximum sampling rates + +The driver initializes the device in fast mode and uses the maximum fast-m= ode +output data rate as the default sampling frequency. + +When buffered capture starts, the driver selects the lowest-noise mode tha= t can +produce the requested output data rates for all enabled channels. Where ou= tput +data rates overlap, fast mode is preferred over median mode, and median mo= de is +preferred over low power mode. This prioritizes the lower RMS noise and hi= gher +dynamic range offered by a faster mode at the same output data rate. + +Data output configuration +------------------------- + +The devices support flexible serial data output configurations: + +AD7768 data lines +^^^^^^^^^^^^^^^^^ + +* 1 data line (DOUT0) - Standard single-lane output +* 2 data lines (DOUT0, DOUT1) - Dual-lane output for higher throughput +* 8 data lines (DOUT0-DOUT7) - Maximum throughput, one line per channel + +AD7768-4 data lines +^^^^^^^^^^^^^^^^^^^ + +* 1 data line (DOUT0) - Standard single-lane output +* 4 data lines (DOUT0-DOUT3) - Maximum throughput, one line per channel + +The number of data lines can be configured via the ``adi,data-lines-number= `` +device tree property. If omitted, the driver uses the maximum supported by= the +selected variant: eight lines for AD7768 and four lines for AD7768-4. + +Channel configuration +--------------------- + +Each channel can be individually configured with: + +Channel modes +^^^^^^^^^^^^^ + +* **Mode A** - First set of filter and decimation settings +* **Mode B** - Second set of filter and decimation settings + +The hardware provides two mode profiles (A and B), each holding one +(frequency, filter) combination. When buffered capture is started, +enabled channels are grouped by their configured (frequency, filter) +pair. Up to two distinct groups are supported; the driver automatically +assigns each group to a mode slot and programs the hardware accordingly. +If the enabled channels request more than two distinct pairs, buffer setup +fails and capture does not start. + +Precharge and reference buffers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Per-channel buffer control for optimal signal integrity: + +* Positive input precharge buffer (``adi,prechargebuf-pos-enable``) +* Negative input precharge buffer (``adi,prechargebuf-neg-enable``) +* Positive reference buffer (``adi,refbuf-pos-enable``) +* Negative reference buffer (``adi,refbuf-neg-enable``) + +Common mode voltage +------------------- + +The VCM pin provides a buffered common-mode voltage output used to bias +the analog inputs. The driver exposes this as a standard voltage regulator +provider under a ``regulators`` subnode in the device tree. Supported +output voltage levels are: + +* (AVDD1 - AVSS) / 2 - Mid-supply (hardware default), reported as half the + voltage provided by ``avdd1-supply`` +* 1,650,000 =C2=B5V - 1.65V +* 2,500,000 =C2=B5V - 2.5V +* 2,140,000 =C2=B5V - 2.14V + +The regulator can be enabled and disabled at runtime using the standard +regulator framework interfaces. + +The VCM circuitry is associated with channel 0. When VCM is used externall= y, +``channel@0`` must be present in the device tree and channel 0 must remain +enabled in the active scan mask. Placing channel 0 in standby disables the= VCM +output. + +Filter types +------------ + +Two digital filter types are available: + +* **Wideband** - Optimized for wide bandwidth applications +* **Sinc5** - Fifth-order sinc filter for high rejection of out-of-band no= ise + +IIO backend support +------------------- + +The driver integrates with IIO backends (e.g., AXI ADC) for high-speed data +capture and DMA operations. Features include: + +* Automatic channel enable/disable based on scan mask +* CRC on data interface. CRC replaces the header every 4th output sample. +* High-throughput buffered data acquisition + +GPIO controller +--------------- + +The AD7768 includes a 5-pin GPIO controller for auxiliary digital I/O +operations. The GPIO pins can be configured as inputs or outputs. + +GPIO4 is reserved when a crystal or LVDS master clock is used. GPIO0 throu= gh +GPIO3 remain available in these configurations. + +Device attributes +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The following IIO attributes are available for each enabled channel: + +Voltage scale +------------- + +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - Attribute + - Description + * - ``in_voltage_scale`` + - Scale in millivolts per least significant bit for signed 24-bit dat= a, + calculated as twice the differential reference voltage used by chan= nel + N divided by 2\ :sup:`24`. + +Sampling frequency +------------------ + +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - Attribute + - Description + * - ``in_voltage_sampling_frequency`` + - Requested sampling frequency in Hz for channel N. Enabled channels = are + grouped into up to two profiles at capture time. + * - ``in_voltage_sampling_frequency_available`` + - Available sampling frequencies in Hz for channel N across all power + modes, based on the master clock frequency. Buffer setup fails if no + single power mode supports the frequencies requested by all enabled + channels. + +Filter configuration +--------------------- + +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - Attribute + - Description + * - ``in_voltage_filter_type`` + - Requested filter type for channel N: "wideband" or "sinc5". It is + grouped with sampling frequency at capture time. + * - ``in_voltage_filter_type_available`` + - Available filter types for channel N: "wideband sinc5". + +Per-channel calibration +----------------------- + +.. list-table:: + :header-rows: 1 + :widths: 40 60 + + * - Attribute + - Description + * - ``in_voltage_calibbias`` + - Signed 24-bit two's complement channel offset register value. + * - ``in_voltage_calibscale`` + - Raw unsigned 24-bit channel gain register value. + * - ``in_voltage_convdelay`` + - Per-channel conversion delay. The driver exposes the sync phase off= set + value in seconds with picosecond precision. Resolution and valid ra= nge + depend on the decimation ratio in use (see datasheet + Table 32). + +Device buffers +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +This driver supports IIO buffered data acquisition through IIO backends. +When used with compatible backends like the AXI ADC, it provides: + +* High-speed simultaneous sampling across all enabled channels +* Hardware-driven data capture +* DMA-based data transfer for minimal CPU overhead +* CRC error detection + +See :doc:`iio_devbuf` for more information about IIO device buffers. + +Example usage +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +.. code-block:: bash + + # Read current sampling frequency for channel 0 + cat /sys/bus/iio/devices/iio:device0/in_voltage0_sampling_frequency + + # Update sampling frequency for channel 0 + echo 8000 > /sys/bus/iio/devices/iio:device0/in_voltage0_sampling_frequen= cy + + # Read current filter type for channel 0 + cat /sys/bus/iio/devices/iio:device0/in_voltage0_filter_type + + # List available filter types for channel 0 + cat /sys/bus/iio/devices/iio:device0/in_voltage0_filter_type_available + + # Update filter type for channel 0 to wideband + echo wideband > /sys/bus/iio/devices/iio:device0/in_voltage0_filter_type + + # Buffer setup fails if enabled channels request more than two distinct + # (sampling frequency, filter type) combinations. + + # Read calibration scale for channel 0 + cat /sys/bus/iio/devices/iio:device0/in_voltage0_calibscale + + # Read conversion delay for channel 0 + cat /sys/bus/iio/devices/iio:device0/in_voltage0_convdelay + + +Unimplemented features +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +* CRC message every 16 samples (CRC_SEL configuration) - currently only + supports CRC every 4 samples diff --git a/Documentation/iio/index.rst b/Documentation/iio/index.rst index b02b879b053a..73c58cec7620 100644 --- a/Documentation/iio/index.rst +++ b/Documentation/iio/index.rst @@ -29,6 +29,7 @@ Industrial I/O Kernel Drivers ad7380 ad7606 ad7625 + ad7768 ad7944 ade9000 adf41513 diff --git a/MAINTAINERS b/MAINTAINERS index de91903b0b45..93eab996c529 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1663,6 +1663,7 @@ L: linux-iio@vger.kernel.org S: Supported W: https://ez.analog.com/linux-software-drivers F: Documentation/devicetree/bindings/iio/adc/adi,ad7768.yaml +F: Documentation/iio/ad7768.rst F: drivers/iio/adc/ad7768.c =20 ANALOG DEVICES INC AD7780 DRIVER --=20 2.43.0