From patchwork Mon Mar 3 11:46:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 13998678 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5444320B7E6 for ; Mon, 3 Mar 2025 11:47:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002464; cv=none; b=G7YcNm7qWO17Gqfc3cfV9sFR2pPGDnI+dWS4DUn75cQ/Iac1aIOllnWhHuXS8Y0QUN97LwZ9vRIxEiWdQMUgl6LZJQAYZPS2Lcj3YGZpj1OwJapePFaXn0mejCkZyV9IMRY3dADGbYxF8Xr5TNfr0GtBf2z8vW+xBKhwEd5gkKs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002464; c=relaxed/simple; bh=aFcJsLIM3cdSSP2ZKtYFolUMMu1Z1B26+vDxNxrArwM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=LotCfkF7LRH4XoO1QxTio4/p7BEcEiLXl31kAyC/OUz6Ux/QnXTX9/6d4eWSgMtuy2FbSHZ65oPjazdK0tkQ3i6m6UOp+kYp/e3OLLuQ2WJ6a8Y6/5E1UvhG5g+pe2637ZvwytA0iOqY02MHpDF8213jxavvQE57YAJuaCIKEno= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=AGX6qDMP; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="AGX6qDMP" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-4393dc02b78so27117635e9.3 for ; Mon, 03 Mar 2025 03:47:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1741002460; x=1741607260; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fD2W5spHwFZMZCXHsDH3WDbcND7HpNlEPuCt+X3A6+A=; b=AGX6qDMPKzBrT9uAU9WUWlrmLa/+HkboYORSa73/SFeeqQ0BFjy13DC4NiQhQXKWJh 8yUinCsNqAjGnKGUMz7AYnSXMvHq5x2q2dtiUmlvEyRH1LE9xS4LP6gAxlg1BjM2MoT9 +S0Mk7SmkXdDg9D/qi3XIrKTDDQdcDLabvnTcEeCUXl+K9Cw7+RWvjKz/YbyNo3NjxvP 7Ie/zqY4uZVhKQy5Qix+UIlnwK5UPT6ZXXGrEt2y3h1OLALc/K0HBrbnAm+QPK3xCNbj vLce8pDOz0pNrG7ezs30i/W7DYOOnIzlMaaZP6xOTxZImtlFpvbhKoqvxaKnVNHqQ08A SIEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741002460; x=1741607260; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fD2W5spHwFZMZCXHsDH3WDbcND7HpNlEPuCt+X3A6+A=; b=O7Z7CO7eEpsTMHiyfXGE4z7K+tn8ue8pm2lmmrHE2V5jcW3cMuPznidL9Wp5IYebYn iDUX7mtx86VqP/SLkFQJkpXtQHlweexGPBFea9ugxjofDp99yuu57yUNh3QeiLHMgdSo RNigTglledrf/qzIbEmlpKfOyi/Ko2qNYlR/iCTrWathoCaH/AlnBKDJPVE0+QeBVLN2 DUX53CkWw/lqdQ062iOTwoYOYD9rLSQze34db3jLdR6YRo+C8WefpWiUD/6wLx1gJ0du ghNImNIyhtq4BO8uVbsOTwjbkXpX9CMW+WJaYONlrRrhzktEUSx/kFaUtTndLc4zl+IL qyNw== X-Forwarded-Encrypted: i=1; AJvYcCXMaUFh18L+7zyAj3NTty9Dw326PIEGOP4U7ib33C5ChxLuI7lmwP/qEhBC94PlK7cIzOhPM9u9Q2Q=@vger.kernel.org X-Gm-Message-State: AOJu0YzUIcKe1Ztp3M5V2QUhhWP9I7h/bP+IaKtN8cSbTenyM1mzc4kl zpTgx+vGavldxj4qdLdUsF43mHyQJNDync/7ujXM+7F9OWJ5sbpFyz7gDr7Dnfc= X-Gm-Gg: ASbGncu1ebJd1a2ZfDV3gMG/QrYZ0Oy1lFgJHLSCmRbLmtHao1QprhKQ3dbscKJxNZP v1auaRGpI5lj/LqaGZzXnPQSvbz4lBE5b3gYeWAkyAr3+ZhXD0Z3M7dtBi0yGadRdWfuKZOGz3y DCwk7YdXLWyex5bwzH3CTfPJ6bZj/k03uzug2/N49lSN73qJKpXFZxjbDdR4buqsl7XPgsq3Oxi 8icNkoUtwLovQ+WXEpihiQPyLWVjUDeqCk6HIzvIA2vd5sfnYF1oahHYCx51krZe5VFqTKJZHNk bvFZUZgICVnDRW9Y5/BRho1W3R5eRMqKDp5i7yZ4NGsPFRjtItmJuhhyeHpT1EdzbK1ZCqz5Rq4 pon2X9zupzfZan8zmh9gmt1DlrA== X-Google-Smtp-Source: AGHT+IElYqKKYXWK0QS+vSvd1EzRFOK/gfCXSM63txcjRymmf2gCmddJGZCNMDVgYWJ66ef9goIAiQ== X-Received: by 2002:a05:6000:1847:b0:390:fdba:ac7 with SMTP id ffacd0b85a97d-390fdba0c01mr5447474f8f.51.1741002460636; Mon, 03 Mar 2025 03:47:40 -0800 (PST) Received: from localhost (amontpellier-556-1-148-206.w109-210.abo.wanadoo.fr. [109.210.4.206]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-390e47b6ceesm14101702f8f.45.2025.03.03.03.47.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Mar 2025 03:47:40 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Jonathan Cameron Cc: Andy Shevchenko , Cosmin Tanislav , Dumitru Ceclan , Guillaume Ranquet , Lars-Peter Clausen , Michael Hennerich , Michael Walle , Nuno Sa , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 1/8] iio: adc: ad_sigma_delta: Disable channel after calibration Date: Mon, 3 Mar 2025 12:46:59 +0100 Message-ID: <20250303114659.1672695-11-u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> References: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1372; i=u.kleine-koenig@baylibre.com; h=from:subject; bh=aFcJsLIM3cdSSP2ZKtYFolUMMu1Z1B26+vDxNxrArwM=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnxZa1Fla+gzXLCTT/KwY3Cm6Y677bJqeMMk3Jr pPPpuRIgiaJATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ8WWtQAKCRCPgPtYfRL+ TuwvB/oDIs1C/+avbqlmD/ajiAhUAHnJVsoJGiLUjXEcP6OGyC8yiuj5gKTQK7rO3WhoSMr90Kv 0NjN6uyKG4p5cR/qAg+DxdArV2cGa0yThd+juLb+5+NLkYCuC47Jtsi+1BfnMEgwZ+WZt2l+lPW zNViNP+m7lR+UoOtcsllw5EJ5/0rspBxOVtXPCswhNUcQFj9IdT+O+3FMwMvhQKty2n5hyuFOI8 8x6nHDSIl/XUZIzycmnNVt2aK2CsFjeg0FQIWh7OfnwyvDn72yyzCumw9VDjiYoBgo/Mhzk9IMk cPuJejXqM1SpvQ+boXQBD1mtyT/L4nnJ2z0zGOgRA3Q/wcpm X-Developer-Key: i=u.kleine-koenig@baylibre.com; a=openpgp; fpr=0D2511F322BFAB1C1580266BE2DCDD9132669BD6 The function ad_sd_calibrate() enables the channel to calibrate at function entry but doesn't disable it on exit. This is problematic because if two (or more) channels are calibrated in a row, the second calibration isn't executed as intended as the first (still enabled) channel is recalibrated and after the first irq (i.e. when the calibration of the first channel completed) the calibration is aborted. This currently affects ad7173 only, as the other drivers using ad_sd_calibrate() never have more than one channel enabled at a time. To fix this, disable the calibrated channel after calibration. Fixes: 031bdc8aee01 ("iio: adc: ad7173: add calibration support") Signed-off-by: Uwe Kleine-König --- drivers/iio/adc/ad_sigma_delta.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c index 5907c35b98e5..d91a3ba127e3 100644 --- a/drivers/iio/adc/ad_sigma_delta.c +++ b/drivers/iio/adc/ad_sigma_delta.c @@ -339,6 +339,7 @@ int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta, out: sigma_delta->keep_cs_asserted = false; ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE); + ad_sigma_delta_disable_one(sigma_delta, channel); sigma_delta->bus_locked = false; spi_bus_unlock(sigma_delta->spi->controller); From patchwork Mon Mar 3 11:47:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 13998679 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 142FB20C00C for ; Mon, 3 Mar 2025 11:47:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002466; cv=none; b=ko5hJpU2Qn0muioZitKleJ1RefjJldr35ZQxZ6qpT938bz0y9VF/Ol3TQoQvZhyFI924Muj9xaWE0p+RpHBjI6tBqVHlmNmTVs+fbufOjRwHiRyYLdLhpfT2cRehJ6qErRVIq9XR+lHqm0ltzlq+FYklEBzYN64AEGhw06hrI78= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002466; c=relaxed/simple; bh=ec14xnJrpwkJrC/ethpz0fLxzagiTiLZ9fwLcAvPKo8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=SSPEBRubsHUenzXQC0TARTgWi7W/xuJ7ig0gdYV3LuN8utKCRCZ8ImU/hNYZPxmDhlDIeoYOA4RUc2i/qazESOJhVkG8DdsXfetNCDRNB76h2s+Zv1f7hL2ef4btnpeFExme8xyYS+Uz02RM6inOPV5Y1ug3EMGCGo646QclfKs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=GiTislL2; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="GiTislL2" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-439946a49e1so27335775e9.0 for ; Mon, 03 Mar 2025 03:47:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1741002463; x=1741607263; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=q3z/kCXdK0L4ldNMK0CvF1cmi0sAxHIrcS5GyQP4Qyg=; b=GiTislL2oGDcR3O/UPEyyV9DuHlFpA/s79L/3KSLzLUIQBsR3IYe5LdlLYaLmwGeA5 BsSbNd8Z9RTdiwTSpreY7kQEQq66tglj7pW29z/yHJfqTu7esegTVwmWRzcU8dkeMxEG T51S4LOIe/5fXMWGrjRK+xEA4deNiNq5tC/p2I2+xIS8ZYfssX/5yMwa0pLv8SqQBBRr GoBRJQ5qoiikGwjqfvOl6q0x36D01GH6CqGshAZi8y49Kam21t5SrrP8bO3F9SIfesf6 CgvlXnwJ0+IVvdz5WV9JPxSWsNPOUP1lESaDpLiEDGgK+ATO4Uxxt+tMzu3Whx23ljCW PF1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741002463; x=1741607263; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=q3z/kCXdK0L4ldNMK0CvF1cmi0sAxHIrcS5GyQP4Qyg=; b=rzbeB5WaK31iccEhaJwgG8yMoU37Gs19qXF2Q2dEr99bjDetNP+ilqxefD4AyDRgUh brDipFCElorj2P1WPbydn3uKvgK36U22ARNVg2vrqK7KfOr38nsNp2OW4rNg698BaQco U3bpC8M+11R5IxvHDMzSpX1lHVcoST+ou7vd1qVg1sCzJiKYaq5EXTjxUEFumr5qAch4 tabpVNXfF2hiII7+y3ewohfuTx7PoXJW/nOPOLjuLObaE/jIeZcH53QUTdK3rqr2O7gD qDPE/+ajANYaUtVIxTvhNYWPPihQpxS9mgNLUpFY8qx/aXd97cFIL0T631hQM7lC6sQY 8ZYw== X-Forwarded-Encrypted: i=1; AJvYcCWbSRA7fWptLJdI82f+3YlTgrFVe2vE2sCqdnP57d1bhYQlmcXtGM8ZN6quI1wLUVoH7Vk0JmP10Zc=@vger.kernel.org X-Gm-Message-State: AOJu0Yy62mwzI4ZuhOaI/33Bm5gEAsHj1AGmWZAzzcH7eCLFImPDJ88G oubeK7kknF5/Yyrrt1Yvi9L00L/f9CCQYATZ99jyhNaPNhmr+mZ/p5+HFGY6Iik= X-Gm-Gg: ASbGncuq05I5PG00f14tGdZMk2hOQbBasgtp0BKTUnIDQtYfC9ZZ27Fh4fmGpL1cNM+ uQjbj5eJ4rglF5PVGC3cowAebC35oO58uOz7AYAAgKnltY/41ooboR/sTRHCEEvMZhBGHcGoSjR 5RxPkDkv843OyKUuXZZCWBnjTvecrIWW8CYARupeZjCqADQbIeMoIPwRbbD13r33P/4t551bYwp STgMt0pkZu98r0V+QQDfl0qKIlDXCxyrdy4REBwfy+6UJkDXzM4dwuWKlXehnSKOOsIcZae7IZN +mO36KtMG+yM+ArH3jk4sL9qYCYBexAuoaRYGBlP9hFaGap6XQWLnY6//dHOCCf3ykb43w2R8wn z4LSDh3dCjwntWJjBzYo0OqR6+A== X-Google-Smtp-Source: AGHT+IGcpkNfGC9cZp7cxPodUHwFeqsEzvnD9PBRgOzzVs1HtvoYaDG1YKghsPwupGg0CervwLwT7g== X-Received: by 2002:a05:600c:190b:b0:439:955d:7ad9 with SMTP id 5b1f17b1804b1-43ba66fe855mr109065095e9.14.1741002463376; Mon, 03 Mar 2025 03:47:43 -0800 (PST) Received: from localhost (amontpellier-556-1-148-206.w109-210.abo.wanadoo.fr. [109.210.4.206]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-390e47a7a2asm14385125f8f.37.2025.03.03.03.47.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Mar 2025 03:47:43 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Jonathan Cameron Cc: Andy Shevchenko , Cosmin Tanislav , Dumitru Ceclan , Guillaume Ranquet , Lars-Peter Clausen , Michael Hennerich , Michael Walle , Nuno Sa , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 2/8] iio: adc: ad4130: Fix comparison of channel setups Date: Mon, 3 Mar 2025 12:47:00 +0100 Message-ID: <20250303114659.1672695-12-u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> References: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3350; i=u.kleine-koenig@baylibre.com; h=from:subject; bh=ec14xnJrpwkJrC/ethpz0fLxzagiTiLZ9fwLcAvPKo8=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnxZa43uPHm+mFcYsPYI+AEgpGn7hKsucQzPMCC CLTMo9E9RKJATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ8WWuAAKCRCPgPtYfRL+ TkWZB/4xBWucmDiiknccyOSXYattbMonYzRbz4bd9Umov8diX8N4xq0TJN7QrqvTlOp6CaSSPYk t+gXSgqH4jTIbnIb/x6kAWm981EhINKtu2hxbuPEkfoEEk4mNikABZBMZG7xc6U+M8BNAO8+GTd uzbv9mWwEV6LvzPmziBAXEcQlm7C6RsuUV9yBsXS93SB6vn0rce1aZucMHyR1JiuF5vx2mx+xRr 9T3neSNT8JiOldSEIAmLeOxg6zRL0ccwEGOfD95KVdD4XHjd5T1IfxPc0T15yf6Jc1XcPNXKxcZ EbqyAKdMYk2rHWzC22jfSbOVyx8ZeEkT9N3eWBvwLc32UUff X-Developer-Key: i=u.kleine-koenig@baylibre.com; a=openpgp; fpr=0D2511F322BFAB1C1580266BE2DCDD9132669BD6 Checking the binary representation of two structs (of the same type) for equality doesn't have the same semantic as comparing all members for equality. The former might find a difference where the latter doesn't in the presence of padding or when ambiguous types like float or bool are involved. (Floats typically have different representations for single values, like -0.0 vs +0.0, or 0.5 * 2² vs 0.25 * 2³. The type bool has at least 8 bits and the raw values 1 and 2 (probably) both evaluate to true, but memcmp finds a difference.) When searching for a channel that already has the configuration we need, the comparison by member is the one that is needed. Convert the comparison accordingly to compare the members one after another. Also add a static_assert guard to (somewhat) ensure that when struct ad4130_setup_info is expanded, the comparison is adapted, too. This issue is somewhat theoretic, but using memcmp() on a struct is a bad pattern that is worth fixing. Fixes: 62094060cf3a ("iio: adc: ad4130: add AD4130 driver") Signed-off-by: Uwe Kleine-König --- drivers/iio/adc/ad4130.c | 41 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/drivers/iio/adc/ad4130.c b/drivers/iio/adc/ad4130.c index 061eeb9b1f8d..4ab1943c4697 100644 --- a/drivers/iio/adc/ad4130.c +++ b/drivers/iio/adc/ad4130.c @@ -223,6 +223,10 @@ enum ad4130_pin_function { AD4130_PIN_FN_VBIAS = BIT(3), }; +/* + * If you make adaptations in this struct, you most likely also have to adapt + * ad4130_setup_info_eq(), too. + */ struct ad4130_setup_info { unsigned int iout0_val; unsigned int iout1_val; @@ -591,6 +595,40 @@ static irqreturn_t ad4130_irq_handler(int irq, void *private) return IRQ_HANDLED; } +static bool ad4130_setup_info_eq(struct ad4130_setup_info *a, + struct ad4130_setup_info *b) +{ + /* + * This is just to make sure that the comparison is adapted after + * struct ad4130_setup_info was changed. + */ + static_assert(sizeof(*a) == + sizeof(struct { + unsigned int iout0_val; + unsigned int iout1_val; + unsigned int burnout; + unsigned int pga; + unsigned int fs; + u32 ref_sel; + enum ad4130_filter_mode filter_mode; + bool ref_bufp; + bool ref_bufm; + })); + + if (a->iout0_val != b->iout0_val || + a->iout1_val != b->iout1_val || + a->burnout != b->burnout || + a->pga != b->pga || + a->fs != b->fs || + a->ref_sel != b->ref_sel || + a->filter_mode != b->filter_mode || + a->ref_bufp != b->ref_bufp || + a->ref_bufm != b->ref_bufm) + return false; + + return true; +} + static int ad4130_find_slot(struct ad4130_state *st, struct ad4130_setup_info *target_setup_info, unsigned int *slot, bool *overwrite) @@ -604,8 +642,7 @@ static int ad4130_find_slot(struct ad4130_state *st, struct ad4130_slot_info *slot_info = &st->slots_info[i]; /* Immediately accept a matching setup info. */ - if (!memcmp(target_setup_info, &slot_info->setup, - sizeof(*target_setup_info))) { + if (ad4130_setup_info_eq(target_setup_info, &slot_info->setup)) { *slot = i; return 0; } From patchwork Mon Mar 3 11:47:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 13998680 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 00DE220C48B for ; Mon, 3 Mar 2025 11:47:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002468; cv=none; b=hfVWgFn4iIYlf9JS9qaUCjpomi39BqQ5gmJgM4C+rBcqrrHL92gxycYhfjiaRZ2CU3fX6BRJM9BNKByUBrDJ5JCiuQBZPRLn3/BOhDR2nFlsnfbiKIiLHOvRiHcROVgntgS6s8eLkEY/3nm64HgTTn9DsVcveCLbqZK161FmBsg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002468; c=relaxed/simple; bh=np/7+Gia9o5hRCqEtnJukHY+JqLP+X1gw41ncD9ejcs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tH3SQ3Y4T1+jqAwxL06nLiPNMYwSMEz05gzU7ph2JoQd/k6lY7qn/QyYxvyV1rawQJWdSU05oer9yLL+9YvFw9DC1RiOjw6+x19HkJ4+xEW5YodlTF6dubOF/3zLRZLiYYp1m3NGuQwuFndLCidhVeFsUnuOW0vU8XSqV4CH7wI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=ukkS3HEI; arc=none smtp.client-ip=209.85.221.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="ukkS3HEI" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-390dd35c78dso2824019f8f.1 for ; Mon, 03 Mar 2025 03:47:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1741002465; x=1741607265; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9fn2Y9vpcQ3oAClJnMsZcxwhOJxacZwCbnE8JdwAGjM=; b=ukkS3HEIbCvK98xCilOhLg9mqdr7sIRcZzVGckXNduV7O/rUMrXgA2eAEucoL5alEc j5ICxKMEz6njdZvAd7UjyhcVXbYLb9BtqNSwF/lCIdNDD+u/h224BSGEJpSRMCXbrGVv b/b7w9YDxyHfLhfGIlu2dgYINd7liT8TRf5eR8NuaOjZZGC1XQvEje3HWTKRrSEIu+4B 0CFqoA9naFE6NHZWSTDC24ZvnqUSWjNMyb9B1dNZ6Qf4kVizH0UyE9WRrybVmdhG4pQA ZFUCDKszk5Ub+HSm2XMEIcvz0KVNBssOkxmGagQ1HGZSBUX6Fgyuz7pHAXaUzvNQlQ/v ouag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741002465; x=1741607265; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9fn2Y9vpcQ3oAClJnMsZcxwhOJxacZwCbnE8JdwAGjM=; b=s3r4Jl+2LewugIaMzFkoF/45RTR+FssU6nnUu88nWYYMU0BckGl04+NBYhCSY/0fZ/ EeUfjV4994BkhxXSsa/bpzU4Rv7jgYEgiEZz2oEtSMwq/JZgsWr3tzJ5qHYytji9OGeI ANikbyQoaTE4xhsERVDoLsamxpOIVOuWN+SwEF5NovZn9ZtguucEHk4P5h4GdsjHC1VY CeEiajIi8qfVXaM5eSCM+6sH/3y3NX8X+SZQEgnMTQcOE+BVJGDsa2/x3kAN0L7BSSsh Zhd71diYrdCE3rJo8uzWFrC09uvwm1D+0EIne4azxib+22wXKgf/xtMLcsurzi/B3WX/ O3Yg== X-Forwarded-Encrypted: i=1; AJvYcCX8jiCfJMSjyFLp6oL7Et8xK32QDC+ANedUiwCamS5rZIPNUALlok7C4NcX0xFCEMQt4oty160u1pg=@vger.kernel.org X-Gm-Message-State: AOJu0Yx191eHzpoU5kGP7Sw5jj3iZyx0EIop/ROs4NxMHWGw+rBgD/IP RbMCLtHOV5gtUTi0vLUoKLWq27mbCKX3bQmmn/LPlhu9N1krC29M77947mNBNZE= X-Gm-Gg: ASbGncuWZ1d6ghHg8J6kKrA1wrKBZQ//f03BaHWhBmr2xHDqPSGIjRRh+tq7gmEGsdN HCiSUbqNGJTLxT66RpMK2vP8dHGf18QvIYkSRy/RmQ39jItQl4NsOyFVKnqtTcDgXXd5l2SL1dq 08BgZejfXeUyFMqYzA7aTnxEWRsZQ4QXOaPOmq3XI2ROssi1Ip/WAjCiZvKHmOltXXbMsBW966F 26nK5eE4ZNqgBjXkHzoIXqnW50l5D2Jyf8i89LociY2Hfkj2m5wnbm+oW8chilnSpnOG0bwEZLt d7Gq5K+nHeUpcrZGfiTDy6VZ4fstrIaSu1AzqX2T2mywGbjqgTuxsjvTZuZ7X4ZLngeVu07BGMU zF9fRLtNek6EjX7cxiKkiVdazCw== X-Google-Smtp-Source: AGHT+IHGuolsvcew0aNtGB2on+v463R3QZeJSIqaolbyjPawP/M5ygIMB2T2uNeJ8FlmUsy4njoNGA== X-Received: by 2002:a05:6000:4591:b0:390:f025:9e85 with SMTP id ffacd0b85a97d-390f0259ebfmr7497566f8f.21.1741002465316; Mon, 03 Mar 2025 03:47:45 -0800 (PST) Received: from localhost (amontpellier-556-1-148-206.w109-210.abo.wanadoo.fr. [109.210.4.206]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-390e485df22sm14465256f8f.97.2025.03.03.03.47.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Mar 2025 03:47:44 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Jonathan Cameron Cc: Andy Shevchenko , Cosmin Tanislav , Dumitru Ceclan , Guillaume Ranquet , Lars-Peter Clausen , Michael Hennerich , Michael Walle , Nuno Sa , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 3/8] iio: adc: ad7124: Fix comparison of channel configs Date: Mon, 3 Mar 2025 12:47:01 +0100 Message-ID: <20250303114659.1672695-13-u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> References: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3388; i=u.kleine-koenig@baylibre.com; h=from:subject; bh=np/7+Gia9o5hRCqEtnJukHY+JqLP+X1gw41ncD9ejcs=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnxZbAJOt5fORmw5hG2SGvZ4uf/Inm2XPAMzWvj nzD3Jjk6W2JATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ8WWwAAKCRCPgPtYfRL+ TtAuB/9O9MJyCKychQJPr1/HtaYd7pkBazF4KnKZYm6z81dPMHWwxpxURZkhm960VrHf97ZygAb DP7NBlMXeylVlbicg4wuGR1lktiu0ftQULqr/4qVsIDveEDAZl3o8vtl+8jdv3xUa6vuQzyivUZ FtPWVFOzUePAD1XX66kiFd0qdwWSuiRLyQyTwyGtKneQG5AvykSpuF7RZkT2qk9+ykmSFTAu4SP B1Bw2+ME4rGSNMDmqgs41fUuIUncDvnHSlhWM2yiz4ZeJGSkQmI77+z2EWnWfGvsEE2pujOBrbg YS82JlzmwWJyrFLyLn/MNNM/t6zk/qxPaB/H/pxNZfXuS95M X-Developer-Key: i=u.kleine-koenig@baylibre.com; a=openpgp; fpr=0D2511F322BFAB1C1580266BE2DCDD9132669BD6 Checking the binary representation of two structs (of the same type) for equality doesn't have the same semantic as comparing all members for equality. The former might find a difference where the latter doesn't in the presence of padding or when ambiguous types like float or bool are involved. (Floats typically have different representations for single values, like -0.0 vs +0.0, or 0.5 * 2² vs 0.25 * 2³. The type bool has at least 8 bits and the raw values 1 and 2 (probably) both evaluate to true, but memcmp finds a difference.) When searching for a channel that already has the configuration we need, the comparison by member is the one that is needed. Convert the comparison accordingly to compare the members one after another. Also add a static_assert guard to (somewhat) ensure that when struct ad7124_channel_config::config_props is expanded, the comparison is adapted, too. This issue is somewhat theoretic, but using memcmp() on a struct is a bad pattern that is worth fixing. Fixes: 7b8d045e497a ("iio: adc: ad7124: allow more than 8 channels") Signed-off-by: Uwe Kleine-König --- drivers/iio/adc/ad7124.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c index 6bc418d38820..de90ecb5f630 100644 --- a/drivers/iio/adc/ad7124.c +++ b/drivers/iio/adc/ad7124.c @@ -151,7 +151,11 @@ struct ad7124_chip_info { struct ad7124_channel_config { bool live; unsigned int cfg_slot; - /* Following fields are used to compare equality. */ + /* + * Following fields are used to compare for equality. If you + * make adaptations in it, you most likely also have to adapt + * ad7124_find_similar_live_cfg(), too. + */ struct_group(config_props, enum ad7124_ref_sel refsel; bool bipolar; @@ -338,15 +342,38 @@ static struct ad7124_channel_config *ad7124_find_similar_live_cfg(struct ad7124_ struct ad7124_channel_config *cfg) { struct ad7124_channel_config *cfg_aux; - ptrdiff_t cmp_size; int i; - cmp_size = sizeof_field(struct ad7124_channel_config, config_props); + /* + * This is just to make sure that the comparison is adapted after + * struct ad7124_channel_config was changed. + */ + static_assert(sizeof_field(struct ad7124_channel_config, config_props) == + sizeof(struct { + enum ad7124_ref_sel refsel; + bool bipolar; + bool buf_positive; + bool buf_negative; + unsigned int vref_mv; + unsigned int pga_bits; + unsigned int odr; + unsigned int odr_sel_bits; + unsigned int filter_type; + })); + for (i = 0; i < st->num_channels; i++) { cfg_aux = &st->channels[i].cfg; if (cfg_aux->live && - !memcmp(&cfg->config_props, &cfg_aux->config_props, cmp_size)) + cfg->refsel == cfg_aux->refsel && + cfg->bipolar == cfg_aux->bipolar && + cfg->buf_positive == cfg_aux->buf_positive && + cfg->buf_negative == cfg_aux->buf_negative && + cfg->vref_mv == cfg_aux->vref_mv && + cfg->pga_bits == cfg_aux->pga_bits && + cfg->odr == cfg_aux->odr && + cfg->odr_sel_bits == cfg_aux->odr_sel_bits && + cfg->filter_type == cfg_aux->filter_type) return cfg_aux; } From patchwork Mon Mar 3 11:47:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 13998681 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E606F20CCF0 for ; Mon, 3 Mar 2025 11:47:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002470; cv=none; b=RwrTcEUKw+FTZVe6XRI8qtOW3ZWSpKp066lsIOiDH3IJemWVw3s9Gg1Uhjg2EVeSMiet2lx51uK0KAGKmT7ffFg+z08Tl7xnbtwnoyIojIVql36R4EKPie0kUB4ja0c+lqzPBUeDXfeX5JBWbEaTPt1um8rJCYsjeev0e31viJU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002470; c=relaxed/simple; bh=y10CLHrz5q1cvvW/6hCv3R5E5E/v+RGlhugIUuM3XuU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=s51nrubovEnEUM3lowFqvXdv2ieT/txP7dBJNh6BubBbWgroXg0XfUrTsUnnBziInXCjzpQV4OHZT0raidrLQNUbZuUW3MXZ8Ta6xc+R0jgA5caTaSeuDfJ6lus4/WFuFhiODXgy6pgrazjij4YyBaYlr6IO+ubfV+J4xsdpm0U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=TgmgKYi9; arc=none smtp.client-ip=209.85.221.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="TgmgKYi9" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-390df0138beso2289994f8f.0 for ; Mon, 03 Mar 2025 03:47:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1741002467; x=1741607267; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wZWcsKY7qzjNS1Wm2Xh8944/cSh1cBOdNgKC7R7IPMQ=; b=TgmgKYi9Ci33UhWc8RR0ukMzU9CMr39R1kvq85RsZ2GpPJaz0eTVezEj4bh7ys5MPR pbW0NwwzlrsisGI6mqExgyFaDV2xcgG5FmYUxFSW2wVcVL+fTSBPT5P40Ph/ViQ2Yee2 8IJzIdgCsC4ndouDLDGkZoscs2SJD0W9VV80SHrH9UXnwCpMVaTfHkpc8HuSgi97NVuz enkG3a53FFPOVTkhttbBvE7PZf6+jpvQGcLTUI2quanOm2wjAAI1dy0R5iUvHm/A+Cg7 kXFP6VMo6iT2EvCiGgQreVFBG9T4RpOPh2DzXnuO3HUne7zyi0kJm7b5hM6XlH8UTDIS 79CQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741002467; x=1741607267; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wZWcsKY7qzjNS1Wm2Xh8944/cSh1cBOdNgKC7R7IPMQ=; b=DJgNLgJtkkEO5BPysntilf/Ren7Nhm4cWhjDKKEQu7Lxx7h9RUhR5/R/2tJaPXQoVx rsnIpgfMHbArZNrO1C73YkVc66Ja/UKrXrLLFcCyoUYAd2VZO1TFV296aI0pJai/J5kK BmtSh2hvgZofKtOXQb9YoywIqC+r76VwEVmmQZUVZgXOoZbS1oFR4Y5Zxv30U+GvUcNd JkxUUylgMdm/1arzlrn6OVQjFfMpobyMY48/tntNrBCUMAXpkbSP9KDUh89TPpsjU322 DpTNrqiftBofHgt2GyKdOkcfG8/0hJ1//5Rr9GgA2IVSv0cjbDp+aXseqqe2E8cKCTSH zYlA== X-Forwarded-Encrypted: i=1; AJvYcCWcGrNjrm3Ut25pMIuDOPyV1GmMXhxk7Xw3uEluUPjkFTT+TjHdDqwv8X+Fqv+jAWNcVQPmZ9bp4Mc=@vger.kernel.org X-Gm-Message-State: AOJu0YyNO2AuQ4Q9ciKVpGZsgVUOkXuABY8lklFmkgKs/umudDG0yqW9 NhsB/K+xLh7M9f79OoWz/ANo+FYefgEARcL3+OLtpJ+Q34Anh1rnnHu9GHbQWEG/ogWl1dstThZ 4pcE= X-Gm-Gg: ASbGncvpnR7Aosr8cFs9PziDXk48PrNrWkqG1WrsyTZyGYFUXpp2DxbJSnkXipRW7GM mKymttEBH3huo3TRPJswTW7giHHS9nQjievPrp8/NC8lHuVRYAYiWJ79cmjvQwk3H7zuXd9AXgH TWny4MserbuJbbnEdsX8NMx9qFHI/d8175NuHpyArAEN1xUhNJs8Ip9Vd4Ywla8p5JfV6hSq/wj rYobhXYlnS/5bJSVan0rii1bDOZrT4rPN8CHXmtw1JiWW+7WYIG3qTQqNibIF/TzCY3C6SoeOkE 6vW5lEPyp2kLkPl3Y25C07VJgL5qPeTPk/ZOMTUcQnJJDKCQ5ZOx8a03As2DgBdsLzOy3oJNTXJ zRwL8/VEM6OVnYmbcCcFadrEnCQ== X-Google-Smtp-Source: AGHT+IGcoDodgmWp5+Ijtads7PMkR9LPBMeEvPtHwX7hSfwU3B7pWXGiyRfLkGUcWCvwHE+j4WYS+w== X-Received: by 2002:a05:6000:2b04:b0:390:df7f:c20a with SMTP id ffacd0b85a97d-390ec9c19a2mr8181322f8f.33.1741002467084; Mon, 03 Mar 2025 03:47:47 -0800 (PST) Received: from localhost (amontpellier-556-1-148-206.w109-210.abo.wanadoo.fr. [109.210.4.206]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43aba5870e7sm191186775e9.35.2025.03.03.03.47.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Mar 2025 03:47:46 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Jonathan Cameron Cc: Andy Shevchenko , Cosmin Tanislav , Dumitru Ceclan , Guillaume Ranquet , Lars-Peter Clausen , Michael Hennerich , Michael Walle , Nuno Sa , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 4/8] iio: adc: ad7173: Fix comparison of channel configs Date: Mon, 3 Mar 2025 12:47:02 +0100 Message-ID: <20250303114659.1672695-14-u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> References: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2867; i=u.kleine-koenig@baylibre.com; h=from:subject; bh=y10CLHrz5q1cvvW/6hCv3R5E5E/v+RGlhugIUuM3XuU=; b=kA0DAAoBj4D7WH0S/k4ByyZiAGfFlsKjoB/9Enx0XBp7O5uj/4SpG8Eo5mO3qMUnhEvhZcpxs IkBMwQAAQoAHRYhBD+BrGk6eh5Zia3+04+A+1h9Ev5OBQJnxZbCAAoJEI+A+1h9Ev5OeFoIAKNt I0HVB0FGhl6WXRj+K+a+jWQubV3oqNtlhol6jL3swaA1Yb+W8f1OsxHLqw3xmL3qnu3F7Zmnuvu 9cWdxMCHqU4cqoUdfzPw2Jg0MvJBSZ4QDLhWtkvrt0KGO2t4TcxrSmZ7XngGVFoh33KNhHo2alF gfRSoPv9iC/zgLS+JPalhzfB0VODl9U2UvcOqwUtRLW4eVeBynbngZXUAsQi87AO7qxJMOpVf77 U5fArLQ0XafUWhNs4Y3EugyOOrNqUrGHABVm0jvyPqvc0+CvQOjpP6HYL+3rLnmOvCXDE5EXxSK r5vjeptYied6fbL17oTgb2Hrx+F+f7tAcyGxGs8= X-Developer-Key: i=u.kleine-koenig@baylibre.com; a=openpgp; fpr=0D2511F322BFAB1C1580266BE2DCDD9132669BD6 Checking the binary representation of two structs (of the same type) for equality doesn't have the same semantic as comparing all members for equality. The former might find a difference where the latter doesn't in the presence of padding or when ambiguous types like float or bool are involved. (Floats typically have different representations for single values, like -0.0 vs +0.0, or 0.5 * 2² vs 0.25 * 2³. The type bool has at least 8 bits and the raw values 1 and 2 (probably) both evaluate to true, but memcmp finds a difference.) When searching for a channel that already has the configuration we need, the comparison by member is the one that is needed. Convert the comparison accordingly to compare the members one after another. Also add a static_assert guard to (somewhat) ensure that when struct ad7173_channel_config::config_props is expanded, the comparison is adapted, too. This issue is somewhat theoretic, but using memcmp() on a struct is a bad pattern that is worth fixing. Fixes: 76a1e6a42802 ("iio: adc: ad7173: add AD7173 driver") Signed-off-by: Uwe Kleine-König --- drivers/iio/adc/ad7173.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/iio/adc/ad7173.c b/drivers/iio/adc/ad7173.c index ca2b41b16cc9..2d90487c7f31 100644 --- a/drivers/iio/adc/ad7173.c +++ b/drivers/iio/adc/ad7173.c @@ -197,7 +197,11 @@ struct ad7173_channel_config { u8 cfg_slot; bool live; - /* Following fields are used to compare equality. */ + /* + * Following fields are used to compare equality. If you + * make adaptations in it, you most likely also have to adapt + * ad7173_find_live_config(), too. + */ struct_group(config_props, bool bipolar; bool input_buf; @@ -568,15 +572,28 @@ static struct ad7173_channel_config * ad7173_find_live_config(struct ad7173_state *st, struct ad7173_channel_config *cfg) { struct ad7173_channel_config *cfg_aux; - ptrdiff_t cmp_size; int i; - cmp_size = sizeof_field(struct ad7173_channel_config, config_props); + /* + * This is just to make sure that the comparison is adapted after + * struct ad7173_channel_config was changed. + */ + static_assert(sizeof_field(struct ad7173_channel_config, config_props) == + sizeof(struct { + bool bipolar; + bool input_buf; + u8 odr; + u8 ref_sel; + })); + for (i = 0; i < st->num_channels; i++) { cfg_aux = &st->channels[i].cfg; if (cfg_aux->live && - !memcmp(&cfg->config_props, &cfg_aux->config_props, cmp_size)) + cfg->bipolar == cfg_aux->bipolar && + cfg->input_buf == cfg_aux->input_buf && + cfg->odr == cfg_aux->odr && + cfg->ref_sel == cfg_aux->ref_sel) return cfg_aux; } return NULL; From patchwork Mon Mar 3 11:47:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 13998682 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D3F1F20D50E for ; Mon, 3 Mar 2025 11:47:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002472; cv=none; b=fKciHqpeOtLefmyFpNG1BjPZbBWhcp9xDsVsa9JrkkZS+qQGpxyN4sbjrRTNjbadZCL5vSRxV3Jbs4CNtjcoAkRx19puY541D6aLkPH42JDtqGGOlBmTQlHHHIczne+KpH8VhJEAA+/OXcf0PXZNzjV/UmD7ygOKYf4JyDdJ44U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002472; c=relaxed/simple; bh=f5oXDYngVLmmeCgw3m2NxlkPSjJDX6EDhYcIJAY4bHI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hB5yZrwQv6Y/UTxz7wl2OSjMKJ9YewQTtXq1AA30MqmZx3KIS6ZzF4bGqS1dmQ/ijqKy5+cJPlkJ3xN2uFtszMRhlTt4ch7lsA5HIUHW3yuIBqGL7PSYDsCa2YUVc6Vf8IyQqG6lakiGtLKdxQ+aq+P6nr9Nl3yU3GPofYqjxuE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=Kvg5Dv8q; arc=none smtp.client-ip=209.85.128.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="Kvg5Dv8q" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-43aac0390e8so27135425e9.2 for ; Mon, 03 Mar 2025 03:47:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1741002469; x=1741607269; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7oStMvILYc+VcE0Bos6wZo8DhR0OCDR8DIF2cp2zAmw=; b=Kvg5Dv8q27F+9fY4+9dvP9nw5dxD/T/cY1xeQpvnMGjlAq+1RCNalf+3aP1HYkxQEh WXD2FrvxELzuGwye3gSljMkPK6xi8cfTLdWfNmWKDS2azpxpKRd7833kDc8cOyUe3u2z zKEgL2KYqdHrqKAC5raBrIWNmAhQR2SV/Eiectu0Wjvf2xjwUViwPWMsptHGWPa2Md+V ui+XdMwAwgC1WxVVNhijfF4Y909WTBbXXGsuFRLvtz6zVTrCmAm6SccUa+5h9y4IlNRa MLz6lmX+HqIhAKgcgLs3v/DtSl3tKlMUpF3vjidw51ki3E105Li8HwNM9ptw9dsz5RkB BtiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741002469; x=1741607269; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7oStMvILYc+VcE0Bos6wZo8DhR0OCDR8DIF2cp2zAmw=; b=RlCq70lTvBF0T0sKSLef/smbtEPiAq8Ct3mebMKq4FmoZLZ/gL/GRDm9yUhrkPLrmv yMgbtHPhb4160KDU6Lk8QvgqG1pa8LkGyEuL201oGY2DYlavptb95kNV/XDqRIs9TXXp iixf3ww68N8RzHz4y187nkn6kQGxT9FC7vKKSYCpzTPvSSHHunKcDtoVGO+hGb3sfqbn kpGRS9musQ9werzav9Wm2VHLZUee8AvNNDQZs1kzqStB5pDW3isBocyKPvCzE1fJAcEO 7BTVB5XRGwes18yb6tbA48qo58nD0VsxUEJAi2a/goCbf58BP82dPwosMtC0MosJkJgf 7NFQ== X-Forwarded-Encrypted: i=1; AJvYcCXSOMUwVW76VcmHnE8brJpMe8TPF3NAHz747iKnpImVAdMfQsHUX9UC7i/KCM5Ugu1KxMnQaEbzAXY=@vger.kernel.org X-Gm-Message-State: AOJu0YwcHbC3mmRNwsAPPjJq37OTM4+C1C/ZGFiloUto5jymEbSeLl4t CfNXlax0GspjzIYOeQdtDUA5UrlMEXnK7Fz3lTu+mE4fEbnVKMEHm7ui6ctNKHM= X-Gm-Gg: ASbGncurqPI5EVbZfaoexKysIREiOjZcVtiW9xDnuV1FP4ThQp3toXYeNs+Z4UIXMNN 4FQykEajHAS4q7aPGP7BOZR3nF5YDjeXADuDvYNOx7a2jLmYGJZK53pOBUJifY6QZsUny94DwNt vQzTjt5E2818bFLpK43Jck2PuNVvCAV3RQgR9TZBzCyg/VSj+hxSOwSlK+PSeq8YUuehny5qLf0 20VfQ0lqgg5zPyjMNY9h4pLmd66FPnAjbOcldy8DYlqFyMwySsr4QbdL7+PUBwvZ+oYW97TdoUD ccyNDKZQzLwzFSkhiZPvL3HMynAvwHhQcJ10gpSQxvsXn2pHPQJDxkchFaMprgiBX8+Xw9MGgG5 aAwofrnJmICr/3Qd4fNq3Q+ZDnw== X-Google-Smtp-Source: AGHT+IELfVBNUZ3T62EMT1S63oZc8YXWbdY+myyuSZ9x2ZPWALyNI6M68yP4U9enUx3QzHfaeTngGA== X-Received: by 2002:a05:600c:5119:b0:439:a25b:e7d3 with SMTP id 5b1f17b1804b1-43ba67047c9mr107630935e9.14.1741002469168; Mon, 03 Mar 2025 03:47:49 -0800 (PST) Received: from localhost (amontpellier-556-1-148-206.w109-210.abo.wanadoo.fr. [109.210.4.206]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43b73702bd0sm158648515e9.10.2025.03.03.03.47.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Mar 2025 03:47:48 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Jonathan Cameron Cc: Andy Shevchenko , Cosmin Tanislav , Dumitru Ceclan , Guillaume Ranquet , Lars-Peter Clausen , Michael Hennerich , Michael Walle , Nuno Sa , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 5/8] iio: adc: ad4130: Adapt internal names to match official filter_type ABI Date: Mon, 3 Mar 2025 12:47:03 +0100 Message-ID: <20250303114659.1672695-15-u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> References: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=10026; i=u.kleine-koenig@baylibre.com; h=from:subject; bh=f5oXDYngVLmmeCgw3m2NxlkPSjJDX6EDhYcIJAY4bHI=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnxZbJmgat15ejTK0QQKh7YezB6CM5zXG9qgXEo EJXgAtDlCmJATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ8WWyQAKCRCPgPtYfRL+ TmOEB/40PrifRoyMnbRW15f0Kc5i2Lyj3lHgreXcSplrKQrQ2yQT8ugWqShJzKm3GrX8Ivmxuay /ROUnJccQp+uZrdP6UXQS4IttUfsMk/wET65liNBPSoQr//Mw0l5Do5jUJ2js0C+MssELsulZMO GmX7KoRlwPum8U2U232iA4nUBn7Ed5XHe140HYOsR2+xvZjC80dc+JGdceUW64U0MgXV34DLLWC K3fjzvFG+dyIBLiLUJOnJ2v5B9lchBTUyoZIER10Eufnf9Z7De+rIT0h+kzY2Z1gry51NVnsr+r 4q/SeYDF5v4+nubYhxlYB8zc3sjL5Gd4Wk4G/iDhUh0jOTDx X-Developer-Key: i=u.kleine-koenig@baylibre.com; a=openpgp; fpr=0D2511F322BFAB1C1580266BE2DCDD9132669BD6 Recently the interface to to select a filter was officially blessed to use "filter_type". Adapt the naming of several functions accordingly to make the new standard more present and so make the driver a better template for other drivers. Apart from the comment update this is just s/filter_mode/filter_type/. Signed-off-by: Uwe Kleine-König --- drivers/iio/adc/ad4130.c | 84 ++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/drivers/iio/adc/ad4130.c b/drivers/iio/adc/ad4130.c index 4ab1943c4697..3dbf1d89b671 100644 --- a/drivers/iio/adc/ad4130.c +++ b/drivers/iio/adc/ad4130.c @@ -203,7 +203,7 @@ enum ad4130_mode { AD4130_MODE_IDLE = 0b0100, }; -enum ad4130_filter_mode { +enum ad4130_filter_type { AD4130_FILTER_SINC4, AD4130_FILTER_SINC4_SINC1, AD4130_FILTER_SINC3, @@ -234,7 +234,7 @@ struct ad4130_setup_info { unsigned int pga; unsigned int fs; u32 ref_sel; - enum ad4130_filter_mode filter_mode; + enum ad4130_filter_type filter_type; bool ref_bufp; bool ref_bufm; }; @@ -255,7 +255,7 @@ struct ad4130_chan_info { }; struct ad4130_filter_config { - enum ad4130_filter_mode filter_mode; + enum ad4130_filter_type filter_type; unsigned int odr_div; unsigned int fs_max; enum iio_available_type samp_freq_avail_type; @@ -341,9 +341,9 @@ static const unsigned int ad4130_burnout_current_na_tbl[AD4130_BURNOUT_MAX] = { [AD4130_BURNOUT_4000NA] = 4000, }; -#define AD4130_VARIABLE_ODR_CONFIG(_filter_mode, _odr_div, _fs_max) \ +#define AD4130_VARIABLE_ODR_CONFIG(_filter_type, _odr_div, _fs_max) \ { \ - .filter_mode = (_filter_mode), \ + .filter_type = (_filter_type), \ .odr_div = (_odr_div), \ .fs_max = (_fs_max), \ .samp_freq_avail_type = IIO_AVAIL_RANGE, \ @@ -354,9 +354,9 @@ static const unsigned int ad4130_burnout_current_na_tbl[AD4130_BURNOUT_MAX] = { }, \ } -#define AD4130_FIXED_ODR_CONFIG(_filter_mode, _odr_div) \ +#define AD4130_FIXED_ODR_CONFIG(_filter_type, _odr_div) \ { \ - .filter_mode = (_filter_mode), \ + .filter_type = (_filter_type), \ .odr_div = (_odr_div), \ .fs_max = AD4130_FILTER_SELECT_MIN, \ .samp_freq_avail_type = IIO_AVAIL_LIST, \ @@ -378,7 +378,7 @@ static const struct ad4130_filter_config ad4130_filter_configs[] = { AD4130_FIXED_ODR_CONFIG(AD4130_FILTER_SINC3_PF4, 148), }; -static const char * const ad4130_filter_modes_str[] = { +static const char * const ad4130_filter_types_str[] = { [AD4130_FILTER_SINC4] = "sinc4", [AD4130_FILTER_SINC4_SINC1] = "sinc4+sinc1", [AD4130_FILTER_SINC3] = "sinc3", @@ -610,7 +610,7 @@ static bool ad4130_setup_info_eq(struct ad4130_setup_info *a, unsigned int pga; unsigned int fs; u32 ref_sel; - enum ad4130_filter_mode filter_mode; + enum ad4130_filter_type filter_type; bool ref_bufp; bool ref_bufm; })); @@ -621,7 +621,7 @@ static bool ad4130_setup_info_eq(struct ad4130_setup_info *a, a->pga != b->pga || a->fs != b->fs || a->ref_sel != b->ref_sel || - a->filter_mode != b->filter_mode || + a->filter_type != b->filter_type || a->ref_bufp != b->ref_bufp || a->ref_bufm != b->ref_bufm) return false; @@ -728,7 +728,7 @@ static int ad4130_write_slot_setup(struct ad4130_state *st, if (ret) return ret; - val = FIELD_PREP(AD4130_FILTER_MODE_MASK, setup_info->filter_mode) | + val = FIELD_PREP(AD4130_FILTER_MODE_MASK, setup_info->filter_type) | FIELD_PREP(AD4130_FILTER_SELECT_MASK, setup_info->fs); ret = regmap_write(st->regmap, AD4130_FILTER_X_REG(slot), val); @@ -872,11 +872,11 @@ static int ad4130_set_channel_enable(struct ad4130_state *st, * (used in ad4130_fs_to_freq) */ -static void ad4130_freq_to_fs(enum ad4130_filter_mode filter_mode, +static void ad4130_freq_to_fs(enum ad4130_filter_type filter_type, int val, int val2, unsigned int *fs) { const struct ad4130_filter_config *filter_config = - &ad4130_filter_configs[filter_mode]; + &ad4130_filter_configs[filter_type]; u64 dividend, divisor; int temp; @@ -895,11 +895,11 @@ static void ad4130_freq_to_fs(enum ad4130_filter_mode filter_mode, *fs = temp; } -static void ad4130_fs_to_freq(enum ad4130_filter_mode filter_mode, +static void ad4130_fs_to_freq(enum ad4130_filter_type filter_type, unsigned int fs, int *val, int *val2) { const struct ad4130_filter_config *filter_config = - &ad4130_filter_configs[filter_mode]; + &ad4130_filter_configs[filter_type]; unsigned int dividend, divisor; u64 temp; @@ -911,7 +911,7 @@ static void ad4130_fs_to_freq(enum ad4130_filter_mode filter_mode, *val = div_u64_rem(temp, NANO, val2); } -static int ad4130_set_filter_mode(struct iio_dev *indio_dev, +static int ad4130_set_filter_type(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, unsigned int val) { @@ -919,17 +919,17 @@ static int ad4130_set_filter_mode(struct iio_dev *indio_dev, unsigned int channel = chan->scan_index; struct ad4130_chan_info *chan_info = &st->chans_info[channel]; struct ad4130_setup_info *setup_info = &chan_info->setup; - enum ad4130_filter_mode old_filter_mode; + enum ad4130_filter_type old_filter_type; int freq_val, freq_val2; unsigned int old_fs; int ret = 0; guard(mutex)(&st->lock); - if (setup_info->filter_mode == val) + if (setup_info->filter_type == val) return 0; old_fs = setup_info->fs; - old_filter_mode = setup_info->filter_mode; + old_filter_type = setup_info->filter_type; /* * When switching between filter modes, try to match the ODR as @@ -937,55 +937,55 @@ static int ad4130_set_filter_mode(struct iio_dev *indio_dev, * using the old filter mode, then convert it back into FS using * the new filter mode. */ - ad4130_fs_to_freq(setup_info->filter_mode, setup_info->fs, + ad4130_fs_to_freq(setup_info->filter_type, setup_info->fs, &freq_val, &freq_val2); ad4130_freq_to_fs(val, freq_val, freq_val2, &setup_info->fs); - setup_info->filter_mode = val; + setup_info->filter_type = val; ret = ad4130_write_channel_setup(st, channel, false); if (ret) { setup_info->fs = old_fs; - setup_info->filter_mode = old_filter_mode; + setup_info->filter_type = old_filter_type; return ret; } return 0; } -static int ad4130_get_filter_mode(struct iio_dev *indio_dev, +static int ad4130_get_filter_type(struct iio_dev *indio_dev, const struct iio_chan_spec *chan) { struct ad4130_state *st = iio_priv(indio_dev); unsigned int channel = chan->scan_index; struct ad4130_setup_info *setup_info = &st->chans_info[channel].setup; - enum ad4130_filter_mode filter_mode; + enum ad4130_filter_type filter_type; guard(mutex)(&st->lock); - filter_mode = setup_info->filter_mode; + filter_type = setup_info->filter_type; - return filter_mode; + return filter_type; } -static const struct iio_enum ad4130_filter_mode_enum = { - .items = ad4130_filter_modes_str, - .num_items = ARRAY_SIZE(ad4130_filter_modes_str), - .set = ad4130_set_filter_mode, - .get = ad4130_get_filter_mode, +static const struct iio_enum ad4130_filter_type_enum = { + .items = ad4130_filter_types_str, + .num_items = ARRAY_SIZE(ad4130_filter_types_str), + .set = ad4130_set_filter_type, + .get = ad4130_get_filter_type, }; -static const struct iio_chan_spec_ext_info ad4130_filter_mode_ext_info[] = { +static const struct iio_chan_spec_ext_info ad4130_ext_info[] = { /* - * Intentional duplication of attributes to keep backwards compatibility - * while standardizing over the main IIO ABI for digital filtering. + * `filter_type` is the standardized IIO ABI for digital filtering. + * `filter_mode` is just kept for backwards compatibility. */ - IIO_ENUM("filter_mode", IIO_SEPARATE, &ad4130_filter_mode_enum), + IIO_ENUM("filter_mode", IIO_SEPARATE, &ad4130_filter_type_enum), IIO_ENUM_AVAILABLE("filter_mode", IIO_SHARED_BY_TYPE, - &ad4130_filter_mode_enum), - IIO_ENUM("filter_type", IIO_SEPARATE, &ad4130_filter_mode_enum), + &ad4130_filter_type_enum), + IIO_ENUM("filter_type", IIO_SEPARATE, &ad4130_filter_type_enum), IIO_ENUM_AVAILABLE("filter_type", IIO_SHARED_BY_TYPE, - &ad4130_filter_mode_enum), + &ad4130_filter_type_enum), { } }; @@ -999,7 +999,7 @@ static const struct iio_chan_spec ad4130_channel_template = { BIT(IIO_CHAN_INFO_SAMP_FREQ), .info_mask_separate_available = BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ), - .ext_info = ad4130_filter_mode_ext_info, + .ext_info = ad4130_ext_info, .scan_type = { .sign = 'u', .endianness = IIO_BE, @@ -1049,7 +1049,7 @@ static int ad4130_set_channel_freq(struct ad4130_state *st, guard(mutex)(&st->lock); old_fs = setup_info->fs; - ad4130_freq_to_fs(setup_info->filter_mode, val, val2, &fs); + ad4130_freq_to_fs(setup_info->filter_type, val, val2, &fs); if (fs == setup_info->fs) return 0; @@ -1141,7 +1141,7 @@ static int ad4130_read_raw(struct iio_dev *indio_dev, return IIO_VAL_INT; case IIO_CHAN_INFO_SAMP_FREQ: { guard(mutex)(&st->lock); - ad4130_fs_to_freq(setup_info->filter_mode, setup_info->fs, + ad4130_fs_to_freq(setup_info->filter_type, setup_info->fs, val, val2); return IIO_VAL_INT_PLUS_NANO; @@ -1171,7 +1171,7 @@ static int ad4130_read_avail(struct iio_dev *indio_dev, return IIO_AVAIL_LIST; case IIO_CHAN_INFO_SAMP_FREQ: scoped_guard(mutex, &st->lock) { - filter_config = &ad4130_filter_configs[setup_info->filter_mode]; + filter_config = &ad4130_filter_configs[setup_info->filter_type]; } *vals = (int *)filter_config->samp_freq_avail; From patchwork Mon Mar 3 11:47:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 13998683 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 00B8820DD6E for ; Mon, 3 Mar 2025 11:47:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002474; cv=none; b=idcFffo/QHbsPxEnJMYMzcNY2kB3KRdL4uhzG3Z3ONJYF/c8zgOUh1RqVxrpkxyIcWWKpfpa3RxXb8k9QG3DWpqoS2QNSTuBDEy/aUPuNsB7wkrJaNENigpaX59UFPSJ+HE7nEIlOPkvUjUGIG77EsyAr6f9Jc3//809upakDVM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002474; c=relaxed/simple; bh=+v+ir1+IglYL05L7kQ/+NcMJ+uc5Mh8VNYIDLO2zj4c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=As3l1vOkEngnlTYeO49s9FtKFpZI9ZzsEjTso3ooGdGPyrvRh5VW6kCedTUVKMqGQsgew5M4apOeaqEnidfsCN0E5kvpareFXPQYMcMVcSXyM+RS3q4Cw610tvGSZ8ioaEvi2ekeR8ykVGYeJ8bfZiNFrGznAeOJOQbI+jM6Uvw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=CCyBrL8e; arc=none smtp.client-ip=209.85.221.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="CCyBrL8e" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-390cf7458f5so4050350f8f.2 for ; Mon, 03 Mar 2025 03:47:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1741002471; x=1741607271; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iKR8mmc7je6VNvAt7e6XfCwJ0Xm9s9LiP8WsU315nXs=; b=CCyBrL8eeJVwtW/vo7tWcTm446qekFDbvRoK1W3Pmqxv3iA5H/UdB3hF6EQit9gGwh v9qV1HvcIGe8093vqFQZ7pe583JvPwx1uBhHLNigNoJdRAoZDVUoYG7aZ7u1Hs4HqGcL 5KMOMD169w3jkX45AIUarv/Z/j4Lun0gybflb1G7OxCePmO48nc9dt7fLfp5XdYwTIJA MXtf5CM/XmKlwWEyjWaiRv6vNOh/HCsOXMJcLy2Alf1tj2mzV6icIEU+DOimXJLm9RD9 yRn3lsSl39E6iPrwmGupqJ42Xe18sRgiK682EedLV/HOp1w2sZuVaCNbQbXUvTnXjOSc X0mA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741002471; x=1741607271; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iKR8mmc7je6VNvAt7e6XfCwJ0Xm9s9LiP8WsU315nXs=; b=ifCAAnoVPWHueIf7mV3axgicoZ8ivrY4P0F8ewOeT7TwiBf/Ie46lwtGo7VjGlJvb9 y56Z2fJWU5mhLH73yXXBzesi6cDBnZebhKJ0aS+HVsEWI2VsZ/y9OnNyi4N15grdEf/C AHjDFZLzfcgH4A02h3jPvajdVTk3eTZdvRCj4jUAG4Qwu8TT2yk/DR4R2OAso2P0l9CD MMtQY4qA645Njn+J2HagtLrE1NkALyZrgOHLEHByBjbmCTxbFZvBeMgqStHv4ysUyxSi rJziUUFd5PXErrLiMQh6yYgVula68hbpSYyKtWtPYU9GJhSOgFzDAeUocV41fNyGhKpN n5kw== X-Forwarded-Encrypted: i=1; AJvYcCU4rkFIiRkr7VsR8/CZebR2gkLCVoAERcoaz2Tfw2fph1eyfd4mRwh1iqsGIhyd2+Kf5i01oS/d2Gc=@vger.kernel.org X-Gm-Message-State: AOJu0YwV6udO5Arc1bt65bZtxrH+BZ0k6qDgGmaQuhnaLbrZegEZuzn5 gzf1zVRxsaE4HCb0/MK6bUSNW2T2ZWno6ax+VMbX/6tpQA8D5FNfp8PYOt5orDhQ7H2MI5jjY2d pT4I= X-Gm-Gg: ASbGnctSIQ3OfanmxRRZ77bpOrPVuv6euv1jCYwO+vkSiUEsj+Rc5EMICEk7VqKN3dE Jyspanxau0oSt3vPYdDVAWTnY7gkjmVA6Q0obnTAiWSexGIC2dAvzEDo1WST/gr8DwS1pPye9KL xwX+7zFa1KycXVMNSeRachZIUcWn8cX/GhpsKJeijZOFHEK+sieTeIJbEAgmVr4EOPprUwYjZys uR2FMUyhArqDhMsR7YFek+l5CS17x3r+caYz2mUZp/j6FH88eXUPnK45M3EGxqQh6Z5DwsRi/8w jzle89f980Gcvyd3/kxs+D6hxE9bztV94NpZRTrXzynLe7lgyjjzlipBtdX9/eKyfRpYBIyIniN EkEa/EY6dCk/kWZmI9OK+iTvEqQ== X-Google-Smtp-Source: AGHT+IH5Z6btw41ZKAgQDipPHeM1p1kYa1+Z7ciGYHSk4HbVAIZ7A2f2vv2fwdCwPPHx3p4Q1j+Vww== X-Received: by 2002:a5d:424b:0:b0:390:e46f:4454 with SMTP id ffacd0b85a97d-390ec9cbfbfmr10067180f8f.32.1741002471263; Mon, 03 Mar 2025 03:47:51 -0800 (PST) Received: from localhost (amontpellier-556-1-148-206.w109-210.abo.wanadoo.fr. [109.210.4.206]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-390e47a66adsm14110736f8f.25.2025.03.03.03.47.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Mar 2025 03:47:50 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Jonathan Cameron Cc: Andy Shevchenko , Cosmin Tanislav , Dumitru Ceclan , Guillaume Ranquet , Lars-Peter Clausen , Michael Hennerich , Michael Walle , Nuno Sa , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 6/8] iio: adc: ad_sigma_delta: Add error checking for ad_sigma_delta_set_channel() Date: Mon, 3 Mar 2025 12:47:04 +0100 Message-ID: <20250303114659.1672695-16-u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> References: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1187; i=u.kleine-koenig@baylibre.com; h=from:subject; bh=+v+ir1+IglYL05L7kQ/+NcMJ+uc5Mh8VNYIDLO2zj4c=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnxZbLpSyJJZQrMNOYSBT3O10ZES5srubfMKd/z Hdc8npRu1aJATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ8WWywAKCRCPgPtYfRL+ TlsjB/wOYCnOMHsdZ0Q3jdrrQBdxHsZXk7f919eqxPaLXjMVofd/123J4vpuLOwaXwaC9W2fjs/ qEW9uVGxoJPU2pXSI/NOnW/tSiqvlVvvF0nKn8Vs8PGs4fACQy+R5WifPK8o/JDCKXnVex6BTOQ NOLo01eR/oiOROTYDKSkx1PKWUW1/efx/ARiHTLKT8bXBKRp0AGXj4nrn1ia98dXJj28h3t7D00 hkX1dnHsPcX5OjWBizSl7SxPa5dXzMQAe11k+Hsa8iu2l58v0J2FCYjmCuCXnxL75xv57fvrK1b 3mRa4JdY9akWMDP7YnNdyNbQyCL286ODl8Ga9ub/dpnFZRT8 X-Developer-Key: i=u.kleine-koenig@baylibre.com; a=openpgp; fpr=0D2511F322BFAB1C1580266BE2DCDD9132669BD6 All other calls to ad_sigma_delta_set_channel() in ad_sigma_delta.c check the return value afterwards. Do it for all calls. Signed-off-by: Uwe Kleine-König --- drivers/iio/adc/ad_sigma_delta.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c index d91a3ba127e3..6c37f8e21120 100644 --- a/drivers/iio/adc/ad_sigma_delta.c +++ b/drivers/iio/adc/ad_sigma_delta.c @@ -390,7 +390,9 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev, if (!iio_device_claim_direct(indio_dev)) return -EBUSY; - ad_sigma_delta_set_channel(sigma_delta, chan->address); + ret = ad_sigma_delta_set_channel(sigma_delta, chan->address); + if (ret) + goto out_release; spi_bus_lock(sigma_delta->spi->controller); sigma_delta->bus_locked = true; @@ -431,6 +433,7 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev, sigma_delta->keep_cs_asserted = false; sigma_delta->bus_locked = false; spi_bus_unlock(sigma_delta->spi->controller); +out_release: iio_device_release_direct(indio_dev); if (ret) From patchwork Mon Mar 3 11:47:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 13998684 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C825920E01E for ; Mon, 3 Mar 2025 11:47:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002477; cv=none; b=KRVAvsbNmDjUr09AXpq/vhGpkDCMGLSUcHwJQMdAv6wE4+ddT2eH0KzmZBOptQjZ9OQR92vLjkPt9m3TqOyCfiKeNsdqGCG1LMW9QdeVMYTAu8kSc8CMA442vwsbNnlzk93mS+/3xVtoFVdK0cTSsXaxp2mQhSgxz4rws90P0nE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002477; c=relaxed/simple; bh=jqr9EwXfZY3b+14dJHqEdl3sytYGW0GVhd2OmY7oUBw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aY1UdanQftltCFRN3yJSNXGQEGQ/2+PzYB2TV66KRrflh1f3D3yKzskh+LslqXRnINawMql0wIuNVEg/rWFU93dAW9wER4F4qo4SiatLii3yG6hSCwwg9FhCFheRWuUAOaaeY61BVNgic+G8OgN6yuw0RvXc5xdkfc5uVXseHAw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=NBRJ9t0/; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="NBRJ9t0/" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-439ac3216dcso29382025e9.1 for ; Mon, 03 Mar 2025 03:47:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1741002473; x=1741607273; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IQozffwnOCsYFoqS8k7yOzUIgAbpTEtaLUGEzpJWOM8=; b=NBRJ9t0//e8B+CKEW+UUUgx5fjbZqxNGjQXtzkKzqUMs6va+5HtB5fAGU/tqIhv64L d9oeIBN8dmYuNtuXFwDvSjLliIe4syDd0/neJXd8KATVQ4rbeWzOsH354S36oGTSiZKh DA3rwOIkKTWnm/ZJm2xn1sAVqxJ7NTKTE41yhZh9bn3djPqbUIs8u3/XJi4JNLKZfPzb CUWqNQu6ECZe9caabBoP6NlLlEIBGiJrihdE+mF2yzWZNxu3DzoKfsZtG7uoPaeHPpZD ZMuDsH2EmRrnvsTCGL/qw4ZX4t8NAbv1LZ0BUUjIh/ZaE8L645GYIcIOo21oCrp570KS U2ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741002473; x=1741607273; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IQozffwnOCsYFoqS8k7yOzUIgAbpTEtaLUGEzpJWOM8=; b=Pzh54wDPFMnnhjAZ8nydTfbkhV49R2cz4A9iIpzDuMrHl3jsamZGOK+1wiiVWv45x9 J58kx3J4pu2iOnbtX6ae6s68cVKB5nGMfuaGtiNU5tq4BmA4oGRAnEq98r5VsXPq84Wp EFN593psvguZ2sfLGs76ItMPw7YAy8QWc460pt7VlrjJiL/ucqp8pm3Qd3B9Eune2vkl DjFjC2Ni13E4C6IIl3I5PITOgA0uhpx1xvkrNZJWsu313Gw0am9ovRI252lj5fWxXOQq 10o56vTOOTWAMk8B4uHkXKR2rowYsbMUIjdiV8ugoZ7PfM4t/cUqN4w7xKG5d+XQB8ic poOA== X-Forwarded-Encrypted: i=1; AJvYcCXdFhSTVKmTVp5IbehNzhalCZ4mxVB+VG3lwviiRMLmBDOTlqh7zXzQeZVDk4q+22xTH7X/MtwiFOI=@vger.kernel.org X-Gm-Message-State: AOJu0Yyt3x9gKjiE9iQ6cM+Y/SPGME3uPCT0FDCMvb2uKJbJpuhcVSH1 v3kDkLQShlOV6AOvdfpi4dVoiuNw+HXVeeBmR006wcKEZlJY3QIEdtXSIqDBnac= X-Gm-Gg: ASbGncu27Vm81YFkXJ4udGYCjDTYgn3xykJdCXPOtVKLXJ84HjYUg4T9lakttLUzjuh j4c4pwEKxdoq2KLvGqIOaev4EvhsApVJsmgSRF/9U8YmaqFZvLYCZqDLLmTjbH784lUZ9Zohj2G vi20jxjkldzMyuyN4VrWuy2fMbNfkEPWYIj06BXJbM4qrqjd4lYI5uG5uSMnIDkbD3arEG3A6Pr QScqdXK+C33/4vcKTicugl6fhjfLJOlGuJbn1VzOoyunLxBy3IPu+6hoigw/RZArQf4XRopMKwG rPI24UceF9pG7VamJbJG6beE0CY6jGBNmRx5CTEQvlzAu3vp3TJJltdJ2ie0MkPuX0QB5gcyrWL CmkGc8nx8YvXp6OxAmXCqAhF6/w== X-Google-Smtp-Source: AGHT+IHbFpaqCqy7oJ39CyR2Zwl/9NuAfZAB+lM4qcvF3LKM+A/AKR9yfndWp4sIKq8aPZyIHh+KQA== X-Received: by 2002:a05:600c:a581:b0:43b:ba80:4393 with SMTP id 5b1f17b1804b1-43bba80467emr32420225e9.3.1741002473131; Mon, 03 Mar 2025 03:47:53 -0800 (PST) Received: from localhost (amontpellier-556-1-148-206.w109-210.abo.wanadoo.fr. [109.210.4.206]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43bc222362dsm23270805e9.0.2025.03.03.03.47.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Mar 2025 03:47:52 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Jonathan Cameron Cc: Andy Shevchenko , Cosmin Tanislav , Dumitru Ceclan , Guillaume Ranquet , Lars-Peter Clausen , Michael Hennerich , Michael Walle , Nuno Sa , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 7/8] iio: adc: ad7124: Implement internal calibration at probe time Date: Mon, 3 Mar 2025 12:47:05 +0100 Message-ID: <20250303114659.1672695-17-u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> References: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=7681; i=u.kleine-koenig@baylibre.com; h=from:subject; bh=jqr9EwXfZY3b+14dJHqEdl3sytYGW0GVhd2OmY7oUBw=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnxZbOJ2NHnT28BuDYn5pn9Cy6XUnoy62wNXfb8 1o1Xgxn7j+JATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ8WWzgAKCRCPgPtYfRL+ TlPWB/9kBA/YalUMm9uRc0QIp6zcwfZVklEnf5cUkfHuLQSemru4lDAKLWuZ+lL+vT0jAF4jV8n 7xZcSv8VR3a2ya5bAuJyImvR6GBMkWGZWlm2oU4J/6/6LKZcuumNLwZW6Ugvm5BmbZjxhkOsPH9 yXwP/ruUPptaJgvRK8Y4JYdMfsSulBDX+ht13pS9YSiNnCotRkmwIrQ3HG7RfqOAq4an1Q0+hSf ZCQHouM5Vd4vmdXvLmrLTJcs8OtNUYwf1/1UTrb3nYROcmrcT5Fwk6DF8Q0/zh4iPFtOM2xUJgv nTWQ6ebaS9bWCUd+OB8Hh9+tmmPqI571CRcOq9pi13xZldqj X-Developer-Key: i=u.kleine-koenig@baylibre.com; a=openpgp; fpr=0D2511F322BFAB1C1580266BE2DCDD9132669BD6 Use the calibration function provided by the ad_sigma_delta shim to calibrate all channels at probe time. For measurements with gain 1 (i.e. if CONFIG_x.PGA = 0) full-scale calibrations are not supported and the reset default value of the GAIN register is supposed to be used then. Signed-off-by: Uwe Kleine-König --- drivers/iio/adc/ad7124.c | 129 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 3 deletions(-) diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c index de90ecb5f630..382f46ff2b51 100644 --- a/drivers/iio/adc/ad7124.c +++ b/drivers/iio/adc/ad7124.c @@ -53,6 +53,11 @@ #define AD7124_ADC_CTRL_MODE_MSK GENMASK(5, 2) #define AD7124_ADC_CTRL_MODE(x) FIELD_PREP(AD7124_ADC_CTRL_MODE_MSK, x) +#define AD7124_MODE_CAL_INT_ZERO 0x5 /* Internal Zero-Scale Calibration */ +#define AD7124_MODE_CAL_INT_FULL 0x6 /* Internal Full-Scale Calibration */ +#define AD7124_MODE_CAL_SYS_ZERO 0x7 /* System Zero-Scale Calibration */ +#define AD7124_MODE_CAL_SYS_FULL 0x8 /* System Full-Scale Calibration */ + /* AD7124 ID */ #define AD7124_DEVICE_ID_MSK GENMASK(7, 4) #define AD7124_DEVICE_ID_GET(x) FIELD_GET(AD7124_DEVICE_ID_MSK, x) @@ -166,6 +171,8 @@ struct ad7124_channel_config { unsigned int odr; unsigned int odr_sel_bits; unsigned int filter_type; + unsigned int calibration_offset; + unsigned int calibration_gain; ); }; @@ -186,6 +193,12 @@ struct ad7124_state { unsigned int num_channels; struct mutex cfgs_lock; /* lock for configs access */ unsigned long cfg_slots_status; /* bitmap with slot status (1 means it is used) */ + + /* + * Stores the power-on reset value for the GAIN(x) registers which are + * needed for measurements at gain 1 (i.e. CONFIG(x).PGA == 0) + */ + unsigned int gain_default; DECLARE_KFIFO(live_cfgs_fifo, struct ad7124_channel_config *, AD7124_MAX_CONFIGS); }; @@ -359,6 +372,8 @@ static struct ad7124_channel_config *ad7124_find_similar_live_cfg(struct ad7124_ unsigned int odr; unsigned int odr_sel_bits; unsigned int filter_type; + unsigned int calibration_offset; + unsigned int calibration_gain; })); for (i = 0; i < st->num_channels; i++) { @@ -373,7 +388,9 @@ static struct ad7124_channel_config *ad7124_find_similar_live_cfg(struct ad7124_ cfg->pga_bits == cfg_aux->pga_bits && cfg->odr == cfg_aux->odr && cfg->odr_sel_bits == cfg_aux->odr_sel_bits && - cfg->filter_type == cfg_aux->filter_type) + cfg->filter_type == cfg_aux->filter_type && + cfg->calibration_offset == cfg_aux->calibration_offset && + cfg->calibration_gain == cfg_aux->calibration_gain) return cfg_aux; } @@ -429,6 +446,14 @@ static int ad7124_write_config(struct ad7124_state *st, struct ad7124_channel_co cfg->cfg_slot = cfg_slot; + ret = ad_sd_write_reg(&st->sd, AD7124_OFFSET(cfg->cfg_slot), 3, cfg->calibration_offset); + if (ret) + return ret; + + ret = ad_sd_write_reg(&st->sd, AD7124_GAIN(cfg->cfg_slot), 3, cfg->calibration_gain); + if (ret) + return ret; + tmp = (cfg->buf_positive << 1) + cfg->buf_negative; val = AD7124_CONFIG_BIPOLAR(cfg->bipolar) | AD7124_CONFIG_REF_SEL(cfg->refsel) | AD7124_CONFIG_IN_BUFF(tmp) | AD7124_CONFIG_PGA(cfg->pga_bits); @@ -835,13 +860,22 @@ static int ad7124_soft_reset(struct ad7124_state *st) return dev_err_probe(dev, ret, "Error reading status register\n"); if (!(readval & AD7124_STATUS_POR_FLAG_MSK)) - return 0; + break; /* The AD7124 requires typically 2ms to power up and settle */ usleep_range(100, 2000); } while (--timeout); - return dev_err_probe(dev, -EIO, "Soft reset failed\n"); + if (readval & AD7124_STATUS_POR_FLAG_MSK) + return dev_err_probe(dev, -EIO, "Soft reset failed\n"); + + ret = ad_sd_read_reg(&st->sd, AD7124_GAIN(0), 3, &st->gain_default); + if (ret < 0) + return dev_err_probe(dev, ret, "Error reading gain register\n"); + + dev_dbg(dev, "Reset value of GAIN register is 0x%x\n", st->gain_default); + + return 0; } static int ad7124_check_chip_id(struct ad7124_state *st) @@ -1054,6 +1088,91 @@ static int ad7124_setup(struct ad7124_state *st) return ret; } +static int __ad7124_calibrate_all(struct ad7124_state *st, struct iio_dev *indio_dev) +{ + struct device *dev = &st->sd.spi->dev; + int ret, i; + + for (i = 0; i < st->num_channels; i++) { + + if (indio_dev->channels[i].type != IIO_VOLTAGE) + continue; + + /* + * For calibration the OFFSET register should hold its reset default + * value. For the GAIN register there is no such requirement but + * for gain 1 it should hold the reset default value, too. So to + * simplify matters use the reset default value for both. + */ + st->channels[i].cfg.calibration_offset = 0x800000; + st->channels[i].cfg.calibration_gain = st->gain_default; + + /* + * Full-scale calibration isn't supported at gain 1, so skip in + * that case. Note that untypically full-scale calibration has + * to happen before zero-scale calibration. This only applies to + * the internal calibration. For system calibration it's as + * usual: first zero-scale then full-scale calibration. + */ + if (st->channels[i].cfg.pga_bits > 0) { + ret = ad_sd_calibrate(&st->sd, AD7124_MODE_CAL_INT_FULL, i); + if (ret < 0) + return ret; + + /* + * read out the resulting value of GAIN + * after full-scale calibration because the next + * ad_sd_calibrate() call overwrites this via + * ad_sigma_delta_set_channel() -> ad7124_set_channel() + * ... -> ad7124_enable_channel(). + */ + ret = ad_sd_read_reg(&st->sd, AD7124_GAIN(st->channels[i].cfg.cfg_slot), 3, + &st->channels[i].cfg.calibration_gain); + if (ret < 0) + return ret; + } + + ret = ad_sd_calibrate(&st->sd, AD7124_MODE_CAL_INT_ZERO, i); + if (ret < 0) + return ret; + + ret = ad_sd_read_reg(&st->sd, AD7124_OFFSET(st->channels[i].cfg.cfg_slot), 3, + &st->channels[i].cfg.calibration_offset); + if (ret < 0) + return ret; + + dev_dbg(dev, "offset and gain for channel %d = 0x%x + 0x%x\n", i, + st->channels[i].cfg.calibration_offset, + st->channels[i].cfg.calibration_gain); + } + + return 0; +} + +static int ad7124_calibrate_all(struct ad7124_state *st, struct iio_dev *indio_dev) +{ + int ret; + unsigned int adc_control = st->adc_control; + + /* + * Calibration isn't supported at full power, so speed down a bit. + * Setting .adc_control is enough here because the control register is + * written as part of ad_sd_calibrate() -> ad_sigma_delta_set_mode(). + * The resulting calibration is then also valid for high-speed, so just + * restore adc_control afterwards. + */ + if (FIELD_GET(AD7124_ADC_CTRL_PWR_MSK, adc_control) >= AD7124_FULL_POWER) { + st->adc_control &= ~AD7124_ADC_CTRL_PWR_MSK; + st->adc_control |= AD7124_ADC_CTRL_PWR(AD7124_MID_POWER); + } + + ret = __ad7124_calibrate_all(st, indio_dev); + + st->adc_control = adc_control; + + return ret; +} + static void ad7124_reg_disable(void *r) { regulator_disable(r); @@ -1132,6 +1251,10 @@ static int ad7124_probe(struct spi_device *spi) if (ret < 0) return dev_err_probe(dev, ret, "Failed to setup triggers\n"); + ret = ad7124_calibrate_all(st, indio_dev); + if (ret) + return ret; + ret = devm_iio_device_register(&spi->dev, indio_dev); if (ret < 0) return dev_err_probe(dev, ret, "Failed to register iio device\n"); From patchwork Mon Mar 3 11:47:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 13998685 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A3F920E00D for ; Mon, 3 Mar 2025 11:47:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002478; cv=none; b=rVq8UBqqk02+GWH8y8ADLlQXYXLwvJbNWJ+gtNoG0OqSlYj44V4yDkGo+g+E4I5ia3dueX8wcwXNoWoKZjqf55mAKwR34RIOeHhG18Qvgb/v7NXeMR+XPjwJJp08NZWWwLx6/xTSTcfTwJQU/iKYBCo8wCLFZFqfAQDHK/PEn6I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741002478; c=relaxed/simple; bh=cGqPD8/SZrkOEEoS5r71WCJ1/AsMqIH3QA/fWi2qpiM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=jzoXHy7/tAZOHOk1ksfa5U1sD2elaZ3IPgFnLcJfBhh2uveXjGd0gTHoLSuiIDaUnbwSLVGfP1QlYGGaUEHWX5rvCZlx7Om7jXCUhKrk2xEbMADLvKZqTUg/97K6oMiOsX1WvskA63FDl9EMkRwgdyl9PSsqmlJBD9pFurmTLuc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=rLc7SPlv; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="rLc7SPlv" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-390e702d481so1774252f8f.1 for ; Mon, 03 Mar 2025 03:47:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1741002475; x=1741607275; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0JfuBlnVs+Mi+9z09rt1BKUuKJ56NGKvPoa3JHTdL8U=; b=rLc7SPlvITfDKZc0T1DYAS7loPH9CBrtv9OfIEJGGCNNUEBGjA9ZStuDvDfS3ixCbu FjvujN+FrzTVScHm7sdbC5HWSktmrqVeka3tpA00C7q4Kh+XPgvwwVQHjh+7JOBwfkg+ 8UEk5MtWkd3SMXkLg0NRPs7ForPFjtoGt09g1e5NBApZfG9A4KyICwtJ5PqoZF6fwF7R II+aVR4xw16DvUpXm3bmR2p2I7B9tftr36dwoxT1Ijg0x2CXcThR18mfX/5xJHijpxqe myVXhltfEk3cWEvrnWByLyif5p11uUaJkWqqzOAmFPMXbtcOkB8QrVNvwoXPNDwvSI88 5Rgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741002475; x=1741607275; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0JfuBlnVs+Mi+9z09rt1BKUuKJ56NGKvPoa3JHTdL8U=; b=g0J7WfQNSb22SNPmebW20REz/8hKwIJV9E2fiL1tPecIa/XAEv9UDFUwKF/ggL5oL/ 56E8Dw5BqgMfp7Im0r1XN50KcN1tcAp/o4qDUEk5Hu/yVZumV9nvIiNfE5jgE8FM+j0f M1JJDiTTbt/l80ZfihwqICgmsGU+KjfnQh+z9I5d+NtFoPF1ftCMNPjp/RwpgRmtIflS kQ86Y3O9SijNoeXRPdanB+t6a+xpZuyLN0sz/e2j0mndh9gaLMR7LjCfAdpC0tFHfNgB F4pb8P7KzSR64uun/PuH9TI7eRQHCyh8pgnMzRa4aNGwug8DFyEA4XxkMs+IJ7f9RwqA JQ5w== X-Forwarded-Encrypted: i=1; AJvYcCXvMTuXIfFU3/wJNLwzWHjg8SLRSmh2CcSbS/GWn86S6Muk0ZKJUbPv/bYZKmOdbh9ffOWoSs94Ejk=@vger.kernel.org X-Gm-Message-State: AOJu0YxXFOCoU/OCs6usDEliNjfTfJHvW0W61mHWwUuETDMb8xLqgPFV kO3giebLWsTv/Z6D13NNZcAG3a3upv9sFILjh0g3OewNbeO9CGlTKxIDtvmmfQE= X-Gm-Gg: ASbGncs6HiN0BAgy8MW9ochh74MBlDA2FHq6DxsYMFUGPoqUEvshsGyAcgagOUu7WZE NKXKcTJesKBhGRXrxocKtfNRh+n1x8XE9Gk5OILUJCCHUi2wP9hfsUt44ZGg1GxeZ5k8gu1ld0v ZIe1978AgRdN2jdu+Chqm4kuQ68RZfZs60LF1YxKvRDfBRctWjTwfuTzv+n2yxm11zQ5nkUFB+L e/+6mNbnbNTVSwo3zyo6fB6eg4JF+x7/orfcbLyeO42TlU6OMNWQOo5nZZCf1PNpttBKro0UNlp xB8KckM8I0Blnz3ZM5MVK0M60QYhsIWmyUuV78cAL8TTelRxnloH9+9DTPPMZo75DP1GO9zIwZZ ie6XK4pdhvwK+oez6QJ1+kHkZvA== X-Google-Smtp-Source: AGHT+IGkSIxp717Pg3OS71H44ATwH724qKt8I091Xvxo2HPuDyZAhdmwoEbHrejhhauDj7QidAGPPQ== X-Received: by 2002:a5d:5f4c:0:b0:390:fd7c:98be with SMTP id ffacd0b85a97d-390fd7c9b46mr5721261f8f.19.1741002474987; Mon, 03 Mar 2025 03:47:54 -0800 (PST) Received: from localhost (amontpellier-556-1-148-206.w109-210.abo.wanadoo.fr. [109.210.4.206]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-390e47a6d17sm14048575f8f.28.2025.03.03.03.47.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Mar 2025 03:47:54 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Jonathan Cameron Cc: Andy Shevchenko , Cosmin Tanislav , Dumitru Ceclan , Guillaume Ranquet , Lars-Peter Clausen , Michael Hennerich , Michael Walle , Nuno Sa , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 8/8] iio: adc: ad7124: Implement system calibration Date: Mon, 3 Mar 2025 12:47:06 +0100 Message-ID: <20250303114659.1672695-18-u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> References: <20250303114659.1672695-10-u.kleine-koenig@baylibre.com> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5359; i=u.kleine-koenig@baylibre.com; h=from:subject; bh=cGqPD8/SZrkOEEoS5r71WCJ1/AsMqIH3QA/fWi2qpiM=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnxZbQQj85GuyCEcT/+/txKbDasve9RcMnzqqly Hw1ZzYSxYWJATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ8WW0AAKCRCPgPtYfRL+ Tu9CCACvrDJKvuayNJIw8lOaq4cQjCSsgpuDp3xSqYdQ2o0NL/lOdxFoQ4DOFsOhe5DawJVGVaw DBFDkuLlNr/FSXmbtWmojqmMpdi50c0jrtDWW4rSB0N3PBSHol+PQgWEbpx+3WmlNuOf0a4ozOS 4IiTn8pdcBWdPOGENAzLT2G7xVtVuO93XpPDpxQpyba7DNud6doMPUPYC5TUIm2OYQS8FQ+c8Ss fKPaoM03QcH/s5ObNYfDYsm8WVRZbI3a4nvt1SIgYFK7FIZg2OZMGHWly/xl5vKD3COFkNodkZM YoZRbA2e+yL9SuvgxnprI6blsEpMFRVIExfDONzOlcuZgnWr X-Developer-Key: i=u.kleine-koenig@baylibre.com; a=openpgp; fpr=0D2511F322BFAB1C1580266BE2DCDD9132669BD6 Allow triggering both zero-scale and full-scale calibration via sysfs in the same way as it's done for ad7173. Signed-off-by: Uwe Kleine-König --- drivers/iio/adc/ad7124.c | 153 ++++++++++++++++++++++++++++++++++----- 1 file changed, 136 insertions(+), 17 deletions(-) diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c index 382f46ff2b51..5ab0d3e48c43 100644 --- a/drivers/iio/adc/ad7124.c +++ b/drivers/iio/adc/ad7124.c @@ -4,6 +4,7 @@ * * Copyright 2018 Analog Devices Inc. */ + #include #include #include @@ -181,6 +182,7 @@ struct ad7124_channel { struct ad7124_channel_config cfg; unsigned int ain; unsigned int slot; + u8 syscalib_mode; }; struct ad7124_state { @@ -202,23 +204,6 @@ struct ad7124_state { DECLARE_KFIFO(live_cfgs_fifo, struct ad7124_channel_config *, AD7124_MAX_CONFIGS); }; -static const struct iio_chan_spec ad7124_channel_template = { - .type = IIO_VOLTAGE, - .indexed = 1, - .differential = 1, - .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | - BIT(IIO_CHAN_INFO_SCALE) | - BIT(IIO_CHAN_INFO_OFFSET) | - BIT(IIO_CHAN_INFO_SAMP_FREQ) | - BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), - .scan_type = { - .sign = 'u', - .realbits = 24, - .storagebits = 32, - .endianness = IIO_BE, - }, -}; - static struct ad7124_chip_info ad7124_chip_info_tbl[] = { [ID_AD7124_4] = { .name = "ad7124-4", @@ -903,6 +888,140 @@ static int ad7124_check_chip_id(struct ad7124_state *st) return 0; } +enum { + AD7124_SYSCALIB_ZERO_SCALE, + AD7124_SYSCALIB_FULL_SCALE, +}; + +static int ad7124_syscalib_locked(struct ad7124_state *st, const struct iio_chan_spec *chan) +{ + struct device *dev = &st->sd.spi->dev; + struct ad7124_channel *ch = &st->channels[chan->channel]; + int ret; + + if (ch->syscalib_mode == AD7124_SYSCALIB_ZERO_SCALE) { + ch->cfg.calibration_offset = 0x800000; + + ret = ad_sd_calibrate(&st->sd, AD7124_MODE_CAL_SYS_ZERO, + chan->address); + if (ret < 0) + return ret; + + ret = ad_sd_read_reg(&st->sd, AD7124_OFFSET(ch->cfg.cfg_slot), 3, + &ch->cfg.calibration_offset); + if (ret < 0) + return ret; + + dev_dbg(dev, "offset for channel %d after zero-scale calibration: 0x%x\n", + chan->channel, ch->cfg.calibration_offset); + } else { + ch->cfg.calibration_gain = st->gain_default; + + ret = ad_sd_calibrate(&st->sd, AD7124_MODE_CAL_SYS_FULL, + chan->address); + if (ret < 0) + return ret; + + ret = ad_sd_read_reg(&st->sd, AD7124_GAIN(ch->cfg.cfg_slot), 3, + &ch->cfg.calibration_gain); + if (ret < 0) + return ret; + + dev_dbg(dev, "gain for channel %d after full-scale calibration: 0x%x\n", + chan->channel, ch->cfg.calibration_gain); + } + + return 0; +} + +static ssize_t ad7124_write_syscalib(struct iio_dev *indio_dev, + uintptr_t private, + const struct iio_chan_spec *chan, + const char *buf, size_t len) +{ + struct ad7124_state *st = iio_priv(indio_dev); + bool sys_calib; + int ret; + + ret = kstrtobool(buf, &sys_calib); + if (ret) + return ret; + + if (!sys_calib) + return len; + + if (!iio_device_claim_direct(indio_dev)) + return -EBUSY; + + ret = ad7124_syscalib_locked(st, chan); + + iio_device_release_direct(indio_dev); + + return ret ?: len; +} + +static const char * const ad7124_syscalib_modes[] = { + [AD7124_SYSCALIB_ZERO_SCALE] = "zero_scale", + [AD7124_SYSCALIB_FULL_SCALE] = "full_scale", +}; + +static int ad7124_set_syscalib_mode(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + unsigned int mode) +{ + struct ad7124_state *st = iio_priv(indio_dev); + + st->channels[chan->channel].syscalib_mode = mode; + + return 0; +} + +static int ad7124_get_syscalib_mode(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan) +{ + struct ad7124_state *st = iio_priv(indio_dev); + + return st->channels[chan->channel].syscalib_mode; +} + +static const struct iio_enum ad7124_syscalib_mode_enum = { + .items = ad7124_syscalib_modes, + .num_items = ARRAY_SIZE(ad7124_syscalib_modes), + .set = ad7124_set_syscalib_mode, + .get = ad7124_get_syscalib_mode +}; + +static const struct iio_chan_spec_ext_info ad7124_calibsys_ext_info[] = { + { + .name = "sys_calibration", + .write = ad7124_write_syscalib, + .shared = IIO_SEPARATE, + }, + IIO_ENUM("sys_calibration_mode", IIO_SEPARATE, + &ad7124_syscalib_mode_enum), + IIO_ENUM_AVAILABLE("sys_calibration_mode", IIO_SHARED_BY_TYPE, + &ad7124_syscalib_mode_enum), + { } +}; + +static const struct iio_chan_spec ad7124_channel_template = { + .type = IIO_VOLTAGE, + .indexed = 1, + .differential = 1, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | + BIT(IIO_CHAN_INFO_SCALE) | + BIT(IIO_CHAN_INFO_OFFSET) | + BIT(IIO_CHAN_INFO_SAMP_FREQ) | + BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), + .scan_type = { + .sign = 'u', + .realbits = 24, + .storagebits = 32, + .endianness = IIO_BE, + }, + .ext_info = ad7124_calibsys_ext_info, +}; + /* * Input specifiers 8 - 15 are explicitly reserved for ad7124-4 * while they are fine for ad7124-8. Values above 31 don't fit