From patchwork Mon Feb 24 14:10:12 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: 13988240 Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.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 D9D5F13A88A for ; Mon, 24 Feb 2025 14:10:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406248; cv=none; b=p/qp2v+xSregl0ts/mO0SQejqSUlrEhZdWA4MhtqHQz3uyxupVmi+xMA95WOWyjGpPW/Nf+F76NLKnluzzNKvRw4UwPFJbBbGMn1zfuQ0ljRguBm0ZeDk5c0MvOdBH/GIvqNT3j1gxrZKfk75g3HXZ0nYbYQhDiXjgQVrM8jQZA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406248; c=relaxed/simple; bh=SRKMapFlVg3+8kF9cvHubzekV8X8++YISp0c0O7y6Ac=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZcmDzSraPQ9JBTwm9meg9hXPia4fgayPFNXmfZXnVUx5yPi2rTDtvjUPuTYo0AU6dC4RqQInwS2kVch53ynvYTARICDxWZtfunOVq9L38sA9Q1cH3bGpE6jdzJZukYlmv+sRY6p/Dhuc+bHqlXwGLaB+PN+rgL/NGSjxabr7lpU= 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=24K4xLB+; arc=none smtp.client-ip=209.85.208.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="24K4xLB+" Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-5e0505275b7so7182807a12.3 for ; Mon, 24 Feb 2025 06:10:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1740406244; x=1741011044; 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=6E0VFJeeN3DbM9e1x+ou8SemoqItJRlOI3ariJtd6jU=; b=24K4xLB+k3NpmtTXSPvdYvQHGNgXLyPPAgJvAZ/KAoeUdR+rlBbaHB8o5wyyqBnrEA PWwwIb3ICCjVomiW1zS90lT+Hg2ZJXdcqGpKG4R6moqTUvtGebUuJlD7AAbK59DeVW1Z UFaQQwUP4xnSlEFAEzAoQQtdJhTtcDkltNctOUdcTc9NW2Ggge+B/jmidf+pjTtr7RKZ P3wgf2pCEZ3fvSaGPE/8QKP/dl1I7KhQeh1nPMlW6xF8UkkEVR+a7kehCfGCMcHISTeX acsYLfoyp7f1fe29E5vx/NVt4zsm4N7YgML5Zeb/3Ufhe7HANC8/umvsISI+FZ/qmicT t5ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740406244; x=1741011044; 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=6E0VFJeeN3DbM9e1x+ou8SemoqItJRlOI3ariJtd6jU=; b=U8RDtSp08FR+vZF3C+qBEACXgIf+keQh+Y1DPIb2aF2z/eUAa9UNrHKN+VxsLauqt+ viJAcuiLm6xYifdbb2JOw36p9xdHQdfBaFZ1pFTmGjgeqMnhc1yq16qErDrnqgyhNQ8N /Ck/H5NtEnodIkj98C1ec6XemISeSYG4/UiYK6+YAmEpd9DNxM2kw8UHwUHofY4sYlot fJ7Eme80TexHcmih5V0c56iTixONvmYxfwEp5EdXtJtIeZYNFz0iT2Y7vPMUq0pbM1fp OjBKI3WjxcZGEnc7v8A/4ZZ/PNaVttxGwA1K6aFU0l/stZsailwa/5QmITJnL9WwqRYh gsoQ== X-Gm-Message-State: AOJu0YzBhAcDIhNL7evw3z72kf3aJxYFZ2M6w8YaB73g2MDeWu9ZdRVf yJ89kJ39sQSJbpoL+JGCaUx3ZRM6bnA7bj4I0/qh8Qw3PiD7CC5cY2F3zK8cafc= X-Gm-Gg: ASbGncts6kTdd0YrtxJh749mJeIBuvwyMjy9owzaHEz2Kl4giKF33bEsqt3F6cmWWed voQj/lReaU8CDngFcXyiBEJgzUgqfjE1o0PWmTtLTo/bcTWkPb0f85RJses4oRtm/NkY9VjmcvE r+idTtYBKin2hvFrrQIQFXcNMbybKBZugngmOTxLyV1EztvQlb4o9C6bWP2ckFbmX4hW+MTaaty Zib51PyMy90EKtmE8dWsT7A9CWxGCruS2bo7InMkJV44zbQ+IabTE+/SGOtSJoT+cZs8VHz5J2U mvoPmE1DfbDPcg8Wpyd7gZIunVgggws= X-Google-Smtp-Source: AGHT+IF9hjXLR5IgH2ytyzjW6fpx2H3xfIANXvajOLuVYy7ECx+hR9GEOC/lf9lILFcaiMEFnBzAxA== X-Received: by 2002:a05:6402:3592:b0:5da:105b:86c1 with SMTP id 4fb4d7f45d1cf-5e0b7236ee0mr13221532a12.23.1740406243963; Mon, 24 Feb 2025 06:10:43 -0800 (PST) Received: from localhost ([2a02:8071:b783:6940:36f3:9aff:fec2:7e46]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dece1d48c5sm19200919a12.47.2025.02.24.06.10.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:10:43 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Cosmin Tanislav , Andy Shevchenko , Guillaume Ranquet , Nuno Sa , David Lechner Cc: linux-iio@vger.kernel.org Subject: [PATCH v3 1/7] iio: adc: ad_sigma_delta: Disable channel after calibration Date: Mon, 24 Feb 2025 15:10:12 +0100 Message-ID: <078cd5a78b536b368279be49a09f1c5be836db81.1740405546.git.u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: References: 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:message-id; bh=SRKMapFlVg3+8kF9cvHubzekV8X8++YISp0c0O7y6Ac=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnvH3H4vN6a2TlRtaxZvfozYC6VZFqqNsueMlJH l1mjnTY1ciJATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ7x9xwAKCRCPgPtYfRL+ Tl81B/9KiUF0D4CAMS0JiYnnlE5qVeJ8xAKk/D/yu9bF3Yot6cnIoRl6S37rj2ATjzkEVz0pnjJ 3sbaa//bQ4Wvr+D2baANCajGdNXAtXp9/uK5jCw46jz6AQSlLcQG5LYdWpxK9pwHYdXpQB7cs6R YHcg361criw5GEKdW+E1RJOizrD0q0u7NFJb35BGhh9hdmow/52JxVt2shbSHppR5VDKrbJdaPJ vllQXUSH/bTpEInnhCD/m859cnKp69hNOCGLwCszFhRqJiKRI/fWZQK+mOVt40jd4HpdNglqUkU 7tAB4IET5EiBCV/d03DFn+ZBjgoq7aak1Zjj8p26GdXqXQUg 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 10e635fc4fa4..fbe241b90f37 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 Feb 24 14:10:13 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: 13988241 Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.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 666EF13B2A9 for ; Mon, 24 Feb 2025 14:10:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406251; cv=none; b=fdqdmgndT39PLs9GPLFSD9/xO8uHHhHKsxhAEl3dxJVBjlwmxqkz9BcspC1nI0Ez83XhoHT39oiKgFW2FA/0q3vmYl/Ni+IVdpnETYBCHhLIH8kNjtP8VX59Q3slhUlpJA47GvAAtwC3kxg1DE2enM/N+UWvw5GxiJVkYgiEHwg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406251; c=relaxed/simple; bh=ec14xnJrpwkJrC/ethpz0fLxzagiTiLZ9fwLcAvPKo8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=dloFivcYfX5DoBiwDjO0md2cWePzLYAERfLtAGKRNp99VglUWKu9tWlkr6k/MTe1/PlHl9EpDMdii71PgiT4K6gLe6wvahFRweCqmIltb1Qgp0XpRCBuYhaTwSBZJAkx4/HSjaEUmZGmNld6lC9NvSozs6POsEAaaoaXzOLldd0= 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=tQHhhxMt; arc=none smtp.client-ip=209.85.218.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="tQHhhxMt" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-abb9709b5b5so821063166b.2 for ; Mon, 24 Feb 2025 06:10:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1740406246; x=1741011046; 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=tQHhhxMtbbBIZTPQRPeP7qaA0a0VGbdBaolxJ+eRgMWpLZMHpoimwIfGdUGtlDY4oY 69hS0viWRXf+lUS2U2BWUqOYyJ9MbCNVLjVuSmTpv0mTvi1AA35caKrs1albw5MIn1Yn pbCnml6FGJjAPZnDW5Ax0YPxeBruBUyO5q6dsZAU6oRIATLiHvou6w6jPJz86na5+eTe 2l3KkBinnirrpI102/6sn8ZRXRbW0xW4cZqiH080BfMkQUDGKszZ0lCS1jkXMwuq8rZz 8F037bLqhdAKQzCXOba1zXdB2/EKXp8s/xv+DBW9IOEWxzftbkvEr5YMDDj+oWkMbTtm 7PfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740406246; x=1741011046; 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=e/POsYyaerxmq5IUz3Rqozkhj/CB5H9twBW9OAgNMTFByrxt0BtDKdFXOVo6sXm4GS En3mX9ZWF9U0B5A+KLa64WcUzfLUgTCy7MapNJPp8dxNqyweX4kWrDiCrCxBt7FAENEd +IGWjsbulIRDsX4U51gM3cwg3dG1kIq8RrvlY/x/2kx7pvPlCTqtlXLJMBsrh+SggeJo eIkCdBTy5o5XU63z5OdwBt1EZ/bD36FzW3GYQHM9lOULFQy3Uj2AfvDFeE6YmP1DcE20 ksZezHD0Lk26m3qiDQ94WOXCQMObOOwV9Qvw6XPUmu1lZFgPqb8lRDjcjPa8Y5biJc3e LO9g== X-Gm-Message-State: AOJu0YyPzHgS+SX7LnnQ8ihJPr4WZbyQlG1lJ/wfmUi18GT1oZJModfE fpLK0A78XUjvyfnn0xhjyk44LhsZDdqIBQmFPAQYfE6SwHtDXVeBTgBq9ir2EDOpPEr2PeeahNY t X-Gm-Gg: ASbGncueXVWje/xymCyPoYKQj1Z6Z4m9a45VcHa2OuqEEMjM31k38TtOn6en64aDLcb BTznYmQH4U4tmu+6Aa5wKRCfBsf56iyWHQ2VzvZ3zzHULmaegKdJ+gu8qulMejVnbHwk+tWyn6d oFJRlrX4MMaj0HHvdnqEUY7hXSliJ/IsvXjckpsDdxq7sCu1yru8L7xXWHskP12ma/owG/xFSlW Li7yBzP7eMKZ6X7lU/VxYC7YVGzskQucSDX8wj17s1BnbYBHsOs2xIHT2XAOuBynSgXNQysAb+h rOTWIebu+oTz7cRhWgsbedGU+Eg7rZ8= X-Google-Smtp-Source: AGHT+IEerRa4aomy662kgS2FvwbBpmQRsCYO0ncpqcdejEb2ubM+sRbpqK3FovOpqe/ZYbg0jaiLXA== X-Received: by 2002:a17:906:c154:b0:ab7:e567:4fe8 with SMTP id a640c23a62f3a-abc09ab0dffmr1425550766b.25.1740406246315; Mon, 24 Feb 2025 06:10:46 -0800 (PST) Received: from localhost ([2a02:8071:b783:6940:36f3:9aff:fec2:7e46]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-abbdac1015dsm1082696566b.127.2025.02.24.06.10.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:10:45 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Cosmin Tanislav , Andy Shevchenko , Guillaume Ranquet , Nuno Sa , David Lechner Cc: linux-iio@vger.kernel.org Subject: [PATCH v3 2/7] iio: adc: ad4130: Fix comparison of channel setups Date: Mon, 24 Feb 2025 15:10:13 +0100 Message-ID: X-Mailer: git-send-email 2.47.1 In-Reply-To: References: 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:message-id; bh=ec14xnJrpwkJrC/ethpz0fLxzagiTiLZ9fwLcAvPKo8=; b=owGbwMvMwMXY3/A7olbonx/jabUkhvQ9tac2pO2reZlW3u+uLNEhPePo1oDd5d/+vbh9bHOW2 WaBvPbqTkZjFgZGLgZZMUUW+8Y1mVZVcpGda/9dhhnEygQyhYGLUwAmcimC/Q//jZVi7H1RLxwS 2z5LCwccfXqu67l/0MaLifd4lyiue3rSOCWCabLQ4oiMdj72hT+mSe/yUGbQ9BdJPyRgJHrx8pp dL9Uv5SlPLzZaK/mZsap2tzc706vJJluiHW92WvX9tOdmXlMyU+jkqXpFwRzR5rc2CX+ey+o0dz YJce8rOrPX9dpEx4V/bYQrf29iLdjIm8nuL39vOz+no46ztav5pIcmGxa23Lrj4juFx/5l8aMMM 9e7vtELzu2PchM8EayW/CfumGWD84ydshwZcqrre7uYph/7vG5TQUM6s9rLGzJiufsZHY91srXt W8dz2yVCS2jRq9KrjJtv/Mxl5N/scSvUP+tkobL9KndtAA== 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 Feb 24 14:10:14 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: 13988242 Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.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 3F6A71386B4 for ; Mon, 24 Feb 2025 14:10:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406252; cv=none; b=osy30Ex/NUe5GwpJ+F0UFUml8mlxbUEqS8nZpNg4sC0HDXrd9EFBi3Av2JHpUliSKUp6fgE+YzGAMjcoYJ83ppen28GWiMGh+wnWO4efrIIwfnkNRgpfWo9jzs+BaG8aujc28CMHVbxAY7x7i4kGu8KLWokUgmNDwoalv5+Of0Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406252; 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=Im+AEzUtUSGIgCfOhPDQZtTBsIWJ3mg/J/XrdC4ITTpdyYJRQ9hoHUa9fbfjNvSVydGF5jh0YF0XlQm9ZH5qFQLvn9WiBefC79XxLv7SWTMBAxHgNHjx+FUcFh23tfiDQYIKxpFAd9qJvxyGnkuW0C2pSDy+6CJWBLCGW/N0m84= 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=v8SRo/cL; arc=none smtp.client-ip=209.85.218.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="v8SRo/cL" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-aaee2c5ee6eso649217666b.1 for ; Mon, 24 Feb 2025 06:10:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1740406248; x=1741011048; 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=v8SRo/cLtEuRYaPQfWruy/f4SuW+MDtI6EvqBOiIiINW8kGMIbuf9OV7vEOuCA+/In gmoL3dx3G2mwfLnjlCQa9QHYDOfA7hjJCliVNF2gHEn3pbfzMBrNZ2MzXk+DQqK/TWgz PlrUwnbFwcTpFrydzUqJhbkTPTBYhCyQqSeAm9hR94Lw1MUvaM4tOv/rnnGLiCHPsG3f lhjsb1GCVjzHbSApxD3nmzuWpWNADrYUT5WAEVWS5ohqj5Y0yZm9DsnzgiGARKQ7vh1r G98Li5F1USJvUMrM/99BV3swsvkQn2Fox6t7zsudqlJ4LHlMjpop6N6byzKEEgeNMyQ3 wt4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740406248; x=1741011048; 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=mWaYxNJGJdUel5W71sU2/9P03HiJlzAux7lViWqwQOht+eWIY5mRpZDuwfzaAXCb+P Sl/QKHJKTsrUSJJsdrSQKlr5pYD8M+KSsGuhv4RDep2qQLFzJ5D5jUWnldbxeG/yS9Zn EWUnCEKwogKeKb06AwBNO8TNNzulvdfh17HKWIF4GbFIS1INLYi6f3kBbQQX008wSQwr nfkljK/N9ro9R8h2ZxyTAUCK2EaZYn+mvaTvsBSPLR54btoa/vVL2o/3+wW9hrFHbG0B M6ThjzYz9j7oYA1+6lfjut7+TJPJx41xHppu4TcmatdF+rOFhUJt/M/x9a71I71fJMf1 1fBg== X-Gm-Message-State: AOJu0YxrjscRjTWMFK/SMi76E2ZOuAmTbSPUk7tUYEy8W2HxnuLmStzt jcJJW6kb9fOXKmyMatQa0QNxkKx1nkkPtJmuXcjRj9y9UBSmLiO2/SjivI6f3PQ= X-Gm-Gg: ASbGncu66+mOqZTiMeX9V+igQiML0DBRwhPb5Ir75OD76Z55LjzrVKrOGTNmvjLBXd8 4kDyBjLRcD69wR7g7JKcA4H4vJwPJpMwIP87Ic4SuiBlZGSyyEWpTYycEQN7xx6JKzwkgdswFQm 3p/X4cuh2sAj1KbmzrI5xPIWjqX2UIOSRcBYnA1t9oRLmGKb67Pm18ag57wBsMTmvirWHRzYUHL 3q0bRZkrILoyiz+5poz8/NJCoM6zlUv6jCc25D4uBVeW6GS9eYGk6jmB4KVid00Ury0jKKO1Qtt OXLL+4+ptB6ailMv62/Cd5ncw7XOBq0= X-Google-Smtp-Source: AGHT+IEEev2Pq9yHEhPdQ12GlsX2heN1Yij49q/c4oHJQBN4HtkhF+59wxmGEm/9KMx9ijWpgcc3Mg== X-Received: by 2002:a17:907:7851:b0:ab6:fee1:60e0 with SMTP id a640c23a62f3a-abc096c2593mr1226357666b.0.1740406248454; Mon, 24 Feb 2025 06:10:48 -0800 (PST) Received: from localhost ([2a02:8071:b783:6940:36f3:9aff:fec2:7e46]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dece288e38sm18333841a12.79.2025.02.24.06.10.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:10:48 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Cosmin Tanislav , Andy Shevchenko , Guillaume Ranquet , Nuno Sa , David Lechner Cc: linux-iio@vger.kernel.org Subject: [PATCH v3 3/7] iio: adc: ad7124: Fix comparison of channel configs Date: Mon, 24 Feb 2025 15:10:14 +0100 Message-ID: <0699628b9382229f908583ab752c3008d28cf7bc.1740405546.git.u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: References: 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:message-id; bh=np/7+Gia9o5hRCqEtnJukHY+JqLP+X1gw41ncD9ejcs=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnvH3Mw7zonUlErGkb1SgAsItbM0mEx5No/HRM4 s9MQbUVr4OJATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ7x9zAAKCRCPgPtYfRL+ TlMZB/96zO6e+2+CJ1tjsppGwb1qsAgBY2h1F1IpmJhU9MbnO7yTaGmkTcTWTAAjfa4z4cJQgAM loszFc/Owe2wnmk285EeqM9DRZauNNK4Cp7J0kuYYqN3VN4OGP5lJ5Itw1NWDDL3kcKWzXqVWx5 yIxjUHoWQzO+6xieV6eft6ABDjiYSuuYZTQNTm0c9TVjUoKzcCwNKeQpTsjf1MgFO0f2UqXFUME UBWMmePXG7NeuCyOUlP+IDIWeC7A30U2E6KjwG5K0kxCWrYHxkQ0lraGgzehOsr8JaMJ2m1QGLP cwZwKCNoif5BSWzaupXm5EfJnoTfvaYlALR0FHngVpkqRnle 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 Feb 24 14:10:15 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: 13988243 Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.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 B84581386B4 for ; Mon, 24 Feb 2025 14:10:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406254; cv=none; b=fAOAzCW1DptWYkkP6PAU+xtbK37z+LVc6DbQ7XifJDJJT3ktOn6YIjd11e02sQgkRDb8enHVGo9oGLdXe+IYG3eAb1jge8eXNVHibp9PSjB1fDlwW207w/Jm3CwIrQFdf/o18TFbqpQzIsw8pJOVAcJLJY2flgZf4vAJuPjs+w0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406254; c=relaxed/simple; bh=Vs81Vms3na76LF8phSoXFrzIkYQ+oocjyJOIOe552i4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=e8KintRfVVUggR/rkHT5VjzgkCk3q9KmZb5c0+zG7sGnmN+h0oxIURaYGqV48AAERGRh/onOIXsQvsrgAcMmbJ9x68+aQvXH46LfwBxY6BG2fO/La+kbXVC4N4EXOSc0YnAhJRrS/eIFznygdNB9dDO6V//aqUv+xokqenTqaaU= 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=JN+Iq9Oy; arc=none smtp.client-ip=209.85.218.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="JN+Iq9Oy" Received: by mail-ej1-f53.google.com with SMTP id a640c23a62f3a-abec8b750ebso48521966b.0 for ; Mon, 24 Feb 2025 06:10:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1740406251; x=1741011051; 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=kk4bNibOnobb+BM3zwG+9LKQ40oSTYCAQYzdjAQx4Og=; b=JN+Iq9OyN9Rv951LDNxQYdXRVjl057z2CpQClllPnLe6D933WXDBX1s9s/6/k32Nlb 6bGeMasizvD4YyZWd27PMaQI7a6/C+PNUH0yOho0wFH7VVjjMUOY6c3t4vtQOfXgGvpY gASRTwm1CBpVnXND37345oaRugScr2ikbL1DRbPEKrCNstwPQKYHd2+aCy6MuNvs+ysD v692GdYWOLLXbG1OasQbZvNAf4Hm7kRKgMqIVzXo8uFt7zNDPadkr3xndbkMEVwLvKFg mR+CLxi8ZLnNayRtTKcZTaNXkWGQ7zX2kPtsdp7fg94lHn39H2j6oyLHNSZ/zBykNuM1 /onA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740406251; x=1741011051; 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=kk4bNibOnobb+BM3zwG+9LKQ40oSTYCAQYzdjAQx4Og=; b=FPir4hPIpsjJqzUlmaeHh0RpgBDb4/bcjdS7FJFziXclzPa+81rpVFPipQ+O4/4SZo em5G2pwS9Y4QVofElF5R006WPnRXCyzuFeOOcLq35mo8YbDh1QT33HBRghTAdVBAcqHB MKVcWTdTNMxWCwee20RXuomNlRmU4nkWJuw3/Fu8jTap+ijejslAPc5KiUnJZE4nvNVd V1NGFv+0NOVoFFM68MN0B6QECAuIy75dl0m+TjqlA89mGREBb4ecasnrZoByU0FBAUcS xHCk5wYeC/7do3U0FxNsWfEA9Fu2Y3Cguu6JqUBxRTqY5PEMVYyTtM2h5SsGigmdr5KQ B4cA== X-Gm-Message-State: AOJu0Yx5Wq2FBEoK0375cXWJHpsg/l/YaGgOsdtNDR1/CTZkb4tlsAxl gaJwjFCRNQ+5Nl+rRldAfqYTNN3hjq5M9V84dAdR28CywrC/l2eLlMYWcOMqyio= X-Gm-Gg: ASbGncujud7b/iQC1sv27mkR6MJUYalYSlS6Eh0kwvX6GSVuIapLeXYIMUd2jVfHKmK QhUcPO5HioM4MbW/ZuXP2dKDRHbEH0FaWtYr+qSbErGjcqsIk+mksG8sTNjhj/ZAWzc3AJ1oTpH N3bckdSKBxZ1dHABHMfEvKOcZrvPuNCWfIVOx8a3B/F4/ilhDLNUK/lw13JaTOHHO6u+2g04i3D RWECxaxmhI/92lFozzJXDjuBXx3wqnbnkdoEvLa9pBBj4MfSHGkII+pZHGBeuvfPu2xccn6hlbd EoiTxWpVqrk/Y6Av8a/5B4kM+AKk2YY= X-Google-Smtp-Source: AGHT+IFfNBlX23Fo/B7jeIH3847V1gKlqsJYWiPnyZyPToC3SZ5rylJ6sNEMW/Frs6+NuBvAtVN+Aw== X-Received: by 2002:a17:906:31cf:b0:ab6:ef33:402 with SMTP id a640c23a62f3a-abc0d9e4ef5mr1193501666b.18.1740406250878; Mon, 24 Feb 2025 06:10:50 -0800 (PST) Received: from localhost ([2a02:8071:b783:6940:36f3:9aff:fec2:7e46]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-abbb73a108bsm1341331166b.141.2025.02.24.06.10.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:10:50 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Cosmin Tanislav , Andy Shevchenko , Guillaume Ranquet , Nuno Sa , David Lechner Cc: linux-iio@vger.kernel.org Subject: [PATCH v3 4/7] iio: adc: ad7173: Fix comparison of channel configs Date: Mon, 24 Feb 2025 15:10:15 +0100 Message-ID: <941123d0959f766878c8799ad4aab325d6018351.1740405546.git.u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: References: 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:message-id; bh=Vs81Vms3na76LF8phSoXFrzIkYQ+oocjyJOIOe552i4=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnvH3PDH3M4wnap9aEHEHK005GUAu+e/F5YHEU4 4VpdRzo9MCJATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ7x9zwAKCRCPgPtYfRL+ TgLlCACk5TOiP2GkPM2nQheVIyqQlG2Ie0WRqHoWauqUuAURYsvsYjXyP/ZcExsxwVueMSdiUYO EaXtZwVIwzkR2CNYqAhhdule9cM5MMR2OtpMhv4U4U5/xFTRoBDTVXGpz4OyPSe8Ldwa7WpXKmm YPniC7V62spdyEsgu8lakspjLPE41eRUndXLeIRVgmbhiSHDvcdr25hLBJ6sgdiD9UEots3USQF QlUBVudpHj/lXEpTfzAjkFCxI5Rg0AtvbKNQewan9D65ybKgbm2j/bmX4S5vpbTRwiSS1To22Ck Qkqw71L5nRcCMsTAyiukNJK94FKNwI4JnBg+OEwXiX/UwDHh 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 54f9cc5a89f5..962033393943 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 Feb 24 14:10:16 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: 13988244 Received: from mail-ed1-f54.google.com (mail-ed1-f54.google.com [209.85.208.54]) (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 11698146D57 for ; Mon, 24 Feb 2025 14:10:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406256; cv=none; b=NkB9/ipTLwdkNOgVtodpAghA4QVGkNj/qb/sGZx7kb2FgMW47wBbOohRkeWxeGwX0p/dPnbu/H7rCxUtF/0nbQR/KhgtFwigadSOl85ONENzlcDnSgMHGQJvDG9stUQRP1vZyUHxVyKcw+9kLkI9tzGqJRy0WjRDnTWCDhlswM0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406256; c=relaxed/simple; bh=BRca3gj2PkpV9SyaPYi59In8bsj2B+W6naUDybav0vw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WRKLKXFtOY/NGYqFpFPPbWtD2xlbDFSCmzIm+wbOMJUoowCVyH8DajEkiC6N5uy9qaF1sY22rhEJ0cGF8QKcOKfDvaTOuRtbcTZFkVdQ6bS/M/0s5TzV61c1MioDCKkc3vnQ55U19onfryEscJ4cbQXPCRjuHYmFilfqfH9Xgw8= 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=GBGke6Hb; arc=none smtp.client-ip=209.85.208.54 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="GBGke6Hb" Received: by mail-ed1-f54.google.com with SMTP id 4fb4d7f45d1cf-5e05780509dso6414378a12.2 for ; Mon, 24 Feb 2025 06:10:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1740406253; x=1741011053; 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=vbkFCx0EfP3wBC1PETMUYmTJ23p6zOVlf0nfEfb93AM=; b=GBGke6HbZ/F7aYGdYldBBwzm5D6H5nXDGeiRuvFarFOCiTOAsLtErQr+dz18e8CPn3 AX1Vg02aSEeUsWEcx7hTiWaewtFZ1p2vTVGSYzSzyAuHF3DSGlQdWU+k6bkteJpFGIPE KzmYOWSDCYhrw2jaXoJsRKMY2Vkq9CjI4c4n/7W5/yCn8dowwDgC4HKzWrllciVjogKQ KEckRNen4CnTDN2ez9omEiNx9IGnfgZW9oUxaMIORM31ED3vRYxYSc3cVLkXysGZNOBj J+YvCJEKUiA1qyqb6xlwg3jXewgd5Mv/UOaU7OTBdAp3k6nhyXHG7Pt7d/z8+CVakej5 CreA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740406253; x=1741011053; 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=vbkFCx0EfP3wBC1PETMUYmTJ23p6zOVlf0nfEfb93AM=; b=EWdI2weJfsLssA4DRJ/paM+tvRc3eG6xtT+PHTahmcNLUByfdJz9GXh3gRjmIM4gBd IcgQ7WvFfyTrEdMJJhKkEKfghQtd+jJQTspe3SlY028LZD1gn8vnRT4neqO+bX/bp2Hx x9jfgXhqQSPcwHLg8nmwoF2+bsVtXupv5V4ZmQ+7smGGK1uxQLUGufmi8r3SHD/wry1N jNcYR8bmQPVfu/DIwuhyvA234cEvBrGJGDTcixoNC0Tctt9ZBUgCvwv77nEM6u3CKMdW xc/qD8V06UyTLxbwWzseTos0/w8eEl2L7ovpWAahu7u7kEnVFfMqyN0yPCNhlu2fU3Zn Pq4g== X-Gm-Message-State: AOJu0YwTHozKP2ijqBe1YwgXdueu8y7cOyhMuCQThFk1b+tYV6M8QI4l 8TCn/usr29mOuuD0YJmdxGjZ6TzntMEnBtXBlFFYcK6YKQ03FyGLRPPQ0koTXfc= X-Gm-Gg: ASbGncsLxeczO1tc6uGlBrdF1w9dyop9GX0Mb93k96wF7JKzWgq37kY//5lifW/ZlXt Fial8Wy9cdUDLdSrjC4P7/t94BtshDtCmVulq5cXwFJG1mCUN/a8fLwPSRaxZUpf2MS13Qp8lWg LhsQjhkjzs5FcGpwgCidbYcdsi20Z3xsOGZ3llvtZ3M3N+UJUsB2Qg4ScJj0eCWbLio5/OkfyQn qVjJocMlWJgvSITQ9WlARb1rA7uJd4CcT0sqrGp/6jZNRTMLpQELmEr5MXkRDGG3nMdbiR6yhpk q/ZRCOmY2eUfQSpQ0nP+9D2Q0Vz1PpY= X-Google-Smtp-Source: AGHT+IHel0v7CXXzVE8v6rBV9/613PJyO/r7h0m6cGahoS83gRxz4oJtIbI6wgIGljI7abaK/QLklg== X-Received: by 2002:a05:6402:2114:b0:5db:f26d:fff1 with SMTP id 4fb4d7f45d1cf-5e0b7246e2amr10273521a12.21.1740406253171; Mon, 24 Feb 2025 06:10:53 -0800 (PST) Received: from localhost ([2a02:8071:b783:6940:36f3:9aff:fec2:7e46]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dece287e2asm18363206a12.71.2025.02.24.06.10.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:10:52 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Cosmin Tanislav , Andy Shevchenko , Guillaume Ranquet , Nuno Sa , David Lechner Cc: linux-iio@vger.kernel.org Subject: [PATCH v3 5/7] iio: adc: ad_sigma_delta: Add error checking for ad_sigma_delta_set_channel() Date: Mon, 24 Feb 2025 15:10:16 +0100 Message-ID: X-Mailer: git-send-email 2.47.1 In-Reply-To: References: 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=1235; i=u.kleine-koenig@baylibre.com; h=from:subject:message-id; bh=BRca3gj2PkpV9SyaPYi59In8bsj2B+W6naUDybav0vw=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnvH3R/78MFap3aZahuuOnEiK9ANmZeu2aYSD3s /vD+JeTaM+JATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ7x90QAKCRCPgPtYfRL+ Tu59B/4+Ue9wRunY0+WHjYinRQ+bfnbYEtuonwk6f2PeyAkzNa/r8QPWUhf7A3naZzgCrGfdrEP AzOeRq31BQpkLYVJ/nNVfUiPSGr08kJg1WDVTsyfOq4X/sEuUN3jv695ZB1j4s+7Zy5He2qFo3p SIEpZYL6oH+QZGWsTGNGvWB0hmbtzggTF5/QjW9GEgqEO7If+CgB3YXn0pkZx2f3VXHWh6CzGC4 gg0g9hJBgSYN7gwwIp50lGwYgdNC+bINpzeCCGJNb4DiqApOevvR1UhGv8oC+6PKuVgufgKIoMk 5dCqBmE2gcSBJyn578eCwRwArGLEl7TVnr8I/4DqPyi+Z8h/ 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. Fixes: af3008485ea0 ("iio:adc: Add common code for ADI Sigma Delta devices") 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 fbe241b90f37..8be1717f034b 100644 --- a/drivers/iio/adc/ad_sigma_delta.c +++ b/drivers/iio/adc/ad_sigma_delta.c @@ -391,7 +391,9 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev, if (ret) return ret; - 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; @@ -432,6 +434,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_mode(indio_dev); if (ret) From patchwork Mon Feb 24 14:10:17 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: 13988245 Received: from mail-ej1-f41.google.com (mail-ej1-f41.google.com [209.85.218.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 1C1BF1519A5 for ; Mon, 24 Feb 2025 14:10:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406259; cv=none; b=cskwFmMLaAESfgDLAtPJVYS8esqqX5Ssdw6HN/9mGfPFqDqZhJyF+JtV1w73vvxpZN2JTKi2dPDDTZBlOu2pOazVPkn48SFjrfP4XD3JkAcwHVShetguCRccrnWZD+FC/G82nlhRiTR7osqTZ46T8LegYoztUPvCdK9WSC75wUM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406259; c=relaxed/simple; bh=jqr9EwXfZY3b+14dJHqEdl3sytYGW0GVhd2OmY7oUBw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=BXFKXwMcdq6d2fJtNNjfDg688lvK6cGGtKj1Zxxe/uqL2vJCsJDNrqx4NBiosPlfb9bpeLG1iQYI6A5fU78xMtLakdO9+mHLvkt8xs1o0z5cSHTonP9IBL6cCEW4v7GvYtnKT9UgGYwmH1Q3Ol9/o3Dn4yhBmHSnUOzBy+c6C+o= 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=rCYcd7Ig; arc=none smtp.client-ip=209.85.218.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="rCYcd7Ig" Received: by mail-ej1-f41.google.com with SMTP id a640c23a62f3a-aaf900cc7fbso686183766b.3 for ; Mon, 24 Feb 2025 06:10:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1740406255; x=1741011055; 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=rCYcd7Ig/MivcN9fa7nUW33Tr2VY2J1YaALZ4L+JqMjxND7gDcJRIwC6eCMKM8FTgl UhKa/xW5lKrmKNpebuqOUhNIRmJKCsEP4hGmq28qVu60270l1P1viz/rZZCsVRyEvajT d98SuIfz+kgRs1OTtP/KCOZVm6n0BJwmdEC3+Iic8qHxLfbHywBTeenUe7OumLjw9iO3 JSzziENreL6wX7mo+XTwsKrHUIE8VpPenLlDmvGmwUkS7dU0ltg/qEyxl5613VQqddsP 3cPzcIzZ5YGXrf0Pq2SarSNvzPQC7crQfAYPZLQdNNWA4kI2o2ireuw1WyW66VC8N+xJ kV4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740406255; x=1741011055; 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=k/e05FkDQ4U7i/c8X60m3VAj2CyvhoNzoJwhHTQBYTT6OGCxdGXBiQVD5PP1VkZKx1 UeghXWS02wEzKHZ0cx2CYaglqFtf74YZaSlmHWnHGyEvBneuh7BWZIBwyJHhYfg53BIC SLuhmfsjcRnpR35Ok2p425wx2BLX6nIdTj3XXu6VQypktsT01S8N7UAx2WltA+o2Ibm5 bgG9K5fL+oyBeM1YsM5ymH3QkP+2u6mkQmt9FByURay7gmpRKXkjyTY9uhNWo6+KZyXE 98gqADhF0UBB1Nv8i1xMPbMNLULssDqRLN7NWgIquNmreAlZzFsUMDpki6M66YwUu49s UkMQ== X-Gm-Message-State: AOJu0Yz38fyzWuXF27GIwScHHRQaF9URNgblGP8NGtn7diy/RcUqkK10 VFggjPtCNOlVTbGkGEZGP3HtJvgyx/LQXoV0LGpEMJd4lTWXjDf8T7b+PJeeix4= X-Gm-Gg: ASbGncsfyFY9X2WjH5DwAHde5z1ZKQrupg5Pa/SLo7aJ0RG8jNjO//QfaLS9Vwgdv8l J62myNskF5ZIaTQr5+zYtsctktrObGPaqTBGcTcvPwEgjhDMGh+hornLYudPgkaFWu08vDBQ5vL i2FzNsGPV4ZH8U/qJInDbUeuhsKpguIRgs2OoiIBRVk6je2FmQIiWHkAZIh8pD2InER0qw+BYEx iDWOONC92pUQWDEoqytW3fVK3/VF0/jgIIX5BHeKKC+pw7MqZFfAa2RUgDx7DJC8n0EN2pdb1nF A8LhgCFv4BVNKnzudHI+1CW46cw6VBI= X-Google-Smtp-Source: AGHT+IFi1NtP0KfFAdRz9V0mOEspeZlLIrmEHghRdbLA8GrZXPM3Ny2IwN7IRxxODoh1hmS1tsdAqQ== X-Received: by 2002:a17:906:310b:b0:ab7:da56:af95 with SMTP id a640c23a62f3a-abc0d97c68cmr1175026866b.2.1740406255327; Mon, 24 Feb 2025 06:10:55 -0800 (PST) Received: from localhost ([2a02:8071:b783:6940:36f3:9aff:fec2:7e46]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-abbeb38e05dsm964484866b.90.2025.02.24.06.10.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:10:55 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Cosmin Tanislav , Andy Shevchenko , Guillaume Ranquet , Nuno Sa , David Lechner Cc: linux-iio@vger.kernel.org Subject: [PATCH v3 6/7] iio: adc: ad7124: Implement internal calibration at probe time Date: Mon, 24 Feb 2025 15:10:17 +0100 Message-ID: <46c4a445363fa41458d60faf961f860ab8032027.1740405546.git.u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: References: 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:message-id; bh=jqr9EwXfZY3b+14dJHqEdl3sytYGW0GVhd2OmY7oUBw=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnvH3UjHQsB3G4k4lCa0JignuAcXrIby2nGIvoM nDSMbRjes+JATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ7x91AAKCRCPgPtYfRL+ TvhbB/9UDBKBsf/WxuZo8aV3H3Rivy7BfEA3rO7Mv0MZ/5UA0LoTuTZwq14ZLYbbM5HrNWL8Shg vyJmLWbIIhm4faScWxfigwQk8fjWIBtz1PR/ADi3D2UrFC96nPaEiOir5XqdK9ku0MUDLNfIkzh R+iE3hmYV0Wb3iEkfTwUK7VVyG2QL8kDa9txSB8GigQiZ8K0x7STBBkAGG7hbnimI/hEOUUCVJd G+20U5kGW9y0OiwUQxV42S8/pzv3yGsEyvkr5alitfecGKyddD7N2jUc6OH6w2HxQEdFXyDSR7f 258+DqHcvoQ7pdOuLntilT+msTPxt8HZaqOQr8fdmtplYVV+ 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 Feb 24 14:10:18 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: 13988246 Received: from mail-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.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 640471519A8 for ; Mon, 24 Feb 2025 14:10:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406261; cv=none; b=ixD9qPIzDfr1xgeP1PZdboiWQyAqDtXSFeVgrQ0IOdQLg72k/TOgIeZpDtNH4hyrph6O3DkB+w0IXfgalMqzYQtkodQwxK9oey8hFwjSJhvo0s+QtyYFjZIVmC9F9+ZPVGjiJBU6IkHPWIl/COEjRQJbSBNvraLMTTTxd+LMl6k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740406261; c=relaxed/simple; bh=tLYHWgOgKFqKV5m8842QnAKRfItLcN1thRf9+nhSm1c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=kQ4DjpeEvo99m7wMB9qV98oh0G8KVIAtATNgxUZnBHh2yJfsgBVYNkXFaRKLHTqld0b8kxxsCqkTFFyFtX2yBdgU0BBK64n1w0Ze6cOtCjMH+ruWhogPxjUGqk9KQHpbFs3KftSxlxOPtIDh0RwX4nugSmkslbnZCPg7tF/eLl8= 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=k3PbDNng; arc=none smtp.client-ip=209.85.208.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="k3PbDNng" Received: by mail-ed1-f42.google.com with SMTP id 4fb4d7f45d1cf-5e033c2f106so5873771a12.3 for ; Mon, 24 Feb 2025 06:10:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1740406258; x=1741011058; 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=AaLxO4ePLEt4WLzLvwC/0MDiuUOe4ZK6pxwDX4VliLQ=; b=k3PbDNngfYGNeGMC/G7ICmNvo/Qp6GweTOnht0dqQRUwMSfK4Sziym1Jdv6tMu3rvj F4XdtqpUsnsWv3sMgpmUvvUTa2Vh0r76vtj9nR3CRCyfmP9nvRRTqkRHSl3jO6twVqSQ 3/o/+TyPYbSTsqXkdx0c7qeDOVPOLLEFpwszOB83mUYGXs46FAWBsYHzRDfAMXx499oV 1WU/4kdutycN58mb2J5N+Ge0I1ltC1atgy4rw400F7ZeSBCZ/XvD98T6k7pk/Qh6u4cC oEQOhuJx7+y+lXSZxAJLN5cpAADuCWqyBVpU/k2cYoHvSdW0zXka5b7F9mxjmN4KiUTA KWRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740406258; x=1741011058; 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=AaLxO4ePLEt4WLzLvwC/0MDiuUOe4ZK6pxwDX4VliLQ=; b=uINJOd6gbPWga1ymCVdTHcjm+pOZI8cI+KYNhIzg9wL8/wzyTUSQWsVuOUihIh/42M 243AtADgqoc8DpSzAcbBno2WkNwd3OSqqD1LXo7RmIGAsJmgLhYfGnmR/tnItlI5gdad WI1hMIYRQb7iNWGnbqWzlsSRWtvPtGChHXcz/pylVuQM6Duwg5/5YvQvVib6xlzUahI6 q+MPi8ms/7jL1KoYhXijTd/2KihAHrNI1s6YJrglMj3aXuGF7vScY0m7l9Oq+w+Wgvg5 /TvUgX/R6qRiqq3Gd8p3nJT1RVbyZdW9NpNttPYKMSk/U8gOuxQ8oEhy1WFmusZ4yovP yqLA== X-Gm-Message-State: AOJu0YzodvGdSbwSxE1uljHKoawgbKVrmB027CI5l4M48Cuq9u4eQBv1 9NsZAfZkGoZSe1K3K1/F5GZm8Xh7QZNuHsJqFEQ+bLE8g4xzrVOKJ+kQJ2qJIFI= X-Gm-Gg: ASbGnctJ0tB1BYC2Bs3IEB7DkBf8Wrj2DwU+O4XxNdUudYJcw5d9aO9vTyB6+vMExOd jlqE78h9+h0xShYXi5lOPu9CwT0NYBb7sZMqHDHj4PmjFnKqmAa3z3XWQrkZKIIdwOUoJYYBp4O CIlolHyfyOlPpR9BJAZWucfMFkMsCJoYDLyaqctT2WJ19SwFUqgzHABnS7Vdv4oWn24ZQvSvXBx iNXXvslgNlySz+rRXif2XnoUa0BYCPIhl2rfYQ9XXH3/m8eLZ5xqVgk492qbweJ2TvhAmamO08e Sodhr4alshGd1Ki78aJA3jitYGgMBoo= X-Google-Smtp-Source: AGHT+IE+vXitc8IJLIfaLSuM9Y5853tGT/s/2uAzpLe8iYu5v5eqmpiTXoT3k+Oj7QrkZB0euazhHA== X-Received: by 2002:a05:6402:234f:b0:5df:b6e1:4690 with SMTP id 4fb4d7f45d1cf-5e0b7106a9cmr32554123a12.12.1740406257566; Mon, 24 Feb 2025 06:10:57 -0800 (PST) Received: from localhost ([2a02:8071:b783:6940:36f3:9aff:fec2:7e46]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-abb80ba68aesm1764405566b.23.2025.02.24.06.10.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 06:10:57 -0800 (PST) From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron , Cosmin Tanislav , Andy Shevchenko , Guillaume Ranquet , Nuno Sa , David Lechner Cc: linux-iio@vger.kernel.org Subject: [PATCH v3 7/7] iio: adc: ad7124: Implement system calibration Date: Mon, 24 Feb 2025 15:10:18 +0100 Message-ID: <6a67919839c82ecde5080127216917d67bd77f2f.1740405546.git.u.kleine-koenig@baylibre.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: References: 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=5084; i=u.kleine-koenig@baylibre.com; h=from:subject:message-id; bh=tLYHWgOgKFqKV5m8842QnAKRfItLcN1thRf9+nhSm1c=; b=owEBbQGS/pANAwAKAY+A+1h9Ev5OAcsmYgBnvH3WYhjSQsqYMqSAccTtt25slNbbbKK8Oqw5c xDxdUl4vYuJATMEAAEKAB0WIQQ/gaxpOnoeWYmt/tOPgPtYfRL+TgUCZ7x91gAKCRCPgPtYfRL+ TrpQCACNpDF7cIf4azfLveHjTSSHjRTryBBoWusWZlEbKr6D5TLyEvGQ9Fb4Ok+DcoI/pNtM/Wx SQa+Mn1zU6Mm+7V/wv3h+bEK8RKl9i0PP2MYcPJspdNGdlNujCxLfh3It2ntwnWaUjoTHVFZywV +JBrDZW2OsqACf78/qmTAL6u9aCPo7cIk1eXaMYiHdq0q5tTxJXfkYUxYBYxc2L0BCILQulawoz tGTnbYkzt2RQxGR+oXqZ+3yXVucSs7EX3MsviFeuXf5K1STxnI1u7rSuxnpWdQuti6SIudtTQ8g UTOxYhZfzoFj9fFdP812G64AYFo2HWvt646mvXb4dr5muDFV 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 | 140 ++++++++++++++++++++++++++++++++++----- 1 file changed, 123 insertions(+), 17 deletions(-) diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c index 382f46ff2b51..019d1d3245e7 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,127 @@ static int ad7124_check_chip_id(struct ad7124_state *st) return 0; } +enum { + AD7124_SYSCALIB_ZERO_SCALE, + AD7124_SYSCALIB_FULL_SCALE, +}; + +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); + struct ad7124_channel *ch = &st->channels[chan->channel]; + struct device *dev = &st->sd.spi->dev; + bool sys_calib; + int ret, mode; + + ret = kstrtobool(buf, &sys_calib); + if (ret) + return ret; + + if (!sys_calib) + return len; + + mode = ch->syscalib_mode; + if (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 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