From nobody Mon Apr 13 21:06:48 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A39C0388E40 for ; Wed, 4 Mar 2026 08:06:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611565; cv=none; b=Vo3kGITZZIsY6QylCMoh6SaTHbABiV1QD0n67U9Sy+MY42LVOVXruuP8zIkR697brbxViGNHn2dP/ZwgUeV0hp/B+VI6Yb+bDN9IdznvutIeqay2Sa36u0+1JNx+vl1cZxesd0qVEU6GZLmMlzs+2mVu2Yr3oX2y1QwCJ4kdSqc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611565; c=relaxed/simple; bh=8vSSfk/mqV/Diy8xqYAvuYstYG9PfyLi4Xga/dffatA=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=gcT9n5pPfn5t3qbmV3SnGH7xl3cq+CZEN/RYmzO7DJzreahGtgVRhb+ZatlF749EBfSOx6JNxUZqAXzaZAnBRdbmKrAF26wW1DVDAZknpPtO4TR8rK2wjT9/KeeLcXxFoiAToCpyJfGo5prZQReNDIdO/99808Lb/xq2T4RS0jM= 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=PBN6bi+y; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="PBN6bi+y" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-4837907f535so58081855e9.3 for ; Wed, 04 Mar 2026 00:06:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1772611562; x=1773216362; 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=oGDK1Bq0ybXWleKDcajfmOxR9UUUs8qs+hjFsjzRODo=; b=PBN6bi+yMi6otpkTa1iWhLRPrHuqmjROttuG8WwMjzaprZnYP34MmRs0Mm7w3kiTn1 lYQyGeNHdNZ7YS0cklc62mrLiO4e2KOU7Xcik94jjQMVuapa6REOvDGFShJVuHNediNI /EvinsMO56Sb5bRv5S671751Qf9pV/abnZtpbEVkKcu6PQA+wRjWYBA0Jm24JI51RVGZ X7k42TPSrg/zp9R8iZm+M8BccGX8+S654p48bRTGMId1yWDUj6bgb+YLPyvN/9T++dqj lH6/Gi/Qa59oC843dI/hBR2Jp9iWee8QXfcgonYgEVwsQGDSXH2uRpSQoVGpXLBHc9YY 0m2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772611562; x=1773216362; 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=oGDK1Bq0ybXWleKDcajfmOxR9UUUs8qs+hjFsjzRODo=; b=UB784gvzSGTidLC0yOt5uA9gcWEoemg4cRmodHPibA8kCIXckI8KJRSVqlpPBSwB7C lENvu9PMBVhycm6xa1yb86KWJmyGmgQzZVDh+6c4f7G512lsNS3FqpAJkGlgQBzL8nmA mmeZmmV7toc1Ah/UhzevThMvCeUr8E+1xIWAlC0Gosqv8258WL/ps/c2b5C55vjLQgWT /5fCphdxA931xevn0dIRVisA26N5iVS8P2PpDrRkzBhLT1WX4JZcV/D3A31hxoKlIOdx 0nfHwar9khkIGIz/eJ9T5blWom1NI1yfhm0jILZq0+korAMDM5cna1Bl3wIH2OwZHkqI BJQg== X-Forwarded-Encrypted: i=1; AJvYcCUtFuXr8c5ECCkaD9P3oOgMgO/+uBGIk+5wL5lgACSJvrHElip+dN5FoqLrAaXWxFrNvKKPYK8gEj61ueE=@vger.kernel.org X-Gm-Message-State: AOJu0YwOt0O+r1MIfBIl0YYX29rGHbnbmAlq4QEOw18/WHyOtCcp0zAj +dNvUO+P1mdCdNTBzLWweMiWtRhaYP7vN1+m58pva8Adax38TAlpRNB3B7tz+xM9KEw= X-Gm-Gg: ATEYQzxDMziXTj+SnFMlwqUw2toF7psQLZNJ59M7vw4ex7wF5toYy0T+v8jvQnnTZT1 rCjwY9s9zx8BPCrNhJD2/Y4giIus0YxxiFi5lSV+hyChgaKcQyWDd/2HhaeknhTZ/wF1wxpkCiF cG0kZY1CrFvQj71k4jFTepRTlgUDteBsgSkoUajlsV5ZEWsGSY40fpyaI1RNDCZE6xshIr3dLme qdLTrK7/rCZnIQ/LFs/MZ8Oqp0vL4q/SpRlh+uAYiPMwY9YoLSujfRq3+KnAO4NbH6jqN44otFa e3CNchOt4TJNU3XuFY3L+I9PXdAdn0EnW00T5hRyI8rgHbZNuzFBbchrzcviZ6eBwFm37c8CpFj K4KxVTB+NgGZxaZEiK/gthx+uzmp8px+EwPgTtH3R/cvpTq0VhQ7f6ZyV2o1HQtDeS6QY X-Received: by 2002:a05:600c:4fc9:b0:471:1765:839c with SMTP id 5b1f17b1804b1-4851986eff6mr14795685e9.20.1772611561838; Wed, 04 Mar 2026 00:06:01 -0800 (PST) Received: from localhost ([151.19.177.89]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4851883a012sm64697625e9.3.2026.03.04.00.06.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2026 00:06:01 -0800 (PST) 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 v7 1/6] iio: imu: st_lsm6dsx: Fix check for invalid samples from FIFO Date: Wed, 4 Mar 2026 09:06:00 +0100 Message-Id: <20260304080600.2844267-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260304080519.2844101-1-flavra@baylibre.com> References: <20260304080519.2844101-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=3692; i=flavra@baylibre.com; h=from:subject; bh=8vSSfk/mqV/Diy8xqYAvuYstYG9PfyLi4Xga/dffatA=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpp+fofn5oXpJpDx0hpSTDM4Sw5hhySnctawLYJ Rj4y1hM/+aJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaafn6AAKCRDt8TtzzpQ2 XxtDC/sHNqQxlIUz/V1r2lRsfTwpuGSACKMas3mZHZjObvAtV8D0Ga5LYF8qjCcvhv+hCxBZqmQ nVrVGO9Kjvi47IYechGHmL33jvOPYCHaKZfCSqdDpXcHA6lVs0MmswPm5T1Jtiehd2r8Nqz7uOr QixqryE28gbOxU1hB3ahYaLA5eoQy3o2UMMZgkgoFqWO/KoprBAq/SCo6jD9o5pZkphwscrOEmL eJMMxgDAh8B9j7nGTl6a8K//2C2gl6iZfPIGku0x5zNKFXuzQnI1amjEig8oHmrCoyns/q6ZNVL bXDlIAI7f+E/FwVnF4JQamHlQlscoR0Oar0ZRHNtLKZcYuwxD+g8JlIhds3fZPaaP9MQ0ts8qQ7 azjDkq+EjljTxDw71TfNyZayVRaHAdkW3iMXZ/Rs18cD5Sty7vRwzVShHvGAAnVCDCDjySx3vNi SJWDmJFcmvLnfyJC3YSMwqzG6Ns8FrKG7OHRVRf8NSv5oMZUcscoUZCrUrZWlayNn2BWA= 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 | 23 +++++++++++-------- 1 file changed, 14 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..a6ee2da5a06c 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. @@ -539,14 +537,14 @@ int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw) #define ST_LSM6DSX_INVALID_SAMPLE 0x7ffd 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 ((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 -EINVAL; =20 /* @@ -609,7 +607,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 +652,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 +663,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 +674,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 13 21:06:48 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 5B8053890E4 for ; Wed, 4 Mar 2026 08:06:43 +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=1772611604; cv=none; b=E3MWn7cEVcl9+szAlAV80NuxDw72ClcGW0vOnj8Gt8+wLIT7TGm7XxKjoGveD2Fd7ZhCOoSBLV6TOjqtiiVqPvOTmMcao8Ep6AfuWxkqN0XZZd5vFE7PP6QFrkWzXxdujFIIWs1DcHBLxA+YtfXaxZ5Qb5nfx0xU8lAY0HVxxcw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611604; c=relaxed/simple; bh=nbcIj9p/rJtGfpI+6gAVQl8LH4vGeVEesGIMEW3TiWI=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=VtSdZEJzjF0HEXtHuFLBbJ8M1gtVSI6AV7t9NdZET7syEWxFpoy9MXX+3Fval3tpHV3UYua+2OM7u6xI7i79n787ignVHbsGtNYtYUS6KjCX4Xvr1cYCNetFi1fBsY7cfIapiDPw6/HXm/0n007ccddhNQkIq0aqdMFLwz4OBW0= 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=HYNso38T; 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="HYNso38T" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-4837584120eso47823255e9.1 for ; Wed, 04 Mar 2026 00:06:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1772611602; x=1773216402; 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=hWAQuloq0on7zfLhaTWn8GaYtLAbCLs7s2S7wp1warE=; b=HYNso38TFXZ1EvN6FfE8ObP8MFoVUNiykDKBIMfHfsVe813Cl0XQSWivuoylPfqCWG AvyC6D2EV9Wmw20KuoqlGMIvScHMnN7gUqMXTvxrNAUx+m7lMgBFHrBl1FVqbPBHCFz3 4dWd3P5S2uTalnG5OL2Zbglc26IcAiP8hZ/XMnHiqqLZlwf8cwUJLnmnj71exlFjAemN YNURHSln4BxLR2rBJuLehXOsHto3POf0pyqcHxPWwf53AzFl8UmokbYMoFdu2TRFkhbB haEGUOu88zQujfTYiWdJY3ulhDu9fCyILwhwq2YTCm8dah7Gxc9WFagS0P4/LPIsaQS6 m0zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772611602; x=1773216402; 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=hWAQuloq0on7zfLhaTWn8GaYtLAbCLs7s2S7wp1warE=; b=em8NSLlSnw/RfDyKwLr0ERy/Gc8JdaXxVHBMzNd01R3gLC24ShrmVMr1tIqe1jaZg1 fbza5GnAf48VZE7CTUx0POzTDWBVGQInpNcnVp+MtmQ5Uw0I4yZaM+ycBf5rLmCN4olW xOLEfhzvknvCgJflf5TLOMifAhzuPLfFtaht6zoDHfV73iw50BQV0SHHS/KPEpHvu7np 2gYpawnL47EDAFhGOlG6FO3sF3Hx2A+Rl7AKaCXAT82elj83CaJN9lF3egECM+Q5qMEZ +l02uE5bk9kJFHV4eL+Pnwg43Vo/Q6wVi2p1G9HBtl3rZ4sRP4yn91HfI9quby26gj0v HJgg== X-Forwarded-Encrypted: i=1; AJvYcCUAkTGjkOwsEJSmfMyifgnEtojhMP04jt8gARPh+4z/S8mRKtRzumbhoap8fN1oOie99CrXfqNO6YQtt04=@vger.kernel.org X-Gm-Message-State: AOJu0Yw+6bD5sObpiSwYygRiweRsSnCcVWbrKgHjoUmKWXJgAZmc8YAH o6C3aSK/Jm7jlFRFu9XZWNgtpkXGi+7ciIf3iHFVpY0lNRm2bytds7xkd6rNZ06e4CR5y/uO194 laJbG9Kg= X-Gm-Gg: ATEYQzyk+yc0Ip865kfRjW/7eSYSCNxasWncZ+XTVhlYh9F9WczoYqJj1w+/kBozKuf Fn8M43wM/BIpEQB27NW0Lk86iS5YUKpJCip7Cz+K1+7l/CPXdxh7K5JMJ2meFYO32hztVLaTLzX 9uRfhNTB1HBs6j9ETS+AS++qfLHZURtFZ51pmKHK03fVhz7EJKa74T8CpwMCH2c/P0Lnc7X6Ca/ ruFaWUODF2He9mDBEXc/LSFs8KgMMY1SB3x+IEYSSewhPv2RxZnCLm2CVlbUFsop/cTSMAhPN5Q /Cj0j5pduGLJCWihTdCvX8sDDMYO7PsKQgvyAD7E7LEB98F+GaoiL4+URoeTr95BzPbKiedvBW8 7l6oerzXiP87+aKZb9SGF4BQ6ncDF6HJ2/pIEst9evHBp44HbJ6vydihv8oNiHliczRcN X-Received: by 2002:a05:600c:1c18:b0:480:69ae:f0e9 with SMTP id 5b1f17b1804b1-48519871aa4mr20809055e9.16.1772611601805; Wed, 04 Mar 2026 00:06:41 -0800 (PST) Received: from localhost ([151.19.177.89]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b130abfasm24333017f8f.34.2026.03.04.00.06.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2026 00:06:41 -0800 (PST) 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 v7 2/6] iio: Replace 'sign' field with union in struct iio_scan_type Date: Wed, 4 Mar 2026 09:06:40 +0100 Message-Id: <20260304080640.2844366-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260304080519.2844101-1-flavra@baylibre.com> References: <20260304080519.2844101-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=2147; i=flavra@baylibre.com; h=from:subject; bh=nbcIj9p/rJtGfpI+6gAVQl8LH4vGeVEesGIMEW3TiWI=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpp+gQu9y/kVgjMpuub/OeUVKw7GKOLTUITzZ4O p/kp6DTbTeJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaafoEAAKCRDt8TtzzpQ2 X3mrC/4tgZlCQIi7HexBqikkIq9gk6RMxPqYaE6WUY3kz1jD11r5sI9GIDnKORWLOC6J44fDroC Pqr29x3VAGHqCFOybqCHkCfrYpwB6kby+UQggt0MrfYUy2tIRrxLr6zL7zpeQIFAA7a2MreEwi4 6QuUa1WBLh/lQijRNmzkLDyDWbKHNHycDZxQTLyqdtNSlDp9z6AWsmXm0KAl4fuLp/PEQWk9aJK VA2uiULdlSPU3MWHCgW/RQqYgSzaZuGlxk4gBvz/6PvN8+W4IBQA5UhBuhI+4fnjekAfHBY/uLR wnAjKXeexOFARMFbVSgfaogoluq26flyNTrkNM8L8iBJTyVN/WE4YB3v0vpjyNqftCqvmhbf3iT uEtRFKveyw8VsSmySYyLn66959C25aagPfr0IEXEDrghtAYhJiI8IL+A7K+Nj2J5mplE95xpmuU W2LheAYQUGIq7q5+Y6lYryLlZLZYQdPsapzHEhXN424o5N0L0iHURa8MbfGIfN1fSX0g8= 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. Signed-off-by: Francesco Lavra --- Documentation/driver-api/iio/buffers.rst | 4 ++-- include/linux/iio/iio.h | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Documentation/driver-api/iio/buffers.rst b/Documentation/drive= r-api/iio/buffers.rst index 63f364e862d1..f36e6d00173f 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 's', .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..61f1dfc14e02 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -178,7 +178,7 @@ struct iio_event_spec { =20 /** * struct iio_scan_type - specification for channel data format in buffer - * @sign: 's' or 'u' to specify signed or unsigned + * @format: (signed or unsigned) integer, or floating point * @realbits: Number of valid bits of data * @storagebits: Realbits + padding * @shift: Shift right by this before masking out realbits. @@ -189,7 +189,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 13 21:06:48 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.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 C3FF33890EA for ; Wed, 4 Mar 2026 08:06:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611615; cv=none; b=XrzBv8JtwSfsiS+/npTMTu0hsk8imkOiwBV2qYPGWNeatc8HJSiPyeG61xm/AQIy3Tt22q/bnfChr/8kz8bTluvDLvPF07p8JXZTeEDp9QkZDeOYlc5Lm9krZBBS8dAFqgyIXGFK21lq0UIm0VS7D0aVEDW5drK0uYNr1JVSsVU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611615; c=relaxed/simple; bh=+VTQz46EOKW2Um5JmqDbjWtJ4+tNkrLXbwXC9v6BvGc=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Z+H1sfQKi+rt3Zx8Dhsl6DcJECL7oGebOEi4qf6AzAGdtE2pLOQoEUh7X2jXmS6JqCqPUarb1b+v8f+2HFjff2X5NsySUGn1yujnlNz0GKvshM/agalWU+wUCSJybk56ounVYau9RUMvzUZ9EytfSGTaI6EeGkB3oL87JZpRpdE= 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=RDi/GzrL; arc=none smtp.client-ip=209.85.128.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="RDi/GzrL" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-480706554beso70887835e9.1 for ; Wed, 04 Mar 2026 00:06:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1772611612; x=1773216412; 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=+TMotMzaSW4Oh+VOEFs9Z8B+kUyDiiMOR5H6kPqUxcM=; b=RDi/GzrLJlAAOsPznAFCKpS0arKPn4uLArwLYj/oFLqbShu0Qp4wyf+fwVw9lbCc3I 3a7zeJJb1RKnWZc7WtzIkzpCfde8MI46PA9DetI7bsOjzydJW0KsjxZz08tMAw9IrZxv sxoElF0TTT+JKZA5FB5RdunrkdLbKTw+O9jOPlO7YO14J942cv3UBDEqssfgbPKBL8lq R3HZLWSoarjda77m2zby/yIDIhR7kVhZIOVsg7AbbKAlFiqhGxAPZmN6DgJQXkvmtWdJ vNby1QCxqd8m4/AI5vJsGpxufHMb8eYdtbUoITtDbcfnZ1mLtHxBB0w1eiJuCMRiOPcq qOrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772611612; x=1773216412; 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=+TMotMzaSW4Oh+VOEFs9Z8B+kUyDiiMOR5H6kPqUxcM=; b=nd2ugg3IrljV7DZKW9z3yo5bRBVUg9i62AgbociTSCguLmtuqZ+s+iLLeSlQHSvSyQ E2dNO92mKH+tyTL5tf7jc70CtE64PvEeJ23jtIN4Lf86tjCrZ/LPfdkeCeR3RivtRKpL TJ8cBXR3EEF/dU8s4lLoeK1BXtNO/GnT0edwtB80L/Aor9nkpbwnH4HDRw8lvTlw+ave xWXnFnXhcvjSuMhvto/FsUJ7LACpE9TXKwA9jfB2ghtfg2Pos4BgZY5SpjDQovB1+qL2 zdcbBsAXMAqRPVho3jCLWX5g0kNc3E5qxbftvq6Uj+RrAT/JoFPEJZk9hExMFKHmg1j/ /ARg== X-Forwarded-Encrypted: i=1; AJvYcCUOO7bTa+jv4+iKX9l9tMIeMMC01wxjQtELXJmsF65m3kswpCgdxy9FlNWRx8QwSn1Ax9up0GAOAx5ZWyE=@vger.kernel.org X-Gm-Message-State: AOJu0YwFwCEeLFYnUQ8ELICajQho+MFDDzKNfuJJg/vb6+jBfjPbJLj+ r7mqRjQZcimX7WZ8iwYjZYT7JhQz++fea+sCGCJtfhcOJkNqfVdF2peoTwnql60hmrE= X-Gm-Gg: ATEYQzxAWiGkN24E6mkX1S43IJU1iaICKAlebbRJ3jLkTMbS6cRGKk95PQ0mlC3r3Zd 5vQfLO1/E0+2PgjCpHLlQ7Wn5xcgSpOJfIDT2HDM2mmBpxeaNYtziN6rq90zCWOI7S76XaS1vk1 K1i3WuZ7x6PdbMJsf3qr/EWla8Q9xqfQLKbpkW4Ca5kDwnROloSjCkOZI34Wxc5/bwb25RN6iBe 8G0uf7WRa/gJKWhrgn3LEi/cja0c0k83J38/36iqOPRm6223o4nF3N7x/O5NoRfpN+K13y4NQS7 4My36SKbDoFcs52u5oVXhe4W8kYMA11OefAVlka1lDu0rmNIqG/N2h7d8N7xZMlFtZblQTVWAom ys6c9+YRxbjTKE4G7WF7ilTXHFZDvEbjvrL/ufEmdvxXRTFbelLYj1xs71VtFEcwUHIxk X-Received: by 2002:a05:600c:6305:b0:483:6de6:37ad with SMTP id 5b1f17b1804b1-485198c0f13mr15807855e9.34.1772611612150; Wed, 04 Mar 2026 00:06:52 -0800 (PST) Received: from localhost ([151.19.177.89]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4851889322bsm30526075e9.13.2026.03.04.00.06.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2026 00:06:51 -0800 (PST) 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 v7 3/6] iio: tools: Add support for floating-point numbers in buffer scan elements Date: Wed, 4 Mar 2026 09:06:50 +0100 Message-Id: <20260304080650.2844401-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260304080519.2844101-1-flavra@baylibre.com> References: <20260304080519.2844101-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=5677; i=flavra@baylibre.com; h=from:subject; bh=+VTQz46EOKW2Um5JmqDbjWtJ4+tNkrLXbwXC9v6BvGc=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpp+gapVKFxU+E52FqXhhcoV8BK2/kFJ0s/Abse cqUilczh26JAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaafoGgAKCRDt8TtzzpQ2 X/gJC/45XxRJat2G5uf63pyQ+kI8sVYHxXkMELVPYYGl5QzuuRVSpMGT5+N7/Vv8rYpvbtUVhzY fJEf3EJjgfmAnBJp5VTHyY6Yc2/7Q6dzz9elIpjT7x5ycihSgh4XM+FNP7CxiYVVNw+35UY4y1w zxS7WvxQfZd9xjZEGH6dc3mL8Wjz+oY2DFI0i2TnCPEpBSxuuDxkUXzc4LPtRGAljSzEHGiyFFK qLb2N2o66kzEHGaUOuYUdYd+bj/WRXZl+AQWxa7qmYQszuqVsiNVYcYVAdSJ2bvDU96UtAzGEUU TRCeOgmFbJBomwh/rLdVA9E8b93n9dVDP2vgdoQUwdaN0nfPNLdfY41JfrHUNKn3vGEzhR644cd fvahuTD3YwJyAGE83heWI1w506fBlialdRvu+dH8i7x/Oa8CQB75p9rN4GHjWhkThpvZuKn2Lwb XwqPPaWwcwUyF4d2wVXNpU+VHq1kB/3WT9Tr2dfrNB/+fqkY/K+2SCoWw9qZZYSvIDlok= 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 | 56 +++++++++++++++++++++++++++++----- tools/iio/iio_utils.c | 8 ++--- tools/iio/iio_utils.h | 4 +-- 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/tools/iio/iio_generic_buffer.c b/tools/iio/iio_generic_buffer.c index bc82bb6a7a2a..39c13b9ad20b 100644 --- a/tools/iio/iio_generic_buffer.c +++ b/tools/iio/iio_generic_buffer.c @@ -89,7 +89,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 +112,26 @@ 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; + case 'f': { + union { + uint16_t u; + __fp16 f; + } converter; + + converter.u =3D input; + printf("%05f ", ((float)converter.f + info->offset) * info->scale); + break; + } } } =20 @@ -135,12 +149,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 +186,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 +196,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..0643a943b2ad 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(unsigned int *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..e09116af194b 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; + unsigned format; unsigned location; }; =20 --=20 2.39.5 From nobody Mon Apr 13 21:06:48 2026 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E22FB388E40 for ; Wed, 4 Mar 2026 08:07:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611622; cv=none; b=cEfU08F+sbAnonG0+lfPr493DzHVPR81JazcpwF4l2aa7+TD2oBEP+Xzrq152J8NlwGHaFhsPvywwkkgAAVB1pjSpmQJN6/T336hpKG8tyFqt1yZAl1glXT+BkAib1IC96xBgPASyHgr1L6q8ebL7hr6Me+j4yAhSZ+YtfCoFCM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611622; c=relaxed/simple; bh=+5kKHgCbfIr6HZ3Ur8u9/0KCgquM6MW/BxUYCxIK5I8=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Uq03lbxPHcwSkzsPEUSgsxqzjDt+Y8J9pea9L4XO9idABTM6RlEFNCuchrdM9IxnfAQVv1lbJGngv0GV7Gg1w9axBhacrp8HLexb32mbK3eRPQFg7hSMqPnsXmACzdx1OuFXBdCROFswsHr0JfuGe/3D4HL6tYcVtPW8pDoPgPQ= 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=W6L+jXLz; arc=none smtp.client-ip=209.85.221.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="W6L+jXLz" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-439b94a19fdso2871918f8f.0 for ; Wed, 04 Mar 2026 00:07:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1772611619; x=1773216419; 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=tZaP3R+BOklF7RhKo03SxE9I1TxjdRO6hcgS5F2nTkQ=; b=W6L+jXLzrfAxTdt9qJK2kS95KWTgMwPeNVXelnWQZ7vfPf5oEKhEuM1WbMDrt1fHK3 OVlSD5lWKuNkpZOzSJnzG0EoUDggKiWLGCsOxcn+aN3GH9wGruLma3n4HV4+b0hyj79r R28U0IDqJ0RkrC3HT/5/Gr2xM7klq1/l9ejwmtppB/1mDWVfeudlHVdV4VaD67PfefGg UH6NRM+ppS1YqnHcC7xWHYcmPfqbJzdSnIRco2GRJ6EV0wIkd3Ns2fATq2fnxVcHy83g GS2b3UqaCPEri3G0641v38t2NkH//D3fiVybckUOwPg1yNL5ZhUTTQwSeX0bLdxmmQQp CL2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772611619; x=1773216419; 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=tZaP3R+BOklF7RhKo03SxE9I1TxjdRO6hcgS5F2nTkQ=; b=k0GfCewVb8Hwut3vr1f1bEDURPd4uAUtp9fFKVWthHzztpFCTZeiTPjkbcUIlgQ4iq fRe6KAmJxtqp8yiXGpFyEMnVsSo7MQ7obA0Hq58A++pshZR6p5fTdZQ6YBCToOKbirfv r1J0fAupxTLZy0q7Rm0n4/ib/U0PrFLYxNOnR6+YPsf+dNZNX9ThI4UDlB8PqEKLQun4 2On9GpMS3SNRDecXdREJ/oWP5lUGcSwwmZQZKnsyR5GIrW3AxuKlV2EetKN7FiuBuL/I Uj2WGbvjtMHU1cBvVQongC6T5ZLXL92wBKPlqqfA4jAjZlly5EO0WAqXrtuKmEsRee7R XZOg== X-Forwarded-Encrypted: i=1; AJvYcCU36AutBipVrIV+iwpTqr53qXVML+f5rLdrYWjpAY7lXTkTn+Aqd/FvwXX+XM7LNe7V90V2SjVJYxKsN4M=@vger.kernel.org X-Gm-Message-State: AOJu0YzuMaQw5WO1WKIwbETHnslL8IYCOU2T04gZH+lnSp/ZHS2hYBm7 8avBnto6vdRLnsBB/tpDNi9PRhtCAbF9dCCh/ofzOmb8N0ptROJWINg/14Suxa3C+kY= X-Gm-Gg: ATEYQzx8YkGaRl5auwicIxlaI4LVXNl9lEwjXTl97owGvBD3HrMhX3pQa4YmdTI2aNF eEDaagqwOB8K8DTS3f3aKnN/1i+IWHCwueuId80mKnfUFkywljnz2BKowpE29aEPj6TDV3icHuP jdkUQQArd1n3MqMuxDc6LL2B+/zvnKzw3j2mLKmHMVYLB4ZlQJQdFYNjL13lsJ615VkSjZ1ZxXm 9lbRSAG9bKXfne7fALfOJ2XoXNkMy65gb91vxP1IlcZCk4TXVBjVlY2aMwD4t9Qhp83m8x7qCy4 CnY0EuLDPflqm0gUIWIDiVKrjjrA56j5E2NGAk1IeV6aPU1lwtDa6QYNDGVX1S9N6acybX99fyO WagcRbs7UtK0nhKKK2yE5/+KVW0fbPmSnRvZwi4Ub5ciubaQ13Ul3ZYP7UIB6+N5xXfrC X-Received: by 2002:a05:6000:1842:b0:439:b7c9:2efd with SMTP id ffacd0b85a97d-439c7fd3e2emr1972255f8f.37.1772611619243; Wed, 04 Mar 2026 00:06:59 -0800 (PST) Received: from localhost ([151.19.177.89]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b485a0b6sm24871128f8f.39.2026.03.04.00.06.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2026 00:06:59 -0800 (PST) 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 v7 4/6] iio: ABI: Add support for floating-point numbers in buffer scan elements Date: Wed, 4 Mar 2026 09:06:57 +0100 Message-Id: <20260304080658.2844434-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260304080519.2844101-1-flavra@baylibre.com> References: <20260304080519.2844101-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=5093; i=flavra@baylibre.com; h=from:subject; bh=+5kKHgCbfIr6HZ3Ur8u9/0KCgquM6MW/BxUYCxIK5I8=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpp+ghK4q2jVvRC8PObm6sJmhgdvHZvM9gDB29A M83+5Wz02WJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaafoIQAKCRDt8TtzzpQ2 X6slC/0XZSNizAK3tm1OWubsiLQa5nXOJpvHb8jg/m4uuPzciIyRHz5Q6VL81bbV6rXDqwveI9V JMMwKIvxIqz3HHM6MpUb7MDs+684wwHXFPm7gEXnyGIDDZxAGKEo8n74oFNoNNIzjCbV6xbrxhx hkFnKjc9GTZ5lTafjFxmosZvRG7oy+CKZroTMpeISDq42O3oVO4GshAOE9oE3BsvNrqQafX/xMi 6XhmhSYWRSWohKrgrihmLluiSVYrdBKnC/7gRBKNne9afD9ZAax4kYIl/zXLqWGr6NVZt2kNLIn x7UPPY1bBu94mymOlJRbd5BqSszVUF8FBXRMttMPW5nSv6+nVZ2mLgLqo0RGW2Iimvxj0qLzK2l L4cl4SCvS3XGIjrsmRdbUMgIqLLgFyUlVjM2Mm9x8EbnpnE4ALxSJ++OYoW5L05gqZjtPdhtnjr 97mpjcraJwlz9FsJV0JVhRM02yG7UiPQD2Ag+CH6Zk8kadHcpnbpI/tWFQXtygssqsEnE= 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 ++- 3 files changed, 22 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 f36e6d00173f..2fc9c2951a9d 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 --=20 2.39.5 From nobody Mon Apr 13 21:06:48 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3ED7C3890EE for ; Wed, 4 Mar 2026 08:07:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611631; cv=none; b=pglYxd6rRhRJtLFLcU82s1odBMXWSdX2U2C2dqJ3NTlLoLrjethOo6NM3GawLccvZlIp5AQz9K7jACpweark8+3k8SsyrcMFUoZaRmoDv4Vax+s+G6MsAy0uP7OWuBGDEPaw8WsPzRQIFSz8uPU/Twept6LGT6KkTDD93fWSujo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611631; c=relaxed/simple; bh=Ol6p0rZth3f/iRDeonQqxoZNZAQhn0rATMP/onRw3YU=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=WiBxHRtpBKnwTDrfFg/eL2pxgbh7rhgRkQOqXhhh2iBFTjxTG1SCqEwWc6Dn7SQgoLvyecBTcvCED/mFo8lwtXDG1EwDQPYm39KE3s3ZCc6zufvkDEKHcol2tSsFz/W5Kh34gV/pDbuTBWme6DILzZBYZdRtnFbGOpsFjK5JeYs= 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=avJonRFD; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="avJonRFD" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-48373a4bca3so40069725e9.0 for ; Wed, 04 Mar 2026 00:07:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1772611627; x=1773216427; 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=oBQtYx9tuun6QBYG3+5uaN0RHfw3MtXpDHY198tkVjk=; b=avJonRFDiBh9NnOMlP/vV6raypKT+fo2draJZvOzTowzwX2rW7/7Wd7TgmOh1+M+6E UAdiE0oQB6bRizYFExSvW0FEmjxYDKW0fLo3LrRownprFhLSHPuqiZ37LFQ2Os7qNifb RClw4GrTi3ttKBkEcMLZORNSkGinkMfRjB8VfP02wG8FK5vg5y07hRKaHBjr8sT5BTkJ px5yUWMOJ4phUXh3g8QgnkQK8UCsnvjhcjMyl1ifRqmMCiOuNBHbUKDxCsP/5MFc3m6l QQRXUoXkwb98rcHZ8sU8ZJHDTRHBe18wYhJNRgZpq3r850RmnCcOIVln+W3J++5GXhoD 8+8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772611627; x=1773216427; 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=oBQtYx9tuun6QBYG3+5uaN0RHfw3MtXpDHY198tkVjk=; b=biFV64BvTPoqzkPz++TnyqXOavYcZCijMez2rdSt/hYNDcUFFtVYw4IPhHHtnpEjXt QvX21fUF7qBcRwANGodBe/H+68CNaxLJK+OSVwAS7v7hHLjNisc1vaNKGyX3J3+Ia30A 4EJW2qxjm3fR+z9KEJZdCZCGAfdHFhDDpafzLth1arF9FIUlBVGQCrkQEPhB+XBwaSMy fJTIXcQg99Co0GmgxCT4ErKwXN+aztgRavfMbUoJSzDGCNYW7+O0Nk3rbglVq6IcU1pi C6wdhN+W9I3eC8LWir639WuuKkdZybnsdp50/PK9xDh9hQhPnE53QXt+qxcI78Emxv/c BO/w== X-Forwarded-Encrypted: i=1; AJvYcCVeW4GtPAGPWPlCZUDiDUwAr5sRMP27qy7czuYwtViRyunzDtTuTnaweV1pE1rn/YqRJe5kMKrLPtwd7yo=@vger.kernel.org X-Gm-Message-State: AOJu0YzQUmA3ms5bjzmkf3coW5a9n1KYxTNxrr3+6XGsvtoNonRAkman HmBxn9fezopz6U9pcrdxZXc+SfSLpp3RtfYdjU0PLW63EDv6M3mkf8P5U+M4Y9JRggA= X-Gm-Gg: ATEYQzxfVaYdQjaGdsyZ0ou5aep2K1JjQK45TFul4aR2rdDQPkuqh7nZuQDZOWP34dF wxC/8En6GlsXzi9D/qrAujleNqj7q6+52NT0tpXcPvVl0noIs7JbcH8GM3FPIUl3KjzMWd3Lw3D 7Z5+5d0Gyb7aqxtnKSNZ88gPBGZspD4Cup4vIVfQft8SkmkX+425+sUyoXbV0yBMa8QAIJeDCP0 7TO0Fg8yJqtwj7Tw/MUnBj/3YuHRw/k63pgAsKCPGiTJwxvfwHjt7XXr6cPfsuNaF9kaqWFMWzN y0dyB6GSgx99QwcG5najVFm2SGgk15pdt/G+M9GF/qX3yUR12p9eDA5spdj4XHc5+ZfCPJc4pk2 TH1RERfUQyp57K5xRY7D70ZvaCrzZUbAS6rAD0gKvjmELwCRdnuV4gARNzc8VQhCNZfXDtDTvfV 51x7U= X-Received: by 2002:a05:600c:1f85:b0:485:17a7:ba0d with SMTP id 5b1f17b1804b1-485198a2858mr14098255e9.32.1772611627398; Wed, 04 Mar 2026 00:07:07 -0800 (PST) Received: from localhost ([151.19.177.89]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4851ad28363sm2482015e9.30.2026.03.04.00.07.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2026 00:07:07 -0800 (PST) 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 v7 5/6] iio: ABI: Add partial quaternion modifier Date: Wed, 4 Mar 2026 09:07:05 +0100 Message-Id: <20260304080706.2844472-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260304080519.2844101-1-flavra@baylibre.com> References: <20260304080519.2844101-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=3185; i=flavra@baylibre.com; h=from:subject; bh=Ol6p0rZth3f/iRDeonQqxoZNZAQhn0rATMP/onRw3YU=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpp+gpXzqY3TDqet6R5VUZ+IRv8tvwkuErdTDGd Lxh9s0qji+JAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaafoKQAKCRDt8TtzzpQ2 X6MKC/4lx/3OC+xd/HZeviR7B8SDtAwArzj88cvVqY9LgevL2CVoPu88RInxP0VcFWFuEMcOEJE cMXeRJRtfcm7SydQRp48EioAc66ARJH2hokyWngI4T0O0dkqXGL4RHsnkzqhv7Snv0ZiNPNrtRq Pewp7bnKHalvwiH8A21D8A+q0LCxxRDwa8ZogCuU7eYOLV9daQLfJ0eKijfnvFW5x45qmrSBlTx qk/Sl5HpEcu+1NLyDyZo1PgxElCQOSo9EshxHXmUzY8SdF20Tkd2YAClbwjZJtb9NxMeymv3XRO awq6+UptWFwXRwY5FHIdTdyyIJC45eFI5G6/Yuq7ew5E0B57pAlB31N6N9xzplFUmUOg8A/NiOz Dh1qjN0DmLpXN00HdsEXFNJ3f0bhmUfv+eVOFmv5/8gp3uxngg3P590n6P2EDPdWAjtxX1vCJGI 6A1R2mQeHZ/M+/WdrugPSF4zgxgl/jmILHuoj1Jxj+plxz6sCA1SECtuXy0EQ8x9Fu758= 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 --- Documentation/ABI/testing/sysfs-bus-iio | 13 +++++++++++++ drivers/iio/industrialio-core.c | 1 + include/uapi/linux/iio/types.h | 1 + tools/iio/iio_event_monitor.c | 1 + 4 files changed, 16 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/te= sting/sysfs-bus-iio index bd6c3305dd2b..54e38ebb044d 100644 --- a/Documentation/ABI/testing/sysfs-bus-iio +++ b/Documentation/ABI/testing/sysfs-bus-iio @@ -1755,6 +1755,19 @@ Description: measurement from channel Y. Units after application of scale and offset are milliamps. =20 +What: /sys/bus/iio/devices/iio:deviceX/in_rot_partial_quaternion_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 costraints: + - the quaternion vector is normalized, i.e. x^2 + y^2 + z^2 + w^2 =3D 1 + - the rotation angle is within the [-180, 180] 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..792fbeb0dfa8 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -125,6 +125,7 @@ static const char * const iio_modifier_names[] =3D { [IIO_MOD_LIGHT_UVB] =3D "uvb", [IIO_MOD_LIGHT_DUV] =3D "duv", [IIO_MOD_QUATERNION] =3D "quaternion", + [IIO_MOD_PARTIAL_QUATERNION] =3D "partial_quaternion", [IIO_MOD_TEMP_AMBIENT] =3D "ambient", [IIO_MOD_TEMP_OBJECT] =3D "object", [IIO_MOD_NORTH_MAGN] =3D "from_north_magnetic", diff --git a/include/uapi/linux/iio/types.h b/include/uapi/linux/iio/types.h index 6d269b844271..c80ef7c1ed12 100644 --- a/include/uapi/linux/iio/types.h +++ b/include/uapi/linux/iio/types.h @@ -77,6 +77,7 @@ enum iio_modifier { IIO_MOD_LIGHT_GREEN, IIO_MOD_LIGHT_BLUE, IIO_MOD_QUATERNION, + IIO_MOD_PARTIAL_QUATERNION, IIO_MOD_TEMP_AMBIENT, IIO_MOD_TEMP_OBJECT, IIO_MOD_NORTH_MAGN, diff --git a/tools/iio/iio_event_monitor.c b/tools/iio/iio_event_monitor.c index 03ca33869ce8..db0fb75806ab 100644 --- a/tools/iio/iio_event_monitor.c +++ b/tools/iio/iio_event_monitor.c @@ -113,6 +113,7 @@ static const char * const iio_modifier_names[] =3D { [IIO_MOD_LIGHT_UVB] =3D "uvb", [IIO_MOD_LIGHT_DUV] =3D "duv", [IIO_MOD_QUATERNION] =3D "quaternion", + [IIO_MOD_PARTIAL_QUATERNION] =3D "partial_quaternion", [IIO_MOD_TEMP_AMBIENT] =3D "ambient", [IIO_MOD_TEMP_OBJECT] =3D "object", [IIO_MOD_NORTH_MAGN] =3D "from_north_magnetic", --=20 2.39.5 From nobody Mon Apr 13 21:06:48 2026 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.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 6D36F37FF79 for ; Wed, 4 Mar 2026 08:07:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611637; cv=none; b=jzBespfbvt2x3sWJf3fK9scuCUrJsJPIdGuYFSCN6CbMx70imCTsNHJXePrmacbxPXm+eYpSVhXHeytErgterpYa/zcfdlFxEmRgX47JsdqYg4eFgqdVZ5iv5XWkjZGJJybcEWN12L9h9FuHXgaLaVIqZOyuxNKhO1/b8LpgrP4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772611637; c=relaxed/simple; bh=vq9hgjVkw2IyLSqx6GRLPbeo5mI6UrCm37fIG5RQhm8=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=nfi8dYZtYx36aW86A7DkL7GxzVuUxxJv6FZUAzVV37atmWT3DiTA3ecaXkqX28XIh2kLvGPEFxBvuT3WCSBhDQGi8MbM4d/5Itc495l/sfzdXXrvyt7J/fG2/i9zuYMsFwSK5EYZPY6qxghThOWt++HWuohgx3cdSudmtn1bCzM= 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=c9rvcz3j; arc=none smtp.client-ip=209.85.221.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="c9rvcz3j" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-439b6d9c981so2021563f8f.1 for ; Wed, 04 Mar 2026 00:07:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1772611634; x=1773216434; 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=UT6cdOv3Men3B4zGxXHfbrc8cEBi1PBjJmQzjY2m3Xk=; b=c9rvcz3jwp7h2R8Ef1bNLd//JXIe5cgEqNDF4/w8GoeHkvyonny+PoczDnn26n3O40 H2XHxUoTyVli7jdh+DWnR4hVH720++Fy+UwBxOYH5U4yEOQlMhSP9NeCz0JpwNe8D3MB sIyt6+C/w9WuSQ4hu75oJAYo1hHOLV2AobGZqoe18S5xcMg90UI7hSXCoToN02jJHkTj 7vrjZG9vG+yflQVAxLZzZGWc5R+130c7Xg92lJr3aF/XKvS5cbGvvRNcolh+Ek0GIvQD pUAF1B2zgKlDhDyX2py4IaaamX4eI7+DyL3AgO5G+IT2MO14hCS7pWrJAa7pV78yShFP e4ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772611634; x=1773216434; 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=UT6cdOv3Men3B4zGxXHfbrc8cEBi1PBjJmQzjY2m3Xk=; b=pTB5wIefisqIdFXWyNCpmc66l2BjDziTSUSUJiM6eZ7nip9QtPGvBxslcW/MT2t4nD 3xqeeM0rfIJj4+D//siTUVXec3rv2Ov1VOjBYB4R/QtB8Fi98vZ6Uha9Mdh99ycWR2nb 3xuYa5i837k4I2rT7WdWl2wNsLpX8BL8gQcuXVIzLgRS8lUP65zYz7ehq3qr21IALyoz EmazBht+xRuqez075FwhH9XkVxNTCa1s/aK2fj18bOhsOOzSUELYZVMQKk2FWTrQWiCn VcLzVzCAyrsx+JVs89wxf4zBAJIUHJE+cUUX62a19M3UWzM0dsSD6q/HRR+/HwcrsGHe nzTw== X-Forwarded-Encrypted: i=1; AJvYcCXYaMnt0G8+LMXGyAP7RLECDQyXveWm2iq+lSg96P7ezfCu5UwUk3h6fngTu3QjlmeAbgyFDCY2XNyLgj8=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+8IjPRXd1nXskM2ZtMfo4qtCxx3KWonTf1Y05NV7Ak6t3ESre aQjZaFT9d9FW48WnIDLqYtWnT3mAP02IcNkOZzUoFJNfIGUHXdqYHoEmoFC1ACjww7s= X-Gm-Gg: ATEYQzwUy6YYJzG1Nx1ao47qKgE1Eo06pelhDyxDER+c3PbaR+2gXDkfOlFwqT3AY/p +ibHU+0TWjCJ2xs6S5c/QFEKq9HZUskgLSdjgcl3ntrwY5ZRAnUc/WYnT26DjB19f2lvPL2Hv2q bU4SYTqQBmg2BAMRskaHaFKxWjwkQ7KQ8uPMS59WXHBH0x/jr54c4NHj6oi6FvA/98SoQkGyqMa +7yfXWFCUirXtUROqQPwpSxu4INHgSPrM/segsa+s+pA1Bl71AWOSLWDP4Mag25dK/2v86FXZJX OggagxjdcNrekcqfXWNw7KrLaAcT8XR6/eWKxu/kutWgTqR+zbiYoJ/QNCpjBhC6cGRZCNdjWrc TVWezuBkY5o6M4NgMtt7sPyDg5h/fWg9wnQjRgvub3p++jtF9G+ck3dj38+rOsvvByD6E X-Received: by 2002:a05:6000:2912:b0:439:c39e:d9ed with SMTP id ffacd0b85a97d-439c8a8e098mr1453492f8f.17.1772611633678; Wed, 04 Mar 2026 00:07:13 -0800 (PST) Received: from localhost ([151.19.177.89]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4399c60e40fsm40367359f8f.7.2026.03.04.00.07.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2026 00:07:13 -0800 (PST) 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 v7 6/6] iio: imu: st_lsm6dsx: Add support for rotation sensor Date: Wed, 4 Mar 2026 09:07:11 +0100 Message-Id: <20260304080712.2844514-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260304080519.2844101-1-flavra@baylibre.com> References: <20260304080519.2844101-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=14873; i=flavra@baylibre.com; h=from:subject; bh=vq9hgjVkw2IyLSqx6GRLPbeo5mI6UrCm37fIG5RQhm8=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpp+gv9l7zZLzZav5eJOxXnTSHPrcEbvtcEZVPW O4XQG8Ont6JAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaafoLwAKCRDt8TtzzpQ2 Xy7aC/wI8cdvSbN0E9LbiZH9w03uP6LuP8oiFhmlAc7w0vPeZIEL27D7BGK6wOMb0uq7Jp3CD0P Oa1Il7nKukR85F6PGIjDOO8NhRC4O66t+98VBwUB0qqATxY0caVsAilIGAeUkSOG5Ne/fpzVu3P Pb1qI942Y8A6tgxuHc4IUoKv/tKQuIGXmtssTx8a10Jz9noNMg871/MtmgATNBphvmzzuYeCAvb p1z+sOyR7JpDyZusnePvvlTrh9CwmURwbaHA82ZWu3hNp/I1m5YDv3nLGVXY4WwEX/zadm+CAxb bbqf2Ri1J2KKMwzA1QhBIN/iqp43fpBrT1S3JprIEdysrmnjm72X5yJFzmhAo2chbubdj4AJidk jLT/izZv6ELK1/SS2pnbAlTCdoPxPP1DY9MJhzKlsRGFQB5159BhYxn8TARkddkxEDBOfozEqh7 P4GjKac8W+8QWPasPHUBTB7Z2aka+bNylx1fICButxwz5lyHdI+u020O1i32Hpo7IrYK0= 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 | 234 ++++++++++++++++++ 5 files changed, 324 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 a6ee2da5a06c..67f2ba0ff642 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) { @@ -578,6 +582,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..763ac9dfe5b1 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_PARTIAL_QUATERNION, \ + .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..38a99ca9bd7b --- /dev/null +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_fusion.c @@ -0,0 +1,234 @@ +// 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 "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