From nobody Sun Sep 27 05:30:23 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 81D1C4A8A17; Fri, 4 Sep 2026 14:16:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531368; cv=none; b=ZByeUHTYYhS7pCaqQNJy+UZPBUCOPjIpOuGIxDOfX21El4fcQoDR4yESon1JDErlZtdNxQbCdZ+t3T5EGfRBvgb3Z2DkqGit0BXXvI55/GPYS7KxNhmR3M7liL5XIOA2YNCjpyeflPfX+h26WB3bz77LXCnHWzVY+Td3YyphRAg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531368; 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=lD9mlfX0HmPMml7y7iiiNXKhHJnhiCHZJJtTud1Uwz5N2IXMO/sn8R8iUYt0HQ+8BBlKkJTRcpQ8GWJOByENVqNkWC9jgi+iV6TOyKoEFCtpYUwZ1HsqPEgV5LnWEcy1NBoINsZoj8VWgJ0lr1Pms4rAffnZIQCDsxTPZ8MI1RU= 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=Lq6j/3Mq; 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="Lq6j/3Mq" 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 684DgPSx4068661; Fri, 4 Sep 2026 10:15:27 -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=Lq6j/3MqE6lCjX/RaoWo/ 99D77oW/BKEC3Jbu6vHy/owl3BOfaOuiLK17oDli9aT5JrqoNzyI0Q12gdM5x9fD 4BnuotsajV9evOosBudRIYCfgFyaspR+fIAg9M2MasU6bwQneJJCqIkc4/ILpK55 zmLlU2+lejWqzyq+xJ9VZbPmRUwEM5BfbA9X1/tB2YqxDVV04zvCTYOfUZfdxWmT CnrO1C7W92Z7aOFGYAU1d03KKueZSAtRiFy0u7EtK9UWq28YYKekr3AiyGS9b5V/ Y+Fro2PoJAviPI29RHzxtm1+HXCHbWCBIKPsl6GFaz1JYaECvSZJokPJFc7yC0J/ A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gfxaw0d0m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:15:27 -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 684EFQBT036061 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:15:26 -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; Fri, 4 Sep 2026 10:15:26 -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; Fri, 4 Sep 2026 10:15:26 -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; Fri, 4 Sep 2026 10:15:25 -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 684EF2d5026210; Fri, 4 Sep 2026 10:15:18 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:14:53 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-1-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=1021; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=FGQG3DmM+7X/giTmbo/iKtzgJp69jhePuib7JGtlpCY=; b=2b35DldDF3ydUbcychk6QzezEG3BNsPaYx8h/vNjPptfL3CIIo7jerVcUGOPseFYqWJLM/Iap EB+L+qiWzz+BEvyHg1z5zjZKilcbNzmL/RQv1kCRL3pIf9b7qwU8+2P 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=UNnt2ify c=1 sm=1 tr=0 ts=6a9ad27f 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=_ljTvifiVFBlT2kRk7cA:9 a=QEXdDO2ut3YA:10 a=zZCYzV9kfG8A:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX4AGs5En9tdyo oAciCPhq0YXvb8tNl7jLDlg0NcZm+glt8swAKU+EVeo1jTEciWffebTcAucYyN8llbNfK8nwP9m 3Nb2x9KfDvwinDzGiurmGouQgDi2vbtXPi1OxCQN0sEPNy1iKQPI X-Proofpoint-GUID: 5QT3f8zbuzDyqcjld90mTGtO44lsbLy1 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX7o4PK1vcPKmY SzbPwJBbuMU8DkJ+lcH7wkFzlax0vKEL0vd3AbSALaob3ZSoUXh2ZlsQNVYgBVd+8ZPIwExEx3M lPCCfAMycbT0PTPS6XPGgTlsIkjl/UXWjwfaW5xD4JvRKrZREj1bROCmkrXgQidNYMEx9s87CXX WMwnbqVaGNgH/5uOfs9kUDQaBAIFaHeYcQ3Kn9IHTZP7RzWbBh15od8oBQjA14cmINyks2jWMsa Rh7y3Aea1/byf3wI5gxlBd9D6lGlr5hLCmch7H4X5fBlhLDf9fNYh+GnlXPcKCFnFtdsdPDyGQn e1c/EbhoaT728ElmmeMLT0a8QecAUmbcNZbUnguev3ZhhgeDxBcpqZ8cbDgnvXqJ++qG1mbZrUE yTDHgR8eCnh//EKimtzEL17sSDYsP84wvaGECJf7+8AEoPkEcpM2GM0uOcppcaZE2eTA7sww/EW NApmKO0AEy9pcHegspg== X-Proofpoint-ORIG-GUID: 5QT3f8zbuzDyqcjld90mTGtO44lsbLy1 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 clxscore=1011 priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 Sun Sep 27 05:30:23 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 8BBFE4AE104; Fri, 4 Sep 2026 14:16:09 +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=1788531373; cv=none; b=phDxaHk5nqv9WJ4QD/HIdLZihxRxJ033ateXsD7o5ReM40wE7/WnVNJD4WdY2j2VwAT7sXha0RLHLyMj/rHo+l/QB2D6iHofvq8zsohWRjaaI2gsVkdASu8JbDZgh2seZH+/5a+4EctWs8qfVEcza1tpQjaHVhNI4lCLzDM/F3M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531373; c=relaxed/simple; bh=NAx2svYyrcf/LNH5NrYC45khnXMpNPfX3LsQIv3GYyc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=lk9fzWbjb4mFegrh3Qp381p9Z02O9GNi2CDYvz6AbvMh7TtiMqg3fv9ACYaBxP/IRlr1HcFq9im0bggmJpdi1rQ3oTzENKZNIF8kMGO95r1X3o5BcQogy/zz/pI4ktfbXiwNsaIBtPBrmEVBAlBN8vYb0dRQLxkrR8rYUTAJjOk= 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=H8Kbg1gb; 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="H8Kbg1gb" 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 684Dhf7J553680; Fri, 4 Sep 2026 10:15:31 -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=pSiR6 DOx8TIp1b6m6QH0kP8C8giSe1xUatDgLYR/xTc=; b=H8Kbg1gbF/dJENqMf9N5X HOvp4P4UyWYjf5SRGfceldyfLbERWS51aoGAN8SvvKieim0eN80OxsuZDn8Kiv2Q go4gLnFcQ9d2lNHy3yviTs9JWl+PhnzgkxHE8hEB5wRX2wToxniir5H++bQrvXql 7DXdpWQw4ND77soH1CS70zF/2Y2sE2jgOMPDIxRLaDa2DdfVsloF0Mo/umd0pqEC Ws6bbM4+uItsBtqccK6GU7ybWXi/SWb4OHvQlsCyjR0M4s/aHdtvK/cFh+m8/9ot 2ChivpxPI8LA8kirLLA/ymb+uZB3KKPK5XwPq2bzqoQjL2zByLbGY6XEPkzqDAmU A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gffk4vh70-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:15:30 -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 684EFTwe036071 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:15:29 -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; Fri, 4 Sep 2026 10:15:29 -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; Fri, 4 Sep 2026 10:15:29 -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; Fri, 4 Sep 2026 10:15:29 -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 684EF2d6026210; Fri, 4 Sep 2026 10:15:21 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:14:54 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-2-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=9115; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=NAx2svYyrcf/LNH5NrYC45khnXMpNPfX3LsQIv3GYyc=; b=bKUKEMft8/3h2Q/Vl1BAQR0vGCCrdyrayKjxZtfr16fH0bGPk1DAgVQ5w+GtvLk85FbEwuf9+ JOmKOuH9Cb7CJWLHSwJa06OvJddWKT4dl66utMpvyMAxNxCkO5ga6aZ 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: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX6Pi5II3rK7q5 LQZOVfs8yE5fVoQpe3jjVkbpxNTwmbk7MM3NcQTApa+0DprDUDPTP6s7pgREDppeai+rFODWwqx RTFwsZRSxDkKdG8NxT7LMv7bpA0VkgP2sAQQXLiPgH11LM+zaP0jsLouaHVof6Fx2rDdyE/v4n8 DnUrskGdyPGWcqsdltw0zBoRwyW9ItvlYQXOJQQBLYM2lVfYQjtI5CuNxW563/13k/5J3x94Igu iA6+SmHupHFi1urx1kQuLJzREuHNLFz+dKslPflNN/Wnel2Crrfmt5aQurj5CcjJsTo7iqUwmpT oIpjy8dEm0/9fQ25m9xNPlUvw3Q9/Ci8qSO67SzG6tZjeQ8WacTr9UpA1y/m0btFhd2kim4r1+c q9gp20EL+kpH56liPjs3G5/NYm/PNOMscNOqSA/uHDfQJXdyw0vCrzSTEDcjhJX4s0jbsrrPIg1 H7YwPvCKih2ma9YjGGA== X-Authority-Analysis: v=2.4 cv=QI1YgALL c=1 sm=1 tr=0 ts=6a9ad282 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=gEfo2CItAAAA:8 a=gAnH3GRIAAAA:8 a=NEAV23lmAAAA:8 a=VwQbUJbxAAAA:8 a=pGLkceISAAAA:8 a=qd1CiYGdZHjR4DSY3K8A:9 a=QEXdDO2ut3YA:10 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-GUID: Ky4uHcIaDnrTgZJDDMIn0AtKtacs5-O6 X-Proofpoint-ORIG-GUID: Ky4uHcIaDnrTgZJDDMIn0AtKtacs5-O6 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX7t67/eyW2pky mZGSOqjQCo8vFVP1o184kVJMbTTSBWVfqC/uJySWeBP0JIt4NEYiaOmVvrp9DLfk1YB94z6vOjn 4lGYIl3jKUu84+mMsSyVJYAWoGNbH+vCh0YMIP4Iw4YB4yJqcLuC 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 lowpriorityscore=0 phishscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 impostorscore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 Devicetree Bindings for AD7768-4 (4 channel) and AD7768 (8 channel) simultaneous sampling ADCs. Signed-off-by: Janani Sunil Acked-by: Conor Dooley --- .../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 Sun Sep 27 05:30:23 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 72EE04AA1FD; Fri, 4 Sep 2026 14:16: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=1788531370; cv=none; b=riIluDm2kMURpgZzfTbFDSaXoqoJoi8cxsrQ/BZL1KbgDPAyAVW7snBOM/oOGxYygPrpaR1iEUh/TkaRyKrWg9ykOTskdaZbKTu87er3vtljU56nVyri9SAvHJtgFoHtAoqjrvbW7kpzFYY2ZrsvP5maWrAlJcsENE1DQXgfets= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531370; c=relaxed/simple; bh=h8rpUQCVfSyFWZ0W5MDo7rp1yKN/O8pCD8GN49kfEBA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=GFU5vhJmUws0PjdajPUuqniIhhw3DJm0MOODRYmuwTPBdaVCncCh4VFl/cxfPS4CgVczHs/WGEtAvoJmDAMsNBB2H83pRiJw8UiVANJN1QBkFt8VbYe82sqjfldTWOJ0IKmJJZc3NFzujS95UHPLEBVq+q+O33TAys0PCTEDgfY= 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=PKROlPJF; 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="PKROlPJF" 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 684DgAwG4068362; Fri, 4 Sep 2026 10:15: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=HaZi5 4XuvSGwwXAOvLRMGXBSqS/rduiS4tFlnN5D9gU=; b=PKROlPJF62tCdG6B5D5ry 3fZXWolMvlgK77Tko8EUuEsnMVuxwZV3CJqs5s4K1U3XZ3bQc12HXP8poAsmKq0+ 0cBsAPpKKr2IkJ3FY4RfbQF6yFAWour/xPrUxKMw4+25qG5esJMcCJ3LY5qASegb gWiobB0ETM79hUPtlIrpbmeEEEw9M7wfpz6F8MuqelxsAqf/+rPx6GzoioOi67Wn LCdawP6wH2DWLTPwpPgW3vOvjb+F+f0x3DMVkP4hsth0e+m/zwme0zzSEcdAQqap +GLaZXHAPgIMJLskwQaxU3TGiZubwUdjMIJdf1mB1n20BPBOK/9WYUQWyLgv38V2 A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gfxaw0d10-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:15:34 -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 684EFX00036089 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:15:33 -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; Fri, 4 Sep 2026 10:15:33 -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; Fri, 4 Sep 2026 10:15: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; Fri, 4 Sep 2026 10:15: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 684EF2d7026210; Fri, 4 Sep 2026 10:15:25 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:14:55 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-3-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=3821; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=h8rpUQCVfSyFWZ0W5MDo7rp1yKN/O8pCD8GN49kfEBA=; b=Mk6ckZYWB39iSmLEJwqqXI3ILY63rGgLg9O3xNtaCuYcT8lsuejFRJXH54wVfR30FQQxo4v6A YkyI0zKHrCcC3VT799uVmBH13hO/VVwSBvFeHqZtw82rqiZfuxrE0S/ 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=UNnt2ify c=1 sm=1 tr=0 ts=6a9ad287 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-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX663kqn8iP79d ul+F89dIoh7/zFGjmba7XZCvHTcCj2SxbMyQxjLs4aEgRRQ0L3dIZUyl8qxh+vGfwUwpjX1SS1M BpVyBzuKp/pe3csSkLGWKcXuVS1ik1LRbZDbKhca/HL7zYtdfAS+ X-Proofpoint-GUID: VfuxKIQGZD7oj41wVpPAzmsZb_2-D1-b X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX8Go+W+sjQsHv poD35MAxCoQhnpIAwZb5l83vHLXQy/8KaCK5wX5TGWrgIybO6YSmU4qcTVDM6QBMYdGibRVQyMd Iv4GfvAm0ndWvCHoC3lbuWATWcTyYwXWUU8v1GblQBI9dIGNP4UOknX8apX3gYq4N6+1IwMj1pu 0iXOCzst1YsU8u1W7o+tH0fEzPLqRilVNvKbCCXwHOoGh6YbOjV1A/kilQIBRA7Jdd2aCdEPIzO TvLFUoFKTzZJ+mMF+5eYAZEtAB7gKw/29PS+jz9+CUmo/VNWzeZ4AUjD/SQznxVBFNYJhiz2wbG UTfjgyYjYRffg2ZE/ze/EZJwmhMNODHV/TxKHCbx1u7cSXtMaZzru87bbTwXiNTH3qqYz99VmXx NNpD0ysPq5a3gGZuksx+4wM5F4YIxazuvUmVC9a5X/bCxaEg4VNPBophtKcmmf3IAJgZ1LYkQ83 S7PHTH5boLspPI89AgA== X-Proofpoint-ORIG-GUID: VfuxKIQGZD7oj41wVpPAzmsZb_2-D1-b 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 clxscore=1011 priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 --- 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 Sun Sep 27 05:30:23 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 72FAB4AA41F; Fri, 4 Sep 2026 14:16: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=1788531370; cv=none; b=mr5dG0K0h0/2H+tnWtj+5g2Ph36QGM6oDwyU5MKAoh7AsypxLGbZaSJY5M7A5PRO5W12vlw4p5VIlb0Q0CKuTt8bCi4ztY2wIYCSmLjlxGLEsiND1g+pzYfQp9vQ3EmAm4DrFVOHo9qDiTeD1WBUhu1gsTw+mu3E7v0ZuhT8kNs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531370; c=relaxed/simple; bh=9U3ZkBZOT0Bl66QSM9ctgUcEGlj948n+eirxEEksq7c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=Suzhvg/ppol1m7ZiV2piJEzs1+9bwB3c5Z0bXXlnZqEtCEezHaZWXpI2JJ/7LeL+QzJo+xtyucW1N3/Ak7yQqXYXPWD+x3So9DKdy+yNR4pNwIIr5qKGFvbGvFXVPep/vZ/jHthQPQfHkxzSHbFg2XtEJmFgkRSe0OUZmR5SV8Y= 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=f5526oXG; 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="f5526oXG" 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 684Dhmxr553936; Fri, 4 Sep 2026 10:15: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=/fLlw wIH4FuW6mKbSN23ldhiq5zEMnS/TMI1O212qdc=; b=f5526oXG6EJle7UOjsMez KvnVUPou7rP0/pIVT2jdRliDM9SMJw2RSOPRiMHThBsOu3ZikTFpjfvIuu9o3pwd Apax/LxGMDNA1wPWYPSxFzyz+GqPaNKkzjwbuawqUGm13mDwbduaZ6pj5z1SRU8J /ZOlfp5eg06Pcs6YpfjadRWOnoapfd2cGFgEj3VLQwcrOMxGtXzHMv/IR7d7ZGOM enYuC2WYHptluxrocuwYL+Q04oTF3qwhmmssqeWbaIoo3YY/KeHnVA0Ts4/jGt33 q3Vjq5JYNTQJZ3r8vScPrld4fM9QB8OjE3e8JEfh4E1CK3jy4PawV/7v+MbXWQPh A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gffk4vh80-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:15:38 -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 684EFbSf036118 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:15:37 -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; Fri, 4 Sep 2026 10:15:37 -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; Fri, 4 Sep 2026 10:15:37 -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 684EF2d8026210; Fri, 4 Sep 2026 10:15:29 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:14:56 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-4-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=2263; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=9U3ZkBZOT0Bl66QSM9ctgUcEGlj948n+eirxEEksq7c=; b=JTytGVTAP+DGgA9mrKH0rF9x4PJ3iN0nN+IcOXiDRmTTf4uRXcxtlvaOljvwemMbCo7isjC9/ gHcL4+E3XFHB2QtLeyQIqWIfnr0iGpruJZkditGT0G+FcIVzNYOzHlQ 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: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX78XZGTKPPgRj 1JCo34Z1ug7IYXo9sJKhGpg9Jey3L8/pFsO+V4rrHAqhyGqY+eMMHCH5XH4E543+NfirZ+QzpoY ephlh/d0AHego/P2sLsRmOiKJ+p2ULLCs//g0OpibUsRc2PK6uWOqEjIcv576UC+QO7c4xhKozD 77yKYNW+CqgqYXYhj2fpR3Dt1he5lewGqdh+VxAwXPJLbrvfM6I4Jom527WCbTAJIUKMnI8JhFz Kh2jgG4G3jUsVBrEBY5n+w48IaX0pTIPo7ooCf7DNNwgDZiooUBl4VdglOINB4f/fLOzcMODsHo ebocXyddJmmVB9ey9wWYgZHHuPy3CE5UBVOi5wFoIthrsF9qPPijlTlslqGhpeSAQMsSTKtRLMe XtveATK4F1vrarFMnroP8FrHgs8/NR23ukDpjdrVAgghK0Cce4/szGEOLAbup6kzfURIWyu46I1 YZwIUyzdPxbRwXEpAsA== X-Authority-Analysis: v=2.4 cv=QI1YgALL c=1 sm=1 tr=0 ts=6a9ad28a 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=IpJZQVW2AAAA:8 a=gAnH3GRIAAAA:8 a=xcMXqGzQfnDy9uQaBxsA:9 a=QEXdDO2ut3YA:10 a=IawgGOuG5U0WyFbmm1f5:22 X-Proofpoint-GUID: czhBAHbvlRP7L0_-CSIHKKKEwiy7Yem1 X-Proofpoint-ORIG-GUID: czhBAHbvlRP7L0_-CSIHKKKEwiy7Yem1 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX6+jKE69o3L+F /RCT2qPK9TzDkiHmOWuuF2vAI7iVrxAbI5n1je4f7aHm1W4UjgW59hyQ2oXPaHwZImvdnOLWZk6 +XPTHixyX5pPIN6MsREafW/ySWwRL1wz7CIXixIRyV+zTXWYVJxB 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1011 spamscore=0 lowpriorityscore=0 phishscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 impostorscore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 --- 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 Sun Sep 27 05:30:23 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 81C753F327F; Fri, 4 Sep 2026 14:16:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531369; cv=none; b=p1iUsXPkaU2fQGqSmm3QfKaT4+nOVn6ecew1f4Wpqi5Un3a1N0+5eiiWUhhbx/+0xuVV2C0ILgLEZr7Kash4Y+CVyRptsMYJWEdv9kDsuplT/9aXGqF7rq+vBNY/XxePHRqrT4irjKxgHisZ2kfQ1VifPG3a1JYczErfwk8+m3g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531369; c=relaxed/simple; bh=Dqb2a4jaFSO9E2AKiYbvFJW5nChDquSW7rDtAsKRVkM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=WOFsI/pwKyxXXAtHlzfCbQujw4lVcU5e31jb8481j42RuuV8ldIrHJiZTbraXeM2AgMXTv9RMpYQvR5NGSP8W1aPbuwaNyEgXb7WRgOR4ro63wkSKUmmuoVn9LxysIRpG2yKNlHGd8p7N2QSraoajML4tPaQ0Hm3DNDKEjSrdbo= 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=aExNMSOv; 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="aExNMSOv" 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 684DgAwH4068362; Fri, 4 Sep 2026 10:15:42 -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=3PoXH eK+8rQthJLz2Z/4tvrb8CPse3CjNRaP8ZZrWx8=; b=aExNMSOvLvQdKosZCmR1l g3IHo+3gengYlaLJUVTLlYMG49zyHUb9NdF1O+wwkjRGPwGD09Kf1SOWJyZQxs8+ 9jqh3r1VL0DefbA6ImuwaXW6u1Z6BmZxvwHKokk7sAsaJqNISbi98rLig3S+O37K V94PjwbJVOdcRbjtmomxIeswVJMPAg85Zqaj9Svj7ZsDR4SscFpXbLSf+VAqPsFS AaMByjxsN0GPp0YBM7Q2gV8DYya6JPV9FgUcfG+Dndr/oORdHxn2RISKlDXAxN8a yR1z+2/p83rQLwZxvfN0CtTmyl+7YRRVUsAwJ03+iibEERxn75jplt8bnzhZ2Mte A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gfxaw0d1c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:15:41 -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 684EFeWZ036122 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:15:40 -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; Fri, 4 Sep 2026 10:15: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; Fri, 4 Sep 2026 10:15: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 684EF2d9026210; Fri, 4 Sep 2026 10:15:32 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:14:57 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-5-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=31344; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=Dqb2a4jaFSO9E2AKiYbvFJW5nChDquSW7rDtAsKRVkM=; b=QJzZwe/VRA40qHb4veb88kFfKTESeNrE0yZp50GAeWPf0g+B3GvegLtvVNEO7BnTKcQC/zjlN tNxWIjDRrgGCoSNmFTpUCO1D7sEzp2Jf6WFkc646jUDYJMBgW52MtuZ 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=UNnt2ify c=1 sm=1 tr=0 ts=6a9ad28d 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=VwQbUJbxAAAA:8 a=xaEP9h1eQhWwnVAwg-4A:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX6MLsh3VQJAtd ME3lw0UTg4Zf+kNTYuYyWbvhTSmpEqygoCei3WUnUqVVXtGqm39PwWrfFfU6MtSdgmoXwEcS/gp obOPohTnWaVKlzygmPOWqYMNvseKwxkrSLZa2J/Q5jWExYKRJCwc X-Proofpoint-GUID: g0vp1fBtdl8TLAA_yjJozj4KUWTIcx9L X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfXwtCw6BMBjv3a TIqyYpUCOxj2AgaTvhR3AgeLEBllcOtz4PMJb2bqPh2EVbx9B5HJ/JPcNi2u0TVPwJaWS0LMdJf uzHIpBFiO0oNDdUXTT0Wgi3BAdT8zmXb8moyoyfVjjO6MuSQAhiGTvSl0JZ5loN4JfY4dEa9lA7 G/qBTGcGJ2NfAOlO5aywI9grf3NtgLajUVgmq8Vpphsw/an2Kgv05G3i5gAU2nA51UbOPzB5gMM nu21iVykb9u+oiQQUI9BeQ8e5rp69WeSKoagKTWfnkoW6eiVLxVqAfyLdrZqDkkAwULi7TGQVyF 7KBMQ/S15Zcvm5MFAmxP2WQ9NqXS6+RplJY5b9CUgV6KHE1lXDB34PXkEqMij3yyAYNFNnj2EbX kBBLVTdnaP/xuzdLUvbl89VWuB+SFn6gLtOVykAT8BZXTCAeT6/vZZAATdgUXo7PpjSWJdqJBoL j4hfWVIVPi5XDJadHkA== X-Proofpoint-ORIG-GUID: g0vp1fBtdl8TLAA_yjJozj4KUWTIcx9L 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 | 1000 ++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 1016 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..c80056a9edd8 --- /dev/null +++ b/drivers/iio/adc/ad7768.c @@ -0,0 +1,1000 @@ +// 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(x) (4 - ffs(x)) + +#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) +#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_4_REG_MAP(ch) ((ch) < 2 ? (ch) : ((ch) + 2)) +#define AD7768_4_REG_OFFSET(ch) \ + (AD7768_REG_OFFSET_BASE + (3 * __AD7768_4_REG_MAP(ch))) +#define AD7768_4_REG_GAIN(ch) \ + (AD7768_REG_GAIN_BASE + (3 * __AD7768_4_REG_MAP(ch))) +#define AD7768_4_REG_PHASE(ch) \ + (AD7768_REG_PHASE_BASE + __AD7768_4_REG_MAP(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; + unsigned int num_channels; + const struct regmap_config *regmap_config; + const unsigned int *available_datalines; + unsigned int num_datalines; + 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) +{ + return (val >> st->chip_info->prebuf_split) & + GENMASK(st->chip_info->prebuf_split - 1, 0); +} + +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 *context, const void *data, size_t cou= nt) +{ + struct spi_device *spi =3D context; + + 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_4_REG_OFFSET(0) ... AD7768_4_REG_OFFSET(1) + 2: + case AD7768_4_REG_OFFSET(2) ... AD7768_4_REG_OFFSET(3) + 2: + case AD7768_4_REG_GAIN(0) ... AD7768_4_REG_GAIN(1) + 2: + case AD7768_4_REG_GAIN(2) ... AD7768_4_REG_GAIN(3) + 2: + case AD7768_4_REG_PHASE(0) ... AD7768_4_REG_PHASE(1): + case AD7768_4_REG_PHASE(2) ... AD7768_4_REG_PHASE(3): + 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 c =3D 0; c < st->chip_info->num_channels; c++) { + if (test_bit(c, scan_mask)) + ret =3D iio_backend_chan_enable(st->back, c); + else + ret =3D iio_backend_chan_disable(st->back, c); + 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; + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV(dclk_div); + 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_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 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 regmap_set_bits(st->regmap, AD7768_REG_POWER_MODE, + AD7768_SLEEP_MODE_MSK); +} + +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 Sun Sep 27 05:30:23 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 7306F4AA572; Fri, 4 Sep 2026 14:16: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=1788531370; cv=none; b=sXEgsL2XGVZADRn7v+AwongHM/iDzIMR5/H+sVifiXsK/6ijdcSSePHUGDbqx0vUImgKs/PQ5QWy4/gPtD70kDXpkrsUlf6X9bWdxgNwQ+JedKawCVIv3JiPtVkIXrnlhDHmc9qTh7wFAjcAWQ0sgwA4+hsRD6lcZlBjPCgq76U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531370; c=relaxed/simple; bh=6snwAoSaSMSIrb7vkif6gG8ygaB+m/IQ+HJUUbD7nqs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=Eu4Nxy5F4O42hEMi/huBhKhaR9GBpVqqhRJ8iMf4tWyv5py3DeqU0JEOIv9bOBLLzWgtFCnbrPyduwniMvac9PMXy0SiuVNlBeY3uT99n4AH6KWXZODXDR7/p2mIqpZ4ZohvGH5OADqtt4LRplnTjK5uBubhLKXzJqBd8KxPYyg= 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=xOHIsG7t; 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="xOHIsG7t" 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 684Dg8YC4068329; Fri, 4 Sep 2026 10:15: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=JxUUs cpwEoHfk2b/DN2S3584MTU+WVnn0om9S5iPrOI=; b=xOHIsG7tu9LBInoTsnUf6 ph75M06tPid2yBGW899ZIteITLIH3wovjUG+OLMHZBQ3hatrjUmWbhpHv1sFbJby dewQXRSAuGWIc+padKdgI7bJZU9Fk16jJ09MnP+2X/H0XUFOVytzMkqkwINduHG4 GXbq9qdlktjIXvlyeUTXP6jWeM5x/Q+xQeBX7xBR5jkBpcfWjwwyGsZIidhfNVlJ C9I8HeH7LneT7iOmiLmTLthXUS+JRWV9KKdL1XzLui/eOmQ0GgwYrJoe+fFqxRDh YRlu/pDJ84isZk4Oq5dvuH1Zqddqu77eDEKSMEdnwa7hGNDJobR+u6YmzzBafhov w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gfxaw0d1q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:15: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 684EFi4u036133 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:15:44 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Fri, 4 Sep 2026 10:15:43 -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; Fri, 4 Sep 2026 10:15:43 -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 684EF2dA026210; Fri, 4 Sep 2026 10:15:36 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:14:58 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-6-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=1994; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=6snwAoSaSMSIrb7vkif6gG8ygaB+m/IQ+HJUUbD7nqs=; b=mu3Jbvv/RGzDstJSRmzD6WeWRBO+VIn1rK7iqFS5q8U0/4YEH97rLCVXSgxsTFlyUMTx4ZYKe dPll8KGlXfuC3q4Nrz685DRKPhsRbxhwunrSWs6yibvH4rbqrN4KcuU 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=UNnt2ify c=1 sm=1 tr=0 ts=6a9ad291 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=FJaljikgz40-E1eqKLcA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX9KWzJLL7kprj C99XNdWwOl/oSRl9fQjKvcZmIpPgCUSlMqdB4eOTQaDi2Nl3VzHeODUBvD3DvbQFNEcvWBHGVC9 uqn/f8EjjL8ZNHjgKxBtKsPw843zR3uat4QsQen4ovFkqblQjheS X-Proofpoint-GUID: p1WHGcGttgCoy-L-809KN0NBBECpt7G8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX/50Sw/KVOYqy ZDBB9chle76J4FcSLxInplhHItqlK3hlAEO0ZtxUf5fo6tjMcyLUtlfEwwcEwvUQfFaoSNj4tD1 Pw5UC/50Vcj2oSrm6qm501WVfR+uxwtIFgl0r/naTaOWvoUMVqaLzij2xwJ2uy5qENJr0qWJAnj W+Pngp9COEmzFtibyQQ65zg9aCncZT12ynmhrEwsGBli370vDu9TvmWUnoFxwIKPRl1WbjG8aeD MtozYzAM0BbxgmiIg+czyABKY0lDS56SAvEnkb1HxALqdVVfdxxMUgACosssDYrSFuTT0qMhzd4 lMmJckng63Pw5haSEhNi0R/QiOrAq5hX5ote7mzhw9CuUQ+GyhtWwJIr0GEnsXzNsxAOXOowier /qAURaar9JOMAdMVP1R/QZmOGXVzQYdxMZ3puYIE/8ManElqFN+Dr/0VzdGFsZO5x+VLHwcjsRi YNKhNf8xGiRhLy7q4gA== X-Proofpoint-ORIG-GUID: p1WHGcGttgCoy-L-809KN0NBBECpt7G8 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 --- 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 c80056a9edd8..707f3ae70a95 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -95,6 +95,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 { @@ -777,6 +780,23 @@ static int ad7768_get_enable_vref(struct device *dev, = unsigned int index) return refp_uV - refn_uV; } =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; @@ -852,6 +872,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 Sun Sep 27 05:30:23 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 872A94AEBED; Fri, 4 Sep 2026 14:17: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=1788531429; cv=none; b=dwvi4jzEz4P0b58JjAThnOn20cOdtJSMqEFPFgdDx94McaggwPJFEgo6NsK3IiaT7EAWEI5MItK2Q0aawqlpDU8f1oJ8UR0LkOu43X3VFCVQPR+AajNicsCJKfONSqFOp16HYxZKSqrvT7MzxphiONjjSSXqvTLK6AhMv3LcQfU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531429; c=relaxed/simple; bh=q/9+ryLJEraKeP+/7D8n8PffyibVBnkMXyyawnCI1BE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=G1RtW0XTbxeRuKfEjoQbzS/w13VfcfUIkWGYqLJZE15Sv007mqn7tGOfJ3IM7a+3zSZ5aD+qr8XgvBQetcfCAI8z12qxjvLMHo+qymXddARNEpTfvwADkIMQmfyr7qBb5Ag7qeG0n1luGJ8RMU/8C7GdSeNWV6sPLFiySzKKh+w= 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=l1LUsWm5; 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="l1LUsWm5" 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 684E2QM93597856; Fri, 4 Sep 2026 10:15: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=55hn+ IUUN7mHugJYPtQlfoiOZqM7Vo0Gs0sdUyCViIo=; b=l1LUsWm5ukvGdUzZLNp2U 45Njms6G72yPs6Bm4ih73EBHO53L8V2XSL6j8FHVi/hH08wE1+qDBA/72ewAdXyA N3FhlJUtW8UdDbpBFPUyV4vPvTAAkx9YtBLu9xCtky3gqqeIWyZmL2QlIgWSYjyT y75HHiV2kFCZLbIIhXInzuz+vbYGimzQJIRpAu9Oqfwx8IeO3yft9Ud1PiSfUKwF FDVXrVAh+bhKC193ILL6yCdZZioiPSmfP8RZYNMnzddT4WrUr2Ot0TNcsJU3jFYR vqJrxDjuk8iAPmQj6c4d6v0KBYomfD2+yJ4UwMZtwbooIJHyyxADuis7BplpMUrp g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gftu3smkd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:15:49 -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 684EFllD036145 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:15:47 -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; Fri, 4 Sep 2026 10:15: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; Fri, 4 Sep 2026 10:15: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 684EF2dB026210; Fri, 4 Sep 2026 10:15:39 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:14:59 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-7-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=3315; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=q/9+ryLJEraKeP+/7D8n8PffyibVBnkMXyyawnCI1BE=; b=wQPl1vInTF+UqYruYkDt/5SlnzqKzg8kc6QU//v73fmI16WWeSJITenylP8CNef53CLFmMglZ h6LsXmwhWZ7Ax6xoTeRRPSIm3EiTma3he5jLAbnX5yoVw/AvRjSt4Ga 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=R6wz39RX c=1 sm=1 tr=0 ts=6a9ad295 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=ouHy9IwMRfQpid4n9IYA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX2JK9e/rdzeom wY3lo4xq/dqgd6yV8fmk9P1GgwpqqILanqNGbwbrpdmgJEkJpciSvkRvxa9r3GvwYPrXPvCEA5S XEuX1To3qnU+cqG5A701C+FSIZS898YAMvJwSE3oECl3SXK8Otej X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX2Zeas0kGItQF DCN3YM4tv76gfakRDIzo0UPpI13QxYl2omRBBIFpB7Hi/6LPbvYQ1klmLO8bJNdaEtY4IAWxY11 7IqNGcHf5OoFY04mdyb3Am0HMK1L2o6ZuV5ock5J8acUFL1WDjV3QUUGWhvPC0TunVOXyzddn91 BPp1wTclORWwqpao8pSqgVjsuxvS8lPmLavJwbDalXXw2G85NKV8J54Liip+y6Fmz56L6MTEcfX 54qpaHXUxXOFuI1hl2g3q4O2ZDBVQzfqbO/7l0ct+8NecPKgI2+bzq1oUaiD3OVk6dZHmvK8NpV ajltLQItLGML3GeBddozxWJ1X3q92hAKrN2HDDRmajIVCE+pe94STOrpZF9CCltBWHE8n5QFS75 uU0NDI6wjVZyGehcNLYFYrX9HxXppKoGUM1RvgWA2nycqY0dW4G6lLUVYJ9RseETMOloLoFuDzU A01aTdB3ajbgsrYUB2g== X-Proofpoint-GUID: W3_Hpo3zRbNCzwetfThHAJhiM8C5UG-k X-Proofpoint-ORIG-GUID: W3_Hpo3zRbNCzwetfThHAJhiM8C5UG-k 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 lowpriorityscore=0 malwarescore=0 impostorscore=0 spamscore=0 phishscore=0 suspectscore=0 priorityscore=1501 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 --- drivers/iio/adc/ad7768.c | 52 +++++++++++++++++++++++++++++++++++++++++---= ---- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 707f3ae70a95..71db57a2b9dd 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) @@ -106,6 +108,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; @@ -131,6 +144,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); }; @@ -335,6 +349,36 @@ 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, + FIELD_PREP(AD7768_POWER_MODE_POWER_MODE_MSK, + mode_info->mode)); + if (ret) + return ret; + + ret =3D regmap_update_bits(st->regmap, AD7768_REG_POWER_MODE, + AD7768_POWER_MODE_MCLK_DIV_MSK, + 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) { @@ -494,13 +538,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 Sun Sep 27 05:30:23 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 062624C6EF7; Fri, 4 Sep 2026 14:16:13 +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=1788531376; cv=none; b=evI5QxRLYHS0v3mz2H3SZRO5LqzfeOqCTXEdXSrGH1ZCHxFrTtDdBvxp7ieMJVmSu9ulZGZHyXThDqnDWaOAGzwq4ROziJe6TChGNqyJ/Lipp/3qCQ8kh+LS7yqyA2/TcbMJZUd3RFRgx+rIdXmGUAVJW9vHrlF83E8fFP2X0YQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531376; c=relaxed/simple; bh=JHvuGW+/KX1PMkIqb86uhaAUY8k5Ty8luuZ4QUJ1Dn4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=ncReaIV7FBuawILpb1mjEkVIDT8O9HXLivX8dvPMYJBifG4sROjArF7Ssu8ursqbH/YwVkMmlPTD60w/F5mZQDTSrVW7xgagutOD5ERHZXyMCyckQZqDUpsRqm+B0OvGq1cADn1IARXDrY5TAftGmuPvA568tCr8T0KlKUJfTGk= 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=h4gEYNyK; 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="h4gEYNyK" 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 684DgPTP4068661; Fri, 4 Sep 2026 10:15:53 -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=LPNGV MKSjOLNnYXlf57qs2DL58DJicKbWsqhdvQd8PE=; b=h4gEYNyK9AuJ951XoemGK GfagufreCL52Fsc66qpB5bdt0IlOcbqJE49X2fcLB//TlYl47d0LUkgu/UlMtKDP /lwKn7UhHkhpVI4LkC8jkiUQhLn2SOAxiUazQNrGKFSTCZNgxkdqitMV9QFiS6Gm 83VgH4BwR70Oe1HJEoyxJYKuhN214WjYCZWz/BRa2OgU0bmtb6rtvxAed656u8uP Q80lrTmX6b3BIypA/gw6CJfaHbSZ+tyxv/9gcpbreSOf2Zd74PSsi808bYjFfcC+ +4iB23xBzB0i4uSrBAl8MZU2ZX9n8lGQyWIiAkYoUhk8yH9IE3s1S+l7J891dNtU w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gfxaw0d2c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:15:53 -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 684EFqb8036157 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:15:52 -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; Fri, 4 Sep 2026 10:15:51 -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; Fri, 4 Sep 2026 10:15:51 -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; Fri, 4 Sep 2026 10:15:51 -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 684EF2dC026210; Fri, 4 Sep 2026 10:15:43 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:00 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-8-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=8248; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=JHvuGW+/KX1PMkIqb86uhaAUY8k5Ty8luuZ4QUJ1Dn4=; b=BuZZkiJgZ+okF8HY8+XpPi9yRK/qPCUrN5m/z6bFmjxY/WTfFnjuoyTd64Sbk4V06YnT+paXG 4D5qDFetKy3Chc9R6OvhBcwdzbbc1wFSiPGoOiATo/KNCjR1iAmQF2q 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=UNnt2ify c=1 sm=1 tr=0 ts=6a9ad299 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=8zL7B6ODU1ky_bk3ulwA:9 a=QEXdDO2ut3YA:10 a=br55WurUj89AL1qEz8Q6:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX3VdJ+VAgYBBG 3yzjumf0TDcbcvQnl3SJBzaLRmhYOqLRZHO+0YQYuoqe9FFy+8BZ3IZVLSlXMpJLOJrzhBmJi73 PBIoKfFXjdu3ql+jADf7ELfGBtGvgT08k3gTSinYdiJtyGZqXI/A X-Proofpoint-GUID: Ckk_mA4e6uUMj04hrRrfTdDGk82PIdNN X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfXxmklX28Wy0k9 LrZ5I3/Ozz9uL9VkD2bE+aHzkETgXQTgWVDakHscRudxtYz+cMfJ+krAkLiHjXGmTCSAKFMUtUH 8ADbzqwuqHzFNzDhzNWyulm8QKB6rmNPmKZCHO5Az3E9B7xsRHBR0yEnS5BFbrsMx11d8ERsI8t CZjuwiRcc6avuWyK2jQ7Qiihh4JxZn8+W4kXgyUUdCUlr3dN68ZAUuRKz0YOf8tidsBWsv9VUhN BiPETGPxbW5giYkp/+rE8qZtOCg63xoSKHWo64y+k3eoWsMT/8gfwLvCXI5E9UbqalR6FgMN/Xk bJIZQhyNX1iD/QFGo/7tJ9deUPrylhoAW43sjwGyd5KEobPNDPapSEeaoq3NamRSGWJhile6Yar 2x9IGSbMG1TVNrlQq/2x6nBgjN86QC/wj7lG1/WFa1Wf2BFEwjg+j6ijhtvqRTGrkVyINVOcSkr qpOlbATgSnxgteMhE+Q== X-Proofpoint-ORIG-GUID: Ckk_mA4e6uUMj04hrRrfTdDGk82PIdNN 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 | 149 +++++++++++++++++++++++++++++++++++++++----= ---- 1 file changed, 126 insertions(+), 23 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 71db57a2b9dd..2020156eb6b6 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 @@ -97,9 +97,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 { @@ -126,6 +129,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; unsigned int num_channels; @@ -142,6 +155,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; @@ -149,6 +164,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, }; @@ -379,6 +398,68 @@ 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)); + + dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV(dclk_div); + + 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) { @@ -531,28 +612,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; @@ -561,17 +672,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; - dclk_div_reg =3D AD7768_INTERFACE_CFG_DCLK_DIV(dclk_div); - 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 @@ -695,6 +796,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 Sun Sep 27 05:30:23 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 500FE4AC16D; Fri, 4 Sep 2026 14:16:23 +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=1788531386; cv=none; b=ZKfWYrXhrCUpV72Rz74pb6J4uGi/CaygLCTn77KGvcCcYnqLyujXzqEV4YyYsjL0LB4CiNV/gbDFY6YZBySc5iTx/hibiMFvpg+8mEXWNlJvqY/w9dMcf8JJ6mn3RlnkFun0U9a7nJsiRZGqRBT6n+oKYZeQGzEtjbwWKEU0FNI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531386; c=relaxed/simple; bh=B4dO+MxJT0noOznoNJyWtXLH7Fp3tKImCqnWK2jOfRA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=fZj/n84GmKLezi8jC8vg5/YZUOkiUPySnJrlmOZfZnWy1PWpl8edF1Un6Wv1kte0qY1pePZaLWZj0xRWIC9T/1DuqbephNlxgNsk0LimOzqyFfwicNnSFeZgbGSAb/ToEiUG6cbH2plc3X8DCYJx+q33JP40o2Zu+Fdi6bQdLa4= 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=N6Qsv2Kb; 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="N6Qsv2Kb" 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 684DgCYe4068371; Fri, 4 Sep 2026 10:15:58 -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=q6Gxb UCXFKt/Y8wk6w9bdzGhln3uC8ualeegauhV57Y=; b=N6Qsv2KbSAMekktAnSS44 Jr7qGJg3R86pz3/2glFPeoZHthymGQMN5RnfC+yquqVueEjh+sPzTdY4KUIEdECX NqcQSoTiJ1z0a6Y0EdPyTDjXyvmfj49fo6sLiKKYZz9Zx8wv6SwTOjlbYXui7PMy 2aov82IvriMOhUn46WsXXxzbbKL23fCqcZNYlk8kUlHEMCUVOTQb4MJFd4a0CKWa aEC+Slb7EraaG0VDml4LNDUJQQcw1UeqwELQsN01cLpNXHoc+XY3JNg/jRIKj8Er Gp+2EeRDu6bT1IXIqL7Sc2PdtFp8RJMZQQqt1tHuKMxnMYB6VCP06/ovP/7sjmy2 g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gfxaw0d32-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:15:58 -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 684EFvJ4036194 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:15:57 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Fri, 4 Sep 2026 10:15:56 -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; Fri, 4 Sep 2026 10:15:56 -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 684EF2dD026210; Fri, 4 Sep 2026 10:15:47 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:01 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-9-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=8216; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=B4dO+MxJT0noOznoNJyWtXLH7Fp3tKImCqnWK2jOfRA=; b=ElaNRSvVgE+07evjonHl4pRYdslGiQ+zFipS82EGLWn2ftZX7iv4Bdc56SzP8+sRLrwEl6UPa J8kY3PppyxvDVzv3vZugI13yOBzI6ZVv3W+SZa/aImshVfSaZyA/r9E 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=UNnt2ify c=1 sm=1 tr=0 ts=6a9ad29e 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=9CUsoPMI47QhLQymv6cA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX2njeDWUM6wjQ M49B9o35kGLIBx4ySFw/n5n/VeuW3pgE8f0IF6Mm2lWH1vIuTbwtrCWsaXvwy1c8on3H8EYfeh1 lmfN6Q+YQsYfzJnkmxOmgSwf4iB5R06adqlyCFA6tus0tjpyncVl X-Proofpoint-GUID: ZLzXE5DTeRtw5NNq0PjnQ_iEm5I0OpB4 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX4UjUwVq+2QoY MQbuuQT57er+EnFmMUGn4OGJnD434hCxFIMz4zrmj9rjFiPPF/ZtdSNFqjjysgzgzSkr+/uRjis tNmzgu5D0ppNQS0h4FtheEfjmcjZzIyX6Qm6eBlHykv28jabvhQk/GWwKloVgyGtl/q8msb5/do mTSrKn/+7iY65gLRXXFX8NYLHq7ihfsE66w1P0+rOARq7sbyeqeiqYFQnZol9Yw0FTi+10IrJUR AP20BZ82Qp584oplil8Q6O2UL28mRjI+8zpGjTKnpW3vHdZv2nRAKfAptzPfu9iqE2rdh+EKbBA +2QptzNmGTWwVk6RNrV1+DCk+XMTo+sIyvq/FPgH9pnIy9rctBkSV2s5mRkrb72Fp3Xvvs5RdkV tx3QIljeZbJi/BLL47+MLSGflxTTutgBdO0NrEOCacJ7fOcKPXuFbeXdVLKCpoEAXkTq2IPiSVu Vs3Rq6VkXvKoU7LKaGQ== X-Proofpoint-ORIG-GUID: ZLzXE5DTeRtw5NNq0PjnQ_iEm5I0OpB4 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 | 162 +++++++++++++++++++++++++++++++++++++++----= ---- 1 file changed, 135 insertions(+), 27 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 2020156eb6b6..868130ebcc8f 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 @@ -104,6 +106,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, @@ -151,6 +154,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; @@ -204,6 +209,11 @@ 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) +{ + 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); @@ -460,14 +470,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 @@ -478,11 +544,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 c =3D 0; c < st->chip_info->num_channels; c++) { if (test_bit(c, scan_mask)) ret =3D iio_backend_chan_enable(st->back, c); @@ -639,11 +760,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); @@ -656,27 +776,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, @@ -798,7 +898,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) @@ -954,6 +1058,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 Sun Sep 27 05:30:23 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 501B94AD7E6; Fri, 4 Sep 2026 14:16:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531385; cv=none; b=ZdLnph9VqGKaqLJX76PtCZn+ZvesARrSy55xcbParIM0WPcB4c79j2f2+WhqpanbKlL0r3/xHIKIFreRHXSNn9RfWGGM7pojNLiyxdPxV6PamW6D8zUYySwIqaIV1gpfMs7VvhhOGH3+x3AVLtv98iQKDuvNrY5UEHPbMSZnfQ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531385; c=relaxed/simple; bh=KiQguzkvoEc5W6hNKkSArOr9OIkgiHdS5jX0QyXMxJs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=VNkl9jAh47i05SWbMI7LiCM0W+U1B44V6APEi6P2rtZZGT7kyLxN2tbiFY5R4/8RRUpFRa4o75yhGW6p2O6DTvKyM8qzKu9FJzt6Dk1Z9q0SmvfCsYh4wRGwjs2dZWozxBC5B4ejW9RGLTEwMPNRO9Ed4K3ryfrK8GSjXXKn4I0= 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=iGOvQsuL; 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="iGOvQsuL" 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 684Dhgcp553720; Fri, 4 Sep 2026 10:16:01 -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=uUntt ExvtV1w74S9V9kUlHAJa9Pn3tyjRpnh7mr293c=; b=iGOvQsuL9rUiJy9QJYkFJ u75X8aPZk83/J3HfYHtPZmOd6/UBpD4ab/cyIByy6nMdP/Esw5/oX3z5CS7H1i1C KAWCZXOrlU3zinE6P9wSWwjCSbET+e4AbhZZG5T2zq8WMGuijWYYhuLdVZ8zLB/1 gG3nEaGPCF/WxOUE7yMVL4hO5PHYYUXkEFYrfNNhHFcrB9h3pk8WV4LLae8+8dwS OTv5sxkWW/7QcEjC5sNk5irW1+lVLMNEQ3OeYEDF0U80HDI4wl15a3x4TbbnFgm1 6qTPo4qNoVeE+rAu4HSd4dsKa3HuZl9Z28VSFa6omXhIB4vDGOyDLGt+pBXK9xym g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gffk4vhaw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:16:01 -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 684EG0dX036240 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:16:00 -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; Fri, 4 Sep 2026 10:16:00 -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; Fri, 4 Sep 2026 10:16:00 -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; Fri, 4 Sep 2026 10:16:00 -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 684EF2dE026210; Fri, 4 Sep 2026 10:15:52 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:02 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-10-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=5135; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=KiQguzkvoEc5W6hNKkSArOr9OIkgiHdS5jX0QyXMxJs=; b=zHk95zD5481V1yJrDCeathuJgrZM29cfIhO7MqOfDRygFuIdYgMyJXLx/Wss2Rk50DcsW3QC/ yWCaOH5RZZqCHeF5Uudi5GbKoiIw8vdcbm/S7MecBvaq/+1qSHg0IgM 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: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX4PJqUrpM6PnQ Yb115BoFU/uLJxuAzlSEdcshdEY3hHnhzwArczxLqQpVMfCxpUCyib8JJxyqrPfD9RTkDDkApMS GV7v/3KGhssmktWpFKdaG6IdhP3vwFgm+0yuN4/37jjhLGbALwWAlwAYQWei1kjXt9sa56yzaxp t4pXbY1pW8yZB4PT1v/V3L1jaCO2mqg1OQnIe5Dhjm+rJMBCVdORSo354KXDMsUAFn6NxXs6RMD NDQN3wOVZ/q0+yg+cYx7A+IstDzgKngRZRsp8uydbdvxxv0qkaBVMmC+/25xu9TI+8Uj5EYAIlX 4wlyWpuRm+jrLjDABbCXzxRX9R++skO5mxg4CYl04O7yZPHRYtSZVmLHDozbRC90x8ykD0wFfHU oTK+Oc1aaXniPeDUkvbs9ryXNh5oZ5tRXhZWnYhJmAIPAAUIFCQtMXdHNbWfH/o/7dXToAejyDv eJDpMAV8uFWThtnMZXg== X-Authority-Analysis: v=2.4 cv=QI1YgALL c=1 sm=1 tr=0 ts=6a9ad2a1 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=LMPk9M2IzwWsjleXqZQA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-GUID: xkv_B2E4qoJznpHl0l1qbNpFK90ECEJo X-Proofpoint-ORIG-GUID: xkv_B2E4qoJznpHl0l1qbNpFK90ECEJo X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfXzn+GSa+evvcD xvSzUWZrb/4oi5UepR9TlfLco3dvuMxZN3NESiAec/FMviBIhFE3n34AEYQblgfo3xLH4eZpIkI pmjsJ0c+TR3p7fDGU2ko7jRnrS52urqtLVTLb+5VHV5Hq3ntlxxu 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 lowpriorityscore=0 phishscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 impostorscore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 868130ebcc8f..d5eaef92cbf2 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -125,6 +125,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; @@ -161,10 +164,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); }; @@ -500,6 +505,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) @@ -678,14 +709,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 @@ -758,6 +838,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) @@ -855,7 +949,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 Sun Sep 27 05:30:23 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 1DE6E4CA785; Fri, 4 Sep 2026 14:16: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=1788531387; cv=none; b=FZS7OZNrT/5K3hry6T6aG+Zj2c2zDk8Agvz2l0RLwJlQv6tC7x1O4d3xtntNyf73mrFbZJx3jPh30cCfFBagwapqWqZAGAxMNg77Bh246XfFYIuFkmrYCd+j3cocblYpHIVZ2pZWfNZOfXlZHGJKCmo7aeO4CcyqobsjCCDOe7A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531387; c=relaxed/simple; bh=O3Pe6kC5PTrtLUZ1vosk4IKs3nba35T7fYXfEVNtRmg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=nuADJ8CociE9s8xgmlBQGvnR3Vd7wpC7bj6Ovv7cwOSBaLgCzUdeYHmjwP80Z/Ty+WnFnOlk28rg2y0eNaaGkVMEN3u/W+xXzFo35hgBLwmxw+FUq0LE1JWraFAB3PKgzyuoacWweG3wrX9qb4muLH6mKPiQGaGlG0OCfGmeixc= 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=0HsKbQt9; 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="0HsKbQt9" 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 684DgXKj332948; Fri, 4 Sep 2026 10:16: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=/RPUB 2hd/v3/MzFjFkWJuA5zOQqjrrHz1HakkLwN8xU=; b=0HsKbQt931xS55o/csRRk BdIT+vOKS2ZzDjySIHEF+y4L8PElrDh1eP+I7cKXVugT12BxMhnmHBjJwcatllEM PwL9l/P4C1JjbpiQH/J/g0ALI5U5z7FdAdDbj8BtydTqkIr9gndIa6xlZk7EoIYq n0usco8TgvbzNuPEMVdFuB2JOYiY5FeDoVUzzNmF30vPp+ryToCsd2gUCUk47T5s 7jPAkLcVDxd0b2mu3cG61L8cn6yqBzXEYcgBNVOFqT8OEbEfR/8/t415UlnKxq/5 ObW8mX75kE6EozpWVAjQHQ4tEDJ/achYaPZFt4G6fKZYn+HBOcmgqGcWIpFuuerY g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gffkkmfcr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:16:05 -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 684EG4Z2036289 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:16:04 -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; Fri, 4 Sep 2026 10:16:04 -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; Fri, 4 Sep 2026 10:16:04 -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; Fri, 4 Sep 2026 10:16:03 -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 684EF2dF026210; Fri, 4 Sep 2026 10:15:56 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:03 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-11-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=5046; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=O3Pe6kC5PTrtLUZ1vosk4IKs3nba35T7fYXfEVNtRmg=; b=wZ0zmXcEHxN/+w3AOgy2EMUIvr69kGFZTg4o1n4Jv498oO6z130QKwN383IUN+y7G7njoMIj8 Qy8Xsd7URAwBZ/bZhGzydMF+NjJKiJkVpBv1Mz+RZYgdRnp5ka8aGZ3 X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: im6xWZpTZXfm7nz1x7ZDoXe4VCmgrAet X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX1LtnmfKAFGKM NmwRzQ1VIou6L5+2GbHFffgrirWJ4Jixgvx92b3I3zrH5U03xolUPtZcpGcDzk3K2Uy+xbFPKfi fQPEnaZO5XeToBKee6xsnPGEEzx9wLSZ7ubXwvgvcDjsxjBn6geslqoCulBGPLB1N+XcX+PNCnO h8XaLzVvJgeD5HxUb+OdFXHLilovfXnEziDSLQLXfhUL35RQwxU/ji6yFif6k9/B0590KnAx5XA PIk/06YlrBZYqUKQSJm4uGmMXGOwcfeHim7q5mx1dGDf7MUx+SYI/A8ZxvBkvoCl7nhFl+J7+zo Vkp9ss/j0ed+ts/RfTob71P/P6O0evhh8bz1HSHW0kB+ENTbtZQg4AqrD+NVlYJd1R7Dp6jKjBM holZ8DRqvD+O5JX2d0nS+dN2aFgO3eHQmr00NNQKZJD3eppL40laF8lckr05yzlFMPyj0sWadnh Up5DFoH9wlmmwfntM2A== X-Proofpoint-ORIG-GUID: im6xWZpTZXfm7nz1x7ZDoXe4VCmgrAet X-Authority-Analysis: v=2.4 cv=F6NnsKhN c=1 sm=1 tr=0 ts=6a9ad2a5 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: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX7Nf10hAiTJeb 0+TBvIjtvl8ARD+/3PgxTofulqoexNxhpatOturSNcAqI6GwagHctssEmT19yGaSc+eH0PysmKu LCQqgbufOoaZu83ekxW2OL5z7/T2BE32iZ+WSFCM9P5p0pchyCjh 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 spamscore=0 clxscore=1015 adultscore=0 phishscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 d5eaef92cbf2..ac236e5c74c7 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -108,6 +108,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, @@ -168,6 +173,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 @@ -531,12 +537,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 @@ -546,6 +599,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); @@ -580,13 +634,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); @@ -610,8 +666,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 @@ -867,8 +924,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; } @@ -961,6 +1020,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 Sun Sep 27 05:30:23 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 826594CB8C4; Fri, 4 Sep 2026 14:16:28 +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=1788531389; cv=none; b=j+7HC+H0QBYrsqbnY7lGHYp1KsCb5E1VfbJlXQZBFYkwMV9g94/aj9kmj2lBpiOujXA1IZQs0YhHjkBQxFy1ztNyPbzr92Y7MH3oAYANWTDbLLu5udXH5o1yET0FYS/v3uD5MeBaS5LEeIl3B1dUj3fJJZgK6x6s3gLoZfSD/1Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531389; c=relaxed/simple; bh=Gng0O6YkiF01/cFtKdvl8bmy4Zs56iHjUpnoGLkDNIE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=usZfMVMbN5lmHCxe/lO7zy4oPijmzf9ey+dGSwSI5QizroSGGxC4ocaXTPdrvzAMB3tBt0I7CtHVjnoxUYJoirHseu7s4faiXNy5X6D/flOAOWKP8d9bG4zSxsDieIBlC74FgKn+UHt4hff1SlqqImz04MtyYo5gvsDd1axuiOM= 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=IvGn+qni; 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="IvGn+qni" 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 684Dg7UA4068323; Fri, 4 Sep 2026 10:16: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=lhnmy CXfNwIOvQRuBD4vDTjGWOLquvD1bp04yyC/5g0=; b=IvGn+qnixTt37LghZYdp6 7pbflnova191uVa8UWJq0qqVrXz1+jsny3Ti11tzGmcM/29ffEq77k8akAHfXqmR wy0QoWqiE8vCHGQP0ysxNmVjVkVFx2808kon3CxdQRacWf/ndDZC4uqvQ36kgQ15 0dxRW5/iiMwp/kHXhArB+IcOhPiqKujw9QiW6QdKI6Lb8xJ9Qb1qH5OCutGu4G0A YpRlYOITRL8U8UhQRmyvz/K+UE1+ICFstOvp36HPQGGSBeivZhZbIklB7s3gSR7J snuBlYJpcXFn3YLYGxnTBQhBvJrKBL3V24Fp+bC4IRAGJZtu7I8zYx4fONEZ6ccd Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gfxaw0d53-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:16:11 -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 684EGANB036356 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:16:10 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Fri, 4 Sep 2026 10:16:09 -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; Fri, 4 Sep 2026 10:16: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 684EF2dG026210; Fri, 4 Sep 2026 10:15:59 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:04 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-12-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=2279; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=Gng0O6YkiF01/cFtKdvl8bmy4Zs56iHjUpnoGLkDNIE=; b=XyTFPtdbbreROD9BWuJjl1Y1yORZ1cCPVpji3QyBY9e2KlCvFoaZysrFQId+xnPM+fhHtdV9Q LR2JE/UPtQSBIVQVX66FfdS53yG+xOmKin6RBp02ajnMSAWl1UTYa38 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=UNnt2ify c=1 sm=1 tr=0 ts=6a9ad2ab 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=meB-weNJVlBEWY6-UGIA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfXxtLMpDy92hgR 3a4oS7/7tWuls/GBnJb/3mO2+rRPy8Sl7+z3xuw9A69qzoXZ9VhYsGRQbrCCI9sA3abo9Go+6qB +9+H3T2r7N4MPIhAVexR9qbyGwKeyICeRLN6kfrBPEhJtjC4g29s X-Proofpoint-GUID: oiWAlIpKkZe6ukJ-QjDCk8FSuYg94x-9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX6czVk1JYW+ya HUeU4I2uyATJ1yNsfd8V8r5O3u6HVxoWiu9MRMACSNdjdaK4nkuAz4MCHcoX/uBfN6TSWNy7WX6 egUUhsj4h83ChDmFIZbVarZQvFMQsum5lykJUCvXnoDQhG/wIj1F9AB7a1LdwyYSLI7Q7psa/+u 1mJ8gMwA2+ulTMX030dEuWhc+hhqMyg/2Qy4Dhzl5gAW5nwxFa78H7bAmEGB0pIvOkyuuJpJ07C Cz9sqtbRxCbdW5MrOE900yuUGM5NE2pQtfuBlZZgs2fdzBgDja79H/flsO6kq4xUeIqm/oh63b/ GJwExc+xuJfpmEHGqBMXsTZZjy1FOdzePfQ3OpTQyEnMKVICEd0Y9+C03EMh7Hf9c60OFDdHsBq rtzyGyeK17TndGoBUNk3gmxNLeC4mK9rBI3eCsNpv/xE5m7U4TELoLHCjoOi9RB6YWT/UMP1Cb7 9M0miRGIN4VJpcOKxoA== X-Proofpoint-ORIG-GUID: oiWAlIpKkZe6ukJ-QjDCk8FSuYg94x-9 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 ac236e5c74c7..f2c762688fb3 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -107,6 +107,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, @@ -596,6 +598,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) { @@ -679,7 +708,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 Sun Sep 27 05:30:23 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 F33B44AA59E; Fri, 4 Sep 2026 14:16:36 +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=1788531398; cv=none; b=SecNynpsTs5uHJCmJdZTZJss4Jt+uuQDxxGIdY+vcSAXLoTyyLdQXyWA1+csYys67qzK5uKHhM5XavvUM2ve8fNmN+zolGK7DFHWDEvclm2mTPQte4AjDlV+HJMac/BIq+qXZXiJ2OID8+Jvk1/96I5B1mn+gZuueYLbEGTkxFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531398; c=relaxed/simple; bh=+bkRCAOuQDP8epPKOploODHvIjeX3T2j4xF8qImqJ1U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=WN7EsUsCiQLVaTsw4SLTs74r4/hkur75nrXC2u6couRySFNdOhyouCZgGzmPoqr4V+9fU3cHffND6oqExF8zJJlrklmg17VWlhwjnC5dLDfYT76WzgEDFoQRw2u1qyMCFQGgRTgctyvfwvCrkgHBTRI3JbsIYmWdkqNGaV5z9KY= 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=KJkoo79h; 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="KJkoo79h" 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 684DfdSJ3552678; Fri, 4 Sep 2026 10:16: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=XbnfY tRTrcWhuyIelNIllAosrm6xnxnGXwUgzoDGPnc=; b=KJkoo79h8QrfMgyycXisP avnn8Lc59agc1yn60DOD6NJna4l2aLD2b7SmiAq6tiSPH3C07Yqu1B9KCV/r9LuL CxvpUfWlDVbdoNzV1FrX9vwJ8wAWwDlR4qKx2ynQmS1Gb9EN9IAjV+P/kNwT3j1I LlGQpF1n2r+6jyWtKOTW7xBdtWHN1e9MpMKA7DV+UjJaKIret0sXvwdtkvubBHQG +EDzPnIe9m7Jnn4NjSCNWDbTYIC1TfmE6/0oBMJf8mLTTFZbF663fWji0MLiW3JQ PvSfFmW+qY/YMYE0FUBmeUhmyUFfZ/vnelDrfCuo6EngInq2LafWD4gAROkqQc4K A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gftu3smpt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:16:14 -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 684EGDKN036371 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:16:13 -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; Fri, 4 Sep 2026 10:16:12 -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; Fri, 4 Sep 2026 10:16:12 -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 684EF2dH026210; Fri, 4 Sep 2026 10:16:05 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:05 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-13-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=5753; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=+bkRCAOuQDP8epPKOploODHvIjeX3T2j4xF8qImqJ1U=; b=P8hI2ijfkmbL5HxWND+NhoreycaYqunF2lRX0l9JmqVJC2JQghgupFSVuQg6a7qH1/phynvAx dDe1WNF6uXwDPARSkrpBqVULrQpoC0xMqIPudEoxRarUPTanWhEFhkq 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=R6wz39RX c=1 sm=1 tr=0 ts=6a9ad2ae 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=-8FhGxT0-ylaBreVXV0A:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfXy5SE8zXuRFK2 81UN/9K0ad66rLQVKRBjVyQ/JBvKHMdzq0W3i2X19U6CgVWIpeIyweuzD9ql1Con6DkFoS/ej0x 9MnNOyNcQzx/4tQMQ1c14/RU3gtXaUgblCM3ueBf0XTKTp+iDra5 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX/xjl4HNDLbLR cU2cxPoK9tFAxph5NClEYombVCxsLZymoHSOqCCktMAnaMkTYDSb4BuUbYxmbfZGngqLCsEXT1l VLymoN4auj/QsFmcY+1hjXX7+R4eW6xTMM4YVBxjOa8OllnFX7GJG9VI0BA0p+//Im/Vbcgsgsy lpaBrONLphnCPLwF6OaMY9DTryEQ4jeE4/iLJGCtK1g4pFiQeY8JwhWa14W2seMOWTDeM5jeVot ZzsWzGx4dBeeUeRdzliurwhDRnkc5cFwthJ2+vYYxzDUosycPmgflhEY63zBtflmp+bvmdhcREd zY9+QqvD2UBX5qswUChVf2w5qzEoqupeuOsD9+PZJhgwL4TICGrqHTE5HNfBQ93/rcjyrRUA6Q8 FSQdFyt8Pec1bkyNsHDyls3jbgH37nrDEv7zdDVPTTu08aVoHM6pqb6u5MaJH5yK8v5H/JfjB0p YJWtc99fEVrpxM05a7w== X-Proofpoint-GUID: SdNwhzgBSV_KK-Lb14RpjTWvlvfeHjoa X-Proofpoint-ORIG-GUID: SdNwhzgBSV_KK-Lb14RpjTWvlvfeHjoa 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 lowpriorityscore=0 malwarescore=0 impostorscore=0 spamscore=0 phishscore=0 suspectscore=0 priorityscore=1501 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 | 116 +++++++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 111 insertions(+), 5 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index f2c762688fb3..802666f7abd4 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -27,6 +27,7 @@ #include #include #include +#include #include =20 #include @@ -107,6 +108,7 @@ #define AD7768_MAX_FREQ_PER_MODE 6 #define AD7768_MAX_CHANNEL 8 #define AD7768_NUM_CHANNEL_MODES 2 +#define AD7768_CALIB_REG_MSK GENMASK(23, 0) #define AD7768_WIDEBAND_SETTLING_SAMPLES 68 #define AD7768_SINC5_SETTLING_SAMPLES 7 =20 @@ -232,6 +234,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); @@ -359,6 +373,59 @@ 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, unsigned int *val) +{ + 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; + + *val =3D get_unaligned_be24(data); + + return 0; +} + +static int ad7768_write_calib_value(struct ad7768_state *st, + unsigned int base_reg, unsigned int val) +{ + u8 data[3]; + int ret; + + if (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, @@ -798,6 +865,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: @@ -808,6 +876,21 @@ 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; + unsigned int calib; + + base_reg =3D ad7768_get_calib_reg_base(st, chan, is_gain); + ret =3D ad7768_read_calib_value(st, base_reg, &calib); + if (ret) + return ret; + + *val =3D calib; + return IIO_VAL_INT; + } default: return -EINVAL; } @@ -816,24 +899,45 @@ 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); + case IIO_CHAN_INFO_CALIBBIAS: + if (val < 0 || val > AD7768_CALIB_REG_MSK) + return -EINVAL; =20 - return -EINVAL; + base_reg =3D ad7768_get_calib_reg_base(st, chan, false); + return ad7768_write_calib_value(st, base_reg, val); + case IIO_CHAN_INFO_CALIBSCALE: + if (val < 0 || val > AD7768_CALIB_REG_MSK) + return -EINVAL; + + base_reg =3D ad7768_get_calib_reg_base(st, chan, true); + return ad7768_write_calib_value(st, base_reg, val); + default: + return -EINVAL; + } } =20 static int ad7768_read_avail(struct iio_dev *indio_dev, @@ -1045,6 +1149,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 Sun Sep 27 05:30:23 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 4D0934AA001; Fri, 4 Sep 2026 14:16: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=1788531400; cv=none; b=mtYWNoL9xHbP6xcOSsiUFZS+yOu+K1da6s++pMHvjUUYhJWAgATxfIlFzQys0xZiESjmZVxw9zp91e1/XS3uFcdHe1t4Be8iXyKHfPWWf9d+/WT88IdcS9MZOvTbRJVbWlPgqe7BHn3H77IU3QiaWOg/BxUjLuGCAY1Ln5UzlIE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531400; c=relaxed/simple; bh=oO4uo+23np++Y/7p+i4afFeckxmNLvOBTrgRTMXkKNo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=X3kQp5ACmKns92eh0vI1XXcbvxm/TGvJC6Yt0N9t5dZY8zM2NsjOu1Pnq1xno4bNuGi1bKaE/6lZJmjo5ojokrwyF4nNC5ls/1Xh9aQB58TbuSxkl4RcRB5Adh/1BSjU3KD0H4C1JXhsErCTqSqZBWNRbYwX+y9Qk2DQydc1Ewg= 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=sf0cHVdW; 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="sf0cHVdW" 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 684DgAwZ4068362; Fri, 4 Sep 2026 10:16: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=y9Vbe GYZ6t5zqTdxpfkCh99pvOxr18SIRZzn0cGA0zs=; b=sf0cHVdWDdBAZNMdmR/oz uSGjOsxYuVB5cwTz/ciB/tEOsTaXHoQqcji6DSIUeFg5MKsJLtrlOfHK0oLOKASJ RrVhnVhNlgaH1/mOGh57uuJjpfWpSHLca09ki3auSkyCre7W5N+nb+C2rwRfHKei kLLGJRLzZiGTc06CiPIbh2K/p9SDfRKVo+mQqqXhstv+F5EVC5zksIdK+MtOiSg/ g/LiSw91C94J94PZ5CHEpVtT1SL55QP4OeyKw1U0MmA+yfxMN6PXBH8XCj38d0ZJ oJ3XYOqHtbHB5ubEINVBv80aZqevv1p8+WsMyp8v4Sk9iZwIqigw05EV1MtzaQDa A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gfxaw0d5v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:16:17 -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 684EGGWO036381 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:16:16 -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; Fri, 4 Sep 2026 10:16:16 -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; Fri, 4 Sep 2026 10:16: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; Fri, 4 Sep 2026 10:16: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 684EF2dI026210; Fri, 4 Sep 2026 10:16:08 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:06 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-14-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=6229; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=oO4uo+23np++Y/7p+i4afFeckxmNLvOBTrgRTMXkKNo=; b=XR9GdIAvfnSYbkPjEemRc9BSqFAQTKXSAOi8d8wR7BXjhWjppNUzuMJCKgGcV670YztgrYo// uyv39/9r+nXAmN6FBl8KYnZPCyLOMv+QzcJW4Kng+ryDQb+2CQYllW2 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=UNnt2ify c=1 sm=1 tr=0 ts=6a9ad2b2 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=g92PuHId75YPrMRR_n4A:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX4upwTGOIv02y p2OaaC1rfyJD5QjUhZ+4YBgOFqnXV5UAXrMWSBUQn8ntKoy1qOhMqZWMe59fi3bixJU27wSJwkI J8U2AtlPcjJvAl2U+kDECsQmF2WOckuifphveCT5HrniT0hkM+W7 X-Proofpoint-GUID: Sds-tBiCN7FFCY2FzxopRCCAgXtUJI3Z X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX7QN9ZVd2jRO6 x/+7TNfEW9Dh034LysHn+Cg6nx7QRzxx5aWbm7OvlWpmemKos/yPxcSkYuMxHRHBgHIMgmhwDk7 IHXT2p2b4ImPm258MwbvJYEfziVereBkPvgjAss7ULG5wsP5qr/uxJI0OGlsD1Lpx3oeM1eakPh BLEH22luh+uvJlywky5PblGMX0d6xXZH8a8MyRUWWGJDj1B4bnnPNHbleY4Oi0EJAceXoqM17oX UA8QNuQWkefr7yy+YXO6OHrDx9sMwMW7Iy4Pch+fMsfVY2cWiKUUxV+Opn4sjgkERJ7r1hKwz7M 6lKZcYrmTXkB+LM2VbgWkoRHxh6h5RpTj9C759g5haj2zWBjm94yf0bntwMjuktKtzOGiu6VwvM qDiKMSlVxoj4JWbADbIBtyVaw0BRq6jxWe4FSGw0dY9c3q+42lYlCqIvTrXF56NAFMdIeCfXerB mMn2uXxBezNzxiH9U+Q== X-Proofpoint-ORIG-GUID: Sds-tBiCN7FFCY2FzxopRCCAgXtUJI3Z 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 | 129 +++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 129 insertions(+) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 802666f7abd4..9c6bebb1857f 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -149,6 +149,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]; @@ -175,6 +181,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]; @@ -246,6 +253,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); @@ -665,6 +678,92 @@ 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; + u64 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) + 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, mclk); + + 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; + + 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, 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) @@ -771,6 +870,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; @@ -891,6 +1000,13 @@ static int ad7768_read_raw(struct iio_dev *indio_dev, *val =3D calib; 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; } @@ -904,6 +1020,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; } @@ -915,6 +1033,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)) @@ -935,6 +1054,15 @@ static int ad7768_write_raw(struct iio_dev *indio_dev, =20 base_reg =3D ad7768_get_calib_reg_base(st, chan, true); return ad7768_write_calib_value(st, base_reg, 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; } @@ -1151,6 +1279,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 Sun Sep 27 05:30:23 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 523404D2EC4; Fri, 4 Sep 2026 14:16:42 +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=1788531405; cv=none; b=p5dvNRkZ1DA9QoOEMDNPff5RqPspqA1tMtflUXF+mWAa8ADxva0/uYqSxvtMmyECmmTNd5/RMYJWQcsx44Hu7cqqf/DKxRVvlM1zEP3dLGNAExatlS/MHlkzZIjRrs6vBir1LN0tNgK9EkjZHmb/Ndwlb2f/7ZYNxADKeHA/Ki4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531405; c=relaxed/simple; bh=SttIyvMI7w2tGaXFII+STMY8iJ7bQTKeDJINWqUI+FU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=bpNFYRDJjERiimOm2utcTpVgdXgSKj2yajwfb8wgbTY/2cRO+4jNjsQ8nCWPbqzDzs7Zh/1XkjGchzbrxo362MV3Bwt86P12M2yIbNTbavpfM5o82o1B4YoxrSrr0m+0XB00wXElf4QP16rPIuSwzWIHz+F5Un9ZKtZfdD00tEM= 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=krUfkQ6p; 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="krUfkQ6p" 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 684Dg53p3553411; Fri, 4 Sep 2026 10:16:22 -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=MocIZ iAaxaluxDCmMIEV0zmhi+Tr376M9cujRrEaxJQ=; b=krUfkQ6pKHtq/zvse0mKm SDxQ/T5kPj0GH4iST0qRStOSQifvft7hoSBMopODDPhKOsvEUqG1B8vkliDodc7z 0wC+o97Bc8hdgRdwy57JM9PIQXguWB0JE3VTbzke05DBdsG03f3CA+s+2QkbNmos GKfMaZM+oATBNlZEEoPP6AkmUnqrLaiVDgt4TSvkOHvwWHr8fRNKMAlE8UvpXScA cOfmd+9POnynDLPRO65lUJgokemdd3oq/FOnttOg1FJcqZkDINPiOm5eg7+dtXiC D9EkY0XLM3fW13NtJpPv7GMEafuApasYxaNWLJAa4/nPHSc/7naQ4xyKXEJlmdaI g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gftu3smqc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:16:22 -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 684EGLe6036387 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:16:21 -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; Fri, 4 Sep 2026 10:16:20 -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; Fri, 4 Sep 2026 10:16:20 -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; Fri, 4 Sep 2026 10:16: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 684EF2dJ026210; Fri, 4 Sep 2026 10:16:12 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:07 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-15-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=6843; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=SttIyvMI7w2tGaXFII+STMY8iJ7bQTKeDJINWqUI+FU=; b=JyD2Ue+JuxHmvBn0mdutbEKR2GTQWqhUJQXvAQB86lWtvR+msghMeByL8KtSEY4Dn7NJ+0NdH lFIZfh1qT7HAeWF+loUKVtNez5skE11eaikrlyyOWRbTmUYyYkyehFl 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=R6wz39RX c=1 sm=1 tr=0 ts=6a9ad2b6 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=-yOam_tWmGQwaYRI1VcA:9 a=QEXdDO2ut3YA:10 a=br55WurUj89AL1qEz8Q6:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX2TRBnDKa2Wwi 7KRzoqPPH6piTNEPnRxskQ5JXXeqWHTc7kM0k8X5Zv1R0JKN7lPTyALH7w9ylj7Y1AG/HXQaFxo ypE3+9r7xQLfPptaUkGmZx3GNg5MzwU/XfyT4cWsn6wnn5F34Wo7 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfXy3HlcZtE0Tbc zD6UTUW+uOz2zcjBLz8VkGCgH4NwCJ/Zzr889KE7QgQ0mp1GR7bB1XLtX77CyuYKYVCgBsQ0ZfW Aka82BTB+d3tiVN+RwEeX58I9SjQu5nBSXiJ9HKPejkIpTZgNeRQgw4IU1nj1zOila8fQp63ccq 1wkeJbtNuRyhy0H7FLHyj1fuVx4hHlVuaIKtVJNqnnrDkBaNJ6W5HwHAfj2MjJIRdZggUpvGN1U BXSXZNdvzfn98gQhsEPdr1y/fKBtqH5MRYY/XtBpl/wHVR95MBXDmtXvA25qzex/a7cZ5XFGWn4 PIt3552i/2DbZbUn228++Wzhn88WeZld9ij6Ldp2KTKvdwRg2eeGDZGOLoKjNyIjuaWuXZfnEZT ZBCJY5P0WmZArscna4FaLcfpyEo34nPZQWDs/8ILCr2WNOSylkNWdZRijgSzrFdsZB2s7jZYSLx nnRWLJ3TTvH7u9y8Ghg== X-Proofpoint-GUID: t21vGNDRGaeYviZeadM08X-A3MJc6sCy X-Proofpoint-ORIG-GUID: t21vGNDRGaeYviZeadM08X-A3MJc6sCy 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 lowpriorityscore=0 malwarescore=0 impostorscore=0 spamscore=0 phishscore=0 suspectscore=0 priorityscore=1501 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 9c6bebb1857f..4acf89bdad12 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 @@ -186,11 +191,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, }; @@ -1502,11 +1653,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); @@ -1636,6 +1789,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 Sun Sep 27 05:30:23 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 A2FA94D90C5; Fri, 4 Sep 2026 14:16: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=1788531410; cv=none; b=MG83birIElPmoI6RvrriMfJZizDjOErS6T+phCJHhOjarG/I4UQHhOwZC7GeyIjzYPvYgVBopwIVecc4yNXeRQphpKyfE7gycF2qXBU+KXPtgYa9mXsZLvF9+6cy77581Hw9UGCsKkAebC1zUTqXI0UgA5wm7EUZmdUszktUaig= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531410; c=relaxed/simple; bh=E9UNKcEjX4DUVKS2p1M8UezZRQMGWnYYqPo8Ji+H19I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=n+csvycUWXqXVhmn/h/pY3rCH22wecv81J1sEqF5ADa1Xa8YFE2lKZiJbXOty46NOMM/aI5fsyTOu0DP7MY9nk2dzBFelp+ibNBhRD4Bhmo+kTVyG7TRE8uZHg2gy8M1O+dYW66WStHMKX9GiCzP8E/RKXhBZbjeUlJYpNGsxTA= 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=xgEwSJVn; 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="xgEwSJVn" 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 684DgXJq332955; Fri, 4 Sep 2026 10:16: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=SYuzW h4efkNPHpCNZxKjW76NbnH09MIS0ZZTYMBrZMw=; b=xgEwSJVnf/WHBi9J0ie6S babTV5dyTxYS2zp1JDYU6AUk9Aba9i/FHaEjXKbcrCT6u88fvhM9RF8eF+d7OnyQ wjY7L1WN0h4Jo3posGfjEs/rn0dO3agGD6Fs6jX30J/6U577IxaV3tqvU7O0ZWik r2ewOePENR0GUwdss+1bm2wwnpdD4+gWMg4rrvik3MUvtpVuQbFTYbJ5TFT1d7z5 gM3eQdi0U5RP4qW8GIy4uYKkkBr+fQjUy6dzxx0N/u2YhQw0L8fJ//g7CKUDDGP+ LN0KFUu7qRGw8dbseGWgQmABpBW8i4UKY5bKPQOdFSKgTSR8ynwBpeR2IOGL262f Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gffkkmff9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:16: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 684EGOLM036406 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:16:24 -0400 Received: from ASHBMBX9.ad.analog.com (10.64.17.10) 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; Fri, 4 Sep 2026 10:16:24 -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; Fri, 4 Sep 2026 10:16:24 -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 684EF2dK026210; Fri, 4 Sep 2026 10:16:16 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:08 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-16-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=2350; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=E9UNKcEjX4DUVKS2p1M8UezZRQMGWnYYqPo8Ji+H19I=; b=W/6uMKLGc1hZgvf7LqjjT7rDQTfZjTiWolHPNv72/eYTH6du6RBDF/GA5vIxhP99alapy83Do ZqbWzW4eF5VCMBfe5T24nWbA7W/YDVnOeo6gCCB4u4p+KLkxL4rhGHH X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: uS_AToryl6Tc1SN7yHeI5S0mwQLc54fD X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX1+yrCDIT0suW wLl5PH53LNFPCYWOwQUo1c1zkpaAN6ybuuxZuGDpATGUce+kXIBw6L0yoICWVmp0sbP0hXIziZK A8qAwhy9JRyjo2Q6uVHafBbb3J9NQ7RoUTEK6PPUaDSFCNzakwGG3r6A6BAAfXOOh++NMPSt6n3 2lB5/PdQZMqtnwxnPmxSDKBAbeYbb8oFNjlHf0WIV2d0wk+9NHFzpL2EsqxT/mlZaoHiF5bC7K3 P2s8HEaSBJKIheA4C+zlw/f8sZaQiVsVuCpJnsQ7g2OTo7LR53uPUmjc6NrdmyrQsjm3oEyr8ts 3czcak6RqZXu+Tr4qPyVC5uDwtdeXspstX8jexfvBa0KMzucsTCP9WkkCCE3ShJgXowXQBTrdi8 D2EcYv+r9OqMo0fl8s4zA1oF7vtGRMTWyuHrDUkZnO9VeEe0o7XqBUrbBb/mTAQsBWLmSp8CLAq oLn9r39+3A0Jg1yYASA== X-Proofpoint-ORIG-GUID: uS_AToryl6Tc1SN7yHeI5S0mwQLc54fD X-Authority-Analysis: v=2.4 cv=F6NnsKhN c=1 sm=1 tr=0 ts=6a9ad2b9 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=uS1bAgcam2TDL027Z10A:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX/SdGLXxqx3lw Ty/ZzYeziHe3cilY/5M17GzsvcgDMXSn+U1/yK1EFs3ao3Ts2RCh5a2qmocQVUfaFIBWZaQS1ly DaTinw6XcdKJqh6tMLxquYH/YJHZ8PFsIbnfvlCqQaD75TbXM4Pv 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 spamscore=0 clxscore=1015 adultscore=0 phishscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 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 --- 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 4acf89bdad12..ecb7e8554d6d 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -6,6 +6,7 @@ */ =20 #include +#include #include #include #include @@ -1245,6 +1246,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) { @@ -1794,6 +1819,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 Sun Sep 27 05:30:23 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 A3F834AF9F2; Fri, 4 Sep 2026 14:16:47 +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=1788531409; cv=none; b=KdhB3dyq5Zl/GEqVa5IbJVqwg/U0Feaeqgv6lNWMp9R+BvKbK4YaA1JqXwKklAupCVl8aFAmmt8rn9KzBen9bTtnLp5r1v/d9ZW/PwBel/WTqjNyvLITqMUi7y3Znb7gJvh2Nwp3BJgarZjz041w4NBw17HaAk6XYV8zrvW5qgk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788531409; c=relaxed/simple; bh=C6kVitUYJGPe5tGfS3y2hr4h73phfW6MRFgei643zKQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=svH58CtWpdD3Rd5ROQNNhIWpWo/4PVH8XoP1SYfXqRLcFMD/st1mhdk/Lp11x0ab598KuGpe2JTOn/iieHuWOhYXUOmTzmLgApUrRhYcY1G34e9qzzGPfL4EmUgyd+48ZWOAHf0jgAUpHRw1v2f8Z1ZLCNJBsTW0C54YCdmTKJU= 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=qnoAV/uQ; 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="qnoAV/uQ" 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 684Dgbq0332992; Fri, 4 Sep 2026 10:16: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=hMlHd fP911EjZ+zw3LGCw3e93G3IlmCtQHurZ5y4dMQ=; b=qnoAV/uQ0fnWpeSkqfbbf HlzFk5MmQkS+gs24HhHj7bUIg6ZbAy4qUQ2q4cyegeLpsGDKRtetKCTWVieHbsu8 CNQM93SbmL0SYK7DYUlzWSCVMtofdIwh61gZITuIoa6zmDIExC7imf6zIv97HYHP mu9ySUwZW9L/Z2OSIvLq/t8zqccwTaYZcasymwhommK/iL2PmATrCfuo6aRUVcry ALowVtuAMII8sPaixs/S2xNC7197HPIhzHes2ta93/1kvNcSJGuINbGBhBf6fJKP s2HnYXQb02Fe11qYkSCRGYWKmd5e1iblNUIzvOWHA4nOeso9uc8td2iEA6kbj7PO g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gffkkmffk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Sep 2026 10:16: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 684EGR8I036424 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 4 Sep 2026 10:16: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; Fri, 4 Sep 2026 10:16: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; Fri, 4 Sep 2026 10:16: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; Fri, 4 Sep 2026 10:16: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 684EF2dL026210; Fri, 4 Sep 2026 10:16:19 -0400 From: Janani Sunil Date: Fri, 4 Sep 2026 16:15:09 +0200 Subject: [PATCH v6 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: <20260904-ad7768-driver-v6-17-e4378f946bfb@analog.com> References: <20260904-ad7768-driver-v6-0-e4378f946bfb@analog.com> In-Reply-To: <20260904-ad7768-driver-v6-0-e4378f946bfb@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=1788531302; l=10704; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=C6kVitUYJGPe5tGfS3y2hr4h73phfW6MRFgei643zKQ=; b=VwK/rymDrvyMrOGzT3UEOYqOmxpCFGO3j8NF7tBLU9BbhIYL88Fb6OydAFvz040GRONkg7mEt Alci0vVpx1IC7nTYhGuYRyH7+LX3Uhg84hWzocP88SY0gDqVhc1PPCT X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: 5P6IFDxgTfDp_NV4oOQwN2WdnDSCqhz5 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX41CbdECZJLn7 sglZjKSUHBXE4khQ6gnvO2zlNDUmsLf4dtDs00JR8Mp3S9xbASMzbPeGWOkHaRBjs/BB91RNnHN GDh238QyeKQTppkowuXT5LNgB618cCNrWy86HPzC7IqfFAYfVWbrooiBnszkLFQwv+zbEtFDv5v CIpbJBh3A1Gm+N3c+pdhJrC61+F7ZSOfwhsKKWpNx8IhdFo2O26T9+RKGh3k0CAUC19AnhpcpOA aXbE58zBvmdIoyRdm1RWQJbFiYLLiXJgcZ8qwGi81wuQgmEgsiyfKqp/iwQTeYbkIcD0eFxPSex Te7Ij2GwWKw0hWjxcUsYnOmKSjOj1RA8Hrs3Q71clD3ktI8L9hdKZba7vekMgJtb/EWn2VyEHcA lw77APVCDlGVwT7e7dgNHZLx+k6+edacNfovXMITiKCz/fwsfyp5behnKKfGhTUBKBwuKrbOHZZ yZXROPQ4+R5dVa1vXRA== X-Proofpoint-ORIG-GUID: 5P6IFDxgTfDp_NV4oOQwN2WdnDSCqhz5 X-Authority-Analysis: v=2.4 cv=F6NnsKhN c=1 sm=1 tr=0 ts=6a9ad2bc 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=-vtaFOnmicWHHgfH-jcA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA0MDEzMCBTYWx0ZWRfX1x42NKSyY8aS M5QoEDycy85qpzzb8KiJjroVD9v1QnHJ0Zd6XoNjJdvApWazcImtHRSfmyjZYbSpeHbgNleRAhP 2GpGvxglSmd6gVuas53elvJk4ftZZYE4qC/IlLnHqtgGx260rIsW 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-04_04,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 spamscore=0 clxscore=1011 adultscore=0 phishscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609040130 Add driver documentation for AD7768. Signed-off-by: Janani Sunil --- Documentation/iio/ad7768.rst | 273 +++++++++++++++++++++++++++++++++++++++= ++++ Documentation/iio/index.rst | 1 + MAINTAINERS | 1 + 3 files changed, 275 insertions(+) diff --git a/Documentation/iio/ad7768.rst b/Documentation/iio/ad7768.rst new file mode 100644 index 000000000000..49aeff27b00a --- /dev/null +++ b/Documentation/iio/ad7768.rst @@ -0,0 +1,273 @@ +.. 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. + +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`` + - Raw unsigned 24-bit 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