From nobody Sun Feb 8 04:12:46 2026 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.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 BF31F21C173 for ; Thu, 16 Oct 2025 17:21:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760635289; cv=none; b=FAjB/DvXGQ2gj0Aka6CWwJcPXj9InhrEfMeA3bJYL5X3QMwfCyIUxkf1fSPFBAZvI4BBoY8mhpRLuzPk3kEKGoEm1cYB9/R/j/UoBHv0WfWZh81pj4FaYE4Bb4LDEPMTf9dXYbn3rzyeaEOghae3j4wuodkoTgawo8Y84xLJmeQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760635289; c=relaxed/simple; bh=wBY2cs92+fygg+uCMwB58jzVy7qCTwKs8jhbQwv+zXM=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dELL/3LZ4A9k2w6uRpn+xO0th7jLG35xg7/Uvqq7ACPbxGBUKhKQNeMgw6Q7/n8qlt378AF4o+oPZnVkYbmDSO45AOH+L+6kYzLweLz1uzjXh0SLQuvkwjQQWegL3K4cJqs2qTH/4eK/ojmHRRmIon4/+XPSfFriSnisf5dQhvk= 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=yjqItfth; arc=none smtp.client-ip=209.85.221.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="yjqItfth" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-427007b1fe5so572836f8f.1 for ; Thu, 16 Oct 2025 10:21:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1760635286; x=1761240086; 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=RPtpl05ucdsH554VPwBpisewoWIW4AQUlxIpVcCcSz8=; b=yjqItfthWvzSoNGCjnquVriEdZ/8pV59ElIPFcVtuzlVrSxxJHduT0Jr4ZXjWSpQ4R 7JonvfJ1Mr8tFWVTheiHsu2H+jYe275z/Z+CyKztMrd3906p68KZ4qSeDFWsDqI00tIm NQSLCBWbcZoK0Ows2Av/+hAUu82kOVQCWk/RRr3q44Ur4sCngzdVaMbRTWYQ1Akr6XpL F1H4x/wK+ASqvpE5GaE4q/GhqIbVTFRyo2cYaHkzBiPTjZKCCkK6o7KmOq6VbJaL2g5U fN/xBjZmy/YK445P5yHpk8Iindw1+7kPgHOnM5Qjk3zWJMs4b09iHGuBBqyf5J48iA9M CceA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760635286; x=1761240086; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RPtpl05ucdsH554VPwBpisewoWIW4AQUlxIpVcCcSz8=; b=o83cHpWvCclmYHuu3cVGpLPk5eLwvg9PrIbq4rKhPRCK1O9HYYQgrG1TRl8Be9cZsg ohHAdVujebTbKkVF6Tr1KETYYLLeH4RVdtT0sAbyObuIhw5MP+djV3hggZhKbjhMSECU AIfmVu4LhABvGzcl8/MTvYzTgcvCXGav3ybsqzRLYNEVXWT0otBLVcAaoPQyC6Plem/F IpI2fLu8w8/ETZeXJQJbaEChgXJs/0ZYK4znm12Qlp/dfif7lXXvn9qBfSliCIaRvHix ItpEqQLkKuXI55qUxYek58ofp/nze1AdFAU8cb+STEwXe+nF8cUi5sOF8sJ/bkfmz3NO 1MDQ== X-Forwarded-Encrypted: i=1; AJvYcCX48YoqOSChAyLtt5AshyhYmWvEkhuIuIkw1ZUhEEbu4laf5gy+R+31fRV8O9LQqWD6QelzO24uP62yeWo=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5ofL/It+s/k1mdXELd5IvrY1bN8Pux7/1CU1gwnGZWVwHh40F ZcA9TRkcGvnxe5wvR7ZR5E+P7fq2TBLIJt6ODM9OA7Ywxy093yXkDvCcS2Evz2O3k+4= X-Gm-Gg: ASbGncu3IDeL4JY+XDk+qbSdbaGeQYr7DdUCdcXilohUO+axy5xcr3MRYEpiqTEXfiT I1Lux0Px6q2/+7d6NYuR0FNYEXrz1rDAggoSU/aouukTzzTXA7bMo6Y56t5uEInn5QirmJTDtkp vCphg1RfEPLVe7w6816mDwMA7dKAd9i6rzCvYv2KuH9BNTPOzexrvh5TS0NCciiGDl5q/Ldh7uW 0NPTR9TF9ISRkayLkDtYomI4znoMmTzqTUIUO6bzAqUvakyB+rTyx4oKklYuTATGm7YIdKdYwkQ 8yujtfLwJ+sREe0p7KArQkU6e96JDvlM9686VLU9xqetL4kw2oCHhqHvPZftWYaKvo2WOFjpViV dlORo/Y3taUypqvu8kYT4qP/70cSE7nIUYrYE2/CtTb89GoAvJoU9+z2arzbMeUHOsCwu+xl0Q9 f9QQ== X-Google-Smtp-Source: AGHT+IEbAwOLpN+3gLcIXSlwje3hgYAK4GcMgt9FiO6xlV5Qw7qtPGE7OeuueIeTbngPsjCV45Lc7w== X-Received: by 2002:a05:6000:4205:b0:401:70eb:eec7 with SMTP id ffacd0b85a97d-42704db8ccbmr625604f8f.43.1760635286027; Thu, 16 Oct 2025 10:21:26 -0700 (PDT) Received: from localhost ([151.35.142.227]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4711443e81asm40085805e9.10.2025.10.16.10.21.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Oct 2025 10:21:25 -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 1/2] iio: imu: st_lsm6dsx: Fix measurement unit for odr struct member Date: Thu, 16 Oct 2025 19:21:21 +0200 Message-Id: <20251016172122.1220332-2-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251016172122.1220332-1-flavra@baylibre.com> References: <20251016172122.1220332-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=1011; i=flavra@baylibre.com; h=from:subject; bh=wBY2cs92+fygg+uCMwB58jzVy7qCTwKs8jhbQwv+zXM=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBo8SlG/5SlI7hO8FM0OzFXZY/MDRumIt3Y6VWoA foWjMafTBWJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaPEpRgAKCRDt8TtzzpQ2 X0iuC/9y/vx/TgX0ojCFHNuz8sAIt4HxpRJS1SuidRyW4MvcgKpXVW4TlqdE+d9AJUyIcWuyVs0 wHzBYOzfJZ8pjtytYCjLf7TPuSRBF0AqviR5SFdAWZpHe4U3L/uS45fsWdoU1LY6+DoKX0/XCpD nFT7FJansxCiKxGE5IPhH2H4wlvXmf/X1X05wFSK32OM7cmDpgheSeNl8Ag4sl4nsd7ajGm8RYf APDSzudrK9uDYCzrEItJHKMV3XG2JGySTyumqYGkNnIAz3fOgjH2SN2kdPHP8Yvd6hiQ4E5t/yy +FkMsaEzfKlh/IId6vJJz1IQNWSFbAH7a6EweZR1AMY4+mSimCbKCviJqZd0Sb2aX6B1vgvla2I vlAUoHRQcd2H+BeAh+cK9CaqXVJONg6EjcWXSXgXXLY+pB7tNZYN3wNJsFpR9NWlJ41nbHFx/Qu KCl+HVL/oRNgQgJtnfhzVS+yI0hK7sW0Iim5lGADApjxkVMGiCCr3aTul1boMWIByTIiM= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The `odr` field in struct st_lsm6dsx_sensor contains a data rate value expressed in mHz, not in Hz. Fixes: 290a6ce11d938 ("iio: imu: add support to lsm6dsx driver") Signed-off-by: Francesco Lavra Acked-by: Lorenzo Bianconi --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index c225b246c8a5..bd366c6e282a 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -365,7 +365,7 @@ enum st_lsm6dsx_fifo_mode { * @id: Sensor identifier. * @hw: Pointer to instance of struct st_lsm6dsx_hw. * @gain: Configured sensor sensitivity. - * @odr: Output data rate of the sensor [Hz]. + * @odr: Output data rate of the sensor [mHz]. * @samples_to_discard: Number of samples to discard for filters settling = time. * @watermark: Sensor watermark level. * @decimator: Sensor decimation factor. --=20 2.39.5 From nobody Sun Feb 8 04:12:46 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.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 A2A953176E8 for ; Thu, 16 Oct 2025 17:21:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760635292; cv=none; b=PJzZmx08N/n1137av5LpPpqLNUJPaiOVbPU83411i2aOuTV2BIVI9eBOZmJrkYZu3v/4ejHqkufIEj56awRC39+E/qd+t5ElvPc6xIsi2A+G776KjSVHgQ+z6B7lAYZnLVQg7ERn7LyY5RrCn5nW+oFElCF2DmRr6Zf00XC8mfc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760635292; c=relaxed/simple; bh=OWmMaB3SrzHnfCDh9K18vjCvQJ2hdy4J/JH+EhrXHlQ=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=eYPH3ISt1UI+//FRdCImw6X5M/RnmavROmD09tG9F3xGA8953Zbx/qqj02XMjKchOKHfQ1th6vuAKLuMEGJAZlpfqZFYEIJlIaFnoTBDaViw2WmSN1YRQIVWDm94NLIDcWB8nL4ubTOI2VsgfhrpMzPGyO7LYo79uC3EMLm7H88= 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=qWzbMaPT; arc=none smtp.client-ip=209.85.221.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="qWzbMaPT" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-3ed20bdfdffso981719f8f.2 for ; Thu, 16 Oct 2025 10:21:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1760635289; x=1761240089; 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=k2Z2ncf+NA62rVuWxzs3s0fNmnAI48xeZMjz51I4PYQ=; b=qWzbMaPTGcNzGwdVDGsznXEWjv0U8K9rTbNIwlaJqSZ+66RYBX1t14X1+XhU4RAIQQ RqTdzTmsnJBa7trLZuTbBjgLnDpi3pQhYUi+f3GbOvCIGskEel/wrCaLFvJo046oGaJx 9/LWNq+SeYE8+fYVF8tiM8LzNn2EJ8dMrryIv6i+cdT0ZywtWoHhxni3ESJZhv7p623O Ban5UiV5/Re4/MSBn/gQu6Lk0xGPzgFNjP9du2xL51eAzCm8yYxtbrbCpN/GEfG8mUva o1fRERZVPJbQTFFfygdWkOOpsVlXxjauuFII9qo9O0p3ZkuvwR0wJmenPRaiyBfN0Vqh Lmgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760635289; x=1761240089; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=k2Z2ncf+NA62rVuWxzs3s0fNmnAI48xeZMjz51I4PYQ=; b=lluooYjYik58jF7lgn6BveWy+Ov8ZzM/1LFO5hgil7nERtVCeewIp4sUH/6VqcO/et ZwwODFKOOc94cNpimSDAMjFKjtmn6fwTyLDnFA7WtpE7YDa2TJiuTQk2hqecxD1Y6/hF hzOhTwdap0G6H4mBVXJzKh7pls9No7eqHlAnaqFx80ModpsiVck1VYidDSzgvffJu0Cp u9EuJC0QrXLoCezsa6jOaRU1+04b5sD1kkw3FeasEwfag+YdBbZvUR8gmp1CpDxQhmQn AMQnleYUoVOtWB0wbVovzD0tCTe1hbc7uzsssyYSREjGGP8IGjLG/0KuQC+A5lhY2VIs NonQ== X-Forwarded-Encrypted: i=1; AJvYcCVZ5otVAOxZpMjdZ95u9pNZfdP78S70FAxFIQ+GrH7Y1igFUPLdBhTb+RnejrRLOGTaxIiUXoiGTs4y6xg=@vger.kernel.org X-Gm-Message-State: AOJu0YyvlKBo/FrdBHUaZuXgl6mSGw17FY1aCHq3JJMCwiOFNHZyMSNq tk3+ne4ROguFzv7U1STHZzJ9eptdxmUB8GOBYo1fuFw4ygzXBEXQEKGOYELjk4UzEZU= X-Gm-Gg: ASbGncs/XI6iblkw0zVew1rrVxeR1tlngHNC5yGWaoPgkHiMY53PbD1Ee1M1AijcN7l s1K0tZzleAJQty5Xfcf+W7kElrWQkH5uuOfLfpEEo8tH60y4kPDUVTmaC9oiGMKbWz0UZk0cBUB KM2+ViyUoklE8RqDAPz2P2uAVQRP2F2xfZdcVth3Uyo3ujLhQpGjYAnCmxbkY9rBQK26ggWq9oI CdVjFpW9fxDKnpg7EYUZhrRIIljWEaPXefikhdrPShZGHoPnoNE5aq3BP7ylrpgeZrcP5Qm+0Ez HsxhE1NW4Taoo/Qg8BnCh7hBJqStD52AsZZAbu1ZkokYzdoXDWWe4SnkksqGig75FyJZjNfe2P4 N3fGts2MBWQNrgMA6p3dXqYbTgYVEPe4tvgsbGPVd+zBusLg= X-Google-Smtp-Source: AGHT+IG/HhCkm1Gi61ELQRqkvZ3XIKNGqTBZELD2vHrE8vEDDGA4SjyDoHug+ECuSyTQxFMvHAm9vw== X-Received: by 2002:a05:6000:144a:b0:3ee:114f:f89f with SMTP id ffacd0b85a97d-42704d87e31mr696458f8f.15.1760635288872; Thu, 16 Oct 2025 10:21:28 -0700 (PDT) Received: from localhost ([151.35.142.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-426ce5e1284sm35562724f8f.45.2025.10.16.10.21.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Oct 2025 10:21:27 -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 2/2] iio: imu: st_lsm6dsx: Decouple sensor ODR from FIFO batch data rate Date: Thu, 16 Oct 2025 19:21:22 +0200 Message-Id: <20251016172122.1220332-3-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251016172122.1220332-1-flavra@baylibre.com> References: <20251016172122.1220332-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=8512; i=flavra@baylibre.com; h=from:subject; bh=OWmMaB3SrzHnfCDh9K18vjCvQJ2hdy4J/JH+EhrXHlQ=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBo8SlGgCckhZixFpg+ln/Nt4QhyFRygHiAprqgN VMlGmYT2iWJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaPEpRgAKCRDt8TtzzpQ2 X/0PC/9o6cpQL6wMMPQZkYMgUz6uYIEIY2stSxgmDL+xIIgRF2RVdetKBSL5uHjErBl6fXObDxU DJeyfSGbkqtILQ4JLBsJuH+eBOXBwk+SgISK4yrZoD2A134wVWjvAppmJZY6sdM8Dy5oM36qDO9 gQ0LDS88V9Iaw4d//MoNfSk6b+QN3dw81c7e16xLCLww1jXF7eQtsB2EESD2kEWuOgnoh6eH4lc tvyVV6cj7HmfGlbt4WdM7SdxYgKlmHQ7HkpPbfxGTpa7cdqN/7pw5C3utVVPbUdRcEB3k0ykifD b1kZRiSfNJ1DZFFwMQkWKPIMJ91CTSuwrov7udsTeeFrW0r3KJ06aG9uxEKpDytJUFteYrNSXue 1bZUobAU6130eyJqCkJZ2X/QTc8D6whgxDy7hS29Xvqkm85ZTdaHO2d2/LNHv83kfyPnpcDtYaZ uT2G3F4bKpvK6hC954GEQgRar9Lx9go+w+LAIS6Ph2x69J+VjCDe/qUjFqv1BoBY1gXhk= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The rate at which accelerometer or gyroscope sensor samples are fed to the hardware FIFO (batch data rate, or BDR) does not have to coincide with the sensor sampling frequency (output data rate, or ODR); the only requirement is for the BDR to not be greater than the ODR. Having a BDR lower than the ODR is useful in cases where an application requires a high sampling rate for accurate detection of motion events (e.g. wakeup events), but wants to read sensor sample values from the hardware FIFO at a lower data rate (e.g. to minimize the amount of I2C or SPI traffic and the rate of periodic interrupts). To support the above use case, add a sampling_frequency sysfs attribute to the buffer directory of st_lsm6dsx IIO devices, which controls the BDR for a given sensor independently from the "main" sampling_frequency attribute (which controls the ODR); introduce a new `hwfifo_odr_mHz` field in struct st_lsm6dsx_sensor to keep track of the current BDR value, and use this field instead of the `odr` field in the code that deals with the FIFO data rate. In the sensor hub driver, make the hwfifo_odr_mHz value always mirror the odr value, since there is no separate configuration setting to control the BDR for data produced by the sensor hub functionality. For backwards compatibility, set the buffer frequency equal to the main frequency whenever the latter is updated via sysfs; if userspace wants a different buffer frequency, it has to write to the relevant sysfs attribute after any writes to the main frequency attribute. Signed-off-by: Francesco Lavra Acked-by: Lorenzo Bianconi --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 2 + .../iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | 71 ++++++++++++++++--- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 3 +- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c | 3 +- 4 files changed, 69 insertions(+), 10 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index bd366c6e282a..3cd520bdec46 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -366,6 +366,7 @@ enum st_lsm6dsx_fifo_mode { * @hw: Pointer to instance of struct st_lsm6dsx_hw. * @gain: Configured sensor sensitivity. * @odr: Output data rate of the sensor [mHz]. + * hwfifo_odr_mHz: Batch data rate for hardware FIFO [mHz] * @samples_to_discard: Number of samples to discard for filters settling = time. * @watermark: Sensor watermark level. * @decimator: Sensor decimation factor. @@ -380,6 +381,7 @@ struct st_lsm6dsx_sensor { =20 u32 gain; u32 odr; + u32 hwfifo_odr_mHz; =20 u16 samples_to_discard; u16 watermark; diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c b/drivers/iio/i= mu/st_lsm6dsx/st_lsm6dsx_buffer.c index 8a9d2593576a..7a66f06522c4 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c @@ -56,6 +56,7 @@ #include #include #include +#include #include #include =20 @@ -105,7 +106,7 @@ static int st_lsm6dsx_get_decimator_val(struct st_lsm6dsx_sensor *sensor, u32 max_odr) { const int max_size =3D ARRAY_SIZE(st_lsm6dsx_decimator_table); - u32 decimator =3D max_odr / sensor->odr; + u32 decimator =3D max_odr / sensor->hwfifo_odr_mHz; int i; =20 if (decimator > 1) @@ -136,14 +137,14 @@ static void st_lsm6dsx_get_max_min_odr(struct st_lsm6= dsx_hw *hw, if (!(hw->enable_mask & BIT(sensor->id))) continue; =20 - *max_odr =3D max_t(u32, *max_odr, sensor->odr); - *min_odr =3D min_t(u32, *min_odr, sensor->odr); + *max_odr =3D max(*max_odr, sensor->hwfifo_odr_mHz); + *min_odr =3D min(*min_odr, sensor->hwfifo_odr_mHz); } } =20 static u8 st_lsm6dsx_get_sip(struct st_lsm6dsx_sensor *sensor, u32 min_odr) { - u8 sip =3D sensor->odr / min_odr; + u8 sip =3D sensor->hwfifo_odr_mHz / min_odr; =20 return sip > 1 ? round_down(sip, 2) : sip; } @@ -231,7 +232,7 @@ static int st_lsm6dsx_set_fifo_odr(struct st_lsm6dsx_se= nsor *sensor, if (enable) { int err; =20 - err =3D st_lsm6dsx_check_odr(sensor, sensor->odr, + err =3D st_lsm6dsx_check_odr(sensor, sensor->hwfifo_odr_mHz, &data); if (err < 0) return err; @@ -713,7 +714,7 @@ st_lsm6dsx_update_samples_to_discard(struct st_lsm6dsx_= sensor *sensor) =20 data =3D &hw->settings->samples_to_discard[sensor->id]; for (i =3D 0; i < ST_LSM6DSX_ODR_LIST_SIZE; i++) { - if (data->val[i].milli_hz =3D=3D sensor->odr) { + if (data->val[i].milli_hz =3D=3D sensor->hwfifo_odr_mHz) { sensor->samples_to_discard =3D data->val[i].samples; return; } @@ -799,6 +800,59 @@ static const struct iio_buffer_setup_ops st_lsm6dsx_bu= ffer_ops =3D { .postdisable =3D st_lsm6dsx_buffer_postdisable, }; =20 +static ssize_t st_lsm6dsx_hwfifo_odr_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct st_lsm6dsx_sensor *sensor =3D iio_priv(dev_to_iio_dev(dev)); + u32 hwfifo_odr =3D sensor->hwfifo_odr_mHz; + + return sysfs_emit(buf, "%d.%03d\n", hwfifo_odr / 1000, hwfifo_odr % 1000); +} + +static ssize_t st_lsm6dsx_hwfifo_odr_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct iio_dev *iio_dev =3D dev_to_iio_dev(dev); + struct st_lsm6dsx_sensor *sensor =3D iio_priv(iio_dev); + int integer, milli; + int ret; + u32 hwfifo_odr; + u8 data; + + if (!iio_device_claim_direct(iio_dev)) + return -EBUSY; + + ret =3D iio_str_to_fixpoint(buf, 100, &integer, &milli); + if (ret) + goto out; + + hwfifo_odr =3D integer * 1000 + milli; + ret =3D st_lsm6dsx_check_odr(sensor, hwfifo_odr, &data); + if (ret < 0) + goto out; + + hwfifo_odr =3D ret; + + /* the batch data rate must not exceed the sensor output data rate */ + if (hwfifo_odr <=3D sensor->odr) + sensor->hwfifo_odr_mHz =3D hwfifo_odr; + else + ret =3D -EINVAL; + +out: + iio_device_release_direct(iio_dev); + + return ret < 0 ? ret : len; +} + +static IIO_DEV_ATTR_SAMP_FREQ(0664, st_lsm6dsx_hwfifo_odr_show, st_lsm6dsx= _hwfifo_odr_store); + +static const struct iio_dev_attr *st_lsm6dsx_buffer_attrs[] =3D { + &iio_dev_attr_sampling_frequency, + NULL +}; + int st_lsm6dsx_fifo_setup(struct st_lsm6dsx_hw *hw) { int i, ret; @@ -807,8 +861,9 @@ int st_lsm6dsx_fifo_setup(struct st_lsm6dsx_hw *hw) if (!hw->iio_devs[i]) continue; =20 - ret =3D devm_iio_kfifo_buffer_setup(hw->dev, hw->iio_devs[i], - &st_lsm6dsx_buffer_ops); + ret =3D devm_iio_kfifo_buffer_setup_ext(hw->dev, hw->iio_devs[i], + &st_lsm6dsx_buffer_ops, + st_lsm6dsx_buffer_attrs); if (ret) return ret; } diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index c65ad49829e7..055424303a4f 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -1850,7 +1850,7 @@ static int st_lsm6dsx_write_raw(struct iio_dev *iio_d= ev, if (val < 0) err =3D val; else - sensor->odr =3D val; + sensor->odr =3D sensor->hwfifo_odr_mHz =3D val; break; } default: @@ -2384,6 +2384,7 @@ static struct iio_dev *st_lsm6dsx_alloc_iiodev(struct= st_lsm6dsx_hw *hw, sensor->id =3D id; sensor->hw =3D hw; sensor->odr =3D hw->settings->odr_table[id].odr_avl[0].milli_hz; + sensor->hwfifo_odr_mHz =3D sensor->odr; sensor->gain =3D hw->settings->fs_table[id].fs_avl[0].gain; sensor->watermark =3D 1; =20 diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_shub.c index 3c5e65dc0f97..039f588ef806 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c @@ -639,7 +639,7 @@ __st_lsm6dsx_shub_write_raw(struct iio_dev *iio_dev, return odr; =20 sensor->ext_info.slv_odr =3D val; - sensor->odr =3D odr; + sensor->odr =3D sensor->hwfifo_odr_mHz =3D odr; return 0; } case IIO_CHAN_INFO_SCALE: @@ -746,6 +746,7 @@ st_lsm6dsx_shub_alloc_iiodev(struct st_lsm6dsx_hw *hw, sensor->id =3D id; sensor->hw =3D hw; sensor->odr =3D hw->settings->odr_table[ref_id].odr_avl[0].milli_hz; + sensor->hwfifo_odr_mHz =3D sensor->odr; sensor->ext_info.slv_odr =3D info->odr_table.odr_avl[0].milli_hz; sensor->gain =3D info->fs_table.fs_avl[0].gain; sensor->ext_info.settings =3D info; --=20 2.39.5