From nobody Mon Apr 6 22:01:20 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.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 3F6FF3E9F87 for ; Tue, 17 Mar 2026 15:03:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759838; cv=none; b=ScJS8e8lG4kKtjgNlZ3VBjLotXA1p7va2kZUGVVpFS1VLlFdmycckuasoZokl0SFyhsLVkNQ0sXprdfuvJF0sd58hmBIRJT8l3AO+JtUxP1XVn5RprqkouHH5pNAevzqlADnIB1WQMruTr+BRfp26JhRbxYhlUno1b1zYZjw0Yg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759838; c=relaxed/simple; bh=LhhuQW+kXumxf4ZHnfybInW36mhcntwwfWxHRNAL3MI=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=BpaDCvLwTgow4plSHgsF/QI/Q2lrl/Jl5ZG0fw3nPBdguneA210QDqlhLBg+tf4r3tOtqJjcJIrqnzieXGedKUTYLlND3/etYNlqFE4N6jOOnslhxMt2HYeZxJq7gbuASBqwOZnVwWnw5LKXjTlAT1Un3nTPcHra0FTou+9F1Jc= 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=PEt4xb8b; arc=none smtp.client-ip=209.85.128.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="PEt4xb8b" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-48539cbb7b1so35130995e9.3 for ; Tue, 17 Mar 2026 08:03:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1773759834; x=1774364634; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=D6Ly+Y1OaGrVPqGuh6+YPQYhQbgbR6xEfPk5ktqV5IQ=; b=PEt4xb8bTBmjG8/yiQqWtWbhlqRlleg5cuuPH4tW3mNdQ9lGjqiB5f34TGWOQMEpKU UraYsoxowHUnVWE/0IlxbDAD4yoVA7F+jIkzBHqYdqmMslWFndRXK/T/VkvIjyvOkndS 1VIX2jqTd1gT/Bqu0tXZ6/UjalIh4soy0LPncQnt7i78Mwx+XT9zmGS1zt16nLmU6NBB 5cdWF/H6VafobRLAt81RjL8RNpf2Stq43qBIXNkGg0/Rmf811LoaeSCOC+lnl+JXahUo B3JfWnwVzqIlSzF+ap7M2KLpisfOAW1XBEPxNvRllBOsELeKRqIMmFBPcUHFb+sziK+y 2ZcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773759834; x=1774364634; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=D6Ly+Y1OaGrVPqGuh6+YPQYhQbgbR6xEfPk5ktqV5IQ=; b=R/5a7ayPjcEIO/AAvg556SE4MsItwBD3usjJ9WaS5Quqd6Rz9b+gsPW7/ecsrYggR1 //AWy4jCJq+XpBLWwup2aggMiP9pKh7UR+lcW3LiLa7E9DEsgjgNN5YBr//Z4V9PWFKV 4l+jQxK6YEUnY3X1ufqxrfx4cl6JrYiKSqbHPN9qL/skLMVOjc6JO+2qcw5XqO/wJhh9 5yxmN7uYQYX1Xy7vHWQhadOsxSSnpHmoF92JRgQW0Cd0ho/CgBYWlLwzn5ugOxeHsZRo WDaOnpqg99xlfFnQDKmuNmSTKMoxrFLrHWpSeG8OnVKTt1MiCzqddaRI2civA1ZcSeIT TnkQ== X-Forwarded-Encrypted: i=1; AJvYcCU0lvSeAPLqcRyOn9vG+O+fj1eRvaT79AQoOHHTLWlvLH2eHY9JuwIcko8DiBNsXoOFK75i2B5xpHFDEVE=@vger.kernel.org X-Gm-Message-State: AOJu0Yxg3orq56Jmf0pUEgMHyaSA9wKOtoKCop9/N/zvw9EIOgKb2907 mawXYazWZb7k4RJJ1Q/XyeQk1TQPyXe1+1WH5JnNdoPxknKQvIdXaPIqY/2zFwXpJtc= X-Gm-Gg: ATEYQzwTS/LYqCvVw9Qo3912t+jzghyykAocLlmWQxHtmVkFu3C3pxrrJYn4j/6VQTw 5BO0+/Pk/IFK8yoAMxgidGPl6D6zv/1KLkdJkLvsgCf+4cPOczLkK3fsnieH8dDDsaKTgCZOyph TfNeQZ81MESDvGOxNp8cJ8Jlv5f9bJRN2FPGyROdxn2lGXZQ7Zhp3xEJ6SpU5zLsh6jdjePQHG4 BAqR9hTiE3YSWNUvJQ2KEr4eXhkWx01zt9mFTbkx4bIt1MYO6+lBVh6GRjtQ7E4NXejmvii9YZ1 tyRoLTgzWBgH2SaQcQxJ+IRUye/Sy+9z0cy6quDCoBeKEbBQZT8XZ1GyrAh3p8Ige3MvP1jULRP g0TOV+CqMMgvmePbWgf+fBTj2RA6FnCogg0ZiUAax3LKxH+gfZPpJAAIUL36Mo39SL/j8pEWRZQ WRs0+P X-Received: by 2002:a05:600c:c8d:b0:486:de04:5906 with SMTP id 5b1f17b1804b1-486de045a22mr27707715e9.19.1773759834477; Tue, 17 Mar 2026 08:03:54 -0700 (PDT) Received: from localhost ([151.37.101.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48634a7ac93sm51971735e9.2.2026.03.17.08.03.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 08:03:53 -0700 (PDT) From: Francesco Lavra To: Lorenzo Bianconi , Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 1/6] iio: imu: st_lsm6dsx: Fix check for invalid samples from FIFO Date: Tue, 17 Mar 2026 16:03:53 +0100 Message-Id: <20260317150353.3878258-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260317150316.3878107-1-flavra@baylibre.com> References: <20260317150316.3878107-1-flavra@baylibre.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3896; i=flavra@baylibre.com; h=from:subject; bh=LhhuQW+kXumxf4ZHnfybInW36mhcntwwfWxHRNAL3MI=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpuW1ZL3a1po6S4t6UgIXVMNxGsQxe+I2iIBwUl 6sQCXcfE7yJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCabltWQAKCRDt8TtzzpQ2 X1J/DACyD4pzkSXnCGT5iq86Iumn+gkCFDC3Pr9/8KiY6RtBNBRXV0Lo1jKtM0nfoTfr6jOddm5 3oHlr8qpqd8tdfuywK2UVpeYjhx8+eggCUizNtoJSNzAsTXjWSOxRcGSxK2kusKOWGHhc9H+UlB biQffbicZ6+L9j09cOvI4MNbMphHBiuub8QvDMXXzwiezy6FblGoRdKKTUkfSPcwrUqYuP8FdxT aYRtOPDYgH5D9KvXage+7hqGu2iZZ0QAp8ERB3xzRDyQ0Ov/NeVlVtZNfWRymI/llgJDXlCMk6w 80FjomauvE8v6nK7WohfLgXoEygwHIa6q9E3WEPZbyQdQnTLOZ3aBiJtdqoQtYX78T+vfT/Iixr eloR4uYJc7arn7OZ0xMWMDKVIhzUM8rBnY8J4yBitHS99hLDhyg6SktlRnSs9kVAk4Kv6AnCraJ m2eMWcvp6bTiXjxzNVtfeZn8/zdOPt6Vk6X7zJOfA7Q/CDQ23THXC24zQU4D5F3zC080M= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The DRDY_MASK feature implemented in sensor chips marks gyroscope and accelerometer invalid samples (i.e. samples that have been acquired during the settling time of sensor filters) with the special values 0x7FFFh, 0x7FFE, and 0x7FFD. The driver checks FIFO samples against these special values in order to discard invalid samples; however, it does the check regardless of the type of samples being processed, whereas this feature is specific to gyroscope and accelerometer data. This could cause valid samples to be discarded. Fix the above check so that it takes into account the type of samples being processed. To avoid casting to __le16 * when checking sample values, clean up the type representation for data read from the FIFO. Fixes: 960506ed2c69 ("iio: imu: st_lsm6dsx: enable drdy-mask if available") Signed-off-by: Francesco Lavra Acked-by: Lorenzo Bianconi --- .../iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c b/drivers/iio/i= mu/st_lsm6dsx/st_lsm6dsx_buffer.c index 5b28a3ffcc3d..19232146bd61 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c @@ -365,8 +365,6 @@ static inline int st_lsm6dsx_read_block(struct st_lsm6d= sx_hw *hw, u8 addr, return 0; } =20 -#define ST_LSM6DSX_IIO_BUFF_SIZE (ALIGN(ST_LSM6DSX_SAMPLE_SIZE, \ - sizeof(s64)) + sizeof(s64)) /** * st_lsm6dsx_read_fifo() - hw FIFO read routine * @hw: Pointer to instance of struct st_lsm6dsx_hw. @@ -537,16 +535,24 @@ int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw) } =20 #define ST_LSM6DSX_INVALID_SAMPLE 0x7ffd +static bool st_lsm6dsx_check_data(u8 tag, __le16 *data) +{ + if ((tag =3D=3D ST_LSM6DSX_GYRO_TAG || tag =3D=3D ST_LSM6DSX_ACC_TAG) && + (s16)le16_to_cpup(data) >=3D ST_LSM6DSX_INVALID_SAMPLE) + return false; + + return true; +} + static int st_lsm6dsx_push_tagged_data(struct st_lsm6dsx_hw *hw, u8 tag, - u8 *data, s64 ts) + __le16 *data, s64 ts) { - s16 val =3D le16_to_cpu(*(__le16 *)data); struct st_lsm6dsx_sensor *sensor; struct iio_dev *iio_dev; =20 /* invalid sample during bootstrap phase */ - if (val >=3D ST_LSM6DSX_INVALID_SAMPLE) + if (!st_lsm6dsx_check_data(tag, data)) return -EINVAL; =20 /* @@ -609,7 +615,13 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *= hw) * must be passed a buffer that is aligned to 8 bytes so * as to allow insertion of a naturally aligned timestamp. */ - u8 iio_buff[ST_LSM6DSX_IIO_BUFF_SIZE] __aligned(8); + struct { + union { + __le16 data[3]; + __le32 fifo_ts; + }; + aligned_s64 timestamp; + } iio_buff =3D { }; u8 tag; bool reset_ts =3D false; int i, err, read_len; @@ -648,7 +660,7 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *h= w) =20 for (i =3D 0; i < pattern_len; i +=3D ST_LSM6DSX_TAGGED_SAMPLE_SIZE) { - memcpy(iio_buff, &hw->buff[i + ST_LSM6DSX_TAG_SIZE], + memcpy(&iio_buff, &hw->buff[i + ST_LSM6DSX_TAG_SIZE], ST_LSM6DSX_SAMPLE_SIZE); =20 tag =3D hw->buff[i] >> 3; @@ -659,7 +671,7 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *h= w) * B0 =3D ts[7:0], B1 =3D ts[15:8], B2 =3D ts[23:16], * B3 =3D ts[31:24] */ - ts =3D le32_to_cpu(*((__le32 *)iio_buff)); + ts =3D le32_to_cpu(iio_buff.fifo_ts); /* * check if hw timestamp engine is going to * reset (the sensor generates an interrupt @@ -670,7 +682,8 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *h= w) reset_ts =3D true; ts *=3D hw->ts_gain; } else { - st_lsm6dsx_push_tagged_data(hw, tag, iio_buff, + st_lsm6dsx_push_tagged_data(hw, tag, + iio_buff.data, ts); } } --=20 2.39.5 From nobody Mon Apr 6 22:01:20 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (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 F19C23EAC6F for ; Tue, 17 Mar 2026 15:04:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759845; cv=none; b=GRZCB9Niu7B0jBDHJgcy6z3B+C0mROwbEPSI+wjUmcUzQjlj/SsPLQWLkt9xnBOiF5oYgohCDh4YeEX/0f6Xg0g50KYpKIczO05JjPcjdUIbnIim6nHyXKM1hprqtbYFdz+9m0aGytFg0s8emmJPORKc31QDTshCMeGyi9m9+eQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759845; c=relaxed/simple; bh=3gJuZXgHzE2rXI2domcIKlpvuPEWhFJR3203rfyOu8M=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=O11NAIZtYcnjgY6i4JbZ/BjlYfrhmfL8zMlEmZUZrAkeUVLQwkTwy2e2rA9+hHbUQ6o3Ut/gslM2vcgyyMLfusz676U7sCR1NKyGmlOdsjgpWm8pZXtZYTYmhaMyh//6wxZ4zSLPxgi2cw3OrYgC5TthSaJbQHdZ7WZD9I00NB0= 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=0xRNsv0n; arc=none smtp.client-ip=209.85.221.48 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="0xRNsv0n" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-43b44c0bcdbso2085978f8f.1 for ; Tue, 17 Mar 2026 08:04:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1773759842; x=1774364642; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=GfDNVGPIN2le5n46HwmmKt51w/MhetLaeIkD5JM163s=; b=0xRNsv0nD+VHXoC38gnW3k1RGqDejLthpxdk2Nq0PserZeUBy6rE1UALNE6A2wlIWj +5Rj+yLWIlgVECggNZbAqTmVPZi2JSOvfZkaYe/ejcN3UoRZanBQmG0QKedQRnTBzOKp vrmx0ib/vackG7y4z5Jj5Rxa8XFLdQYobF7gWLgJtjXs6J2iyh6DhQWOwgUn58qKtqst Taj5Y+tfgUAD91TZwLqUJ0qZ+X0rdhUQnCmTBkjl65XqziTzP4pCam/HzvY4mTJmTFI+ 20NIz+91f1Rpx+By9fwaKPiO3cn/tDrbxb0ipsn8VOKsqRckt6zYNeIw5GPHK/yoGWYe Xw9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773759842; x=1774364642; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=GfDNVGPIN2le5n46HwmmKt51w/MhetLaeIkD5JM163s=; b=Jd8p0bOr5Kt4mjY+esLWe1Xos89lqfWMulSi63u+moNP49hJSENiJvpPfx+lhj5eo5 qC7qfwkYB69fOXWrTaqlPyOCm6GM7thL5/lOT1nb5COTR4sZ6P7C83WSe02wR9/jTm5c c6YPdRYuH7aCl3Jf7REn4woWgVgVbl2rSrnI5bOK3QFyI9q+cUuwZ0z0SPG5t0tBq55G d9x7BrRbh33jBPNVP+NejkJCD8sv84vofyBTjwvpHRJy/Tbyym60Nx4n6Yer9PR+qq2E UHNlkr8aGaQAlF0y8ufIjc9MDvCsAUTScoEEnBG+Bjswd/qtQ8c1MYN+DEUmVRLRgyGH IieQ== X-Forwarded-Encrypted: i=1; AJvYcCUoCX69QI64PU/tSInBmX8fXMu0pAhGGMJq71CTy6wHZky3IbACYkUv0FSAtaNxwUa7QZaTaJWJojaseLY=@vger.kernel.org X-Gm-Message-State: AOJu0YwspvxtSpU4PBe2eX/CFbsk2w6HcgkYBFB7iwqzz+2t/NqZfaqv xoepxWKjivRdX0def140pbT/OAHZtrt+ongFP59J3YcUsP20jOb2UJj1qttrO3sffnA= X-Gm-Gg: ATEYQzyVt2xrLQJk2Dn2UySMXn+jWzt5lU2YXg/nba7JVkRJvyrv045pYbeEO/3KKEQ /T1k9ED1bX6zefPAUozh5hCoPLQHb6iQ28sZ2eI/26KfTO55GsNUXYWHVsF49jbzWX2NLG2+WfD Uzb5MB0999UHFdRnE/wyaEwdlX+N6f1OtyxVN1GF0QUqbomKj1fa7D6SbqsWxGms35+Yir5qYb6 lDCBG0VtmS6xxQc5l+VBhSUCdmTMUx/37SRY+oES82RsBIj8h/XtGJL/IAEaua/W18Fa3xD4C8j gn0ZmoST/w4OqTtouBPOTP8tu9ILiCDPDBm4lzaJxFwc2ukkPEJCKAB9kLlJOKAqwiSQt9OtdCP XJ1qwnhmAJN5kKvDa3hnn4vY7DShZdOSClcRLh+moG8jo72XNCFTrJ7K49Yms5ddTmXCLeA== X-Received: by 2002:a05:6000:230f:b0:439:b79d:b99f with SMTP id ffacd0b85a97d-43a04dc0568mr31062236f8f.40.1773759842112; Tue, 17 Mar 2026 08:04:02 -0700 (PDT) Received: from localhost ([151.37.101.237]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43b51852aa8sm89261f8f.15.2026.03.17.08.04.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 08:04:01 -0700 (PDT) From: Francesco Lavra To: Jonathan Corbet , Shuah Khan , Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org Subject: [PATCH v8 2/6] iio: Replace 'sign' field with union in struct iio_scan_type Date: Tue, 17 Mar 2026 16:04:01 +0100 Message-Id: <20260317150401.3878294-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260317150316.3878107-1-flavra@baylibre.com> References: <20260317150316.3878107-1-flavra@baylibre.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2677; i=flavra@baylibre.com; h=from:subject; bh=3gJuZXgHzE2rXI2domcIKlpvuPEWhFJR3203rfyOu8M=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpuW1h1uYuWrYCw/6uqGVTi6n5o9bz5kSuOfvy1 L61H6lo4CCJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCabltYQAKCRDt8TtzzpQ2 X9qWC/9ql0gkurGhYbfnfbYoMG+f/91ADwASWY5YXLGiPA5G3QMNu/I+kMij7XDcyxiN6rA2CJu 7jYFCUtQD/AgLCiNvuI+8rkTLSUW5Ugy+xDso9bg+qZGNP9CeISr4yFfG8xj1CNmWQrFbWVjouz ROZ19D8K9+JkXvvV1JO9bjdGWOUnVaNKKTWTgM3ZUbfIEYk7xAA0UZG1Ngk7kYfjImit+LwmJl2 qeXkPBtfY9AJZb6mEzqFWLmnDBH1HJbuD73enxc4M41tQeq/rmSzefdNxay6ZSi2dEM5xW08Rz3 uOkiTduKfdhV4F+OhUIMrbu5gAUycX+9Kob/OUDsQYn3Y4qn8OTB99LzxMXbWD4LWQzLMA79dz7 h4XDvOXxuLrPOAgwzY98066xPi8wSVsk9zjgprt+0XU+U4sPM0VallOWJwLU8eOGvvA92+k7e0m 0n/5LFcO9JY9pq3GyZtILwcgn+5BjXMLUkc1Cl+sJC8nYIabutM+dsL8TysSpeHuby8n0= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This field is used to differentiate between signed and unsigned integers. A following commit will extend its use in order to add support for non- integer scan elements; therefore, replace it with a union that contains a more generic 'format' field. This union will be dropped when all drivers are changed to use the format field. Opportunistically replace character literals with symbolic constants that represent the set of allowed values for the format field. Signed-off-by: Francesco Lavra --- Documentation/driver-api/iio/buffers.rst | 4 ++-- include/linux/iio/iio.h | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Documentation/driver-api/iio/buffers.rst b/Documentation/drive= r-api/iio/buffers.rst index 63f364e862d1..e16abaf826fe 100644 --- a/Documentation/driver-api/iio/buffers.rst +++ b/Documentation/driver-api/iio/buffers.rst @@ -78,7 +78,7 @@ fields in iio_chan_spec definition:: /* other members */ int scan_index struct { - char sign; + char format; u8 realbits; u8 storagebits; u8 shift; @@ -98,7 +98,7 @@ following channel definition:: /* other stuff here */ .scan_index =3D 0, .scan_type =3D { - .sign =3D 's', + .format =3D IIO_SCAN_FORMAT_SIGNED_INT, .realbits =3D 12, .storagebits =3D 16, .shift =3D 4, diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index a9ecff191bd9..d48a0ab01b8d 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -176,9 +176,19 @@ struct iio_event_spec { unsigned long mask_shared_by_all; }; =20 +/* + * Format values in scan type + * @IIO_SCAN_FORMAT_SIGNED_INT: Signed integer (two's complement). + * @IIO_SCAN_FORMAT_UNSIGNED_INT: Unsigned integer. + */ +#define IIO_SCAN_FORMAT_SIGNED_INT 's' +#define IIO_SCAN_FORMAT_UNSIGNED_INT 'u' + /** * struct iio_scan_type - specification for channel data format in buffer - * @sign: 's' or 'u' to specify signed or unsigned + * @sign: Deprecated, use @format instead. + * @format: Data format, can have any of the IIO_SCAN_FORMAT_* + * values. * @realbits: Number of valid bits of data * @storagebits: Realbits + padding * @shift: Shift right by this before masking out realbits. @@ -189,7 +199,10 @@ struct iio_event_spec { * @endianness: little or big endian */ struct iio_scan_type { - char sign; + union { + char sign; + char format; + }; u8 realbits; u8 storagebits; u8 shift; --=20 2.39.5 From nobody Mon Apr 6 22:01:20 2026 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) (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 47B981FC7 for ; Tue, 17 Mar 2026 15:04:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759853; cv=none; b=Tao4dK0Zd7KZCLG5y0VNjDx0QECjhQDvYoxjhXhDAnSoY818DFkypfxt+tvGMfn3mqdrrYWTteKaTylc8RMmO7sEENTETV/+4W2bzxEQvmNVakmPEUaxaBL/oPUxoijJShXGwaG5FGrjvqjyohlKAJhYKxDILvgmLwhE0BmYv74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759853; c=relaxed/simple; bh=6a+Xn6NnG/8MprGOzF86J6ycUeL5AAW7PxS2qczBlu4=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ShnXu3NzXN+ysJRFT+HWts1EJuJaWa8vFBwS77Hsr4jV+sn5+pl//TrytdRa4F309+RY9EIZy6L9gMobfFMQseY0/mGlWmnnHrpLeW5aNRAEZHz4CYfdUJH2YwNQ9yhU01G9rOh6RmLNDr9wDUNtoqSg6ns9cP7kp5mzv13aJ+Q= 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=NHy1q47L; arc=none smtp.client-ip=209.85.167.46 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="NHy1q47L" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-5a1307438ddso5779209e87.1 for ; Tue, 17 Mar 2026 08:04:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1773759850; x=1774364650; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=r21/87fWkstXATGZU1YjKqhkHTuYYucKq7beo3fBdD4=; b=NHy1q47Lv80XssXv1bXZ1Q+gSs4yKeRe/jL08uTjUujnDq3V4fulTcQMoll1PWmHxm GG4fHbeuFhXHtBqBlNxsHALx9Aw9Y1wPHQV8OkpkeYfAtL4xR+hrZJ9XJM/UVpXu4Mlu SavJw+6/CYwG9kE2H/DPI0vY1TBRIDwgQXmMedwOehPlwianmufZkZj6YAEYb8mE01fs c6QrFDUxAb1wnw4wJyW+4v5NQe/tfI0o9faw4kiG3nHqehpZ3NS7nPHca8i65SZKF5G6 NOJSgqnJLCuPvTn7EI9mZLi9zzA6ahCZzwRiycwxlWwOD6GVfjjAxcsv9cU4JmI9eIU3 /+Sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773759850; x=1774364650; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=r21/87fWkstXATGZU1YjKqhkHTuYYucKq7beo3fBdD4=; b=XrdVUUXhaV09gf11ukjEdyo4SMl6ATBwyr+ThB11qXSVbeUIFG5jQYizGR8ZvfOrFl Gjvh1x1RZlRfji283FRoNdotwOzhDUAaoaymQjlgMiEjxpp8usUAMIH49ScEqkBJyMRr nH3AYY9HqAn0v/iNRPW7KZMmrewZDZa7+MKHR1Y+PKcF1ApfJoLd22qQnvsO0aGaOYU3 FH7OFgLqF3giog8L9CDlWcbLxGAeMuJYzW88Gq73bTDxIUYpso5DTahOVYgr/oREi5j9 6CQUZczwF7g83z2HPQENvIVfD+sAFq2w64wySYmGkBTuAo3igYv2/uxRVwiQcLnNfMqY yO2w== X-Forwarded-Encrypted: i=1; AJvYcCUAAZYp13HUyVB1Mocv1P+X91AtqOivLBQM2IYBfwrns/W/l4L49Juv5EQXpqQZSI1lWn4kd1RSreemsQM=@vger.kernel.org X-Gm-Message-State: AOJu0YzpKJnNnEziNVxfMT8aOJT7K+ihWX5jm/R79htz94foCv1smeyF e6PvBZW0RGdh7YbXsYjWH85mYGJS43yW3RgsG5x9Szz01HDbPTQkDyLFj0whT2efZCM= X-Gm-Gg: ATEYQzyoVlRPGAPqylYKzCxX+36Zgwv6a8Kol9XU5lF6Uk9Dj6YkeIJj3FQjyXBAhxn f0N830MClphbs1vuebB3X3uLp7ex4KUlkuL4zVIgnbrD/ijsVoVgfM/4gdTxJ5017WxL0NRGk/V zuM6aiweTHbtKeR5//Ytz+syVSabnQ8jfoEa6GaPTY4qk15yK+BDLdWrcM5JLqdCC5aF4nStAHV D9sAM4vI8vXx0ol9NwV8cRiYmX4MH7/BpvzOuPt7udkULS5JrhOa923lGUDmms8FUhgvrrf/NVO 85bySjcGPgYDOP/f+On5nMOKUxMiMsnJUexZGj7+tza2Oby0+wiMzOwLH57T0iuSvK53J2ZJV/L 9AWIMXwbhnjgxQvZXbqSr43565P1BglKOF5FUOvk3xo0IpFC4Io3kWG+FZz6gSBqRXFoADQ== X-Received: by 2002:ac2:4e83:0:b0:5a1:4473:bb44 with SMTP id 2adb3069b0e04-5a162b12580mr4573766e87.33.1773759848791; Tue, 17 Mar 2026 08:04:08 -0700 (PDT) Received: from localhost ([151.37.101.237]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43b51852097sm104795f8f.9.2026.03.17.08.04.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 08:04:08 -0700 (PDT) From: Francesco Lavra To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 3/6] iio: tools: Add support for floating-point types in buffer scan elements Date: Tue, 17 Mar 2026 16:04:08 +0100 Message-Id: <20260317150408.3878335-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260317150316.3878107-1-flavra@baylibre.com> References: <20260317150316.3878107-1-flavra@baylibre.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5878; i=flavra@baylibre.com; h=from:subject; bh=6a+Xn6NnG/8MprGOzF86J6ycUeL5AAW7PxS2qczBlu4=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpuW1ngtBo1B9Hy5EL0X1iDU+Zh8q1yasMlCqGN +ghrVMIeciJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCabltZwAKCRDt8TtzzpQ2 X75jDACKVpDjf9TWI33WXpoWG71eq4jtbJ4CtB4pAPmc+kqfdWtIMIatKtFsf4WS9cljpWgWPPt 3pckJjP1KYEOpQnmKue1LVNjOGb6vOGJ2CrHgKpWxnSXw0BVmgTPN6pLeaTpoENNZFIbYeCXO44 iz9iJddl2wN8NnV8SaR2RjKr+dlVZH74Pytza2hKmkF4zQuXuKmANcqmhKC2lEk2X9cRcQMr8Dw 5AEHykS18AAmMDLHniMLhqnbfdsi71WKR4GczJjDvEGTxcFZl7brToMPKT2/Jb/V7GvL1i0thqI tRpV689r0RdqUkZ4tFFzxaNUT455z5wQ+XkC48SKtW53alKZk0U7rhQ+Rv4BRLK7H9ntxoMlUIj FRtwlaLEEec9DOnOQEUxxrf6E1oCgaZYMP/WCp9RORG7Phd1JugMjYTJeImpQRZAzJyH83RQrpp xINDlHb1Jklj9t6CqJ4Wbg9JSyoAKeSz/TVRLkVLfpZwIhVJTZmkt3989yMOe7MRltIXk= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" A subsequent commit will add floating-point support to the ABI; enhance the iio_generic_buffer tool to be able to parse this new data format. Signed-off-by: Francesco Lavra --- tools/iio/iio_generic_buffer.c | 59 ++++++++++++++++++++++++++++++---- tools/iio/iio_utils.c | 8 ++--- tools/iio/iio_utils.h | 4 +-- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/tools/iio/iio_generic_buffer.c b/tools/iio/iio_generic_buffer.c index bc82bb6a7a2a..a21552c2b190 100644 --- a/tools/iio/iio_generic_buffer.c +++ b/tools/iio/iio_generic_buffer.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -89,7 +90,7 @@ static void print1byte(uint8_t input, struct iio_channel_= info *info) */ input >>=3D info->shift; input &=3D info->mask; - if (info->is_signed) { + if (info->format =3D=3D 's') { int8_t val =3D (int8_t)(input << (8 - info->bits_used)) >> (8 - info->bits_used); printf("%05f ", ((float)val + info->offset) * info->scale); @@ -112,12 +113,28 @@ static void print2byte(uint16_t input, struct iio_cha= nnel_info *info) */ input >>=3D info->shift; input &=3D info->mask; - if (info->is_signed) { + switch (info->format) { + case 's': { int16_t val =3D (int16_t)(input << (16 - info->bits_used)) >> (16 - info->bits_used); printf("%05f ", ((float)val + info->offset) * info->scale); - } else { + break; + } + case 'u': printf("%05f ", ((float)input + info->offset) * info->scale); + break; +#if defined(__FLT16_MAX__) + case 'f': { + union { + uint16_t u; + _Float16 f; + } converter; + + converter.u =3D input; + printf("%05f ", ((float)converter.f + info->offset) * info->scale); + break; + } +#endif } } =20 @@ -135,12 +152,26 @@ static void print4byte(uint32_t input, struct iio_cha= nnel_info *info) */ input >>=3D info->shift; input &=3D info->mask; - if (info->is_signed) { + switch (info->format) { + case 's': { int32_t val =3D (int32_t)(input << (32 - info->bits_used)) >> (32 - info->bits_used); printf("%05f ", ((float)val + info->offset) * info->scale); - } else { + break; + } + case 'u': printf("%05f ", ((float)input + info->offset) * info->scale); + break; + case 'f': { + union { + uint32_t u; + float f; + } converter; + + converter.u =3D input; + printf("%05f ", (converter.f + info->offset) * info->scale); + break; + } } } =20 @@ -158,7 +189,8 @@ static void print8byte(uint64_t input, struct iio_chann= el_info *info) */ input >>=3D info->shift; input &=3D info->mask; - if (info->is_signed) { + switch (info->format) { + case 's': { int64_t val =3D (int64_t)(input << (64 - info->bits_used)) >> (64 - info->bits_used); /* special case for timestamp */ @@ -167,8 +199,21 @@ static void print8byte(uint64_t input, struct iio_chan= nel_info *info) else printf("%05f ", ((float)val + info->offset) * info->scale); - } else { + break; + } + case 'u': printf("%05f ", ((float)input + info->offset) * info->scale); + break; + case 'f': { + union { + uint64_t u; + double f; + } converter; + + converter.u =3D input; + printf("%05f ", (converter.f + info->offset) * info->scale); + break; + } } } =20 diff --git a/tools/iio/iio_utils.c b/tools/iio/iio_utils.c index c5c5082cb24e..f1d58db69942 100644 --- a/tools/iio/iio_utils.c +++ b/tools/iio/iio_utils.c @@ -70,7 +70,7 @@ int iioutils_break_up_name(const char *full_name, char **= generic_name) =20 /** * iioutils_get_type() - find and process _type attribute data - * @is_signed: output whether channel is signed + * @format: output channel format * @bytes: output how many bytes the channel storage occupies * @bits_used: output number of valid bits of data * @shift: output amount of bits to shift right data before applying bit m= ask @@ -83,7 +83,7 @@ int iioutils_break_up_name(const char *full_name, char **= generic_name) * * Returns a value >=3D 0 on success, otherwise a negative error code. **/ -static int iioutils_get_type(unsigned int *is_signed, unsigned int *bytes, +static int iioutils_get_type(char *format, unsigned int *bytes, unsigned int *bits_used, unsigned int *shift, uint64_t *mask, unsigned int *be, const char *device_dir, int buffer_idx, @@ -162,7 +162,7 @@ static int iioutils_get_type(unsigned int *is_signed, u= nsigned int *bytes, else *mask =3D (1ULL << *bits_used) - 1ULL; =20 - *is_signed =3D (signchar =3D=3D 's'); + *format =3D signchar; if (fclose(sysfsfp)) { ret =3D -errno; fprintf(stderr, "Failed to close %s\n", @@ -487,7 +487,7 @@ int build_channel_array(const char *device_dir, int buf= fer_idx, if ((ret < 0) && (ret !=3D -ENOENT)) goto error_cleanup_array; =20 - ret =3D iioutils_get_type(¤t->is_signed, + ret =3D iioutils_get_type(¤t->format, ¤t->bytes, ¤t->bits_used, ¤t->shift, diff --git a/tools/iio/iio_utils.h b/tools/iio/iio_utils.h index 663c94a6c705..8c72f002d050 100644 --- a/tools/iio/iio_utils.h +++ b/tools/iio/iio_utils.h @@ -32,7 +32,7 @@ extern const char *iio_dir; * @shift: amount of bits to shift right data before applying bit mask * @mask: a bit mask for the raw output * @be: flag if data is big endian - * @is_signed: is the raw value stored signed + * @format: format of the raw value * @location: data offset for this channel inside the buffer (in bytes) **/ struct iio_channel_info { @@ -46,7 +46,7 @@ struct iio_channel_info { unsigned shift; uint64_t mask; unsigned be; - unsigned is_signed; + char format; unsigned location; }; =20 --=20 2.39.5 From nobody Mon Apr 6 22:01:20 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.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 C02783EAC7D for ; Tue, 17 Mar 2026 15:04:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759857; cv=none; b=H4VkBJe2js53NQgHKmgBRDWXB+YFxQEkAVNIA0YusxQiYwPbnCCI8fREaASlqaTHnerkHAZ69ZTq9KIggKR/QdBoQHCq1kzu/YuPFX2vq4Vq6F8SWQdZdd9LieZZboSx7bxNE/MQGuVNN6PXV9oTuwYmtlzHWACcB7PzJumN5lo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759857; c=relaxed/simple; bh=nJstDZ/QxoZ2lCZSTohbFx88cUeNPJ2aHRDezpiEztg=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CYdtNWzbDdOEQDGEfBZJcZT6Ah7dxz+hyyOUIORNUZMaRBP909ix+y+79s3bNphpg47kxEpesf1X8wN3siydsLex+pymrGUTVF/dqN3jGdlxMFFRijxfsAhmhiw54546CXZZfavlv9nxjqeauPWok+Ix3M6Jh831HTFZN/9ueJE= 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=vzGd9q3P; arc=none smtp.client-ip=209.85.128.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="vzGd9q3P" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-4852e09e23dso50191085e9.0 for ; Tue, 17 Mar 2026 08:04:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1773759854; x=1774364654; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=oof/EJX4ZjAg7qi0LTv1JyI3DSw6kCFAbKLxi0V35OE=; b=vzGd9q3P1man3wgFU8Ae/2FmCphz/ZIQYr9NxR3KvklRncYhwydgq2Fi5/OV745q1h 1TVoWQ+G6hijXFGIvsCfNs3lE6xjFjHWwJys92XSwhQCBA30Kb/d/8abvK71UT/3/aYf FOHSScxLgqy+f6Clb/9qawXV08KHpTDuPhAhfLExztvvBAPX28ezB0M16lvBi0UN9HeU /j0C6qSm7fs/ogV1F7VUdMLzmhMqaB35YjVMs2MCCWCX07dQzRjI4TEbqWLFVhBVDhaE HdLKOSRVPyuICJy1ffHgr0j+bCIgjnGQjufpYtPyfguK6TNgNPkG0EAj/4cnffuYW998 f+pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773759854; x=1774364654; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=oof/EJX4ZjAg7qi0LTv1JyI3DSw6kCFAbKLxi0V35OE=; b=o9yyUdOh9dkVdMW+CezlGMWPuXsu2sq9a/tOg6qWgMquQZRvnzSBEoDm8cibZ3qOsM 0WaP77Y4h6QI+6GmfHNUadXE4iOQAYWNbc3MiJN7N97eg6OHB8nR/NfC9urH4pu8vl8B Grq/GYqueV2lk/uWUPJ93f2DniHCwZX7N17myzTmK+GYsHGUGMBXK3Nwjb0SmwUNUNs1 uEVfNe/gABtiq9CIIXLF5AwfPKRGCaiRDQVe9/ChGWGXlQOzooy/W4AnGyZ6POPLBzLS 8zZWXY4L1t37p3ZmiJDKuyx81Kk/1GimDo+IUhI2FeT0G5T+ZPcRwdgbLkO6/LjsAEm4 YeDA== X-Forwarded-Encrypted: i=1; AJvYcCU9g/KJCG+MYaCcoQ2gaU0gHZ7XYcgJn16mLx7GP6ofIh4/zXgrxnAvR1CyL9gKhcrV43f/CGDqwi5PX9Y=@vger.kernel.org X-Gm-Message-State: AOJu0YxfZ8RliqxRBM84RDjHq5Lz6gbwRhsAfV4A304wmShFgZEHckBo L0eEmFS4v9C/rPD1AEFT5dsMI1k7CZAm925xeWITXqI5R4bu8oQJYyNbR7kNzsoiXEI= X-Gm-Gg: ATEYQzynuAneDq6J0oVr+T9lPcG+N0G5pfzOTfyl/rvG3AWu+LlnpenQ4IoTMZ0j8Xj JtwEMYVDhohyYZEaBO4+mw8Ee02Vpp7WU5C0RP8oRxqXks2VnCKhSwXNsNZu5JoC1mJIGWUkzir 7ik+aBrCC2TzrmnSVqbl5lDLYmRiNtJ3tlOzsOYCLoAi5SZeMshNpF1IBSnIrxFhctFBuJ+k6Zc I6XZfyPdXJ1J7ZGVfwHguFsHtMHO6Xued2MaAWAQSwdRlgZ8sSM/pAwG+v2xvF95KpxAi44jVqe +9y2DgqQzZb3jzeUL76LXoUkGXE4ZiPQ+MnV3LN8girKpVi/kMCFK6tn3UB+XWX333WjdVQ+uh7 VeaYcVNYdPLz857PmpXHic1UDLhwPxEtdORErY2l9m3P3CQZrHZvU/L+T3yvH9dXfikKKxLFfxK +8sRCuF9wu1dLzDA== X-Received: by 2002:a05:600c:1388:b0:483:badb:618f with SMTP id 5b1f17b1804b1-485567050dcmr289431605e9.25.1773759854008; Tue, 17 Mar 2026 08:04:14 -0700 (PDT) Received: from localhost ([151.37.101.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4856eaeca12sm131699815e9.12.2026.03.17.08.04.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 08:04:13 -0700 (PDT) From: Francesco Lavra To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , Jonathan Corbet , Shuah Khan , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org Subject: [PATCH v8 4/6] iio: ABI: Add support for floating-point numbers in buffer scan elements Date: Tue, 17 Mar 2026 16:04:13 +0100 Message-Id: <20260317150413.3878365-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260317150316.3878107-1-flavra@baylibre.com> References: <20260317150316.3878107-1-flavra@baylibre.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5769; i=flavra@baylibre.com; h=from:subject; bh=nJstDZ/QxoZ2lCZSTohbFx88cUeNPJ2aHRDezpiEztg=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpuW1t8z8jlx35g+4GGQ9DFdnRdXczS088/vY6/ 7I230SyTA+JAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCabltbQAKCRDt8TtzzpQ2 X77VC/4qIu1oMFG1fT+Ujce45VvyVrqPCWBtWmoJuSCMcE84ii/nMOAI8amjPmTrut/ZeSF3RMA tRQWc1HXiyrN9TXlLGFAI2I60729IxamVGmO2WN0qE/Xv1NcHsn2Vd/O1wZb+XhvD2ZKw3gcaTv 4Pr+X8uaNwof5k4AoCbIsXvuEyOxTU8bhQyDlsuPvTiQHqaYlC6p8SQv+agknLOP2lL4cg2AtTc o5/U248wVWXY7iTdCwL4h3QNY4ze7XLTs+eky4ZxO6a0+c2/gy8IcalxghC4LgB/5Im5BcpXvhL MhujgxqoGzmUBLB1bKMxMNPLDillRTPfcSBJkkuezC2Vs3M8iVcNQJh68teEBcsabsYGFi4fw5s 8g3TJ2rT4DIPWjiZa4MrZg8GtQiK0BR+7V2daqkH5HL5AUxsY5SXipYjcXY1JYxw3qj5shHK00O JGHJ+8hBqaWkz3aN9+YILQa++ryvU84lLiZinXyTbs8k4yEo0rk/OwYf4vmKA3XYt4/nU= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In the data storage description of a scan element, the first character after the colon can have the values 's' and 'u' to specify signed and unsigned integers, respectively. Add 'f' as an allowed value to specify floating-point numbers formatted according to the IEEE 754 standard. Signed-off-by: Francesco Lavra --- Documentation/ABI/testing/sysfs-bus-iio | 33 +++++++++++++----------- Documentation/driver-api/iio/buffers.rst | 3 ++- Documentation/iio/iio_devbuf.rst | 3 ++- include/linux/iio/iio.h | 2 ++ 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/te= sting/sysfs-bus-iio index 5f87dcee78f7..bd6c3305dd2b 100644 --- a/Documentation/ABI/testing/sysfs-bus-iio +++ b/Documentation/ABI/testing/sysfs-bus-iio @@ -1510,21 +1510,24 @@ Contact: linux-iio@vger.kernel.org Description: Description of the scan element data storage within the buffer and hence the form in which it is read from user-space. - Form is [be|le]:[s|u]bits/storagebits[>>shift]. - be or le specifies big or little endian. s or u specifies if - signed (2's complement) or unsigned. bits is the number of bits - of data and storagebits is the space (after padding) that it - occupies in the buffer. shift if specified, is the shift that - needs to be applied prior to masking out unused bits. Some - devices put their data in the middle of the transferred elements - with additional information on both sides. Note that some - devices will have additional information in the unused bits - so to get a clean value, the bits value must be used to mask - the buffer output value appropriately. The storagebits value - also specifies the data alignment. So s48/64>>2 will be a - signed 48 bit integer stored in a 64 bit location aligned to - a 64 bit boundary. To obtain the clean value, shift right 2 - and apply a mask to zero the top 16 bits of the result. + Form is [be|le]:[f|s|u]bits/storagebits[>>shift]. + be or le specifies big or little endian. f means floating-point + (IEEE 754 binary format), s means signed (2's complement), u means + unsigned. bits is the number of bits of data and storagebits is the + space (after padding) that it occupies in the buffer; when using a + floating-point format, bits must be one of the width values defined + in the IEEE 754 standard for binary interchange formats (e.g. 16 + indicates the binary16 format for half-precision numbers). shift, + if specified, is the shift that needs to be applied prior to + masking out unused bits. Some devices put their data in the middle + of the transferred elements with additional information on both + sides. Note that some devices will have additional information in + the unused bits, so to get a clean value the bits value must be + used to mask the buffer output value appropriately. The storagebits + value also specifies the data alignment. So s48/64>>2 will be a + signed 48 bit integer stored in a 64 bit location aligned to a 64 + bit boundary. To obtain the clean value, shift right 2 and apply a + mask to zero the top 16 bits of the result. For other storage combinations this attribute will be extended appropriately. =20 diff --git a/Documentation/driver-api/iio/buffers.rst b/Documentation/drive= r-api/iio/buffers.rst index e16abaf826fe..8779022e3da5 100644 --- a/Documentation/driver-api/iio/buffers.rst +++ b/Documentation/driver-api/iio/buffers.rst @@ -37,9 +37,10 @@ directory contains attributes of the following form: * :file:`index`, the scan_index of the channel. * :file:`type`, description of the scan element data storage within the bu= ffer and hence the form in which it is read from user space. - Format is [be|le]:[s|u]bits/storagebits[Xrepeat][>>shift] . + Format is [be|le]:[f|s|u]bits/storagebits[Xrepeat][>>shift] . =20 * *be* or *le*, specifies big or little endian. + * *f*, specifies if floating-point. * *s* or *u*, specifies if signed (2's complement) or unsigned. * *bits*, is the number of valid data bits. * *storagebits*, is the number of bits (after padding) that it occupies = in the diff --git a/Documentation/iio/iio_devbuf.rst b/Documentation/iio/iio_devbu= f.rst index dca1f0200b0d..e91730fa3cea 100644 --- a/Documentation/iio/iio_devbuf.rst +++ b/Documentation/iio/iio_devbuf.rst @@ -83,9 +83,10 @@ and the relevant _type attributes to establish the data = storage format. =20 Read-only attribute containing the description of the scan element data st= orage within the buffer and hence the form in which it is read from userspace. F= ormat -is [be|le]:[s|u]bits/storagebits[Xrepeat][>>shift], where: +is [be|le]:[f|s|u]bits/storagebits[Xrepeat][>>shift], where: =20 - **be** or **le** specifies big or little-endian. +- **f** specifies if floating-point. - **s** or **u** specifies if signed (2's complement) or unsigned. - **bits** is the number of valid data bits. - **storagebits** is the number of bits (after padding) that it occupies i= n the diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index d48a0ab01b8d..1f2c1cb03394 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -180,9 +180,11 @@ struct iio_event_spec { * Format values in scan type * @IIO_SCAN_FORMAT_SIGNED_INT: Signed integer (two's complement). * @IIO_SCAN_FORMAT_UNSIGNED_INT: Unsigned integer. + * @IIO_SCAN_FORMAT_FLOAT: Floating point. */ #define IIO_SCAN_FORMAT_SIGNED_INT 's' #define IIO_SCAN_FORMAT_UNSIGNED_INT 'u' +#define IIO_SCAN_FORMAT_FLOAT 'f' =20 /** * struct iio_scan_type - specification for channel data format in buffer --=20 2.39.5 From nobody Mon Apr 6 22:01:20 2026 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 C4FBE3EB811 for ; Tue, 17 Mar 2026 15:04:22 +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=1773759864; cv=none; b=b5U+GVukHZmowsD/ysF6S1rLT9uCw9en3VdmWsuF5y1RoROndTtd2GQvkmL4rW183V+q1uN5Tef9Y4kTd3K4vctZFB23jekOWUygL2bQujYhlZvJVs0cRWeOojLw2zntCUjOLxYGXPfzpJCCtns3pBK9+meJ+pA5SQlR6iUBeFk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759864; c=relaxed/simple; bh=HohRRDF8l3Dbx0JorWXh1uk1N4zs/oYSUkkwvR1Z+LE=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=UrhWSBWszuaC4qDPkVBfUjQR/7+02K3WInUL4niIWBP6Coq2dAP3D34eOhwKWw90TqrflUOgQvFoFORz+oRaD9+QfNzhYse9WFdqP56zpjZXz+Pe0rXmJTol5gNAzNFl6xS7YoFyz1TPYXonxQv7EIiIptLbq02EraBKe6xZr2E= 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=PU/4661g; 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="PU/4661g" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-4327790c4e9so4278191f8f.2 for ; Tue, 17 Mar 2026 08:04:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1773759861; x=1774364661; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=Qy8dwe6FlWYM+ip3X8t+5BGr1q3na3YWkrOYcDJH1sc=; b=PU/4661gzUispEAYzY8T2a/J6e0+xLxLH8B6mH+PmWJDTaRoZW1x505xWE3bKflEKm yxzyhMQWhC1ORY99BGeH6hipyG8srRVuJT31pvxBjT0XIEdkc+rgxKfeh9q8FcbOhHWG 8Xo/c+zLJ8XtQttVlYTrWTXWUZwQ7iH+kva8XjagjuIPixHG61/eDqBDWoR4fcjL8gbZ FHFGYE+KpnW1exBXR3aMogT/z0tz+b0JpODheP2CqUStT3gktnDPFRnzuy52P6lB406s JMuqzr38XPZ8kC8+yBF/EYfdAq7Ct47l/olPUzhRzF1yawHB6vfdfsHsgGV/hwuGc05+ KWcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773759861; x=1774364661; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Qy8dwe6FlWYM+ip3X8t+5BGr1q3na3YWkrOYcDJH1sc=; b=SCmgJdzZ/+6jqRmUNpcUnRujtbGto4OfrxuGU27G1YNd88+xgN/hKdI3mW/7xypak5 953RJq9aDbJ7YDqfvvdh4449qlOBkdM3ZR5v5tSONH/UVTG/UN/OwVT6Cuhqz3XJXBji BnkQoBwly4zLKiWa01Ps8tuB+LpC5WZ1h6OCsYRsD1ZVqwAEBAq+TjEScD3vfRdCLQHr iqGVzfLzuow9YnqFc5B3ZDbKA+yL26GqwiWgArJClK4p/1DyKQ1F9GGGKITk3jdwXNB3 v4lIo85VQHipb73wsN0Nkv3bVUuAaoJY4Lu1BqGwy86IXVT91fhVkB1twx4QmOv6bvFK zeTA== X-Forwarded-Encrypted: i=1; AJvYcCW8nSiDkvqnrwWmrH8ndGBej3lVle9IyZkuxjzDRhrCYOmeNxtzgpox5jR1LwTN72OTBPTKpJ6a17O0FNw=@vger.kernel.org X-Gm-Message-State: AOJu0Yxrr+f+4pIgr3t8pFgemLFr8vBI0wBGzQ3iuZnF+k3PJttWUD4c V9NDFy1OhqvzI80pl0Yz6xeRvux52UBILPGCWt0E87xRCaTmnoLUgRamHWMQZxTdTuU= X-Gm-Gg: ATEYQzy4G2jSdumiJN/9olZQu1jOg6AwonT7MhgKnKN4jlC31oNreV4306f4MkmtTJS 96o9M6PSpmEfcXACWsFpcQXikbRYcqIOCip4gqVMOCYjB+zeh3rMU75H2XbwrOP12tvAAdCitS7 IxvNNPyvZFYGOp/GkrB+0G7S6On0IsCU6BlPoP+8OqvccDu3yaEMF7W+A3iNNplbU4QoMPPkGRf eV1ZeF7vA9qgSeFALk6hJTLmsG8fU+nHWHAHWU6B30RnSvSEHDSiPBAF6DhboqZ+T2SBkvrRqEz rOCnw6X+xVYFBSkKAwcPU+lVv7Xz3Z89oIR2R26oTx5Y1GfoR+hEsVNkqpg9tHkP7dbeE0Mb95j WUBaNVx0EdySvVVCQltZpyMAXkF6LXIt2uNLTKmIqPt15iQRARgLJLVT6Tp3GW1K3ZtriuKHiWu zUmej8Nrl/PLiSNQ== X-Received: by 2002:a05:600c:4e4a:b0:485:4135:5c92 with SMTP id 5b1f17b1804b1-4855649360amr292454075e9.0.1773759860943; Tue, 17 Mar 2026 08:04:20 -0700 (PDT) Received: from localhost ([151.37.101.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48634a7ac2csm38692075e9.1.2026.03.17.08.04.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 08:04:20 -0700 (PDT) From: Francesco Lavra To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 5/6] iio: ABI: Add quaternion axis modifier Date: Tue, 17 Mar 2026 16:04:20 +0100 Message-Id: <20260317150420.3878400-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260317150316.3878107-1-flavra@baylibre.com> References: <20260317150316.3878107-1-flavra@baylibre.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3003; i=flavra@baylibre.com; h=from:subject; bh=HohRRDF8l3Dbx0JorWXh1uk1N4zs/oYSUkkwvR1Z+LE=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpuW1zfUcZOZ9QxxP4UfnwEnT+HuNvD8t9POSyc pyp3qizUvCJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCabltcwAKCRDt8TtzzpQ2 X0UuC/0RKlBcYDWfJv9o2PyvSd6XBzrMTqjUy7tvO87gAV8unVKprNL7pSKig+SkxeRAdtf+ACc 4OC+BtTBunaPnc4XWLezw2ZDHuwbjo2hCvvex7JZ0ueWCCYzR8aP3Qm6HX5lwuz+AhZar+DIGBS CYDObE4zDEvfYSLXKM3S4YxUtz/35G4A5mm9OKMmMEfDruW191iaHN6BHRrj+WEw0JGycFmJRPz N0uFqW2LrcUFnhfho7ol2OVAQ1snOOUm1wUitCuwQQAigskotAEhl8BaBdFZ37bmUXEdK/1rUWt WSmB52Q5LIAzI9fae3go6MsqEMFiPqCyNZoVD6AbynYOx6UJCv02cPA3LWC14IeKPPHFoAAEIhV wts+DDOd94HlmV8VbQ70vNWjT2LsYORmaUCtMZDxi58FsuX4h2g/+07hBTT4tBHwYsK14tJ570w 206DdgmQWTtfrSMj2BxqrGCAkBnOl9Ib+h92U1J87YcfTf5P9F863wrjRjRGbKSP0FoN0= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This modifier applies to the IIO_ROT channel type, and indicates a data representation that specifies the {x, y, z} components of the normalized quaternion vector. Signed-off-by: Francesco Lavra Reviewed-by: David Lechner --- Documentation/ABI/testing/sysfs-bus-iio | 15 +++++++++++++++ drivers/iio/industrialio-core.c | 1 + include/uapi/linux/iio/types.h | 1 + tools/iio/iio_event_monitor.c | 1 + 4 files changed, 18 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/te= sting/sysfs-bus-iio index bd6c3305dd2b..46fef26e5376 100644 --- a/Documentation/ABI/testing/sysfs-bus-iio +++ b/Documentation/ABI/testing/sysfs-bus-iio @@ -1755,6 +1755,21 @@ Description: measurement from channel Y. Units after application of scale and offset are milliamps. =20 +What: /sys/bus/iio/devices/iio:deviceX/in_rot_quaternionaxis_raw +KernelVersion: 7.1 +Contact: linux-iio@vger.kernel.org +Description: + Raw value of {x, y, z} components of the quaternion vector. These + components represent the axis about which a rotation occurs, and are + subject to the following constraints: + + - the quaternion vector is normalized, i.e. w^2 + x^2 + y^2 + z^2 =3D 1 + - the rotation angle is within the [-pi, pi] range, i.e. the w + component (which represents the amount of rotation) is non-negative + + These constraints allow the w value to be calculated from the other + components: w =3D sqrt(1 - (x^2 + y^2 + z^2)). + What: /sys/.../iio:deviceX/in_energy_en What: /sys/.../iio:deviceX/in_distance_en What: /sys/.../iio:deviceX/in_velocity_sqrt(x^2+y^2+z^2)_en diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-cor= e.c index 22eefd048ba9..bd6f4f9f4533 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -157,6 +157,7 @@ static const char * const iio_modifier_names[] =3D { [IIO_MOD_ACTIVE] =3D "active", [IIO_MOD_REACTIVE] =3D "reactive", [IIO_MOD_APPARENT] =3D "apparent", + [IIO_MOD_QUATERNION_AXIS] =3D "quaternionaxis", }; =20 /* relies on pairs of these shared then separate */ diff --git a/include/uapi/linux/iio/types.h b/include/uapi/linux/iio/types.h index 6d269b844271..d7c2bb223651 100644 --- a/include/uapi/linux/iio/types.h +++ b/include/uapi/linux/iio/types.h @@ -113,6 +113,7 @@ enum iio_modifier { IIO_MOD_ACTIVE, IIO_MOD_REACTIVE, IIO_MOD_APPARENT, + IIO_MOD_QUATERNION_AXIS, }; =20 enum iio_event_type { diff --git a/tools/iio/iio_event_monitor.c b/tools/iio/iio_event_monitor.c index 03ca33869ce8..df6c43d7738d 100644 --- a/tools/iio/iio_event_monitor.c +++ b/tools/iio/iio_event_monitor.c @@ -145,6 +145,7 @@ static const char * const iio_modifier_names[] =3D { [IIO_MOD_ACTIVE] =3D "active", [IIO_MOD_REACTIVE] =3D "reactive", [IIO_MOD_APPARENT] =3D "apparent", + [IIO_MOD_QUATERNION_AXIS] =3D "quaternionaxis", }; =20 static bool event_is_known(struct iio_event_data *event) --=20 2.39.5 From nobody Mon Apr 6 22:01:20 2026 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 788FF3EB7F9 for ; Tue, 17 Mar 2026 15:04:30 +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=1773759872; cv=none; b=t43ORTvXnMCT2QNuGliXw856pXSME7IIhhYtULom2l9kgHALhCkQ2iRj2sWjWfOpPYcHodpz+poGeVeeBgcQvTbbq4O4AV4+6Opgvp1UwcP1DfdNKKZMJvXgiwejoNQYkaGAOSXaIDgWo1sTMWzB8z264/hsy8Hba8OyrHJdSmQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773759872; c=relaxed/simple; bh=7djmIHZtBkRcv7htkjXZqeX2umxLe02sXkdmc1bk654=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rA3y1S47po4zFJkN71P8RUC5ZQhSpev7naLKog6Ud4W2KEPrLAPgmpXg4R0joMpA9VA9HSIyk7HhN3GptMR4S1rmmurqI6Us7OLTtPRr9CSpHS3mLPQpCdvnm/MqzukyizwKcubLUbAqKCAucG8NLEKQb6ZM3wv6Fz0IHdEUfjU= 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=ShxL6HSR; 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="ShxL6HSR" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-48628ce9ab5so10744545e9.2 for ; Tue, 17 Mar 2026 08:04:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1773759869; x=1774364669; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=U9Y1ZVb6O9133EguhmkARwym7qmE+zI7GKlFaw+R4F0=; b=ShxL6HSRFXMs8438K8p2Zs4pTTa7L0e12XL7mfsgeD0RmU4fDqHbjW2zaZes3Kj0Tn 1KfKT01rVYHYB6j5yRd91ZCSBYmdCEVo6jGZsPjX0sKtxlyR/HJBEeQY3LCAEeg4rsQR +4sVSd3VRsGDAh0ROI7X2tjRvZcEPhz3NfWvXUC/BRpoBc1M0VoPKt645jZSPVbPOQ+s 4yzztFj2LoUiBBy09dW3C1DKzTw2bU0jW7klFJtCknxBBZrAO47guFyNAUTP+nKH1nC3 0zk52KeaamsCGWSuGQ/7tobJKnl+c+dB27MbFTOqVFDRWBO1Qw1jgksqfWId0L/IxmJ5 IEsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773759869; x=1774364669; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=U9Y1ZVb6O9133EguhmkARwym7qmE+zI7GKlFaw+R4F0=; b=ZE6+4enFt9bmVcU0qLhUWBEG4T//wPdNik5jQ0n9nMBMVGlGrwyuJBqZPDPdU15RT+ msC8+zCxbaCEDlziCaMtpkvqstJkEdAzIYyAJfdhkeKimwAebpB06iL3C6+FNzQrp8ye pRgKINncz6ssFeIlqlUdZjFenGTAiznZKUB8/+VWX1nT+I+tGJuDnvODlrfxJfiW+X6+ YcYAuyXEyZlhF6+NnJ99hBE+eWdiPlHLVqtSJW1abdduInflBXc9/skfGtIdUhMZ3Fvg HS7zsiPGG+3ixdSjGIswjYY5XM0VVPy5AugTieOEkiB4wuZTdylXz6qjOWLo2gTtiRoW 0Hlw== X-Forwarded-Encrypted: i=1; AJvYcCXY1tlu0u5V3aEgfR8XuSgCUimr5TvaTLqTHhEloC09M+LYqCXf72h4kHZRlJETFjYc2yRUrltYpec29Y4=@vger.kernel.org X-Gm-Message-State: AOJu0YxfDhsLVd5mmy7e6hG2Zv02QC10f44zwXJY9dG6vTsvF9vtw1M4 RFlGZE3HGqZ/zJuk6S3mh9yDczBYsTe2uCaYbR6iwdTlHA1f1vHJN6vTBc0Y4nTxWLs= X-Gm-Gg: ATEYQzy3JmfBaaTlC3B2Xx6aIj1BeAQrPZVnrj/N/lUeoR758BUrSl1MrxN7HAfCGpt ZydU4Hg3teLIrft07GOPPs9ZBiQevjDg5Qh+y6ahkCQhxWWW+j6uE+GqOmPw3RydkdeBfWQWJqv 5asLtz337E3wHFm9hZmR7QMQm3gfw8abVJISfo4MonbDTA9kvjmAlmh6/DDkmx+Wak7C0uWcuEH eNhNWJJJbbiVZwCXyg9ttAslAi9g6EC4iFfhbwMBpqgTJaLZ1JRpqMqhY0OFk9gJI83+1tBoSdI RL6ucLVXH/Pg/UUzkQcKEHxLAemmXkTzzJhH61mvtPTaCzZbufq8/oncvu89dVXdHl58zVKnyze ZLBN5Gzc2Pk4w/KoWThWY4YHBYZdMC1rpsx7/oLVtyiJ6MHxPOXsHoyGnfV313yMq1/+hvQ== X-Received: by 2002:a05:600c:3f1a:b0:485:481c:e7bb with SMTP id 5b1f17b1804b1-4855670289cmr262580915e9.20.1773759868514; Tue, 17 Mar 2026 08:04:28 -0700 (PDT) Received: from localhost ([151.37.101.237]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4856eaee04fsm73040235e9.13.2026.03.17.08.04.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 08:04:28 -0700 (PDT) From: Francesco Lavra To: Lorenzo Bianconi , Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org Subject: [PATCH v8 6/6] iio: imu: st_lsm6dsx: Add support for rotation sensor Date: Tue, 17 Mar 2026 16:04:26 +0100 Message-Id: <20260317150427.3878450-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260317150316.3878107-1-flavra@baylibre.com> References: <20260317150316.3878107-1-flavra@baylibre.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=14914; i=flavra@baylibre.com; h=from:subject; bh=7djmIHZtBkRcv7htkjXZqeX2umxLe02sXkdmc1bk654=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpuW16zKetJw0Bnd9G/PEUQ3zaRJ/Mm649i7ERF 4cHOOlBQdWJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCabltegAKCRDt8TtzzpQ2 X8JWC/4v8zBQ03n9AnuKFQfIFCFQX6fQhLlWF6S2tSf5mpCJirgNO1vCvMInjyPZ9KyCJR2bqLa eLIW1tAw+Sgj2F5bm7AOhi+ZYFd9P5v16PbbhNRws+RochiObumOHyqRBqjY0+fbfO2nJ7Of0qH vr/8i/qHDKUfCrbE5bc87GoAeOcBgCMhsO6RxQRTZf8Qjz3skzAIGukzlkxW2aEUFFWR3hvvmng 7+DI9B/eyEDdAIUyqXjNjmjAsR6psY+b7pdIniAxk0vTy7ycdRNICK0oIs3e7mmLjI8UhvN22VQ E4RbGiM27/h13phguOX5l254EAudIyUD2ZgbkbZDDAi5bkEHVod0Llwdi0p0usIB1Rppx+8YZKS omm7CYH+JPgpNwdwhuICPGZeykN3ULRdy8lYJvZ7Ha3PDRku6PCxsARmryE551ISxNgCJm/Z/D6 wnFtxm0zv9PrUrU5acRkrtZlhAmr84llBbIOwmHf4/9qca3s1+ScXX4rQ0c4buR64MeOk= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some IMU chips in the LSM6DSX family have sensor fusion features that combine data from the accelerometer and gyroscope. One of these features generates rotation vector data and makes it available in the hardware FIFO as a quaternion (more specifically, the X, Y and Z components of the quaternion vector, expressed as 16-bit half-precision floating-point numbers). Add support for a new sensor instance that allows receiving sensor fusion data, by defining a new struct st_lsm6dsx_fusion_settings (which contains chip-specific details for the sensor fusion functionality), and adding this struct as a new field in struct st_lsm6dsx_settings. In st_lsm6dsx_core.c, populate this new struct for the LSM6DSV and LSM6DSV16X chips, and add the logic to initialize an additional IIO device if this struct is populated for the hardware type being probed. Note: a new IIO device is being defined (as opposed to adding channels to an existing device) because the rate at which sensor fusion data is generated may not match the data rate from any of the existing devices. Tested on LSMDSV16X. Signed-off-by: Francesco Lavra Acked-by: Lorenzo Bianconi --- drivers/iio/imu/st_lsm6dsx/Makefile | 2 +- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 28 ++- .../iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | 9 +- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 58 +++++ .../iio/imu/st_lsm6dsx/st_lsm6dsx_fusion.c | 235 ++++++++++++++++++ 5 files changed, 325 insertions(+), 7 deletions(-) create mode 100644 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_fusion.c diff --git a/drivers/iio/imu/st_lsm6dsx/Makefile b/drivers/iio/imu/st_lsm6d= sx/Makefile index 57cbcd67d64f..19a488254de3 100644 --- a/drivers/iio/imu/st_lsm6dsx/Makefile +++ b/drivers/iio/imu/st_lsm6dsx/Makefile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only st_lsm6dsx-y :=3D st_lsm6dsx_core.o st_lsm6dsx_buffer.o \ - st_lsm6dsx_shub.o + st_lsm6dsx_shub.o st_lsm6dsx_fusion.o =20 obj-$(CONFIG_IIO_ST_LSM6DSX) +=3D st_lsm6dsx.o obj-$(CONFIG_IIO_ST_LSM6DSX_I2C) +=3D st_lsm6dsx_i2c.o diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index 07b1773c87bd..767aadfe7061 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -294,6 +294,7 @@ enum st_lsm6dsx_sensor_id { ST_LSM6DSX_ID_EXT0, ST_LSM6DSX_ID_EXT1, ST_LSM6DSX_ID_EXT2, + ST_LSM6DSX_ID_FUSION, ST_LSM6DSX_ID_MAX }; =20 @@ -301,6 +302,17 @@ enum st_lsm6dsx_ext_sensor_id { ST_LSM6DSX_ID_MAGN, }; =20 +struct st_lsm6dsx_fusion_settings { + const struct iio_chan_spec *chan; + int chan_len; + struct st_lsm6dsx_reg odr_reg; + int odr_hz[ST_LSM6DSX_ODR_LIST_SIZE]; + int odr_len; + struct st_lsm6dsx_reg fifo_enable; + struct st_lsm6dsx_reg page_mux; + struct st_lsm6dsx_reg enable; +}; + /** * struct st_lsm6dsx_ext_dev_settings - i2c controller slave settings * @i2c_addr: I2c slave address list. @@ -388,6 +400,7 @@ struct st_lsm6dsx_settings { struct st_lsm6dsx_hw_ts_settings ts_settings; struct st_lsm6dsx_shub_settings shub_settings; struct st_lsm6dsx_event_settings event_settings; + struct st_lsm6dsx_fusion_settings fusion_settings; }; =20 enum st_lsm6dsx_fifo_mode { @@ -510,6 +523,9 @@ int st_lsm6dsx_check_odr(struct st_lsm6dsx_sensor *sens= or, u32 odr, u8 *val); int st_lsm6dsx_shub_probe(struct st_lsm6dsx_hw *hw, const char *name); int st_lsm6dsx_shub_set_enable(struct st_lsm6dsx_sensor *sensor, bool enab= le); int st_lsm6dsx_shub_read_output(struct st_lsm6dsx_hw *hw, u8 *data, int le= n); +int st_lsm6dsx_fusion_probe(struct st_lsm6dsx_hw *hw, const char *name); +int st_lsm6dsx_fusion_set_enable(struct st_lsm6dsx_sensor *sensor, bool en= able); +int st_lsm6dsx_fusion_set_odr(struct st_lsm6dsx_sensor *sensor, bool enabl= e); int st_lsm6dsx_set_page(struct st_lsm6dsx_hw *hw, bool enable); =20 static inline int @@ -564,12 +580,14 @@ st_lsm6dsx_get_mount_matrix(const struct iio_dev *iio= _dev, static inline int st_lsm6dsx_device_set_enable(struct st_lsm6dsx_sensor *sensor, bool enable) { - if (sensor->id =3D=3D ST_LSM6DSX_ID_EXT0 || - sensor->id =3D=3D ST_LSM6DSX_ID_EXT1 || - sensor->id =3D=3D ST_LSM6DSX_ID_EXT2) + switch (sensor->id) { + case ST_LSM6DSX_ID_EXT0 ... ST_LSM6DSX_ID_EXT2: return st_lsm6dsx_shub_set_enable(sensor, enable); - - return st_lsm6dsx_sensor_set_enable(sensor, enable); + case ST_LSM6DSX_ID_FUSION: + return st_lsm6dsx_fusion_set_enable(sensor, enable); + default: + return st_lsm6dsx_sensor_set_enable(sensor, enable); + } } =20 static const diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c b/drivers/iio/i= mu/st_lsm6dsx/st_lsm6dsx_buffer.c index 19232146bd61..d5935106a373 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c @@ -88,6 +88,7 @@ enum st_lsm6dsx_fifo_tag { ST_LSM6DSX_EXT0_TAG =3D 0x0f, ST_LSM6DSX_EXT1_TAG =3D 0x10, ST_LSM6DSX_EXT2_TAG =3D 0x11, + ST_LSM6DSX_ROT_TAG =3D 0x13, }; =20 static const @@ -226,8 +227,11 @@ static int st_lsm6dsx_set_fifo_odr(struct st_lsm6dsx_s= ensor *sensor, u8 data; =20 /* Only internal sensors have a FIFO ODR configuration register. */ - if (sensor->id >=3D ARRAY_SIZE(hw->settings->batch)) + if (sensor->id >=3D ARRAY_SIZE(hw->settings->batch)) { + if (sensor->id =3D=3D ST_LSM6DSX_ID_FUSION) + return st_lsm6dsx_fusion_set_odr(sensor, enable); return 0; + } =20 batch_reg =3D &hw->settings->batch[sensor->id]; if (batch_reg->addr) { @@ -586,6 +590,9 @@ st_lsm6dsx_push_tagged_data(struct st_lsm6dsx_hw *hw, u= 8 tag, case ST_LSM6DSX_EXT2_TAG: iio_dev =3D hw->iio_devs[ST_LSM6DSX_ID_EXT2]; break; + case ST_LSM6DSX_ROT_TAG: + iio_dev =3D hw->iio_devs[ST_LSM6DSX_ID_FUSION]; + break; default: return -EINVAL; } diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index 450cb5b47346..160cc6551853 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -94,6 +94,26 @@ =20 #define ST_LSM6DSX_REG_WHOAMI_ADDR 0x0f =20 +/* Raw values from the IMU are 16-bit half-precision floating-point number= s. */ +#define ST_LSM6DSX_CHANNEL_ROT \ +{ \ + .type =3D IIO_ROT, \ + .modified =3D 1, \ + .channel2 =3D IIO_MOD_QUATERNION_AXIS, \ + .info_mask_shared_by_all =3D BIT(IIO_CHAN_INFO_SAMP_FREQ), \ + .info_mask_shared_by_all_available =3D \ + BIT(IIO_CHAN_INFO_SAMP_FREQ), \ + .scan_index =3D 0, \ + .scan_type =3D { \ + .format =3D 'f', \ + .realbits =3D 16, \ + .storagebits =3D 16, \ + .endianness =3D IIO_LE, \ + .repeat =3D 3, \ + }, \ + .ext_info =3D st_lsm6dsx_ext_info, \ +} + static const struct iio_event_spec st_lsm6dsx_ev_motion[] =3D { { .type =3D IIO_EV_TYPE_THRESH, @@ -153,6 +173,11 @@ static const struct iio_chan_spec st_lsm6ds0_gyro_chan= nels[] =3D { IIO_CHAN_SOFT_TIMESTAMP(3), }; =20 +static const struct iio_chan_spec st_lsm6dsx_fusion_channels[] =3D { + ST_LSM6DSX_CHANNEL_ROT, + IIO_CHAN_SOFT_TIMESTAMP(1), +}; + static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] =3D { { .reset =3D { @@ -1492,6 +1517,33 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_s= ensor_settings[] =3D { }, }, }, + .fusion_settings =3D { + .chan =3D st_lsm6dsx_fusion_channels, + .chan_len =3D ARRAY_SIZE(st_lsm6dsx_fusion_channels), + .odr_reg =3D { + .addr =3D 0x5e, + .mask =3D GENMASK(5, 3), + }, + .odr_hz[0] =3D 15, + .odr_hz[1] =3D 30, + .odr_hz[2] =3D 60, + .odr_hz[3] =3D 120, + .odr_hz[4] =3D 240, + .odr_hz[5] =3D 480, + .odr_len =3D 6, + .fifo_enable =3D { + .addr =3D 0x44, + .mask =3D BIT(1), + }, + .page_mux =3D { + .addr =3D 0x01, + .mask =3D BIT(7), + }, + .enable =3D { + .addr =3D 0x04, + .mask =3D BIT(1), + }, + }, }, { .reset =3D { @@ -2899,6 +2951,12 @@ int st_lsm6dsx_probe(struct device *dev, int irq, in= t hw_id, return err; } =20 + if (hw->settings->fusion_settings.chan) { + err =3D st_lsm6dsx_fusion_probe(hw, name); + if (err) + return err; + } + if (hw->irq > 0) { err =3D st_lsm6dsx_irq_setup(hw); if (err < 0) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_fusion.c b/drivers/iio/i= mu/st_lsm6dsx/st_lsm6dsx_fusion.c new file mode 100644 index 000000000000..74a2cc5cab12 --- /dev/null +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_fusion.c @@ -0,0 +1,235 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * STMicroelectronics st_lsm6dsx IMU sensor fusion + * + * Copyright 2026 BayLibre, SAS + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "st_lsm6dsx.h" + +static int +st_lsm6dsx_fusion_get_odr_val(const struct st_lsm6dsx_fusion_settings *set= tings, + u32 odr_mHz, u8 *val) +{ + int odr_hz =3D odr_mHz / MILLI; + int i; + + for (i =3D 0; i < settings->odr_len; i++) { + if (settings->odr_hz[i] =3D=3D odr_hz) + break; + } + if (i =3D=3D settings->odr_len) + return -EINVAL; + + *val =3D i; + return 0; +} + +/** + * st_lsm6dsx_fusion_page_enable - Enable access to sensor fusion configur= ation + * registers. + * @hw: Sensor hardware instance. + * + * Return: 0 on success, negative value on error. + */ +static int st_lsm6dsx_fusion_page_enable(struct st_lsm6dsx_hw *hw) +{ + const struct st_lsm6dsx_reg *mux; + + mux =3D &hw->settings->fusion_settings.page_mux; + + return regmap_set_bits(hw->regmap, mux->addr, mux->mask); +} + +/** + * st_lsm6dsx_fusion_page_disable - Disable access to sensor fusion + * configuration registers. + * @hw: Sensor hardware instance. + * + * Return: 0 on success, negative value on error. + */ +static int st_lsm6dsx_fusion_page_disable(struct st_lsm6dsx_hw *hw) +{ + const struct st_lsm6dsx_reg *mux; + + mux =3D &hw->settings->fusion_settings.page_mux; + + return regmap_clear_bits(hw->regmap, mux->addr, mux->mask); +} + +int st_lsm6dsx_fusion_set_enable(struct st_lsm6dsx_sensor *sensor, bool en= able) +{ + struct st_lsm6dsx_hw *hw =3D sensor->hw; + const struct st_lsm6dsx_reg *en_reg; + int err; + + guard(mutex)(&hw->page_lock); + + en_reg =3D &hw->settings->fusion_settings.enable; + err =3D st_lsm6dsx_fusion_page_enable(hw); + if (err) + return err; + + err =3D regmap_assign_bits(hw->regmap, en_reg->addr, en_reg->mask, enable= ); + if (err) { + st_lsm6dsx_fusion_page_disable(hw); + return err; + } + + return st_lsm6dsx_fusion_page_disable(hw); +} + +int st_lsm6dsx_fusion_set_odr(struct st_lsm6dsx_sensor *sensor, bool enabl= e) +{ + const struct st_lsm6dsx_fusion_settings *settings; + struct st_lsm6dsx_hw *hw =3D sensor->hw; + u8 data; + int err; + + guard(mutex)(&hw->page_lock); + + err =3D st_lsm6dsx_fusion_page_enable(hw); + if (err) + return err; + + settings =3D &hw->settings->fusion_settings; + if (enable) { + const struct st_lsm6dsx_reg *reg =3D &settings->odr_reg; + u8 odr_val; + + st_lsm6dsx_fusion_get_odr_val(settings, sensor->hwfifo_odr_mHz, + &odr_val); + data =3D ST_LSM6DSX_SHIFT_VAL(odr_val, reg->mask); + err =3D regmap_update_bits(hw->regmap, reg->addr, reg->mask, + data); + if (err) + goto out; + } + + err =3D regmap_assign_bits(hw->regmap, settings->fifo_enable.addr, + settings->fifo_enable.mask, enable); + if (err) + goto out; + + return st_lsm6dsx_fusion_page_disable(hw); + +out: + st_lsm6dsx_fusion_page_disable(hw); + + return err; +} + +static int st_lsm6dsx_fusion_read_raw(struct iio_dev *iio_dev, + struct iio_chan_spec const *ch, + int *val, int *val2, long mask) +{ + struct st_lsm6dsx_sensor *sensor =3D iio_priv(iio_dev); + + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: + *val =3D sensor->hwfifo_odr_mHz / MILLI; + *val2 =3D (sensor->hwfifo_odr_mHz % MILLI) * (MICRO / MILLI); + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } +} + +static int st_lsm6dsx_fusion_write_raw(struct iio_dev *iio_dev, + struct iio_chan_spec const *chan, + int val, int val2, long mask) +{ + struct st_lsm6dsx_sensor *sensor =3D iio_priv(iio_dev); + const struct st_lsm6dsx_fusion_settings *settings; + int err; + + settings =3D &sensor->hw->settings->fusion_settings; + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: { + u32 odr_mHz =3D val * MILLI + val2 * (MILLI / MICRO); + u8 odr_val; + + /* check that the requested frequency is supported */ + err =3D st_lsm6dsx_fusion_get_odr_val(settings, odr_mHz, &odr_val); + if (err) + return err; + + sensor->hwfifo_odr_mHz =3D odr_mHz; + return 0; + } + default: + return -EINVAL; + } +} + +static int st_lsm6dsx_fusion_read_avail(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + const int **vals, int *type, + int *length, long mask) +{ + struct st_lsm6dsx_sensor *sensor =3D iio_priv(indio_dev); + const struct st_lsm6dsx_fusion_settings *settings; + + settings =3D &sensor->hw->settings->fusion_settings; + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: + *vals =3D settings->odr_hz; + *type =3D IIO_VAL_INT; + *length =3D settings->odr_len; + return IIO_AVAIL_LIST; + default: + return -EINVAL; + } +} + +static const struct iio_info st_lsm6dsx_fusion_info =3D { + .read_raw =3D st_lsm6dsx_fusion_read_raw, + .read_avail =3D st_lsm6dsx_fusion_read_avail, + .write_raw =3D st_lsm6dsx_fusion_write_raw, + .hwfifo_set_watermark =3D st_lsm6dsx_set_watermark, +}; + +int st_lsm6dsx_fusion_probe(struct st_lsm6dsx_hw *hw, const char *name) +{ + const struct st_lsm6dsx_fusion_settings *settings; + struct st_lsm6dsx_sensor *sensor; + struct iio_dev *iio_dev; + int ret; + + iio_dev =3D devm_iio_device_alloc(hw->dev, sizeof(*sensor)); + if (!iio_dev) + return -ENOMEM; + + settings =3D &hw->settings->fusion_settings; + sensor =3D iio_priv(iio_dev); + sensor->id =3D ST_LSM6DSX_ID_FUSION; + sensor->hw =3D hw; + sensor->hwfifo_odr_mHz =3D settings->odr_hz[0] * MILLI; + sensor->watermark =3D 1; + iio_dev->modes =3D INDIO_DIRECT_MODE; + iio_dev->info =3D &st_lsm6dsx_fusion_info; + iio_dev->channels =3D settings->chan; + iio_dev->num_channels =3D settings->chan_len; + ret =3D snprintf(sensor->name, sizeof(sensor->name), "%s_fusion", name); + if (ret >=3D sizeof(sensor->name)) + return -E2BIG; + iio_dev->name =3D sensor->name; + + /* + * Put the IIO device pointer in the iio_devs array so that the caller + * can set up a buffer and register this IIO device. + */ + hw->iio_devs[ST_LSM6DSX_ID_FUSION] =3D iio_dev; + + return 0; +} --=20 2.39.5