From nobody Sat Sep 26 22:55:39 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 EBD22326939; Fri, 28 Aug 2026 15:31: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=1787931071; cv=none; b=mrnaDl+1Qb76bbNUMkR879gTYkxrkssgN+8/FxV4FSXiC3d6qF58YhontI+Vq1N7ZE0c2XOBYZqfPI+q0fgd9zAE6fSr5s9mqBPu+bKRuj32pQlk7foaHWroHv7E+reuqSnfS9cj6/TXcsK1cLSImMIqXn7B8fEx3tQcIs91ZZk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931071; c=relaxed/simple; bh=ve7OXVMFVFw2xFHjlWoene6tb7Ty6JXZOSYOaiwxrLM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=tw0f2zt4SSCHmbYaY5Q/NUYe7SeB3Fbcw1Fs4ZwOACM/ls+kzIfRV65BFXCbassgjBi7K2xkxJ0zzw8FlDK92FZMeUfi1+g3zOWidDP/VxKRrgg2RVErw1m3SX++39i3t5++157L2dw332GxQwaY7IKtKU6NnT95aSoQZ22E0HA= 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=RjO/C7Fy; 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="RjO/C7Fy" 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 67SDVgvR1142294; Fri, 28 Aug 2026 11:30: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=NDlT5 gWP/1+ftO/1MnwMDib5N9jKL2+bqbtj1iGL1Fk=; b=RjO/C7Fyk9GNWiF3VolYF HU+sWvZbE4aqPvcPOziun5prEXduig09bOh/BWFVFCaJ8d/A4ngnOawLp+nOZD4p qP8cuoEDsMS+VXYZFS3jODGFjKGUZZAzzA7msXQZscEt6XMlKKPtghIMVTBHRG85 E0pJBcxm/20PnmwDhpaGMRGooLV12lQ1QNzPdbzD6nHsa2708Oqy+hjnErrkcGcp IZdJVVhG5uD45HZDi+Tb5qOzDlGEygFlf4sSs25YaqxQ+qvaC1XOTGIOcOiuI6dY grgXJcqCDTVaEZvLkBe3dc4yhJxHkhBpGcTZOIpMAmsh5M4Xw/yo5JsKgQoG0ZGI g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gaj3cqj4b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:30:58 -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 67SFUv9o012855 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:30:57 -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, 28 Aug 2026 11:30:57 -0400 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBCASHYB4.ad.analog.com (10.64.17.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Fri, 28 Aug 2026 11:30:56 -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, 28 Aug 2026 11:30:56 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3g031424; Fri, 28 Aug 2026 11:30:51 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:24 +0200 Subject: [PATCH v5 01/20] 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: <20260828-ad7768-driver-v5-1-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=1021; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=ve7OXVMFVFw2xFHjlWoene6tb7Ty6JXZOSYOaiwxrLM=; b=7s4G5ZsT3SdTk5ffaMyzvjH6tEmYXyhp0XumQ4VY5T1RoBviowI+KzXS3Nam+3maJ5l10I82g qTNiMK41uYhBeGOwSHtjL1CEo2cNYrZYBWUE4AhRtQ9xmlyHubGcF1F X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: yP0h9tgD11Qx_XxciJiVLDOiwodT6ih0 X-Authority-Analysis: v=2.4 cv=erHvCIpX c=1 sm=1 tr=0 ts=6a91a9b2 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2:22 a=gAnH3GRIAAAA:8 a=_ljTvifiVFBlT2kRk7cA:9 a=QEXdDO2ut3YA:10 a=zZCYzV9kfG8A:10 X-Proofpoint-ORIG-GUID: yP0h9tgD11Qx_XxciJiVLDOiwodT6ih0 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX9PmqXWoxJ/Eo Y49/FKnGLKOt+vsa3DqVDy5uOebUuDOr60k69uB1CbsG7JHoeUH1OjC97BAeUizSHNfuyz3vTEJ YC9a0pETB27S4j1X9hcjmRVnyMXp8zz784BkzhsuDKN9JuWmKfPhWfIKTOgjxQurQfu4ofZAdb8 5j0/flSY//ZNowk8apgFAAgGC5XS0+h9xiueFfKOIK7Hqss0qLrw6AT/sjT7eMVyeJkI365SEdP BT8tQple77v3E4wMKNvrCKneVG82HLQrRxXkSiFmRJR+9Maz/87Eo0gJjxIjxmG7TqHtjibjoGu a2iW7n15fYRaS8E2bCesJ78banTX15DhkFPR5aJfk13u9lXwXwBNeiF7d07gm7ybdUjc1eoeRn6 nWuAAcfqvRGE470yGGaKMYZD1qsqUJ0jXyPhyOGRIL4k4rUGIQatEExjGZOZ+3V/5WJ3XF/ikjF ck4SmCcBg6j7x+VsCPw== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX/vjYhUc5wheX wN7M34h3DfIlX3DGj0XEq3ScS/1E/DOt1wFhP1++9pN15DUoZ5L15GFrKcaQouS54/t821txIZF QdPbWYuUAZTYdd4NQkhzykBwqPFA4Uuq85EeSrxJJGLRlVrfA9ad 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 spamscore=0 suspectscore=0 malwarescore=0 adultscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 26b9c75bd4d8..b5e59b1871b6 100644 --- a/drivers/iio/adc/adi-axi-adc.c +++ b/drivers/iio/adc/adi-axi-adc.c @@ -684,6 +684,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 Sat Sep 26 22:55:39 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 025C03624DB; Fri, 28 Aug 2026 15:31:11 +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=1787931073; cv=none; b=b/hiPQtstiDPSXkMYuK0J9xbujIz0SLwTsHXp+dpP/2ifEWlWAL1j3o5WMTIXtxK3VcEeeoaSDVI8FfLYk9u6Krg9JhSe+ZlISK1UggdBLQN4ksuGkwY2HaV2LwNolsaWq1WrBtOXlrrBR9d5rSR7f3cxbPdv0YRuBz43sxgL4s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931073; c=relaxed/simple; bh=IYxqWqcIKBD/4/W2zWMkvdA/5Lw57wyr4J7+mxhr5aA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=D/khpOseW8U+jslAUF+5ifNCCj9LSP9njS5LJhZzlffRID5CQ3+Kt5/lKiAbe/CrWXtyRm2cXOaS9dAcBNkkhqfdtIgKZVZ10/dF7sQ3G1Gc2vldOqC310bvX9UnXhNpewi/uj9Id+r2fMTiHEwX76ojmMScNasUp5j93DauTNk= 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=S/90ueva; 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="S/90ueva" 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 67SDVeiO1142216; Fri, 28 Aug 2026 11:31:02 -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=EnxYG +XsohKyk238KA4Fjcn6QhIu6UmOnt91Az2XIXA=; b=S/90uevaTdCiblV3uy0/o bboTW9NgyIVakxadyqq072u17fHhoS1Uzq/MYyBBWs6XQvwohrw+PNEr+weTteYJ 9tX6axszY5q01X8SHribA3v4KaKXspxWhqZcvmVAaSkdhYYIlXB8D5HaClsaFgcV ZjdvFJIOXAI4sbX3Hzy04pmS+8iQa3d4d2FSxYbUYLZ5EDOPiluTHpbMS9I2r0Gi GFxy2y0cxBdkxY1JT3VZ02K59O7P3Tk5bEx5oCDXaqXZXSQcHL7/uiZGU9dpPs1r Uze9lqwppsipOTzIq3IkkDvbXCjyYJvuFPRXVsN0A7hdgH4TE7lLvXLcouBodjjD Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gaj3cqj4q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:02 -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 67SFV1EQ012890 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:01 -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, 28 Aug 2026 11:31:00 -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, 28 Aug 2026 11:31:00 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3h031424; Fri, 28 Aug 2026 11:30:54 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:25 +0200 Subject: [PATCH v5 02/20] 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: <20260828-ad7768-driver-v5-2-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=9115; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=IYxqWqcIKBD/4/W2zWMkvdA/5Lw57wyr4J7+mxhr5aA=; b=MRVZ3hMG5VMyKB9Oq8tOvFoYuLlFumiN15IKVKcpm/R9bLDY34HcFx2lsqxGBDbHFnOWD0mYF BGqpUTNNJyVCjSyhNoNDMhDSKxpv5pC+Beoq+dn0bydEDKivlOHnaAt X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: J908MJYqlY1YOHHO9y1sde-iq3tZk31J X-Authority-Analysis: v=2.4 cv=erHvCIpX c=1 sm=1 tr=0 ts=6a91a9b6 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2: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-ORIG-GUID: J908MJYqlY1YOHHO9y1sde-iq3tZk31J X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX5NNFjGLYmvqN V2BqAZdNziqKpPAO4z9GGadu24pJE5REe4T16WjIESNVo7gbyZ/pTo62gtR/fK/nQsO5gw4lf0R BBdZKD0Bh93p/Zhl/nQPFrgnMAGpR/ODVO+KvWrIK1uqN6Tju0utfmaZKYuWnmmFX3Cot+jmFy2 2ZE0vwSDISPo2Zm0yA29X5kBaV4Vy0fE2iXaer9zbMDDOOEvJzmEZ4NOUX6LMY1X6l8S/YSg+jT Ow+9XgtYf43q92/3Hj0GEDmyhxmmkkz3hfIWJagUrqDdH+8t61HTbGExKEHB+0PUWhSZMoZTsSc jLU1/880W3b3frbPpZ04ptzjErNaTEB1P/vVaKRKtRikTaRu9aBrVN6MbyY382Ufi7yqlwc8jbP 55xezFDAlKqRznC9nhHn7nkjbADvusW9GoMQRARNce+Sked284GuWMCbT7mJxS3fnqwz4BUoiwJ h8BVeO7jgFVTWgXc/HQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX5uXw4/UFZ2gR PDZYl6YD+mo8JTdc1lj7UgEFxlPgEIwmjeLgf7TsZV4NYZ9j/oqOyyreJibxlB35nJcK4NeZ/Ij 6MysPiUX0c+MhQe3YMh85dbFF+ejxuUchIOem4mw/THl9g/BHDJj 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 spamscore=0 suspectscore=0 malwarescore=0 adultscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 Devicetree Bindings for AD7768-4 (4 channel) and AD7768 (8 channel) simultaneous sampling ADCs. Signed-off-by: Janani Sunil --- .../devicetree/bindings/iio/adc/adi,ad7768.yaml | 270 +++++++++++++++++= ++++ MAINTAINERS | 7 + 2 files changed, 277 insertions(+) diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7768.yaml b/Do= cumentation/devicetree/bindings/iio/adc/adi,ad7768.yaml new file mode 100644 index 000000000000..d8e489fa1f6f --- /dev/null +++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7768.yaml @@ -0,0 +1,270 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/adc/adi,ad7768.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Analog Devices AD7768 and AD7768-4 ADC + +maintainers: + - Janani Sunil + +description: | + The AD7768 is an 8-channel, 24-bit simultaneous sampling ADC with config= urable + power and performance modes. The AD7768-4 is a 4-channel version. + + This binding covers SPI mode only (register access via SPI). Pin control= mode, + where configuration is set via hardware pins rather than SPI registers, = is not + supported. + + The io-backend represents the high-speed data output interface, consumin= g the + DOUTx data lines, DCLK (data clock), and DRDY (data ready) signals. + + Datasheet at: + https://www.analog.com/media/en/technical-documentation/data-sheets/ad= 7768-ad7768-4.pdf + + HDL reference design: + https://github.com/analogdevicesinc/hdl/tree/main/projects/ad7768evb + +properties: + compatible: + enum: + - adi,ad7768 + - adi,ad7768-4 + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + clock-names: + description: + Describes the type of master clock (MCLK) attached to the XTAL1 and + XTAL2/MCLK pins. A CMOS clock is supplied on the XTAL2/MCLK pin, a + crystal oscillator is connected between the XTAL1 and XTAL2 pins, an= d an + LVDS differential clock is supplied on the XTAL1/XTAL2 pin pair. CMO= S and + LVDS clocks must operate from 1.15 MHz to 34 MHz. Crystals must oper= ate + from 8 MHz to 34 MHz. + enum: + - mclk + - xtal + - lvds + + avdd1-supply: + description: + Analog supply. Its voltage is used to derive the supply-dependent VCM + output level, so it must be a regulator that can report its voltage. + + avss-supply: + description: + Negative analog supply. If omitted, AVSS is assumed to be at system + ground. + + avdd2-supply: true + + iovdd-supply: true + + ref1p-supply: true + + ref1n-supply: + description: + Negative reference input supply for REF1. If omitted, REF1- is assum= ed + to be connected to ground. + + ref2p-supply: true + + ref2n-supply: + description: + Negative reference input supply for REF2. If omitted, REF2- is assum= ed + to be connected to ground. + + reset-gpios: + maxItems: 1 + description: GPIO connected to the active-low RESET pin + + start-gpios: + maxItems: 1 + description: + GPIO connected to the START pin. An active-low pulse on this pin + synchronizes the device to other AD7768 devices. When not used, this + pin must be tied to a logic high level through a pull-up resistor. + When used, SYNC_OUT must be wired back to SYNC_IN on all devices in + the synchronization chain. + + sync-in-gpios: + maxItems: 1 + description: + GPIO connected to the SYNC_IN pin. Receives the synchronization pulse + generated on SYNC_OUT in response to a START pulse. Must be synchron= ous + to the MCLK clock domain. In multi-device or daisy-chained systems, + two successive synchronization pulses must be applied to guarantee a= ll + ADCs are synchronized. + + gpio-controller: true + + '#gpio-cells': + const: 2 + + adi,data-lines-number: + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [1, 2, 4, 8] + description: + Number of DOUTx lines used for the high-speed data output interface + (distinct from the SPI control interface). AD7768 supports 1, 2, or 8 + lines; AD7768-4 supports 1 or 4 lines. Defaults to the maximum number + of lines for the selected variant if omitted. + + regulators: + type: object + description: Container for the on-chip VCM regulator. + additionalProperties: false + + properties: + vcm-output: + type: object + description: + Buffered common-mode voltage output on the VCM pin. Use + regulator-always-on when no consumer node references this output. + Channel 0 must be present and enabled while VCM is used, since + putting channel 0 in standby disables the VCM output. + $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false + + io-backends: + maxItems: 1 + + '#address-cells': + const: 1 + + '#size-cells': + const: 0 + +patternProperties: + "^channel@[0-7]$": + type: object + description: + Represents the external channels which are connected to the device. + AD7768 supports channels 0-7, AD7768-4 supports channels 0-3. + + properties: + reg: + minimum: 0 + maximum: 7 + description: The channel number + + adi,prechargebuf-pos-enable: + type: boolean + description: Enable positive input precharge buffer + + adi,prechargebuf-neg-enable: + type: boolean + description: Enable negative input precharge buffer + + adi,refbuf-pos-enable: + type: boolean + description: Enable positive reference buffer + + adi,refbuf-neg-enable: + type: boolean + description: Enable negative reference buffer + + required: + - reg + + additionalProperties: false + +required: + - compatible + - reg + - clocks + - clock-names + - avdd1-supply + - avdd2-supply + - iovdd-supply + - ref1p-supply + - ref2p-supply + - io-backends + +allOf: + - $ref: /schemas/spi/spi-peripheral-props.yaml# + - if: + properties: + compatible: + contains: + const: adi,ad7768-4 + then: + properties: + adi,data-lines-number: + enum: [1, 4] + patternProperties: + "^channel@[0-3]$": + properties: + reg: + maximum: 3 + "^channel@[4-7]$": false + else: + properties: + adi,data-lines-number: + enum: [1, 2, 8] + +unevaluatedProperties: false + +examples: + - | + #include + + spi { + #address-cells =3D <1>; + #size-cells =3D <0>; + + adc@0 { + compatible =3D "adi,ad7768"; + reg =3D <0>; + spi-max-frequency =3D <1000000>; + + avdd1-supply =3D <&avdd1_regulator>; + avss-supply =3D <&avss_regulator>; + avdd2-supply =3D <&avdd2_regulator>; + iovdd-supply =3D <&iovdd_regulator>; + ref1p-supply =3D <&ref1p_regulator>; + ref1n-supply =3D <&ref1n_regulator>; + ref2p-supply =3D <&ref2p_regulator>; + ref2n-supply =3D <&ref2n_regulator>; + reset-gpios =3D <&gpio0 86 GPIO_ACTIVE_LOW>; + + clocks =3D <&ad7768_mclk>; + clock-names =3D "mclk"; + + adi,data-lines-number =3D <8>; + gpio-controller; + #gpio-cells =3D <2>; + + io-backends =3D <&iio_backend>; + + #address-cells =3D <1>; + #size-cells =3D <0>; + + channel@0 { + reg =3D <0>; + adi,prechargebuf-pos-enable; + adi,refbuf-pos-enable; + }; + + channel@1 { + reg =3D <1>; + adi,prechargebuf-pos-enable; + adi,prechargebuf-neg-enable; + adi,refbuf-pos-enable; + adi,refbuf-neg-enable; + }; + + channel@7 { + reg =3D <7>; + adi,prechargebuf-pos-enable; + adi,refbuf-pos-enable; + }; + }; + }; + +... diff --git a/MAINTAINERS b/MAINTAINERS index 2b1ec46c5919..d667a0411f28 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1633,6 +1633,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 Sat Sep 26 22:55:39 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 E98CF360EE2; Fri, 28 Aug 2026 15:31:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931076; cv=none; b=SLmZACj/N2OIj2Dt9qtaEQ1JJAMx7wuJ5EocPEcf2pzWyLD/p16C0cdxF6+BMEanqvnvLrdCAwkaUIqDOawpXymdMOjvgaYpWToVZ4CW7KnhZa+R7S9WblIhcWtJzKJFVw7XvMcm5Vri9vJdUj6eozkimQ8ttJXJv2HudXkUsac= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931076; c=relaxed/simple; bh=h8rpUQCVfSyFWZ0W5MDo7rp1yKN/O8pCD8GN49kfEBA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=fIp/r8wuq02bO2Tkon8khErKk4hYQ5lDproMJavfJSb8LQS1TEL+GQjc5gkf7ZpU8PXLp0FhRUEMR84hOJPd/QtghkY15+pk42jCAFaf6NJNeVjqdgcjYf+Mh4wq15xK8NZypBk7EQ1FScWUEV//dMMHDihP0jEhfoLF0nInWt8= 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=OpzYzV7J; 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="OpzYzV7J" 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 67SDWNfI2013122; Fri, 28 Aug 2026 11:31: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=HaZi5 4XuvSGwwXAOvLRMGXBSqS/rduiS4tFlnN5D9gU=; b=OpzYzV7JI70prRLS84Ufv R+pA1y8Jo+ZrFYTkir6q9geZLhK6sUjl4UhLX3RuaRI4LrtPhxxA7AAPahouzEvU ROkyMUXiHIfzq5EPpW3RUxn8GnncZemNy5JbRtYz/r6hinUywomPNgVAAcIGHEbH FKiKrruy2pSq+e4w2OkLT8Dzgb/gORzuDBw1Ef8Q/GYVxqBc19SHDrP8j9dmYdVr cj0uCPOgI2ZWdyj1l8zpzd0qoFIOtDmlS06iYRrTveQfzAxOS+XIrYwiqrfla4JA PKZLAt+S6pqsh2R35caf7Vp2vcZQizboRaYhdCsU1fSWH3tdOE+/PfRz5FkA4UaR g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4ga1m14ew2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:05 -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 67SFV4Fa012954 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:04 -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, 28 Aug 2026 11:31:04 -0400 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBCASHYB4.ad.analog.com (10.64.17.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Fri, 28 Aug 2026 11:31:04 -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, 28 Aug 2026 11:31:03 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3i031424; Fri, 28 Aug 2026 11:30:58 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:26 +0200 Subject: [PATCH v5 03/20] 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: <20260828-ad7768-driver-v5-3-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=3821; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=h8rpUQCVfSyFWZ0W5MDo7rp1yKN/O8pCD8GN49kfEBA=; b=gWghRxv+Z6Ds8pghK1OVovh4aeqPAK79YgqUDjvj4/+nuBWv8GrH/CYy0Cs264hLwHW2FmpXU AQ8LF6WcSbmCfjHLhmHoXIxPICBWXxQmaJCRrPaFD5nijiBiiYzqd9j X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: YH-bJM_o2RX1tOU6RwNpPkoxtGmwaiM5 X-Authority-Analysis: v=2.4 cv=NtLhtcdJ c=1 sm=1 tr=0 ts=6a91a9b9 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=IpJZQVW2AAAA:8 a=gAnH3GRIAAAA:8 a=O6R5dNVUA00TSld12QQA:9 a=QEXdDO2ut3YA:10 a=IawgGOuG5U0WyFbmm1f5:22 X-Proofpoint-ORIG-GUID: YH-bJM_o2RX1tOU6RwNpPkoxtGmwaiM5 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX5CWYUyK1kdPU qd7gIr6KaG2ooXZAN0wQ/8KGrOaNX/LsGfTRK5TSvFqgGHOP6A/tPBHy/FAR7JdqLgFvwLXPVpT rHEOuiGZ6O7httbaNAjn+qfB+DfMxOSQYR7FCZNUPt/AdK053hhI8EZUslV3x/sYE4e3n2qF4NK FqSfWsDd2LMc1NB9fL3s5wijw5T0xw6mGH29X9SY8wY4royHqVjkOrmyA1R8VtyuBFcsNfcC04B QRFD60FYBXLFJ6970NHMrNfWAkvbxZkjgTDRQHXqkMNI0syDz4S88Ay4P12yk5DyLkVB5CI2hJ1 LpSAYlJcGZn3u4hldrCH555QUXDgoBskXRkwuAwJexmIM8USbeQyYXM25Vq/hbN4UzZsAWccbXW RfiMIxiFVWtiNQwiJH9wDBj0IgGTnOP4jGo6YC3f92NiO+4/EouH/OUGDxISBUK09vkIVDLWtGh FE4rJs1vzD2xWO6MrTA== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXwy0wGvNACmNM 1Xo3SX9lmINrvyWbS7BjMfpFYa2egSNoKHzMGCmkymh2b2TICKKWSTCf6TZmg+Z042/pacEyVBc gOJey/L71gXkR3zCxmI9obm4yW82euLoIpyE1TQkQX1Zvj+UWt1z 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 bulkscore=0 priorityscore=1501 phishscore=0 impostorscore=0 adultscore=0 suspectscore=0 clxscore=1015 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 Sat Sep 26 22:55:39 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 E20293655D1; Fri, 28 Aug 2026 15:31:19 +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=1787931081; cv=none; b=KnWwKrRjMV3ECE4q+UGQahmTO4Hckgf6B6muFTGNTy6Aip8bb5oVv8w40wAFpr2oVlNkj8OD1XY9jn9zJ6K74sDYHGd1YhpI0iijvCFwOFRiINlymWNU7c6USUBhf531kfIIIIoDY7L/5rhc0xDmeZP5bLYXjfQNqmdUbCntB/A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931081; c=relaxed/simple; bh=UwP+dmRFvcH7A5rH99QtWcNaXeLF8l4I/UN2JTuonu4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=TENtIuSbA0ER4mPlWnikFx3tJG9r81c7fjOY9Oj1v+lJHCRFdx0vqxRi98ZPNA+oE1bPxI41IN7lnSIj+3kJ1WocS6t2Xa9ODzg19qynoQ9mHVmYLXpHnjHaK67w2iQ/79WKhzXjGBA/2cxq/V6AhK6qgqgZZBGuqMj/uDbtFx0= 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=yJyUzGwl; 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="yJyUzGwl" 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 67SDWT281593725; Fri, 28 Aug 2026 11:31:10 -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=VALWG 5kao0/CcRlNfBD3HmtSJumaY1d7RGNLx6GvpUU=; b=yJyUzGwlkdkUN0Rm6XH6e vMZ5fXB+ZJ9qYYndYdkXx/dwsVv/uDTMnbuKOqIwZAW3Nb6zkDLch0LPK4uSePP6 XRWVTizZU+nIPSWF/8B5xo30YDbnonchcQq2qQpFlijyGySVH3SI7A831FsDwnjQ ihWitftyQaZcvNqW7YdjfWEfdxz6QpQ9N1ChiQ7nF8QAAYuREFPyyfKtYi1mWcLp F7OY3ZNmBnL20itYcX2k4GDkvQY49yc/A30+1iKIqoEGgTONdDg4w6Ox/mV9YZle hwp7DH5CFOWxlqYvHLXCh/fDw3+zeEfEUCMuNKZj/aCac/XFFD6r8jg3e0zwOHu4 A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gbaebgvc7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:09 -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 67SFV7Y2012978 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:08 -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, 28 Aug 2026 11:31:07 -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, 28 Aug 2026 11:31:07 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3j031424; Fri, 28 Aug 2026 11:31:01 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:27 +0200 Subject: [PATCH v5 04/20] 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: <20260828-ad7768-driver-v5-4-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=2263; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=UwP+dmRFvcH7A5rH99QtWcNaXeLF8l4I/UN2JTuonu4=; b=n2tHuNRi0eQ+u2B7qLUT/luxby4ZKQ8gOGygW4ySWd+F/g2KHB/e+GD9qBZpLQEd/9rOfVSut SK8AsG6KcwvAPXlQ+WiWTi4V4LuZvhfgPxGv1YWsnC0t4Ttauf9b88S X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX+PRCpmIwt5Uz Ea8QavTx32C6oY8p3hUdEgxUDM+O8Xc37iAYKgKNo/KX9NFU7wtOBrQRsDTXIiutOw0j7SX+paT y5Fzz+FSqFkHTYxfkjp0fhSOIEJzRPIrzcN5KnR6/qd2kDEKGsYq X-Proofpoint-ORIG-GUID: vYszla2ijZ31eJ8zxLulVLRfFrwkwFtI X-Proofpoint-GUID: vYszla2ijZ31eJ8zxLulVLRfFrwkwFtI X-Authority-Analysis: v=2.4 cv=WMtPmHsR c=1 sm=1 tr=0 ts=6a91a9be cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=IpJZQVW2AAAA:8 a=gAnH3GRIAAAA:8 a=xcMXqGzQfnDy9uQaBxsA:9 a=QEXdDO2ut3YA:10 a=IawgGOuG5U0WyFbmm1f5:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXxbH3QYRAsgBx 8Gy2KQR8eV6Fi44DeHmYJ45rw9Uakea5FpvJCHkJA8gHx24uOmqLUFHuFvnYH8AyF2AbQMbE6qd 59TKjIG32ZZBWUD2WPXgKQJPGhJGqDCgxc1g70TTqycy3VtDoQp9RphNZx7QiG1KyeC7HQO0AX6 0by0yzAj8AGorPgbawGaGLiz8GZ2RJMjNw4xTmjJNiiKmLjiNX8G4EWL3Pj98kw6IN+4xrvQY8J jJEK7HzmbYbZyxGAjK1u2+dZMgniJRjGDB5HAre/4HRMBMyZPFT3scqB2efRHUPa6xsDiWlnQcA 8I4QywLGAtgwmJK1QZo13wSdN/h6p+cc9Q17TCzhYmvd82VrxBncababCuQHUAOkeVI91/gOFiE q7hOW+DQC2UfN7YSXxKRPmKI0ZarOan0oiR8ulYqBQoEBbiE0wl26PKU590fswumG2O89H5Km0J UJXHgmMt3aOWsiXnxvw== 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 malwarescore=0 clxscore=1015 adultscore=0 phishscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 b5e59b1871b6..e8f149e230e7 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 @@ -567,6 +570,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, @@ -615,6 +634,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 Sat Sep 26 22:55:39 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 56153326939; Fri, 28 Aug 2026 15:31: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=1787931087; cv=none; b=TWZELV8fT7eIzS+CiqmIHApms0BmBn2sKZ6YqCuCP25Tssw5gHphqGbMSmCbKiDmciAu/gnEJ9pvuFMFP0Q6WzAuEzrsEckxh3jSU2Eshg+XPGtohdkq8phF0+XfxsdXlwwDdwZlDXdRvj41laQZkXZ2U9tE3G6QHkNxe0OGjio= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931087; c=relaxed/simple; bh=mZNshZ2DF3Cq/clesktt8V0NLsjiEp7ta73E0bmPx4k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=qSp7cgck6mZwvlZ0Vn2Adz5wQLygy5zT0Q6GoQqt1GIedYbf/AjOzl0/7Msw1puMOrPSayUFaQmT2C7zZYOD+qEXxZsRK3+c9eQe7fTY/8eLnSfWM7BZnkbtpIJMHkiQTF1p8BRla0eCSQRRd1Fr6svi/2+0Uf+oJaJkDeYUzCo= 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=fj2uCTNz; 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="fj2uCTNz" 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 67SDWBtN2263104; Fri, 28 Aug 2026 11:31:14 -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=843iR cQVnnOZ1HzUXooDp2n0f3xcdvcd0+SdtNLP/MI=; b=fj2uCTNzq0e+sjvg7TGiD n65x4iSz6wZIhOUrZpvHaFE93ftOhgkkrLDDhOAsVXmcXpLp5eGdIYSPMenBRDz4 ghFLHGLJA2xbCy75sruR8QOgRQsaklaLkJ38k37L+cn+GQqdbwu+Wjfqu0AxlS5B gtLmG0HAyMIPFoXz5Oh5TmOX1diizxU2Vvx/NpVH/+Cg7ddt7f98PUnELNJyz5v4 ntUov1cDMfN0t4SwHOZ15XzOIJCGnH9XV3Q5+4I9SHJjavQIY9M8sNFOcWU4sqdS AgUWqwApElCC39n7qWbxI/hgZ6cu5ebCogyafKRIdY9idenfKkhqxIBNwTCdX5OA g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gajxhyd41-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31: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 67SFVCwX012997 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:12 -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, 28 Aug 2026 11:31:11 -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, 28 Aug 2026 11:31:11 -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, 28 Aug 2026 11:31:11 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3k031424; Fri, 28 Aug 2026 11:31:05 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:28 +0200 Subject: [PATCH v5 05/20] 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: <20260828-ad7768-driver-v5-5-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=30375; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=mZNshZ2DF3Cq/clesktt8V0NLsjiEp7ta73E0bmPx4k=; b=UWC5DsbzgRjxaWgFoH03kvbidvIm75nn9zmCt9weBDhXv/izR9iJ2kFpvvza07KTdMnr9liXj G7um9JEgQ82A6w8zMy3+IGMGsz7eBhr1GSOT8Op1Y/RDVMt5Csdmt/H X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXwbZiKbKzdhsh XyAP0dtWu9+OejVzAeuSRHqeR0v8ATfCTtZmTuwLs7evixpyv+G29c5juYu0d1uUBw5W/SVEiWe pnMfXd7IAyQTLMz1LzrBPKWXf5SruYw7SvDbV3lw2hhlaule4wmM X-Proofpoint-ORIG-GUID: jtx71MvLs1XTKVgBkWull2nWEZ0vFvZQ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXxN+tVO78R2w2 qu89QMdXnIiISnVXQOyefF4WgzfsHNKZgLqf8C+yLhDyHbGd2x13zadDRil+2HATeiQirE+mmvU tSGd4MM4+HZELGiVrxZfs19iDXSya/uWfCfR9Vyht3Az32VqLT1x82uP5Plnw5uBjAAOzJPYI2b X+OGfeb1OW9ZVpOyBuGTgyB01bRf1Pj7hPIwvBYDVgHJDyy6jYA1dhvYrq0iYUuZK+4wvrMBOy0 yW1XXdsnlNS5I9GE8KxUKYDtXRI/6N9PdyqZ3Cc+ALKuTi/QzpM65ksX4AUsnFxpmDs00TeAGyH G8le/v09vhlBoBmZolM2UWI4ZP51i90E5id2SaUbi09IKn2WtGYeZqh1j/5ugA8aEFWGkbiGJwS w8NUwX0PpHpo+7I+D9QL0GweM3gPAv9NfaEiuCOUog7v3EGq/MB7dw6UaJwCtetLPpSMjw585y4 QvY4MbfuKuY46D8PZLg== X-Proofpoint-GUID: jtx71MvLs1XTKVgBkWull2nWEZ0vFvZQ X-Authority-Analysis: v=2.4 cv=Oqt/DS/t c=1 sm=1 tr=0 ts=6a91a9c2 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=uXIjobp8t2wMuQ0fPvqm:22 a=gAnH3GRIAAAA:8 a=VwQbUJbxAAAA:8 a=-XxakrEtRxtUKgC0F-AA:9 a=QEXdDO2ut3YA:10 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 impostorscore=0 phishscore=0 malwarescore=0 adultscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 | 974 +++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 990 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index d667a0411f28..dc94e7803a7c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1639,6 +1639,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 d1b198cb8a80..48bb108382b5 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -429,6 +429,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 0f90b75577ff..3e896c8aa7c3 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..cb84bb344aef --- /dev/null +++ b/drivers/iio/adc/ad7768.c @@ -0,0 +1,974 @@ +// 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 +#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; + /* Protects device register access and configuration. */ + struct mutex lock; + 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, + .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, + .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) + standby_mask &=3D ~BIT(st->chip_info->num_channels / 2); + + 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_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); + unsigned int vref_idx; + + if (info !=3D IIO_CHAN_INFO_SCALE) + return -EINVAL; + + vref_idx =3D chan->channel >=3D st->chip_info->num_channels / 2; + *val =3D 2 * st->vref_uV[vref_idx] / 1000; + *val2 =3D chan->scan_type.realbits; + + return IIO_VAL_FRACTIONAL_LOG2; +} + +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 (u8 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); + mode_config |=3D 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_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 int standby_mask; + unsigned int len; + int chan_idx =3D 0; + int ret; + + num_channels =3D 0; + device_for_each_named_child_node_scoped(dev, child, "channel") + num_channels++; + + if (!num_channels || num_channels > st->chip_info->num_channels) + return dev_err_probe(dev, -EINVAL, + "Invalid number of channels\n"); + + chan =3D devm_kcalloc(indio_dev->dev.parent, 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) + standby_mask &=3D ~BIT(st->chip_info->num_channels / 2); + + 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, -EINVAL, + "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; + st->datalines =3D available_datalines[len - 1]; + ret =3D device_property_read_u32(dev, "adi,data-lines-number", + &st->datalines); + if (ret && ret !=3D -EINVAL) + return dev_err_probe(dev, ret, + "Invalid %s property\n", + "adi,data-lines-number"); + + 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); + + 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, -ENODEV, + "Failed to get match data\n"); + + ret =3D devm_regulator_get_enable_optional(dev, "avss"); + if (ret < 0 && ret !=3D -ENODEV) + 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. + */ + if (st->clock_source =3D=3D AD7768_CLOCK_SOURCE_LVDS) + st->mclk =3D devm_clk_get(dev, clock_name); + else + st->mclk =3D devm_clk_get_enabled(dev, clock_name); + + 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); + + if (st->clock_source =3D=3D 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"); + } else if (st->clock_source =3D=3D 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"); + } + + 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 Sat Sep 26 22:55:39 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 5FC4E3612F1; Fri, 28 Aug 2026 15:31: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=1787931086; cv=none; b=B0Ubk1M1x+I/xXIuHb66VzlXP0pa4/CQjs3AoXRzKgnuXLQHkSASbkYlAdUz6a3qAgCgGl/gntwiXPJ6/91nno5ENDj+bDQ3xGcEeS2NNOFd99mGT65WtUm8pipTfki4oAYP6yEKqmSpO6KdFIvEBIbVcPM0cWtiUxQLlxYGulY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931086; c=relaxed/simple; bh=PyICtn448EN/Byag4obIZpriu1X20AQEWAXYvefarKo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=Z9DN1yAlhBv+X2crbOS7zPzCvClOv7xJcmHTWSViTVWBZ2coo41Ydc7gFo83DbcO/KqPhnTHn5p6JllO0ivWqKwSOg1mb7HYE5LV0pFC1NaHp3ckukPVj9MV9EqYsIteMMq9fGh9HoRn8pKcmyJYhIcrc+igfDBMGu+U+QJiiD8= 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=Ua3/ai7/; 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="Ua3/ai7/" 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 67SDVgLC1142281; Fri, 28 Aug 2026 11:31:16 -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=ggUlf NBEcj1WgTXWxgbpZomq3MRs/rWvFYGhbsUMZOk=; b=Ua3/ai7/AAuINBkYRWIbs DV906bhB3ep5zWjFVjFa+5a9+Fn8itnEsSMCZ7mpsbUuruu9PbyxyunxvJqu3EZp UfuyuVSKH04H7gUy2liqJgCxS88+u0xi/zuNUVDTU8g14GMKVm6B6FYeBeSWCUX6 NH3zPv43KydQt/oi+U9R7+1nE3GVoqHraqIQ0rbrwawR7YBjDKvmt8a/Daw6Z3Tf P6AL39ytpCnM4+Yps+rZAIDpznPrTq0chzBR+4fxBNoYUbLNlAAj3Re9+D8IFv4D MDZPPkjaUF5H4F7r7xGhe1i3V5jGmRzTg/EA5AZ/3aRssxxejkmu7Je4yoe7shCX A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gaj3cqj5y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:16 -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 67SFVF2n013014 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:15 -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, 28 Aug 2026 11:31:14 -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, 28 Aug 2026 11:31:14 -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, 28 Aug 2026 11:31:14 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3l031424; Fri, 28 Aug 2026 11:31:09 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:29 +0200 Subject: [PATCH v5 06/20] 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: <20260828-ad7768-driver-v5-6-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=2190; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=PyICtn448EN/Byag4obIZpriu1X20AQEWAXYvefarKo=; b=TPCNSi8VX5gG3dPOL8syiZYu7+mLYbrxsHTq2G25zk1LTH5T4vUapCKk9b2f+TwG5toe7KUen Rr+9fZYwW6HCzs3a3h8cMQfpwiLXMYyqBxCTUojMyMExJBjk7NX3yez X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: SlzNEJ3qGLJm_0AR81Rjbct29gCWApC2 X-Authority-Analysis: v=2.4 cv=erHvCIpX c=1 sm=1 tr=0 ts=6a91a9c4 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2:22 a=gAnH3GRIAAAA:8 a=P_lMv_IeYrmPur7vI-MA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: SlzNEJ3qGLJm_0AR81Rjbct29gCWApC2 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX885U2sSuiY/C WhZRd+SmUIQ7t7jPt3BulsnKSIq1W2j7y5jvRiX/adH4+XvukdFtbFTSMRWAsx+b/5VkTl6xhfQ SXLNNZNL5Ho9oXzZ+NKC+M21LVTc1/p7OHZcAdxS97SFjJFzSBDQaouXULSm0/7Va+1PtTrtmXL Z9SJ/qtClx63cisQsv1NjjHs8ej3CTLNK67hFCWte9S0U7DygtDTirS4IA3uAsXQH2OAvmbKaEG /9YRV8vJ4iCcLtqc12ghKwJIahn5Xoj8TTiRMzGvQhRbEpMw0Y7tfK/k6/p3UzCyscj4ahHu/iW QRfa8BA0TRYtB6M+aqTZs2vHiL3CH1AiJe9ooLpkLg5PHNGuNTGg1xAEZAC/5WUVodMyEcz9mUK 75qrTIvvEVAqNxoTif97vRZBsa1auUxYbgQvchwXalIvTIMJ9dUk98ZGZg7Z+sGj+G+y+4t1YPc YYcIksM6tZpYmeircJg== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXxOKzMIwwRDl5 8KImXBeuvWwUQF4EQbHv8y0ISETnOj3CwEG45XxQYi1IPbIWJxD0W4o95x+UJa8k0P690EMwg0x SWKCvutU/1fetLZQ4WuYWokYrhuKzIfiOgS4bDJr1Hc5xdcXeDdz 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 spamscore=0 suspectscore=0 malwarescore=0 adultscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index cb84bb344aef..ccd457c75224 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -24,6 +24,7 @@ #include #include #include +#include =20 #include #include @@ -100,6 +101,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 { @@ -758,6 +762,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; @@ -831,6 +852,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 Sat Sep 26 22:55:39 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 2758A369D60; Fri, 28 Aug 2026 15:31:30 +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=1787931092; cv=none; b=q7Mq6LEXXsHHD8wbuOvIrY9JX9nxjtuNRaOD3LRuFt8p0cMGl58nA3/KlTzf1swBDHO6sZAB/hOK+JHhXECwRQahjan+HphPKwet6w2y0S4yZtt3GZUwz98ALT1xq4EfJ/qWF+ahNr19oHYfhT705fP73VbOVvCzeko/JfE38sY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931092; c=relaxed/simple; bh=QFMkHmVHWeAR9dsS2ZC32qLZjbpKmsH5vewhY1kfWGg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=bRE54+Y6PfH9tibQxsPoWQAF9b5bUA1ct83jGc/3Hq9umkm7j1EF1HOeEsinN+fbTOrBAZc7ITb4EizZLj1y4mYrJ00rFoiYn8zThjWJ73wlB5RHqBZZhNEQy3vw9oWgVnqo9fX85H7d2RqrRBVfHBg08W7bzWDuSeOUeStu88g= 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=McjDNR4g; 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="McjDNR4g" 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 67SDWf4f1594080; Fri, 28 Aug 2026 11:31:21 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=leFHQ eFH885JgIzF0x3yAnhQPpYMNtV1tdlKOzzYgVw=; b=McjDNR4gTRSM8o3RW8SrI qvOpw+WsB1kPfpAOt7ERbFZrGmbFJ+JIm6s7YWa8GHpUh7/UR0ZFMwgDBWTZS5w5 RHqz7HRCFp7BB8wvWlD3X/44bM/siS12Nvbfqi/OzmBcJRww0pt/uZCKcqPzKgl3 dQ8EdKEuNvydn+ZUZok1uEEUqlTNzCG+gddVPYG/h81kBWbke97BJvjdgPhTpt99 VNF7Hr+Srd63gxsQCQE1bs5HKXj+n+Na6wCkV613q26TCvF/+YrRsJcRt8Wmjy7s yWW/oqhgAvXZM+O6oUL117GSAlCNYZrzjgUavim/R/KaDgOvYVZWLKhGCLPn59BO A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gbaebgve7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:20 -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 67SFVIM0013036 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:18 -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, 28 Aug 2026 11:31:18 -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, 28 Aug 2026 11:31:18 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3m031424; Fri, 28 Aug 2026 11:31:12 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:30 +0200 Subject: [PATCH v5 07/20] 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: <20260828-ad7768-driver-v5-7-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=3354; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=QFMkHmVHWeAR9dsS2ZC32qLZjbpKmsH5vewhY1kfWGg=; b=LYZ9g/UU100QNWfZ4umvdGCy4gYWKGKLEhScmloQWudxCEuPapGLbd8tOxm0pb3krqDk/1zDw NsNEQmImrynCAuItKijCe5cUUm4WEZkuNjwImS9C4Le2g7fKK0KOSB1 X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXxzy/DKl9Vs95 WfDIbv7+2MsGBV+xG2S5G/mJTJngp9r4+0hgqoZCnF9J8SyhguaeQbYpMc+S7VZr8a8VZujGRbK oApTxwyQl4XF4x0GTo3BmNtYs3rki6HIxnMHawKtYtUvleqpZ1U7 X-Proofpoint-ORIG-GUID: kDRO93T2AEflXfh86Lr_nXn4Jhd5QjcM X-Proofpoint-GUID: kDRO93T2AEflXfh86Lr_nXn4Jhd5QjcM X-Authority-Analysis: v=2.4 cv=WMtPmHsR c=1 sm=1 tr=0 ts=6a91a9c8 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=gAnH3GRIAAAA:8 a=fyyMV9E_WP3nD7ChQn0A:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX7iwBzVFw5GYC e9rV3COvmQielP53qPL4h3quj9gAX6h0HhbDEVZQkPhyfgTIw9rx3P4O+C+rhbVwnPJplIn/ZS0 iUd12ISevZ6zjCIiQKOKCWsfkcmLsA/mQVLyUXls2JEUfrRWni8mOMrg7JqpgEeJLsGbuTVF/CE 8LOj6sXnJwCch6KXd24ajjhuxXd4/qvO7WOuua0k1UbANarc3CE5MEW3IH5hN0OMqfxqCyiQMqo m3cVcFZQ75oVIkGW7ChRYLIIHBLnY0ygtdCCis9JIv+GEEKwPeVNn0iKwMT2WLyykWJ4FccyIJV nCpO57OWnu3MOit19NcmZtuElpsaYuoWiUBYPABNXmlkzXVeSu7DUNGCLm0o37L8bL8z+PyZ3U4 9/fAgxJ6RpS0i87U6FXQH0lxZAJJJzq/CrZWKSFy3go/SY9h4KC7miwb40ejNyD69uQ1tp3LHHB p2NCUAC8BYRwzjhMZog== 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 malwarescore=0 clxscore=1015 adultscore=0 phishscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 ccd457c75224..67db6f4971a2 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -43,6 +43,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) @@ -112,6 +114,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; @@ -136,6 +149,7 @@ struct ad7768_state { struct clk *mclk; unsigned int datalines; enum ad7768_clock_source clock_source; + unsigned int power_mode_idx; const struct ad7768_chip_info *chip_info; struct iio_backend *back; unsigned int vref_uV[2]; @@ -333,6 +347,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) { @@ -482,13 +526,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 Sat Sep 26 22:55:39 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 05F2F371D01; Fri, 28 Aug 2026 15:31:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931095; cv=none; b=ew7+ayJ3RG0axVdJ5BGjPwjugTYsURlN4jv2SwLQyDc5YraDEmMd3ODVUcNaEuJAT7XgK19WBegh/zvdyfTaMJPiYxdWXWxN5rA3Z94mUCMtC4lGtFFRNoicVbHcojuNG2bvFCBLx7NjocbV6tb4YWbFCZNFX24ZRsTj+V7eRNE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931095; c=relaxed/simple; bh=4W1tQg6rf8oywE+TtuI292VI79BUIB+y2apu24unE8A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=ECx5qWcnBDOV6xkaq16GvyeNfaiU5wh1KUn1o4AMed5WH9BuzzzrynRolc2yhAZzqUOp528sabRsgCtWWQjKlrA9oJSePj9vJoZUZp4+Oxl3JZauQIjZplmEIUWGP/+Nk02m08h5EhOJA/gEIdcgdl6yi3Q/qXfK4eomd1ZQnus= 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=bamHc7HC; 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="bamHc7HC" 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 67SDWNAL2013140; Fri, 28 Aug 2026 11:31:23 -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=vky9z f6IKq94zNT3C8XYumR9KIQ52T1ySwKVLnm6vK0=; b=bamHc7HCxhKxqhJGeuN3I IHU+kCkO+81lQmu1GbfRfsMxdIsUhtIGjG7uLc/K914Z/mbzlZ2/WG29SL7M3irP TjM2ysLy8s1JRKzaFRkPMKgRC75JWR6Z/e5MipgADddofAucTjvk2f32CpWC8W62 02kCGEfQrka3sBfHhNBe83LEAW1bsN0TSmTgjSSVvx97OnKCXVAu6/86bOodyZBt BjYX3YWZU1TGdQeT8ZoFslBvoIPBVlSmnDNLtgR2J8A7IRZ/8dTbNgi8OIZ22kqw 2lA1LXcZrC7dJiHZDma2f6FB/smQE1nep2S7bs365pWc6Hk81g1PpHsFZRlyjwMn w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4ga1m14exg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:23 -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 67SFVMM3013051 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:22 -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, 28 Aug 2026 11:31:22 -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, 28 Aug 2026 11:31:22 -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, 28 Aug 2026 11:31:21 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3n031424; Fri, 28 Aug 2026 11:31:16 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:31 +0200 Subject: [PATCH v5 08/20] 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: <20260828-ad7768-driver-v5-8-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=8004; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=4W1tQg6rf8oywE+TtuI292VI79BUIB+y2apu24unE8A=; b=Wa3hUamtqZbfbZtvlx84xsVF65EobEvZTAU8JAlgSM+PJmOY1Z3MultgmdN/ls2OABLbdOmpW 0oDB/+daI2gBiE/6It5wekODcsxk+nhUrJllMqiLQTyO59xmuC+txcI X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: VxybT15hMv-M9cTy3aeAFL_a0MashqV5 X-Authority-Analysis: v=2.4 cv=NtLhtcdJ c=1 sm=1 tr=0 ts=6a91a9cb cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=Q8OhHFwT6lX-Zkp3stoA:9 a=QEXdDO2ut3YA:10 a=br55WurUj89AL1qEz8Q6:22 X-Proofpoint-ORIG-GUID: VxybT15hMv-M9cTy3aeAFL_a0MashqV5 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX+0/gVpHhXmc8 dJhItbncXt9n+a2HO+iUefO11WFj1rnSPvmOIjmUGRAueXtEANGJwbRb4yP8jzo/OMA/jkclOhu DpVBjGayFrM69xHoj1nRy9YCRcFIO3XqcCil5GHdMVIEDbVvm41gOw4KgvEX/lxiG4y/Zwvp1Xa 1NLCubpn9FfCCJAWEiVQNMY0NyGtmQbhirgONqq6LWKuXkFT70PehmCt7+anp1xY6u7imFQ1m3x blx6d2YN7t+EontoBC2qWBH9yViOBFaLy+0HAxDpwslqNUiDhrUrDsiV+JHvVy78pVfxi7v8hUs 0GvM5dkaE4qXnyYQP6DWdLEPLt5ElNFLdzlW8D/Aehi4GeAr9ZXRDwyDvYCePNqkRQC2u9s5ecc Ss0mSOt07PR4ydIt5hnJCstXA2DU+RDvcY4cx5OdT1xjpaiX6bomenOwzv8u3b7Ys2B7IT/GavZ aFqlxxl5jhKUxB0TZdA== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX0OPKLPkGLW79 iCn8p4MY/CJOo5pK1RtoQcOZya4MqDeDjGkLlV8qR1z/bvFlIvaU99MvEV1viE8vJVckUc6WaEG PTFWtftzItP8bZwb2i6qIu4CW8ziS7/OlfsEhLm+syGI7G3JS4Jt 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 bulkscore=0 priorityscore=1501 phishscore=0 impostorscore=0 adultscore=0 suspectscore=0 clxscore=1015 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 | 144 +++++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 127 insertions(+), 17 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 67db6f4971a2..09b4e2f32304 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -36,7 +37,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 @@ -103,9 +103,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 { @@ -132,6 +135,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; @@ -151,12 +164,18 @@ struct ad7768_state { enum ad7768_clock_source clock_source; unsigned int power_mode_idx; 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]; =20 __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, }; @@ -377,6 +396,70 @@ 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 || dclk > mclk) + return -EINVAL; + + /* Set the divider to the next-lowest supported power of two. */ + dclk_div =3D DIV_ROUND_CLOSEST(mclk, dclk); + if (dclk_div > AD7768_MAX_DCLK_DIV) + dclk_div =3D AD7768_MAX_DCLK_DIV; + else + dclk_div =3D rounddown_pow_of_two(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) { @@ -519,28 +602,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 mclk =3D clk_get_rate(st->mclk); + + for (unsigned int mode_idx =3D 0; + mode_idx < ARRAY_SIZE(ad7768_power_modes); mode_idx++) { + struct ad7768_avail_freq *avail_freq; + + avail_freq =3D &st->avail_freq[mode_idx]; + for (unsigned int dec =3D ARRAY_SIZE(ad7768_dec_rate); dec > 0; + dec--) { + struct ad7768_freq_config *freq_cfg; + + freq_cfg =3D &avail_freq->freq_cfg[avail_freq->n_freqs++]; + freq_cfg->dec_rate =3D dec - 1; + freq_cfg->freq_hz =3D mclk / + (ad7768_dec_rate[dec - 1] * + ad7768_power_modes[mode_idx].mclk_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[ARRAY_SIZE(ad7768_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); - mode_config |=3D 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, + AD7768_CH_MODE_FILTER_TYPE_MSK, mode_config); if (ret) return ret; @@ -549,12 +662,7 @@ static int ad7768_configure_capture(struct ad7768_stat= e *st) if (ret) return ret; =20 - 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 @@ -677,6 +785,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 Sat Sep 26 22:55:39 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 56BAC284690; Fri, 28 Aug 2026 15:31:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.135.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931102; cv=none; b=M8Mn1m65ZX7K9ZfF4kctjm2BJ0P7Ca/LM7ph0enqkzgpoRdAgsqVNhFvIhcPjfirgKVnFzFEUsjBq++FfRrC88Xmysp0E+3i78o+lMJhq0B38oMXK0q4M8TuoWGYdUek0cCeNWSAamakZ9Q5gTsKFd9ci3GSvVB8ZL+ztk0xaF8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931102; c=relaxed/simple; bh=FWza9itWpZjwiiihqcKtGyjyrARO3ZgsFfv2fIF48i8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=BH2X3xmqUqxq/s3ATuRKELIwd4gT/p5ZAK151BkDXaf4EJy33S0DQyNdj/MB/LL5jKZaTp1MDOInHpM4otB5D4rDQlL0dSY/twQNXHXo7VDunkSefcHgnvyRY/k2+a38RrXoGVqV9WYscLQOfnk9hNDwT/yZ1Xcc3/vF7FNVzwk= 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=YTnC/koP; 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="YTnC/koP" 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 67SDWYnw1593807; Fri, 28 Aug 2026 11:31: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=EWZNT wTESBCPX3u3Aeolyap5oRBCzQc9KLxxLF/lns4=; b=YTnC/koPkLYzvo6s6Zrh5 TkSFHaSgZ4H2pYRafZt7wRboN0mO5tfIQHTcRTtm3Khd+3W5iMe/KTvbV0YeOfMz wjciEjwk9nwq+jVYzT0bYKuoEQ08WAvUCMptS7zCdXbBw59DjcfG+YMLLvqEyuTr gVGXJnY5bC0Rk7KLwpW/XGDYRIj7FkRTo+2enUXs+x5iiO6XrMrltIyHKbANOqjU wc6AbpRoVSAWl3nqXRfnvtRFFHxdkxTh4gBkYpVmu3W/bLbxEScWlnU8FT3LJM6p s6eyMSVk9shOfHX3snRMS2uwhg6+KB5eK3Wy6kAOKgXoNDPXWBjytlOs6kcgXuDV w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gbaebgvfs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31: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 67SFVRLG013081 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:27 -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, 28 Aug 2026 11:31:27 -0400 Received: from ASHBMBX8.ad.analog.com (10.64.17.5) by ASHBCASHYB4.ad.analog.com (10.64.17.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.37; Fri, 28 Aug 2026 11:31: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, 28 Aug 2026 11:31:27 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3o031424; Fri, 28 Aug 2026 11:31:19 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:32 +0200 Subject: [PATCH v5 09/20] 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: <20260828-ad7768-driver-v5-9-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=7379; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=FWza9itWpZjwiiihqcKtGyjyrARO3ZgsFfv2fIF48i8=; b=W1+/uqM7no46uxSp60IES3fP5nUbYdWWjDW8JnmAC4XK3UUtsF59xlmJXsmGG5kwbsLB1A5aY ZXvnkonnC2gB2nD2wknZqlcYzYRb2fKFdj1yrasyX9dc78TY8Qogwmh X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX9Ib9Vyq32Zcz nKCxGH9RzbGw0NIIrmDMb9+DWHOkP5T5F6GN1S1djYWMS4gXMV4jbvThUhr52rG/vjEjUQNF5Hq Ggell4iYjxOGgZFVRqngXfV0kmnOowl2k+99xsfKr0aWgHw9PUF0 X-Proofpoint-ORIG-GUID: rOdmRLRE38mKrTl05rrnzGsdJmjMRkGX X-Proofpoint-GUID: rOdmRLRE38mKrTl05rrnzGsdJmjMRkGX X-Authority-Analysis: v=2.4 cv=WMtPmHsR c=1 sm=1 tr=0 ts=6a91a9d2 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=gAnH3GRIAAAA:8 a=K0dpHdiJ8xCuxrgygZsA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXy+Uy/4L3PZ2E bY1m+EqwO1Xfdy3fj1nUbrwliMa6pxBVz+lU8kIC1pk5IeH4hry1VQIfGvhYja2WVZ+5nlP+Dwn +ol00U6yqyYPwXZPbfIz7WNqK1KUzyi7AdLvRHTDJ6vg92nJfJ1y0P0nYJZdg2mmXpDRmkgD9QH DVUZlbiYVmQGew+Ibb1IcyR/we4H+NVgSoBjxRdfJB6O/ZDwtcEb/nNjKiuovJC8DK3fzdrQF3p MMzKIL3SxMb6tPRQDwK/0YEB5JnWVf+jpz3YDGXDQ/33ZxUxpIuSD21HNRq0VSu5n+FcvtPZ65+ 6kNLYb8VeOXBuzwkErCLrnULvrgAUgFpW9/XseuIL1G2VJvQOjzDcCAymHjBXyWe18EK2NZNgzH kHWWBHEt4EGAY7Zenq2zWbn6AOepGKxPOCO3+WTvGnupodVy3L6opcrDtJ9gMolYkHynsZrgUH0 PWxlycgHNpjR/IPIshA== 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 malwarescore=0 clxscore=1015 adultscore=0 phishscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 | 153 ++++++++++++++++++++++++++++++++++++++-----= ---- 1 file changed, 126 insertions(+), 27 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 09b4e2f32304..00d6f1dce591 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 @@ -35,7 +37,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 @@ -110,6 +111,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, @@ -212,6 +214,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 +467,69 @@ 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) +{ + /* + * 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. + */ + for (unsigned int mode_idx =3D ARRAY_SIZE(ad7768_power_modes); + mode_idx-- > 0;) { + 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 =3D 0; + 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 +540,65 @@ static int ad7768_update_scan_mode(struct iio_dev *in= dio_dev, if (st->clock_source =3D=3D AD7768_CLOCK_SOURCE_XTAL) standby_mask &=3D ~BIT(st->chip_info->num_channels / 2); =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 + 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); @@ -629,11 +745,10 @@ static void ad7768_set_available_sampling_freqs(struc= t ad7768_state *st) st->avail_freq[ARRAY_SIZE(ad7768_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); @@ -646,27 +761,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, @@ -787,7 +882,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) --=20 2.43.0 From nobody Sat Sep 26 22:55:39 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 11A07360EF9; Fri, 28 Aug 2026 15:31:40 +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=1787931102; cv=none; b=IU8o7vRN6v3nVZH8MNUENRYCOXhe7lo4scMv+8Vz+LArJ8WqwDLj9i1/TVGWmrEgegbZomSxyNEc8t/cW2HIkHgu1lLDOfdbLpHArQi6zdrbEIslSEbeRbCzQ6PfejHAsN+5j2gDDOVqWo2CCL3hVHZNrxmi4LmIypBcGe5mn3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931102; c=relaxed/simple; bh=NZzFqpngcCmjyA3h9Hu/0QYnyj+O4qxb/GTiA1jsTNQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=MNxcNMt+SXddqYvwLnp66KdmSnq23LR8kktYSGhIpjCU1eOmfIb/YlLlL1IM89GUI/lSKNhsjScckFuWT4JW5iwNPH9BYUp4KrhNIiqeiOaKsaWUKnFYp5Hf5IsduJXe2BQz5TmOw9K0bhJWvFcYq4rpw2JwEGNtZSPwJB8FkJs= 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=F7ga5dPY; 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="F7ga5dPY" 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 67SDWPtc2013156; Fri, 28 Aug 2026 11:31: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=A2a86 Ll4vlgF9s/SE7NQxQkVP1ygI8LJsI5p+rtv49Y=; b=F7ga5dPYOC6t/0Z+b2tb/ FMZbOtOHOHwwEMk4ZPrkcIL6T+C2BiClPxOzafFUYAP2St8xHW/3ymT36aKsoJ1F rU2F9AtRZ/Vwo6xAv2xuZ7ei85U98E4G87uJBioKJEHmQzkwuZvuwpTquVQIfxp0 Rbp3yK3ej1R5AOoQrmd8t0TVNY85GjCS8ZQn7Ec2W9aTKB2MVYaui1H8kAeTuldP 4/4gpVUJMrc4sMIOxb0f4ZceNul1OY4WCrzhfAjI6iHki8LkLFt8CnnJO1FJQ1pJ FAxOdUw5/TnyfgmEEzaSodjU0e6cmioe9W9yf2aSm5ClBwDm1b1dfxZxWTRJvmbF g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4ga1m14eyn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31: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 67SFVT4w013093 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:29 -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, 28 Aug 2026 11:31:29 -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, 28 Aug 2026 11:31: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, 28 Aug 2026 11:31:29 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3p031424; Fri, 28 Aug 2026 11:31:23 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:33 +0200 Subject: [PATCH v5 10/20] 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: <20260828-ad7768-driver-v5-10-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=5563; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=NZzFqpngcCmjyA3h9Hu/0QYnyj+O4qxb/GTiA1jsTNQ=; b=JQDYLzLWCbrYkD010diSzwB58wg9QJh5eqoIhiSk3wM7vt6mHiEtbKYMkGyWVDfAvo85HCOri NdxWgxrAJhRAAyeQPT0hvjhoyfJPT0QHQutgyeNWvVD2mtytBxlsTFG X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: hkbI-nEPMiAxJSK4E3ISkf9SFOeDcUHw X-Authority-Analysis: v=2.4 cv=NtLhtcdJ c=1 sm=1 tr=0 ts=6a91a9d2 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=DQ_gTnqUUE52UBPUpMQA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: hkbI-nEPMiAxJSK4E3ISkf9SFOeDcUHw X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX8BzIq+dV4PPK V299sktNx7S5GOZAq7X5kT7U5264mqBagB1MpbMh1SmfygG26ufDelcw4coQ8uHKXEWfmcT5p1B ZlWB5GoNW8JDuIUciz9nU9545eep9t9wOQ/8NTPo0oOpbacvx6gmgw1bzp0mK1t7ZDJFwYzTQcO yK2V7XOl4ZNgpBBY07aHDMro15rA+LmDRD/19lo7b19JGmFEp5h6ekT5qghDwLQwX+lOJWQRzVx uOjQdNiM1j0AO4XRrwc6hhhGy5H57vJVk85TNwn8V8xoM0MpFR8uKNC6K0C7Lbrnrog1BXyR1mC pMpWfIWVV94/AKMBBbRz657UW4kvfu9VTgvrwed/E2zidyawy9OpGLaGSBrUfzyuOylTR5o01me g0GQnNoceAHuA8DiB08TLcHV2sTtzhEgtsSGl4toXfrtIg1NumNYRaMWK5QZMFrvN31138BkxgT bJH/G5J7k1H331bxIGg== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX+mDg0WG3XKDi TmmqWx6jfsLxXZPBhLquxh7NyiPQcDM25xVjByQ4j7aTXOAw6uPKao5WGm22xG0UM8F/NaMqFMA t/+3SySMzPNuQ4lR+v96XHZ9RlmJL5P8hgJaChSgRbwekFPad2o0 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 bulkscore=0 priorityscore=1501 phishscore=0 impostorscore=0 adultscore=0 suspectscore=0 clxscore=1015 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 | 116 +++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 109 insertions(+), 7 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 00d6f1dce591..1245ec94b637 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -130,6 +130,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; @@ -167,6 +170,8 @@ struct ad7768_state { unsigned int power_mode_idx; 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]; struct iio_backend *back; unsigned int vref_uV[2]; @@ -496,6 +501,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) @@ -656,21 +687,74 @@ 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); - unsigned int vref_idx; =20 - if (info !=3D IIO_CHAN_INFO_SCALE) + switch (info) { + case IIO_CHAN_INFO_SCALE: { + unsigned int vref_idx; + + vref_idx =3D chan->channel >=3D st->chip_info->num_channels / 2; + *val =3D 2 * st->vref_uV[vref_idx] / 1000; + *val2 =3D chan->scan_type.realbits; + + return IIO_VAL_FRACTIONAL_LOG2; + } + case IIO_CHAN_INFO_SAMP_FREQ: { + guard(mutex)(&st->lock); + *val =3D st->ch_freq[chan->channel]; + + return IIO_VAL_INT; + } + default: + return -EINVAL; + } +} + +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; =20 - vref_idx =3D chan->channel >=3D st->chip_info->num_channels / 2; - *val =3D 2 * st->vref_uV[vref_idx] / 1000; - *val2 =3D chan->scan_type.realbits; + *vals =3D st->freqs; + *type =3D IIO_VAL_INT; + *length =3D st->n_freqs; =20 - return IIO_VAL_FRACTIONAL_LOG2; + return IIO_AVAIL_LIST; } =20 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 @@ -743,6 +827,21 @@ 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[ARRAY_SIZE(ad7768_power_modes) - 1].n_freqs--; + + for (unsigned int mode_idx =3D 0; + mode_idx < ARRAY_SIZE(ad7768_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) @@ -841,7 +940,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 Sat Sep 26 22:55:39 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 4E89836C9EC; Fri, 28 Aug 2026 15:31:43 +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=1787931104; cv=none; b=qJJZfR5/1a8eyhUaAuoEysutSbBYdilUwAVZwdSDq3yuLs9wlugEp5eI6HmNIG29HWju4Tc3h8AzOvA9aFMFdW1xFfFHf6P5P3qYq+ZvpaAbTiILIallmFo6m6Pn7UEFE+1cZgwslwSft7gm4WRt5NfTz8WgoZll1UZgrTsgxJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931104; c=relaxed/simple; bh=W/QCsFcdxiiKnoTH+2LSrhHpFVYdPanIhbm7w87rDzE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=fQ2z5Q7+RjgQ5CMkzmCQKx+DIL/363OymyyE+K9uXjLnVfZ06XwVUzd7Hn7qMqLbrX97vuNLvnOVb89jAYhraZakzsIyzllqXsgsr9N9OGR+I4RyMqIA+5Nzy3bgHLZxmotG9knRTtxL17WjC5hqPw+xklxpZZ9UOgd8Djn8BPo= 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=dMXsx80F; 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="dMXsx80F" 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 67SDWNJt2013118; Fri, 28 Aug 2026 11:31:34 -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=mKiTn I8PlQzXhNaW2vAdjgyozHcfKntzk2l2vlp+jPw=; b=dMXsx80FAlyW3PKdZKBSM +4jleT8QqGQN21Odfv7/gDY7RTaX7mVbrA7fgpQ49o/wtB1unckQ1GY2kZ7iYHPv mUSXIsy4Q+FAqg1ZaJAZOig9MF/XAynpMY7UGGUViTFAEkHy0iMF+hWTlUDZfd6y wKgNCfN26z3hPy6dIse/I6rayrR/ekvq7B+wllpt0DsEEZPRJUTHla65N/bEPHJJ XY7mBrdUEZoNytzgexhXf/tFrNzKaw5qivouAODvXx7hPEmetsEEWngUuVzz0air ash0WoVFiMI0kJ8b+m1804kfYl/VsUD8JQNGRnkxcviq0FfBAVxy55nxL+XPinB4 w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4ga1m14eyw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31: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 67SFVX0e013126 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:33 -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, 28 Aug 2026 11:31:32 -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, 28 Aug 2026 11:31:32 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3q031424; Fri, 28 Aug 2026 11:31:26 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:34 +0200 Subject: [PATCH v5 11/20] 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: <20260828-ad7768-driver-v5-11-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=5039; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=W/QCsFcdxiiKnoTH+2LSrhHpFVYdPanIhbm7w87rDzE=; b=XILRZnQ9Lk0tI8kz8tsWh+lY0cHHcuioAbIZj7299+egxUeKQLGxJI/lnzBiovhzzbyrtA+WG m8jIBQT9UjOD2nM8VrN0peg/D7nzGGa5XI892PAbCzvpJUaviYBuqAS X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: EanwDyvgJrgRmfIe0CCgk-ohtqHlBXww X-Authority-Analysis: v=2.4 cv=NtLhtcdJ c=1 sm=1 tr=0 ts=6a91a9d6 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=u1yhE7RKQyILiklAgKsA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: EanwDyvgJrgRmfIe0CCgk-ohtqHlBXww X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX5c+Vqa0OdJag 7lYSMQ6b2/WV8qN0hpOCC3xDizIzamlBUfsvfUBRTy9FSA2X75i4M6I76NArCUZIlP536mVSn8u 9GuEedj4WAQ1lnzSblN+IffcxAbYQZb2GFyDH8k2OD1kFaek+OKXjR8p6HSgYEaWwG3fdbV61zq iaMkrnbGsKqtv3A4K22AtdmT/jO/qZmNrt+H0TDDIsMZiUs6GtiTqiWih+Pmq2Ka9qDlrI0ZR62 /j9rw4ik9us/B3mvHWcLLxOjIX22fZ53lck1rrQNhCv1rkZgTWcwRhoPMTJuuH2BzUz/dQ68BMi 4MS/uUxs5U9zhMr7jlgngHkvPYnZ718UdWygsKKWuj2gU9pSZP2EKlkt+rDEDGjQjJsNuo9uEi8 RtVmTvFY7pAAavXc8fN9/BNYlti3dtBisw4sHYZ6Gy14YgXSSib2IoedUXpyvktOGflBG1QcDxB 2KiJ9cFbGVir5BtSFzA== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX+7wVGz8eO5Ds Czza1MHzTI9pqfF+RnG4QrL2JdRinbDelXVFmRFVSIFuL8iRjAd2SCkGOHzp3rI7PPAzmoVAJz8 Y1N4ZIAboIFBV6n2YeJirVXIOWl4IiU+PdFwmYsDpBLYxSpHyGZG 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 bulkscore=0 priorityscore=1501 phishscore=0 impostorscore=0 adultscore=0 suspectscore=0 clxscore=1015 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 1245ec94b637..4c67f692861e 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -113,6 +113,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, @@ -173,6 +178,7 @@ struct ad7768_state { unsigned int n_freqs; int freqs[AD7768_MAX_FREQS]; unsigned int ch_freq[AD7768_MAX_CHANNEL]; + enum ad7768_filter_type ch_filter[AD7768_MAX_CHANNEL]; struct iio_backend *back; unsigned int vref_uV[2]; =20 @@ -527,12 +533,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 @@ -542,6 +595,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); @@ -576,13 +630,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); @@ -605,8 +661,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 @@ -857,8 +914,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; } @@ -952,6 +1011,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 Sat Sep 26 22:55:39 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 9645136C5B2; Fri, 28 Aug 2026 15:31:49 +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=1787931111; cv=none; b=td5Pj4u3reg1EoNFiQyAJmJryzdx/YRkKBa6pliMyTQLl1CIDRY8KVApr1kPNtFIEFJq7CjJHG8r/ZRe5XvcmuQPm/jf8EXNTUMk6W21oCayA8FYCZIWX8bWqg2KP70oIqrMoAH1DrAbW6aq7CsJzDTFcGb0yzxZUfMt7fAxDxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931111; c=relaxed/simple; bh=blDN0LtmU7sRseC2tf3ct4y+Hqf1xBLyjypT/+RWM+c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=IXAfTUvFl/IACt8RFVeXCs7TLYHQTXH17CuDmJZLw7Xr8rTtRLnZ7gqTC5gxvgpG3w6/kNLi+7L3gi7vwXW+7BASKfwTj96SgXT9BRNoTUsmBcJJgGHOVuQuQUYIwtO2gD4s/T4I+/ojEyes4EJyapQxNq7scirgK7BUF04od9g= 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=m6OrkGK1; 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="m6OrkGK1" 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 67SDWT2U1593725; Fri, 28 Aug 2026 11:31:40 -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=edw50 3BXTsE1bxevpgO7Ps7YX2BcspAP8C9/SOetlOE=; b=m6OrkGK1LVuKXqHu4Awcs vwIqXKOKwOqdz9t0DVbA+UB4KhNr2pnJUpV/fJreStt3IzuiarukOj3QFsLGLRIS axDkbQXL8sI1UcomyPXjj7RXdkGI4aIwqUCCRibr17q0QzKyMuFsFO5iGM3aQ4H7 oDTi0ABvLb4IT89anJ/XGM9sXkFbVdjVSiKLCB3LeJHgg3LOzq6lGQYq0U38pjNw 5fbcqT1WsDUfexpAFASy1jf/+ug2Cg4LWmkzLPMvBqclePsPXDdLXRrrqi5KMR1l hk0Q94bQOnHPrGXJtNxvJeuDz+38kNh8Uj0RBoBX4SA2prtPPsMVjDt1kLYsCjiP w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gbaebgvht-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:39 -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 67SFVcYV013156 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:38 -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, 28 Aug 2026 11:31:37 -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, 28 Aug 2026 11:31:37 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3r031424; Fri, 28 Aug 2026 11:31:30 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:35 +0200 Subject: [PATCH v5 12/20] 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: <20260828-ad7768-driver-v5-12-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=2289; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=blDN0LtmU7sRseC2tf3ct4y+Hqf1xBLyjypT/+RWM+c=; b=mhEmAAqUhWqoS57+9TnsJZh6D1w0gc7tcUKO5xfgXfDvNM7vYV7GmUWSz7+JBeC+7RIM7tCjM sC2me1KG1iVBU4Wk2lg3CTKh7MSo6EZAT4ejetvoQyAwinbtvOaZ29n X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX8dw/LLjorut/ FIK89OSbox3AxrdJ2WL5DfCRFnE0vz5GhX1tc6RgEXQOe15YcP/Wf2gkzFiYk+SuLZecxeCVDHN ODyhIOUZ7Qjb7Tn5wlwKGboj5Fc3/1jdWVk7/vEtEETBXnsFdHwP X-Proofpoint-ORIG-GUID: Fxq8JZB0bm9bHSPoVBdgMKY5_UXxPFnS X-Proofpoint-GUID: Fxq8JZB0bm9bHSPoVBdgMKY5_UXxPFnS X-Authority-Analysis: v=2.4 cv=WMtPmHsR c=1 sm=1 tr=0 ts=6a91a9db cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=gAnH3GRIAAAA:8 a=meB-weNJVlBEWY6-UGIA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX0/uZch3AmZhD afZouh7JFJ1mcWkbXBkyQ9XZtrvSl3H8Y3amBzyvgWAdDGI1SHK8sDOR90UHI2mK0DVrj1xdTB2 kRASIiIK+CK5LI0AE5bcKYWv74exvmKXm4tscRRHiREwt0i/eTAko/j5ozVvX7+egFYi2QHC/Yb tjIVfDGq+F81prY0cN/lY+hWiz4lrjpfR7z+Mz9EERHr+BAH6nDDG4NUcYw073MuFbgBXed1jPn d/VCq9GRnfkwZPTKAg4JOXg/lcF+N5rvyJ1cn+hk5lGU2/rekxdXYGXUajClwLjMZfhDICphuYT 6QCTXHgFBdV+WsGn+ra2n599Wwx9RQ70Pk47tVGoVy/uwT03ei8/2tQSjs7wUxrlH4ZAjbv+YZT WP08N5iNojywjFN5p8y5yMPc1hCcy0VInkVWSeu2bYbTnmXg2r/pT3xdYNKAXSJZIRMK8GUtWuN uYkuEgtMydqwWEmQ+lQ== 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 malwarescore=0 clxscore=1015 adultscore=0 phishscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 4c67f692861e..84b96b1fab09 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -112,6 +112,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, @@ -592,6 +594,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 settling_samples; + unsigned int t_mode_us; + + 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) { @@ -674,7 +703,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 Sat Sep 26 22:55:39 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 4FFF737C0F8; Fri, 28 Aug 2026 15:31:52 +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=1787931114; cv=none; b=U4cmJlsoFOrl8AzyM6lYsckfCzsVJa7MwI/pnKmnkvbdM1HznPS7Hm9W35lqvccUYHdJSSUlQO6mb1bULAOqiiJyGb8TSXz/+EW+pR1//FYrXCfe/RJ4el80MgliVaScqBCf235Tj9xOfOsTEZDlVFsyK83Xtage6iOeYTtsWs4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931114; c=relaxed/simple; bh=PDpKIKpuoOju1+G0iJfiC7tTRiu7g4kVKJ4YoKykPVg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=q1lmdxuU5an119wlIHr+0m74cp3hhFTg1g6dj051UpzBlvvAVBXpWZfQuu5wBBA8Ev/JXXhqMmzcq+vm+X78BRWf0Rg8cLGnuxmsYmxx4+tyYiyrftS0lJaKN4yM22rRiwk/0TVAUewgidZ3JMhtQnu1OHrqyoM8QJaPd9Vobg0= 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=rlWJ5yH6; 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="rlWJ5yH6" 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 67SDVgLF1142281; Fri, 28 Aug 2026 11:31:43 -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=iptxx fiof5wXV5iy//guzEve4pAycP/02/v7MLb5uYY=; b=rlWJ5yH65n8TXezAq1c5J c0lkJtsGesFMH3iXLx6x6WwHDGxhsk0GRCSMZSPxrzVYefyxkKY+NDew/RhmvwYB 2mRH9eKL6Rk/m2grmJ2hCQYlzFdLLIYV++xCK/GGXOIYn8eSP4zEfkRTsen3kKkB UYnxrRIqFmhg56ouBt5zXUno4sMkacR2MQhb89nscD4vN9oGGRPAO7dJhMf4pqLf lwH6Lt9jQk+JK7tRDltKFqmhnO93rrYHBpBia9ID9nQ1eSk8h06aAHwYG9sAArdW usjHffofZwi4WnLnw6v1DYDs6HroTVVWo3qjw939YnvSwMjSQTJs2TioNtBs1Q3P w== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gaj3cqj8m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:43 -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 67SFVgZo013190 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:42 -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, 28 Aug 2026 11:31:42 -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, 28 Aug 2026 11:31:41 -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, 28 Aug 2026 11:31:41 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3s031424; Fri, 28 Aug 2026 11:31:33 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:36 +0200 Subject: [PATCH v5 13/20] 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: <20260828-ad7768-driver-v5-13-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=5812; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=PDpKIKpuoOju1+G0iJfiC7tTRiu7g4kVKJ4YoKykPVg=; b=OJj1uJ4jyjQrUCvCZJT6aHnxjxZhI2MdjhsszllXvblHJvrdwhvXAveVwmA6j7Sn+1KLDZL1K tzudeosSg+MDf+OKXGHHNB4RlHFdgVJeGGAjKyM5aG7wgMr/pGUR2d5 X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: iTHRNtDoHHs1MtUEI4DSVKfe17M-1uN2 X-Authority-Analysis: v=2.4 cv=erHvCIpX c=1 sm=1 tr=0 ts=6a91a9df cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2:22 a=gAnH3GRIAAAA:8 a=J7MwhgzI37q70DLThgYA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: iTHRNtDoHHs1MtUEI4DSVKfe17M-1uN2 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX5l4Y2qloEUkY 1aNRuEt8VrQEdhVnBb2vzvTQ0SowLUvBmzqt+8Phg6qAGZh7m3PCAQKnAyZHCqR/UkUkp14cgQC Li31T3S0HuNFRXGpzRszl/aPTSzjd6afkVG9jDangzW926NR2f1ptdVZjGBRRfvBmlYDUAuFcne PaegLBdzUVv2N7IguaPBvcEKvCHBNrQyhyRFh739rgY3/0XwSdLKTg5RGW320EDkkWlHofEMfsH TdYEOPwGfyhr/qRnYCyaOW5CAix1JQdx8n5KO6MM7BggBdZjZZDtXLUgVB6nPiZDy0h8nvalcxz sjAhKXJPCQStbdSKOEgprZjOKlVcZoko910TXHHkpK3t2LYUMrwOZppFElt9LJdIc8Wp+JvtKwA r5HKvjSrk+EE4u52OY8JexTXp37z9N/9I5NzVVOP1cXFsCO4HrBwfXtABtYuSxvLFbvPlX0vpxL 0IJKU2tFZqMpSfCSaXg== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX/JPsszHGAJUj BrYPyJj2IGU6s2vHIJUc5X4Uug5r1pqfoQUwDgvlpjnArOyDykK3u2i6If6DqGzDh4zzpM8Z0F+ 4S72dWZ8CRT0eKZyFgtEx6xkxg9VV7RcVTtx++fPcVXqNffaaXB5 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 spamscore=0 suspectscore=0 malwarescore=0 adultscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 | 118 +++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 112 insertions(+), 6 deletions(-) diff --git a/drivers/iio/adc/ad7768.c b/drivers/iio/adc/ad7768.c index 84b96b1fab09..f2f318ebf964 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -27,6 +27,7 @@ #include #include #include +#include #include =20 #include @@ -112,6 +113,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 @@ -237,6 +239,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); @@ -354,6 +368,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, @@ -780,6 +847,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: { @@ -797,6 +865,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; } @@ -805,24 +888,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, @@ -1035,7 +1139,9 @@ static int ad7768_parse_config(struct iio_dev *indio_= dev, =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_CALIBBIAS) | + BIT(IIO_CHAN_INFO_CALIBSCALE) | + BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ), .info_mask_separate_available =3D BIT(IIO_CHAN_INFO_SAMP_FREQ), --=20 2.43.0 From nobody Sat Sep 26 22:55:39 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 497EE37D123; Fri, 28 Aug 2026 15:31:55 +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=1787931116; cv=none; b=b7LxK5+1cM3voOihvsFdBvKFzYcA3OMKuyO9FIyPiTR/NLKR2es5HmO+3L3J1Q38axUDSt0EwHfGYpY76faBiSxobET1DjdPvD3kuxRWGM+jDwUziURuC7US05iSMQUi6cJBumJExy5fcCY2QMdHynLZ3+hGFjEMUiMGaP4Hlak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931116; c=relaxed/simple; bh=8R44WiSWc5C8CuII5XNxbwdk18kSc6TANR70HZFXLI4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=jkAkh1D243c3CiarWqEyn0WM/Led5wfospeDM4d3Y3+IQq8gU4vJU+zV8owlghpoDyDifh3NgQZ+sG9SlYSvvb/EOOXfWlqhQ/VwV1sK6qD2cRpR1+xNZ6S5GSDEAgc4/WGijpXDcLIF6EKuk1w8osydwoujwZIO/3MCiNgwJJE= 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=AZXlnIk8; 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="AZXlnIk8" 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 67SDVmuR1142384; Fri, 28 Aug 2026 11:31:46 -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=WG975 IkcdjFVsbiHLren9l09hKLAsd9Lqh5VLAbzN84=; b=AZXlnIk8FZiy47nK4pLIP TnSaiI6NkCZfN9Gfa7Jz/AA0eb9emWKouyoaezhlW1AUWEUhkvFPNzHD8SuhgGFX BhkOLo0nhoiSk4y75y1diGNR3Yct5i1HVgHvo56y0CNFYffvw9ZaOCIiKaL6QQOu QlcDaXTu7TZkScMahzuyRCbQOZhLV9sb+8LdUXiFoD9cxjmnyDFo7LptazA1ao3/ GXODJe0DQvGysWQp+5JrngUFZX9dR3LEty6Zr+zavum9u0J6DTFr7awuUn66zivI 1KfmnsIhD1UHXkH5L639n/n46cBKYbG/hrOAFFQlJ+2PSp5fEuyTvNpcFZwVYWZA Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gaj3cqj8u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:46 -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 67SFVjp0013202 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:45 -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, 28 Aug 2026 11:31:45 -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, 28 Aug 2026 11:31:45 -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, 28 Aug 2026 11:31:45 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3t031424; Fri, 28 Aug 2026 11:31:37 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:37 +0200 Subject: [PATCH v5 14/20] 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: <20260828-ad7768-driver-v5-14-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=6189; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=8R44WiSWc5C8CuII5XNxbwdk18kSc6TANR70HZFXLI4=; b=rLFZlnHwd41It0Q7WxZxDEQ38c3sQwosHDuq5+VOJM1Siq4n48dg0xKarokUmubv6CtFOYuVY IYELaAbvIQlDMrXXMt5q4fZgPIl12eIU9SE36ae2dmT3iTRp8RsQLrn X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: rjezPWwAEVDNhTzHXrkXQ1KpSeG-RBP0 X-Authority-Analysis: v=2.4 cv=erHvCIpX c=1 sm=1 tr=0 ts=6a91a9e2 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2:22 a=gAnH3GRIAAAA:8 a=Q-mZ1VjmJmedMbfahesA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: rjezPWwAEVDNhTzHXrkXQ1KpSeG-RBP0 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX9Yrz9tbN5Myf xdVt9/xAOPI5Y4AoFJOOWapdCLlZxDoDMK7PBhB/5mJ2HU+u+szmwAvVr7QNtfCAL4WkzbZzK1J LhEdMS48YM3N0I3hMVqD/ZvTtMPrKCv8OSIFM3iLAWqSQSaarlxbKYQ0k90juT9zKYjUz1zJvFi Zo7ktBLs6iD3LbYO7Zl26bUul1l3DK5fmUcdL/k4WXKbDRYYUVQdu+Re86tJrhmvsdSB8F0ghy1 qNEr71Y0+3Ax10kb9f+/jf/m//drXGlZGm86FSNei1GDNUslRFTlu3TnIGDlUv9UYAY1OQPOlcN jl6ajwee8VHUEdwbH08ZbL6YErIG/oDW9oUpr70qCMoTlK67ZvLLQEC+Jxg99WMpVeotiFx/IJy BhdXz+5HOEMM34mBrVjK++ZM9tT/hXQO5y6MX5Re/7RZY4h22hiHc7M7SZJxN4Ab0ML6kDLYgWJ odWObe8uxyRJnlF4OpA== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX62tFqZwzhBU0 meEUsAVTRxN97m6x1yPm85iLYeLCGhP9yKnH6jTqGH5E2IHqXk8G9PVxkmFYjXi0FoLUm8WvgDe vnYuIEN4MFQqnp0+gYm3vM4Mi15yX+jlvyg6N60fhTZp8HBVqtLC 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 spamscore=0 suspectscore=0 malwarescore=0 adultscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 f2f318ebf964..4133e3a033b4 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -154,6 +154,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]; @@ -182,6 +188,7 @@ struct ad7768_state { unsigned int n_freqs; int freqs[AD7768_MAX_FREQS]; unsigned int ch_freq[AD7768_MAX_CHANNEL]; + u64 ch_convdelay_ps[AD7768_MAX_CHANNEL]; enum ad7768_filter_type ch_filter[AD7768_MAX_CHANNEL]; struct iio_backend *back; unsigned int vref_uV[2]; @@ -251,6 +258,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); @@ -661,6 +674,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; + unsigned int mult; + u64 mclk; + + 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((u64)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) @@ -766,6 +865,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; @@ -880,6 +989,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; } @@ -893,6 +1009,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; } @@ -904,6 +1022,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)) @@ -924,6 +1043,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; } @@ -1141,6 +1269,7 @@ static int ad7768_parse_config(struct iio_dev *indio_= dev, .type =3D IIO_VOLTAGE, .info_mask_separate =3D BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_CALIBSCALE) | + BIT(IIO_CHAN_INFO_CONVDELAY) | BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ), .info_mask_separate_available =3D --=20 2.43.0 From nobody Sat Sep 26 22:55:39 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 82FFF372EE4; Fri, 28 Aug 2026 15:31:59 +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=1787931121; cv=none; b=gXzkoVvT4KAoXZLRsyXE0NZGXAnLIi6zCDCtfMG1/3/ubrYw5u8izz9rSrJBl30Ops9/FmtmS1HzsSSDob09AQ1FYXYpe/YZs9pP1IuBfnH+vFM0utGVeCyPCYzS8Axuid7Yz8auqU5/TAlUJWCku0CpD3XDNENLDCcMG27UNPM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931121; c=relaxed/simple; bh=Q/tCh4kW7Xhqsku3z4K7mJzTnTmPCy+ik5jeQfI2t+E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=kCAxgBrYKrQn5szpBhDhet+IMvELM8Jr1bZNJ0wsy810Y33BZ0noNLtLWg1QV8+RWv3In2/AJnDVd4sQ7RCibfvSasJNDQ7ZVV2kHT9SX5chvMqrnvvtJeYrpMON251wSxd2mRe8teFoxVgrkLvre5bP481pw8iEy0C7GD1wOH0= 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=JOynsnC2; 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="JOynsnC2" 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 67SDWYoE1593807; Fri, 28 Aug 2026 11:31:50 -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=eZgx1 gC+xXunhH/xM1+DamVdnHKl3ayKwQkj5UqugSs=; b=JOynsnC2idk41XNtAjC3S Ng/lFnxD+9/2c3bgyrYDRv4/J2JVkBIS+8Loe5+uZ0omOpxvAHRT/HHUrDxunY/o ld7W1gUvWG0/mHTA1bfTLQPiIGs5ByNde0UwUwEzZ44hmgkHEJm/MgKqjaJXIpx/ cygODVhiGWOD+bKaXhRJzC436dxMfSUG6zFtlIARBKXUwG+hueTmDSGFfCgpTXQx wvfjlw9MWmGhjTG3lRs1GV3JuAPSh++yT7thqcphAXbUR9OQWFpxi/su8D9NZjim Xqa0ci6XnAY2oT4GWkHPhm2XiiJiBB33LUvH/Dw4FeDqCFpTO3Ik4kLiUfE6uM+R Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gbaebgvkh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:50 -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 67SFVmv1013218 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:48 -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, 28 Aug 2026 11:31:48 -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, 28 Aug 2026 11:31:48 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3u031424; Fri, 28 Aug 2026 11:31:40 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:38 +0200 Subject: [PATCH v5 15/20] 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: <20260828-ad7768-driver-v5-15-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=6885; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=Q/tCh4kW7Xhqsku3z4K7mJzTnTmPCy+ik5jeQfI2t+E=; b=fsERMXpIzg9grsuriPR/Fa0FTtzuo6kz7TIy+yCY5oBU/QD1Z+fPEbgNcUqmwcAMe+jgs8Enb Th/ObcOcdeGC8/WyBI6ZgnAiGqZIWzVLpxWQ7cVGPpDhufaqVSKTjCH X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX20mKJDW5thKN gr2hN/atWVse8+AQ4ZRNY/MVJTS/T4ldcJZpnatYsCO9g2xMurDm8fYQ1uH7IJspMQUUFsUVrpc rJisnoheBis4wdeicVmBKJEIXtY5G5NuZviHsbc1yE4fB7hjsjzM X-Proofpoint-ORIG-GUID: nfs7J2quz_lNN-_1-nf-ypmFeSjeO3JJ X-Proofpoint-GUID: nfs7J2quz_lNN-_1-nf-ypmFeSjeO3JJ X-Authority-Analysis: v=2.4 cv=WMtPmHsR c=1 sm=1 tr=0 ts=6a91a9e6 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=gAnH3GRIAAAA:8 a=-yOam_tWmGQwaYRI1VcA:9 a=QEXdDO2ut3YA:10 a=br55WurUj89AL1qEz8Q6:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX8TgJOmwYyCfU tgf7iNz0DUGJptO8Np+ukki4NFMS4QhMbLq4KM7r30bRojBwhuw3TlmyoQjTU5kDCeNCI6p6wJi bvUZWLOFudZ8nQVVkvYukvtMkTTTkjp6LoZfOZW7JB8sPg852tFxaAYWaT66eLmht6octnH5xa1 dhFVchAuC0AMZ8q4uIe9blB72gdNNtoxcz56YIMQBFQnyMnPRheyhfdwR1nYMGs2dpwaWHjTJK/ Y8uHfZH8w7PKl27aLu2XsX3ck0CLUEhoi7Kkyn29UAe098Pr4Bz8XHVzcEWwLrv5/Bc8UqfeEli csf5TahM0IIfdZhEA84d/6FNr60D0O2hBjK0uPLyptutoJytgQFr1mH9y30HQrSm+lJlG7FZzFw SSfsrJWSGpyLv/mZnIB94GyuOZlooVySPQs4lLHqnI/hDv86xJ24LBXCuiiBO/EOFtEVPs0hTVT GbVRI+ilCEyx2bd+Thw== 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 malwarescore=0 clxscore=1015 adultscore=0 phishscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 48bb108382b5..a16f36f9502c 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -432,7 +432,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 4133e3a033b4..5e93d4632f17 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,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 @@ -191,11 +196,157 @@ struct ad7768_state { u64 ch_convdelay_ps[AD7768_MAX_CHANNEL]; 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, }; @@ -1489,11 +1640,13 @@ static int ad7768_probe(struct spi_device *spi) return dev_err_probe(dev, ret, "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); @@ -1614,6 +1767,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 Sat Sep 26 22:55:39 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 AFB4437FF5A; Fri, 28 Aug 2026 15:32:02 +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=1787931124; cv=none; b=cIiDmNSDeCbLa9bvuMUd1NjPhI1l9bjhNCwb12GLLn3zkL/WtUMZQyub+dxYJE4CHobSvrUrhEKUu+RbEZPbn2QPc69IyjpF10I5feBZt6tlpCoyuzUEP0ELmvR6O/38vPu8rKuiru5AbCYXY+35dOV6CFxBigvsNkiw0CwUpr8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931124; c=relaxed/simple; bh=ywzzWonKoGfdqANxtzvHh/+8FDFyv8wOgH7XJ21Jxbs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=dlIHrJvxx6snKmmbB71QDWDXS34bwWlvIv+WACp7M9RJW+pYDno7YPH2QvabHvavO9NCl/cQjN/1jXadPY5vZBAs3/2XOGOPqxqT5CIAadtfzaKTKxrMfIi0cqzhOdUGrkLYXre9RJuuKKz7CgDeIs2e4fTY1g88i235BcCCAOs= 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=ak9lIpwy; 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="ak9lIpwy" 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 67SDVgLH1142281; Fri, 28 Aug 2026 11:31: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=cGaC6 KWNucSHpHC6GYQ3aQxoexWBl9slIVVgZKHN1XU=; b=ak9lIpwyBSMxL7S0aANXa y/8gwM5/o2vDmzsUkENCtYmXYoESfKCPHLZhwXK5Q3+qO8ssqSzYP5mROMuXNpSZ OQ+Sw1nHdaZ6JaLLLPGKcyhGc2eFNK7VdBu3XGktxgeADksdvVuk0ijkvHsAFVwi vWc+fDC0/omigOg0Fr/aN85BiY9nFOHAkwHnsSpIIWvXLAD9NnKkyFm8Fp9sacT0 iCFKS9SD3UCdkeNrn07xV+cYjOjQigx/8wahO3v14W26kCnn/O9rLqzogeOBFwUX aPekD7rcAfd6E6vV7FudT2dkksrgP9j35CTCA3Ei00VRUT3vLnyB6EHNyjOxmsEs A== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gaj3cqj9g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:53 -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 67SFVqKY013265 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:52 -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, 28 Aug 2026 11:31:52 -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, 28 Aug 2026 11:31:51 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3v031424; Fri, 28 Aug 2026 11:31:46 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:39 +0200 Subject: [PATCH v5 16/20] 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: <20260828-ad7768-driver-v5-16-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=3105; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=ywzzWonKoGfdqANxtzvHh/+8FDFyv8wOgH7XJ21Jxbs=; b=9F/0K2wmGh2dxS4vnZE5QLhAJXN7MWdZ6SZIlcW3vxWfjkJAGgeFCY2yR4fWZOJZfEDjUw3uW b5Jta4dm/yqB6+5XGGCay9s6yI3fnDXw2US0ZRd8oeGGTfgaiCzlh8T X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: 3q7BOM771mjghathnFY_M6hxYXzZwSPn X-Authority-Analysis: v=2.4 cv=erHvCIpX c=1 sm=1 tr=0 ts=6a91a9e9 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=N--XFCr6TIEc_64PeIT2:22 a=gAnH3GRIAAAA:8 a=31WsVb4KJGHhfLeZpBIA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: 3q7BOM771mjghathnFY_M6hxYXzZwSPn X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXzFe8kzxhHkx9 gihsjpi0OmUdttMeIQ6ZAoDJewsiwRyS2mt1iqpv8TT9eE9depGSQmCovA0GpNbOAT+jLNXEZOV UBO+LznCnKjAdyURgK3jtrsrbF1YxKsReu10vNXrAG0FTFR778Vo19J3fdWf8VOwEwtVf68R+hF cvVbeaZ5dXPwrGvRqsiOK/wyykqTIeM6kKc2vYpIk8FCX6BWflqtm8xMSkA7tElr46o9S50YRLV 7uaIUrrJ56gSgl+0VirK2oUiYj37fCd5eJazKtSam4kVwZ+kXn5oouWUD4djc56K+Pdz7eyXaOH VdYzDfz3FYxlsWPC92drkvR+OkhmOSY2YcpqKvbaKoCeZDZ/Rw3EhNdS3wosjifZ6mGJj5bX3F7 JAu9/h4OUuwsox+jVQLjrVqojXBgBQwBPxiUz9FU/yJsNbZbW4fwTC5OWFb1o1yS+G5kNllca4e GGDEw8TxBgGhIy4OjFg== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX/rMsNkvujgnL qi4TXSugbB8IpjgPlLD7HCOWXCc9lmdtHLIE/okqVj0DQUcQe4w3/5Xs1WY7UEP6EeGloostYcJ Xk3gkSU7v6rsUTrnO/rM64vOHiHNLoyUBtjZwwQSoNpVYoxpABPJ 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 spamscore=0 suspectscore=0 malwarescore=0 adultscore=0 clxscore=1015 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index a16f36f9502c..68334793c9ba 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig @@ -433,6 +433,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 5e93d4632f17..71d91ac6eec5 100644 --- a/drivers/iio/adc/ad7768.c +++ b/drivers/iio/adc/ad7768.c @@ -6,6 +6,7 @@ */ =20 #include +#include #include #include #include @@ -117,6 +118,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_GPIOS 5 #define AD7768_NUM_CHANNEL_MODES 2 #define AD7768_CALIB_REG_MSK GENMASK(23, 0) #define AD7768_WIDEBAND_SETTLING_SAMPLES 68 @@ -186,6 +188,7 @@ struct ad7768_state { struct mutex lock; struct clk *mclk; unsigned int datalines; + unsigned long gpio_valid_mask; enum ad7768_clock_source clock_source; unsigned int power_mode_idx; const struct ad7768_chip_info *chip_info; @@ -1234,6 +1237,34 @@ 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; + + st->gpio_valid_mask =3D GENMASK(AD7768_NUM_GPIOS - 1, 0); + if (st->clock_source !=3D AD7768_CLOCK_SOURCE_MCLK) + st->gpio_valid_mask &=3D ~BIT(4); + + /* + * 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", + &st->gpio_valid_mask, 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) { @@ -1772,6 +1803,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 Sat Sep 26 22:55:39 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 45B50364059; Fri, 28 Aug 2026 15:32:53 +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=1787931174; cv=none; b=FDf5iKM9P7upCrZwbkjtiqRjUXcFbK2KKp+SH9Cn2za66P2rG6vDCvtYlz0u0ciXcIZcOi5eTB/5vRF5LuIZSUiBWZ8E2vQtl+zxAqEr3EH4sHiAT1KCbvTTE1xQUfHb666J19s2Ko+KF9hm/nybx2OjTy9VeQe7dZYcFjJt1CI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931174; c=relaxed/simple; bh=cIFKPg7aR19JvA32/JMcyUeMAkV0UsHAmAU+6sSAUBU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=huWNvKL0eTws6o0c0abL4mzHh/AtXt3cn/ho4jokjEmGkiUTYZ4qdte57lqIQTS5VgquTSZ1CupbLTfANdJbdYosnHlibjxlcbf2gix8zE6sOzXHo0bz817EmM+urRNuFKc5w7U5gluHV9VQb8aa+rEvZsV0HnpoPk9Ly+8qcDU= 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=FOsPjMR2; 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="FOsPjMR2" 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 67SDWYoK1593807; Fri, 28 Aug 2026 11:31: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=hREVb gNyWj2wZiKrMUXMIztb7e8NfeL35pSryE9Au/U=; b=FOsPjMR2y5X4qUsrrhKVQ qSoETD+0F9IrkyfdPPimoCxllBsVGvW7HBNZp79uN8h179LK7aFvHcFx8ZdRpstM vra7+Mll9lNTc508fo3on3D2LxTC12mlp3vy+VvH6LwP9Yrp49tx3uNsDIoZGL1y akmwywDG9Q1UPi/EpQrIs1JOT5ByGWUBqKrRSK3dZvXk46GdwYf0IYhk3CFbF7Yc 2FMiKSWQqqO+MIuJqOju2/3tVMthe5NyfoOktwS4T71SyNVg7fNrYpyp17r6E/14 /PAjMehByq42buuQg5i8fVovGvFv+wmu1exaXFlP++JZFnoRuY3E6ms9MSrSX+IQ Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gbaebgvms-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:31:58 -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 67SFVt0u013282 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:55 -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, 28 Aug 2026 11:31:55 -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, 28 Aug 2026 11:31:55 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3w031424; Fri, 28 Aug 2026 11:31:49 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:40 +0200 Subject: [PATCH v5 17/20] gpio: regmap: Use regmap_test_bits() for single bit reads 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: <20260828-ad7768-driver-v5-17-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , Andy Shevchenko X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=2016; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=cIFKPg7aR19JvA32/JMcyUeMAkV0UsHAmAU+6sSAUBU=; b=wcFdQeEED1ChQXMqVXT74/A8nRPiqdKrbO5yAfKuR9ph2nW3htneCUyvJX1F77qowX6jtrAKn +Mb5/mANOpOBHQPNjvs2FEoOCHoOOc6rw42WKvLdwh+4TVNXZDNeplf X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX4FLEE+/UNTga DdPafSqBDo+hcI3eLQmF4TPXcawmFLJHyDTQrEhTu2pcUCknui9HFHDYbsuuxiSeOO2yeWMaFzx gjnaiy0KQCcePEoqPlrPyLSDMVDeeGfjwtzobGfucPddYb9RB+DI X-Proofpoint-ORIG-GUID: 0Q-UURXz2nRUqTFNNWfgmc4F0j34f3p- X-Proofpoint-GUID: 0Q-UURXz2nRUqTFNNWfgmc4F0j34f3p- X-Authority-Analysis: v=2.4 cv=WMtPmHsR c=1 sm=1 tr=0 ts=6a91a9ee cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=Z0pTeXoby7EwIRygza74:22 a=VwQbUJbxAAAA:8 a=QyXUC8HyAAAA:8 a=gAnH3GRIAAAA:8 a=D1cL9gYDKEHF3ZsCBWwA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX4vu9HOcdI0BI sXssbVAobCf5totu8fwlwlCJ6A9909AImVs1gBs/j633q8qu7n3LdrdVM0CGkn31X/aGIPVY8H9 hjzdHwHuqKyJ1tp8dntiZ4RRt2EhnbFAKPr1GNHN/nCrpONFmFL4qkbuddbxMb/OSmu1yV6xFRN ocB/snY6lN4lKdD+AU5wdKA5D7KQMz8GmCBkSmMLNXU8xc393EOAPVLPfTg1F+/nmZQqC2AbWsr aXBfplPN8IoSKmbOpamDP9M7Cyu/b+q0vHkv9Cuge7xy5jonPHU4gm8i7HKScuaUrui6kc7++So 2pXDlQx4mkb2lhxLh0Xe6hRW5O567hfpRwIgJ8K/rG/VdpR6AhFjP5wazoHsGixhvbBqLdY6YrJ pLtXVZJA+si67U71BxcqgE0iW+9g0unS4NCI0Q4h+HF1YtGufvu7tXvrjZZGwG7D4us1tJq+rib +ZnMndnxLHx98OXi66A== 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 bulkscore=0 malwarescore=0 clxscore=1011 adultscore=0 phishscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 Use regmap_test_bits() when reading a single GPIO value from a normal register and when reading the direction bit. Reviewed-by: Linus Walleij Reviewed-by: Michael Walle Reviewed-by: Andy Shevchenko Signed-off-by: Janani Sunil --- drivers/gpio/gpio-regmap.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/gpio/gpio-regmap.c b/drivers/gpio/gpio-regmap.c index 51b4d69b8740..0012e03d0d4e 100644 --- a/drivers/gpio/gpio-regmap.c +++ b/drivers/gpio/gpio-regmap.c @@ -83,11 +83,11 @@ static int gpio_regmap_get(struct gpio_chip *chip, unsi= gned int offset) if (ret) return ret; =20 + if (gpio->reg_dat_base !=3D gpio->reg_set_base) + return regmap_test_bits(gpio->regmap, reg, mask); + /* ensure we don't spoil any register cache with pin input values */ - if (gpio->reg_dat_base =3D=3D gpio->reg_set_base) - ret =3D regmap_read_bypassed(gpio->regmap, reg, &val); - else - ret =3D regmap_read(gpio->regmap, reg, &val); + ret =3D regmap_read_bypassed(gpio->regmap, reg, &val); if (ret) return ret; =20 @@ -157,7 +157,7 @@ static int gpio_regmap_get_direction(struct gpio_chip *= chip, unsigned int offset) { struct gpio_regmap *gpio =3D gpiochip_get_data(chip); - unsigned int base, val, reg, mask; + unsigned int base, reg, mask; int invert, ret; =20 if (gpio_regmap_fixed_direction(gpio, offset)) { @@ -186,14 +186,14 @@ static int gpio_regmap_get_direction(struct gpio_chip= *chip, if (ret) return ret; =20 - ret =3D regmap_read(gpio->regmap, reg, &val); - if (ret) + ret =3D regmap_test_bits(gpio->regmap, reg, mask); + if (ret < 0) return ret; =20 - if (!!(val & mask) ^ invert) + if (ret ^ invert) return GPIO_LINE_DIRECTION_OUT; - else - return GPIO_LINE_DIRECTION_IN; + + return GPIO_LINE_DIRECTION_IN; } =20 static int gpio_regmap_try_direction_fixed(struct gpio_regmap *gpio, --=20 2.43.0 From nobody Sat Sep 26 22:55:39 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 58E77367B7B; Fri, 28 Aug 2026 15:32:12 +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=1787931133; cv=none; b=FqrS7RCQ/xTwuiH22wOWbtFi3YUfF78HEZyBHGDoXaonShE9uuRHQwW/qCDAwpi5Uzh9jInaI37TQtWYFkYhP7NorJl16PpeFju83fz48L5DiqJtqdjqAQlTr36bRAoj1308laPf1185NMIRFq896Yx+iu6fdpVTm6O5NoQF2lY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931133; c=relaxed/simple; bh=X1hv+PCpqd//A2k5lOrjjeYljMGeKJeVpAfRmNb21f0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=SKLDhSCLSR9Kz/g2DgVF6t2jFNdT6S/Fu1Pwle7ZVQKlX23hWv1UQ0YTyF5UwBfC4crmy0rNcWhNuiM7Q1+rjheSG7+t65usZ+pRvoZt1+9XDR5+sIcF21lgGNor5aTIy1bMZxZLgE6+/jq54yoq1XXvSdBFkoaHACjw+fYZk04= 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=AVPZ0ZA7; 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="AVPZ0ZA7" 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 67SDWNhf2013139; Fri, 28 Aug 2026 11:32:02 -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=D9vQ2 V4TfQ3Eqz/lRuMaccfLAZbzWqAduV3RT87Brn0=; b=AVPZ0ZA7+WBUJls/kuryG ThLsYDAO06U2ZC2Rp1dch+3kM73+mGrhaMg1yy/3s2QjemVPd7nf0teUh3ZDoTb1 XFtuebTaNc2ofqgVn3r/S+E5SEOkxJxSVIKJkLdoPvV/RXA5u0wnsuGoTTYALLp7 w1smfUFWC2OOjAQ42Twra3HgyWtUvwGlXoJUMYeyOLK2irpmu+xZD4eDdv0OvShI AGfvjpbk/7bhwoZ77KnaXqhrLXcR6vmDKpQUHwFLH0Wl0aFHOVQIM/PPehhVCDKL 7dVo3pMEYQakIHYDlangLVl2gk3yrBzedgJSTPHYC3u2/paPfP9dNoJRAnaKHuBR g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4ga1m14f20-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:32:02 -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 67SFVxTS013304 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:31:59 -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, 28 Aug 2026 11:31:59 -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, 28 Aug 2026 11:31:59 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY3x031424; Fri, 28 Aug 2026 11:31:53 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:41 +0200 Subject: [PATCH v5 18/20] gpio: regmap: Add optional runtime PM 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: <20260828-ad7768-driver-v5-18-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=6335; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=X1hv+PCpqd//A2k5lOrjjeYljMGeKJeVpAfRmNb21f0=; b=t8rrD4WzYq491LKZIZFaPVxNXq7nvzMRPYx5aZ/U0UrbWUyEEjl4h9TgiwoPm9xNqd5DMkNkR EEQxNYb4IGMArimVqgIJiVpVp9LpBmsJnyJ2mXQiSOZ1nYcgJ1ao8F3 X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: Gifzs-XWmK891lwg6AcA5oF6AUE9CDK1 X-Authority-Analysis: v=2.4 cv=NtLhtcdJ c=1 sm=1 tr=0 ts=6a91a9f2 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gAnH3GRIAAAA:8 a=3fJ8ZLtifNgCll64qzMA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: Gifzs-XWmK891lwg6AcA5oF6AUE9CDK1 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX0MDhN7Qk3A/r lvrFDJeLiQBUhhfMYZjMyE+tEauYLitb29aiowsaESGNheDVCIXBJHXB7W7QYvkH2GNmfYhBo+v 2nehZTELgq7oj7JYB8v1oUkaDJwLqtzkioHgP6ph5b+Xk05ygb917xDvn275a9E5uI0/8J0IvlE AQYXHkGD4yMOng/V+UT9v/3ZmCLM8WezhT2nQlMS9QTEtKKEPDSlLRneqOSK7K3/i+KVwId0Miy p7llwsK7zx1jNBpd9HHkdnTwapXWlcK4k8SWVRUiV9QcU4eQ50ZKl/X6bIYO6lw1yQBYytkV0Wg P/tC9/coZQpkIGs33hRiRbSzQFSiLIKu9DrXLlBfedqPFsP/RVBmwfxjpGGU9UVtUQ/GSPafySx CnNporusssXqie+vS6Kyh3PNKbl/o0ZQuJT8jJcxLsnDAFJhP3tsjjjLD/qyi0tivLn2Nwg9N5L nUt9HFKVOXI+Zo+yTXg== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXzkRGMeIA24W7 9ZUfeWptFZg0hSudV1Gw2eOty2hpO1ZaUeSWipI9GTlOC8jClAplJAu1l8UhaxRvuB+hqGbHRwN u/yH65NmxvaAPP8wmDPvA/AJTXvMMY0vCKE8msrIuF6TE2Tu1E6I 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 bulkscore=0 priorityscore=1501 phishscore=0 impostorscore=0 adultscore=0 suspectscore=0 clxscore=1015 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 Some gpio-regmap consumers share their regmap with a parent device that may be runtime suspended. GPIO register accesses must resume that device first. Add an optional pm_dev field and acquire it before register translation or access. Release it using runtime autosuspend after each operation. Keep the device active across the complete direction-output sequence and propagate failure when setting the initial output value. Signed-off-by: Janani Sunil Reviewed-by: Andy Shevchenko --- drivers/gpio/gpio-regmap.c | 67 +++++++++++++++++++++++++++++++++++++++++= ++-- include/linux/gpio/regmap.h | 2 ++ 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-regmap.c b/drivers/gpio/gpio-regmap.c index 0012e03d0d4e..154916050ac5 100644 --- a/drivers/gpio/gpio-regmap.c +++ b/drivers/gpio/gpio-regmap.c @@ -6,10 +6,12 @@ */ =20 #include +#include #include #include #include #include +#include #include #include #include @@ -23,6 +25,7 @@ struct gpio_regmap { struct device *parent; struct regmap *regmap; struct gpio_chip gpio_chip; + struct device *pm_dev; =20 int reg_stride; int ngpio_per_reg; @@ -67,6 +70,33 @@ static int gpio_regmap_simple_xlate(struct gpio_regmap *= gpio, return 0; } =20 +static int gpio_regmap_runtime_get(struct gpio_regmap *gpio) +{ + if (!gpio->pm_dev) + return 0; + + return pm_runtime_get_active(gpio->pm_dev, RPM_TRANSPARENT); +} + +static void gpio_regmap_runtime_put(struct gpio_regmap *gpio) +{ + if (!gpio->pm_dev) + return; + + pm_runtime_put_autosuspend(gpio->pm_dev); +} + +DEFINE_GUARD(gpio_regmap_runtime, struct gpio_regmap *, + gpio_regmap_runtime_get(_T), gpio_regmap_runtime_put(_T)) +DEFINE_GUARD_COND(gpio_regmap_runtime, _try, + gpio_regmap_runtime_get(_T), _RET =3D=3D 0) + +#define GPIO_REGMAP_RUNTIME_ACQUIRE(_gpio, _var) \ + ACQUIRE(gpio_regmap_runtime_try, _var)(_gpio) + +#define GPIO_REGMAP_RUNTIME_ACQUIRE_ERR(_var_ptr) \ + ACQUIRE_ERR(gpio_regmap_runtime, _var_ptr) + static int gpio_regmap_get(struct gpio_chip *chip, unsigned int offset) { struct gpio_regmap *gpio =3D gpiochip_get_data(chip); @@ -79,6 +109,11 @@ static int gpio_regmap_get(struct gpio_chip *chip, unsi= gned int offset) else base =3D gpio_regmap_addr(gpio->reg_set_base); =20 + GPIO_REGMAP_RUNTIME_ACQUIRE(gpio, pm); + ret =3D GPIO_REGMAP_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + ret =3D gpio->reg_mask_xlate(gpio, base, offset, ®, &mask); if (ret) return ret; @@ -102,6 +137,11 @@ static int gpio_regmap_set(struct gpio_chip *chip, uns= igned int offset, unsigned int reg, mask, mask_val; int ret; =20 + GPIO_REGMAP_RUNTIME_ACQUIRE(gpio, pm); + ret =3D GPIO_REGMAP_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + ret =3D gpio->reg_mask_xlate(gpio, base, offset, ®, &mask); if (ret) return ret; @@ -127,6 +167,11 @@ static int gpio_regmap_set_with_clear(struct gpio_chip= *chip, unsigned int base, reg, mask; int ret; =20 + GPIO_REGMAP_RUNTIME_ACQUIRE(gpio, pm); + ret =3D GPIO_REGMAP_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + if (val) base =3D gpio_regmap_addr(gpio->reg_set_base); else @@ -182,6 +227,11 @@ static int gpio_regmap_get_direction(struct gpio_chip = *chip, return -ENOTSUPP; } =20 + GPIO_REGMAP_RUNTIME_ACQUIRE(gpio, pm); + ret =3D GPIO_REGMAP_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + ret =3D gpio->reg_mask_xlate(gpio, base, offset, ®, &mask); if (ret) return ret; @@ -236,6 +286,11 @@ static int gpio_regmap_set_direction(struct gpio_chip = *chip, return -ENOTSUPP; } =20 + GPIO_REGMAP_RUNTIME_ACQUIRE(gpio, pm); + ret =3D GPIO_REGMAP_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + ret =3D gpio->reg_mask_xlate(gpio, base, offset, ®, &mask); if (ret) return ret; @@ -260,6 +315,11 @@ static int gpio_regmap_direction_output(struct gpio_ch= ip *chip, struct gpio_regmap *gpio =3D gpiochip_get_data(chip); int ret; =20 + GPIO_REGMAP_RUNTIME_ACQUIRE(gpio, pm); + ret =3D GPIO_REGMAP_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + /* * First check if this is gonna work on a fixed direction line, * if it doesn't (i.e. this is a fixed input line), then do not @@ -271,7 +331,9 @@ static int gpio_regmap_direction_output(struct gpio_chi= p *chip, return ret; } =20 - gpio_regmap_set(chip, offset, value); + ret =3D gpio_regmap_set(chip, offset, value); + if (ret) + return ret; =20 return gpio_regmap_set_direction(chip, offset, true); } @@ -323,6 +385,7 @@ struct gpio_regmap *gpio_regmap_register(const struct g= pio_regmap_config *config gpio->reg_clr_base =3D config->reg_clr_base; gpio->reg_dir_in_base =3D config->reg_dir_in_base; gpio->reg_dir_out_base =3D config->reg_dir_out_base; + gpio->pm_dev =3D config->pm_dev; =20 chip =3D &gpio->gpio_chip; chip->parent =3D config->parent; @@ -330,7 +393,7 @@ struct gpio_regmap *gpio_regmap_register(const struct g= pio_regmap_config *config chip->base =3D -1; chip->names =3D config->names; chip->label =3D config->label ?: dev_name(config->parent); - chip->can_sleep =3D regmap_might_sleep(config->regmap); + chip->can_sleep =3D config->pm_dev || regmap_might_sleep(config->regmap); chip->init_valid_mask =3D config->init_valid_mask; =20 chip->request =3D gpiochip_generic_request; diff --git a/include/linux/gpio/regmap.h b/include/linux/gpio/regmap.h index 06255756710d..ba68d8cbd38d 100644 --- a/include/linux/gpio/regmap.h +++ b/include/linux/gpio/regmap.h @@ -18,6 +18,7 @@ struct regmap; * @parent: The parent device * @regmap: The regmap used to access the registers * given, the name of the device is used + * @pm_dev: (Optional) Device to use for runtime power management. * @fwnode: (Optional) The firmware node. * If not given, the fwnode of the parent is used. * @label: (Optional) Descriptive name for GPIO controller. @@ -81,6 +82,7 @@ struct regmap; struct gpio_regmap_config { struct device *parent; struct regmap *regmap; + struct device *pm_dev; struct fwnode_handle *fwnode; =20 const char *label; --=20 2.43.0 From nobody Sat Sep 26 22:55:39 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 127E0364058; Fri, 28 Aug 2026 15:32:53 +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=1787931174; cv=none; b=k6f/TFxOFm5DkoB6j0DoI9MaWwtZhL4LMyl2AhTbRT0YBbASHIgNIJ0iWZJC4bkF8GuiVhdSELJiDGKXweIHaZGAgkdJI/oqYh9qNDubWq3ZDvopZ0goiyGCXKJOgbgpEUevjFylVrOdHTOK7A0TeOBpSutZyQsJC7J6McwxE1I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931174; c=relaxed/simple; bh=Nf61Yk++7TwW60WX+0W60eBsfKILnmMBeqtfCSFen1s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=W5TfnO/xvkZc5qd8fsWK57Fx/PTStyo9kK6i2YPQ4DU/R+loZOe6L4Uw5d0mDeG1sHiYHGUlt0g/8HiKFkqJWeve8kNdH2VGZV1SrTsT8/qznroPUmKs9IAgTeolkdaLHb3vl/7fl0qG+egb+0YZua01LcuUydz9yz1FIQBBhmw= 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=WCSMUbmb; 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="WCSMUbmb" 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 67SDWNQU2013130; Fri, 28 Aug 2026 11:32: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=uUGEx WTNNwzeqorxSuh/ulOBp1v57miZSzr0N2gsZUE=; b=WCSMUbmbm9Anj/Td2cQu9 JfoqIC/VgYEfVWhbTqr4ZgH2AODxTnGYRX2Bf9hHCnEXaOueBV5+GEw9HYm8dLI1 t18O6NE5bqA0ATPjvOHy7WJOcjUCpXTMt4wUiMZt/jT1R0IPnh6TQA+CZ6u45Y0I +Lb7MJHeZDrA+dbS/14LuVHhcaKZ6jowSaaAFp0FdPnm8B6loL/2SGw5uuczbz0p h3o10c0x4pWjQHwK0ZFNWvfU0egyMZqS38k2dXJeaprKdXjoXEjFqSBuaZCKVQy6 kEpwKsje4D1uTK+0BFdGx2Oii5cseP4oGwPlW22ciG26VGzFs1ugU4ZRmDft09mu g== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4ga1m14f2g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:32:05 -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 67SFW3Wm013370 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:32:04 -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, 28 Aug 2026 11:32:03 -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, 28 Aug 2026 11:32:03 -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, 28 Aug 2026 11:32:03 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY40031424; Fri, 28 Aug 2026 11:31:56 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:42 +0200 Subject: [PATCH v5 19/20] gpio: ad7768: Add AD7768 GPIO auxiliary driver 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: <20260828-ad7768-driver-v5-19-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil , "Andy Shevchenko" X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=5474; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=Nf61Yk++7TwW60WX+0W60eBsfKILnmMBeqtfCSFen1s=; b=azOoW741v2eoprxudcb+9HOo3hwHK5dxtPeuleaqLWvXhG+OfOuZpa7mPoND07Q7b6yUGHGDb KNcrBVPJstoAcp66NkN3tPVW3vlkw9/We9M/c2BLeweRK4nume3opcv X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: OKrxVejNKSv3MCGl7V7xfBNDZDuGNqfp X-Authority-Analysis: v=2.4 cv=NtLhtcdJ c=1 sm=1 tr=0 ts=6a91a9f5 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=QyXUC8HyAAAA:8 a=VwQbUJbxAAAA:8 a=gAnH3GRIAAAA:8 a=8fq82CzG31171KfXEYkA:9 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: OKrxVejNKSv3MCGl7V7xfBNDZDuGNqfp X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXzalCsJSmt8/L oS9Lxom9yMBRHd4HJOyjCjcmB+S9dZ3zeEqP3YNKeHgnaOnZtEwH1e3ufpgwWgp2Dl1fYlYbt/U F36PvF44tQiMxig8SmQsPl9Um6sHgn6UUAMep2O9WdT8bhJyXlnBHYwV8tZ0RV/3GDV7OvpOYb/ cF94HGp1Jd08QFZIwZQjh99wjvFV6l25VNMPrY7fC1K6WIaSdZx08bGnNCRNekW9lbHShDzSN0A kbRKf0VhtjPSk8/Nn/0r2U21TSwafbFfJ8T4UhzveGcUqeuM8B3Nett9E1S2+lHmv3luNs7J+AB t1kacmbW1b5Dz904fFd13Uuq1BqWeIvu63IhAA2uopS3qw+zjFwHfmhlGQs8pvWeVDaUVerke6q LuNjjVcifOMuZWtrhHMWWtWnTCA/C7u8O8Ee7pSM1iHApr/S2U/AvAE3QM7ns8dMCauHtO6Sc1z 1fKadv3/MyEKUADsYmQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXweNH1mLcdfsc FYQfSQAQOqw/kiZHsN++XyvPBn5gIAopqyEefdr259IoKAsxaBz4m21pzXnVt2RwVBlxTi4Af4K bwnPrHikVbwRP/E015R1yuoFH4z3oOaubrxFrl8Y7M1Uwqm7grpH 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 bulkscore=0 priorityscore=1501 phishscore=0 impostorscore=0 adultscore=0 suspectscore=0 clxscore=1011 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 The AD7768 provides five GPIOs controlled through registers shared with the parent IIO device. Register an auxiliary gpio-regmap driver and use the parent device for runtime PM. The device has separate input-state and output-latch registers. Add a reg_mask_xlate() callback that checks the line direction and reads the programmed output latch for output lines while retaining input-state reads for input lines. Reviewed-by: Andy Shevchenko Reviewed-by: Linus Walleij Signed-off-by: Janani Sunil --- drivers/gpio/Kconfig | 12 +++++ drivers/gpio/Makefile | 1 + drivers/gpio/gpio-ad7768.c | 118 +++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 131 insertions(+) diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 28cf6d2e83c2..85cb0c82a823 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -1796,6 +1796,18 @@ endmenu menu "Auxiliary Bus GPIO drivers" depends on AUXILIARY_BUS =20 +config GPIO_AD7768 + tristate "Analog Devices AD7768 GPIO support" + depends on AD7768 + depends on GPIOLIB + select GPIO_REGMAP + help + Say yes here to expose the AD7768 utility pins as GPIOs when the + device tree node is marked as a GPIO controller. + + To compile this driver as a module, choose M here: the module will be + called gpio-ad7768. + config GPIO_LTC4283 tristate "Analog Devices LTC4283 GPIO support" depends on SENSORS_LTC4283 diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 4d0e900402fc..d2921963efc7 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -27,6 +27,7 @@ obj-$(CONFIG_GPIO_104_IDI_48) +=3D gpio-104-idi-48.o obj-$(CONFIG_GPIO_104_IDIO_16) +=3D gpio-104-idio-16.o obj-$(CONFIG_GPIO_74X164) +=3D gpio-74x164.o obj-$(CONFIG_GPIO_74XX_MMIO) +=3D gpio-74xx-mmio.o +obj-$(CONFIG_GPIO_AD7768) +=3D gpio-ad7768.o obj-$(CONFIG_GPIO_ADNP) +=3D gpio-adnp.o obj-$(CONFIG_GPIO_ADP5520) +=3D gpio-adp5520.o obj-$(CONFIG_GPIO_ADP5585) +=3D gpio-adp5585.o diff --git a/drivers/gpio/gpio-ad7768.c b/drivers/gpio/gpio-ad7768.c new file mode 100644 index 000000000000..587ac8b291b4 --- /dev/null +++ b/drivers/gpio/gpio-ad7768.c @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Analog Devices AD7768 GPIO auxiliary driver + * + * Copyright 2026 Analog Devices Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define AD7768_REG_GPIO_CONTROL 0x0E +#define AD7768_GPIO_UGPIO_ENABLE BIT(7) + +#define AD7768_REG_GPIO_WRITE 0x0F +#define AD7768_REG_GPIO_READ 0x10 + +#define AD7768_NUM_GPIOS 5 + +static int ad7768_gpio_init_valid_mask(struct gpio_chip *gc, + unsigned long *valid_mask, + unsigned int ngpios) +{ + unsigned long *mask =3D dev_get_platdata(gc->parent); + + bitmap_copy(valid_mask, mask, ngpios); + + return 0; +} + +static int ad7768_gpio_reg_mask_xlate(struct gpio_regmap *gpio, + unsigned int base, unsigned int offset, + unsigned int *reg, unsigned int *mask) +{ + struct regmap *regmap =3D gpio_regmap_get_drvdata(gpio); + int ret; + + *reg =3D base; + *mask =3D BIT(offset); + + if (base !=3D AD7768_REG_GPIO_READ) + return 0; + + /* + * AD7768 has separate input-state and output-latch registers. For an + * output line, report the programmed value from the output latch; + * input lines continue to use the input-state register. + */ + ret =3D regmap_test_bits(regmap, AD7768_REG_GPIO_CONTROL, *mask); + if (ret < 0) + return ret; + if (ret) + *reg =3D AD7768_REG_GPIO_WRITE; + + return 0; +} + +static int ad7768_gpio_probe(struct auxiliary_device *adev, + const struct auxiliary_device_id *id) +{ + struct gpio_regmap_config config; + struct device *dev =3D &adev->dev; + struct device *parent; + struct regmap *map; + int ret; + + parent =3D dev->parent; + map =3D dev_get_regmap(parent, NULL); + if (!map) + return -ENODEV; + + PM_RUNTIME_ACQUIRE_AUTOSUSPEND(parent, pm); + ret =3D PM_RUNTIME_ACQUIRE_ERR(&pm); + if (ret) + return ret; + + ret =3D regmap_set_bits(map, AD7768_REG_GPIO_CONTROL, AD7768_GPIO_UGPIO_E= NABLE); + if (ret) + return ret; + + config =3D (struct gpio_regmap_config) { + .parent =3D dev, + .regmap =3D map, + .label =3D dev_name(parent), + .ngpio =3D AD7768_NUM_GPIOS, + .reg_dat_base =3D AD7768_REG_GPIO_READ, + .reg_set_base =3D AD7768_REG_GPIO_WRITE, + .reg_dir_out_base =3D AD7768_REG_GPIO_CONTROL, + .pm_dev =3D parent, + .reg_mask_xlate =3D ad7768_gpio_reg_mask_xlate, + .init_valid_mask =3D ad7768_gpio_init_valid_mask, + .drvdata =3D map, + }; + + return PTR_ERR_OR_ZERO(devm_gpio_regmap_register(dev, &config)); +} + +static const struct auxiliary_device_id ad7768_gpio_ids[] =3D { + { .name =3D "ad7768.gpio" }, + { } +}; +MODULE_DEVICE_TABLE(auxiliary, ad7768_gpio_ids); + +static struct auxiliary_driver ad7768_gpio_driver =3D { + .probe =3D ad7768_gpio_probe, + .id_table =3D ad7768_gpio_ids, +}; +module_auxiliary_driver(ad7768_gpio_driver); + +MODULE_AUTHOR("Janani Sunil "); +MODULE_DESCRIPTION("Analog Devices AD7768 GPIO auxiliary driver"); +MODULE_LICENSE("GPL"); --=20 2.43.0 From nobody Sat Sep 26 22:55:39 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 D767237701A; Fri, 28 Aug 2026 15:32:17 +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=1787931140; cv=none; b=OM3r/jZ5tpDcmmt6g9E4Ysh0LYmMXHFrWGz8K2tgfTX/0jqZmj10E1oXuoOIOhclkbVOldtuc+7Nk7VXs5cKSyml+mGyVnkOYYS47YIVISRy4wBv1F/voHi/aMb1MR6xC4/CchBjxKbSCD+NiwIKWGdLRJoqJ6GEBWqkBqD9/I0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787931140; c=relaxed/simple; bh=8GXAjFXrLmaXcOCSocwa7chTBxgbpVn9SRQL7738Y4Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=O2pkc/PqMvDNPmlV+DfDmb7S5M8arpSiiAg6Fws91mRo5EmlbAiDVgdgv5itzznDowH/yjKEUHGZUbvjRlW0F0HcLyJZU3VTfR5mwMfLJzvV5TI+7/vYq9qF2WWrHzWy/eCl3Zjrh95fc5asbNpekqhAGbjyHmFI+BaS3EXt7I0= 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=WAWYjl7s; 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="WAWYjl7s" 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 67SDWPtl2013156; Fri, 28 Aug 2026 11:32:09 -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=B0Xlx 7Vp/kS59ALHq5VL1v1R3xvtEIhH7+RGUJ1zKuc=; b=WAWYjl7sR86CbUaYjAM5Y 6N4PMZTGApMFGO4Qc5jlpuWeWjI8ApG3bMhk/GdiBoPbHv37GMmUaTocNchdA32W VhZPaOlttEhleOwm370z6JdTcGg6bqCwGu1k/N0CgFzhE855OS4+j40plfpQcTKM iQquL9gg55495cIu7vYyR6Ywl96vrJVyFY66rPIqwYQiCNZof7NQ7zKxFntVidv5 S9BHG8KY8bN8jjz2ErdPN9h9hjyNxKhFSStYtwOQK32VslmKViNHQR4p68wLCZg5 Kvhe0pQc2FDqYOcC0rOGyK16LPcnjnfoGdWxM0IBWVJSV3mxT+0LbpADWD/B2WaA Q== Received: from nwd2mta4.analog.com ([137.71.173.58]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4ga1m14f2s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 28 Aug 2026 11:32:09 -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 67SFW7cU013385 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 28 Aug 2026 11:32:08 -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, 28 Aug 2026 11:32:07 -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, 28 Aug 2026 11:32:07 -0400 Received: from HYB-e1y2fvUQ3cx.ad.analog.com ([10.32.223.174]) by zeus.spd.analog.com (8.15.1/8.15.1) with ESMTP id 67SFUY41031424; Fri, 28 Aug 2026 11:32:01 -0400 From: Janani Sunil Date: Fri, 28 Aug 2026 17:30:43 +0200 Subject: [PATCH v5 20/20] 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: <20260828-ad7768-driver-v5-20-e33ca6f841a2@analog.com> References: <20260828-ad7768-driver-v5-0-e33ca6f841a2@analog.com> In-Reply-To: <20260828-ad7768-driver-v5-0-e33ca6f841a2@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 CC: , , , , , , , =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= , Janani Sunil X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1787931034; l=10704; i=janani.sunil@analog.com; s=20260507; h=from:subject:message-id; bh=8GXAjFXrLmaXcOCSocwa7chTBxgbpVn9SRQL7738Y4Y=; b=zzMKKE6YOyUwlsFvqjc3iFrioGqaUzzfFKodvakq3iNZw98c23sUXu1XDh61izXWpjBIzSlWQ dIw3807ETi2B5xB3hq/PEN2I1h61uLs+7N/VOSFDoD/VaGSoSqEmJm/ X-Developer-Key: i=janani.sunil@analog.com; a=ed25519; pk=e25MyjRLPY3RWrYm/LrJ+/+t1MZJUbkgIW5CZg+g+hA= X-ADIRuleOP-NewSCL: Rule Triggered X-Proofpoint-GUID: fXwRZQoUYmprAzcFiJyNVlh07gmF85yc X-Authority-Analysis: v=2.4 cv=NtLhtcdJ c=1 sm=1 tr=0 ts=6a91a9f9 cx=c_pps a=3WNzaoukacrqR9RwcOSAdA==:117 a=3WNzaoukacrqR9RwcOSAdA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA: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-ORIG-GUID: fXwRZQoUYmprAzcFiJyNVlh07gmF85yc X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfX5JEHY5Lyp9E4 5XNmXIVMbdTPUi18pon8HNA8H9GMpqMFdvkiwWasLZuNGizfKvmK/GMXwy3X4sr6da10zkiy28C Dz2mu4OvW0aojMhyTH533AdZfKW0iBDvJ4XsclgXUys6lQCRA/FbJl6OwZYkbU50Oq94Syc1XeX BiLmwx9/5ZDHGNZZUGlatBgm/m23sZeZQN3rwDlCGnfrKEoa5mHEbNxpmW6R/Lq0OZ7feVA4KmJ FGSO2s9//m+io2COBPC1Ttb6rAqci6NDSRASjc7Dq3atK4+UFGBo1Aq3T9oHSKYLMPorg8cW0iO Gm7WfOfgtXVj9iBUElXqa4P4TSa9xaNp9JoQxKQv6ry4oEDqrtlC+qk2Y9GIAovHDEhNuuqOzyD 60V38ohgZyrLkt+TSr1J+PIxRUZS35Of6kZDxjVBZM1q2f9g+p3RmrI4LScSIpJMaMm5VuQ4FvL T/xBmqSHT4HSVxSCU3A== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDEzNSBTYWx0ZWRfXx99XDqShQyMS 1d4S1udFPLSTbwPEQKydHNYq6Qx/bp3Hckd0w91n709OlelbdWx195qrwGNoW3PI7UevBx4y5qe 28fR0SajkjpIczLI51qKWFZmMZU2PSNV0S+/wtDwCQUsWui3gh3J 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-08-28_04,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 bulkscore=0 priorityscore=1501 phishscore=0 impostorscore=0 adultscore=0 suspectscore=0 clxscore=1015 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280135 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 dc94e7803a7c..229f49730138 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1639,6 +1639,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