From nobody Mon Dec 1 21:33:25 2025 Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0FD08302154 for ; Mon, 1 Dec 2025 10:00:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583231; cv=none; b=qwX/HgFYcIR9seDwwh0n3snHc1Pu6cfj+yhdX5TAv3EHgGspJCZf3g1R0WE8NVTnmyYm3MyWxMjE3OI0De3hitjbWS4WymDUXITBuhZ4jqHHXn2yAabCzGsLGKr1kBRVBcgeC9obB+Jdqhv6h0Nfekxpu1gn+kFo+xORb0SU6GI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583231; c=relaxed/simple; bh=Xb/mqp4+YwITWlbn8v8dEwFHqYPu9zYkndT2tCfzi90=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=nmgAfJqE/VP37uBy7nKr+PAjM8grTgSJ8g+96Sl4nS3PjKZQtYfAK9xjYDxknhbAsPTsvk+oIce8sDBrh2kzwC44BrcsBvQeQ+Zr4nT7ctK+AiS+Fy7ODsuW3f2Y4MtAF5GY17CZJMIrTvFseWgGKdvkJR7TznKN/CHNryuiwWE= 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=Gh7UyBSZ; arc=none smtp.client-ip=209.85.218.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="Gh7UyBSZ" Received: by mail-ej1-f53.google.com with SMTP id a640c23a62f3a-b736cd741c1so618610766b.0 for ; Mon, 01 Dec 2025 02:00:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1764583226; x=1765188026; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8Ib0drqFrjnDrbAYTSSfxv4es9CvzBMVOslQd6EXaRk=; b=Gh7UyBSZ4vBRUQl6KzVy4tlg0NQElm49hDqToU0Rw8SXU0b7yDeQzFmMyTHhLo04Pz oS3s89/DRRwaI7QhmRJsQE/PFNhvRUtowN1pQNCMm9NRJrrvedq/fulUgHBiu4czso92 3g4by10vvRltJTXnJbPwTk3/9TjVHzrtxzsq6R+Ltg2dkSiA9nxOTmD+Ck4LLTUgWLr0 UBROpO7L0QCbPqbnsmKQzVYWDrb6iRqDRG9LR1HF6BJjlawgwyiV9IXN9/M95/JxEYdH ba8AWJ1yGrsLc3xCWAfjF70z/GgZbBqn42N4nvkCmfkKDxQvbjC89b+geXKjMKyueQgX OOtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764583226; x=1765188026; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=8Ib0drqFrjnDrbAYTSSfxv4es9CvzBMVOslQd6EXaRk=; b=B88WgYesiCcXuJ7lKuri5i9fGMmmVoUf1v6+1DxFmy8vrzwOqs6r/2xRISw55bqIyU c+gl3vtEjhKms4WGdc9aCTuk3xDX/wKeBbmQW+5ZOjGjOWDb84HL099yVvfPERE+dQ6c bX/dYM46cxbuLlG7M2VTd/Mt9IaqaYi9B/BYW2i9pwEVsdBuaSobYOFjdHcXKE6xUsRW grVoxelBI7p1sfCT2vbaWKYoKVHNmSqMuLZoy7YGrhAX5rXfdwLo8yLqZpBLtSDlWHVA w8P/D0E4qRkQrFfyt+n+fKVxpK8C6ju4YjXH06rOBcpQXPeHT+bf4MUMxsYUxzrXRRj5 7NIQ== X-Forwarded-Encrypted: i=1; AJvYcCWisQv1rh5IZun8Jfvxl/q6sCiQtNFxwNsoA/FKW4QzmTJUXgQyeo0IlbGHv7H9mWP1AVtJ575kvochC7Y=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5cBxKhxQiayoPc5ofGEogtZFmW+W+Z7+0/kWb6Vyd1g+64vKi 73Ne5GaR5neCdbEhcZddxsCr2LdWr82FKk1DZNZbi6d8xfw2n1xNg2lm9ihiEymHW4IzjqC96sI KyUsn X-Gm-Gg: ASbGncv/ga8iFwCiZjXg30WFDLAIEMCEe5Lfjsf6dBgLT8B4Eh8O2OxFwbhtmw9pF/X 59RjozqW2g7BryZbeNWjdf//3nrJRFQ6PtfwNwS0FaLGtuM/bzRiXRAAIqJ+LcVHfxxb/0ahBPO ht4cEqKJZOlX8BaIvtAVZsB0tIRDQpQsqxS1XY9bcMicYs6NnThcdQadLn2KGIIRYWsRDVcj5DU mmTh5G9Fe9QVQ9aH8pQWVRwjtAgmhi96xbeMyEkEbGDB+pFGl9j1ciY2VuadVBa08KGGe84ZClK X7lXYtYggstXGtXo6CchbTqB4s1l3BBN4YSZQKIYcs+pnFR5UGje+jlsV9JG5f9ELhONvp4ZPlw lUW6RAAcvJosoh54SekuZqIQOd+ubOwG2XQTSIEr3WMKMUvtYSIEbSFA+xSN1iWmnuMY= X-Google-Smtp-Source: AGHT+IHC478PO3CBUR5BJC5WOGgav4Icn/Pzk7/d7NpV1ZUnrHGzUJIvyLPUE9PiVEdjfFEhOsXrTA== X-Received: by 2002:a17:907:3e1a:b0:b73:8b7f:8c48 with SMTP id a640c23a62f3a-b76716955b4mr3856310966b.37.1764583226234; Mon, 01 Dec 2025 02:00:26 -0800 (PST) Received: from localhost ([151.35.151.28]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b76f59a63dfsm1143505566b.37.2025.12.01.02.00.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 02:00:25 -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 Cc: Andy Shevchenko Subject: [PATCH v4 1/9] iio: imu: st_lsm6dsx: fix iio_chan_spec for sensors without event detection Date: Mon, 1 Dec 2025 11:00:10 +0100 Message-Id: <20251201100018.426749-2-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251201100018.426749-1-flavra@baylibre.com> References: <20251201100018.426749-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=2615; i=flavra@baylibre.com; h=from:subject; bh=Xb/mqp4+YwITWlbn8v8dEwFHqYPu9zYkndT2tCfzi90=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpLWb3b7PSvMCE4FL2AoX2G7rJWV6MWZPzu6uCj zuR4kzIvpiJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaS1m9wAKCRDt8TtzzpQ2 X6tGDACcRTAVsUnFhiTu4Fo7AEW9fUiqYY8H1hpQUXLtQq+tYt9Y//j7NarFeqPN31hJXx06fkr OQDGV6jXDsMz0GzaJBkn/Jx70XLEFQwdyY3+fQFTXSyWlGi0wrqWnrvSi0ueSzW6DSLwAQffPJk WVnGE4A4FMdZWuflwuh0gzp6PXrMfNj8qrrMEuSzqp1jN8heS0YLORGUKAhRVKVQezOn6L+ezm4 nT0PWB8Yz2lqV6YfLa/BA4AIMhxdMEBjxtB1tq4Y3Hj53QuhLQrvp2te2Ird0nRQyRGvOh0tsp2 kaj+sQPcfCdZGWerIK2phhh4n4i5lKUxCxxYZkFXLCCOklHDf+Qbr7TVP/FwwEHYBhSNCvdKkLS TNH8A2ffJ/zZTsfYMq9lNtfD09eLZWunc6YbHByEHJmQhSQN0u8zOh9qRiNLz0efLPYYaToD2a8 X8SI/2Xa7dyo55fmd9hPUmdoAtqlgjYNL1dEauh6K8E7+sCwQ+JW08Bu11sIMJjZaTOIQ= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The st_lsm6dsx_acc_channels array of struct iio_chan_spec has a non-NULL event_spec field, indicating support for IIO events. However, event detection is not supported for all sensors, and if userspace tries to configure accelerometer wakeup events on a sensor device that does not support them (e.g. LSM6DS0), st_lsm6dsx_write_event() dereferences a NULL pointer when trying to write to the wakeup register. Define an additional struct iio_chan_spec array whose members have a NULL event_spec field, and use this array instead of st_lsm6dsx_acc_channels for sensors without event detection capability. Fixes: b5969abfa8b8 ("iio: imu: st_lsm6dsx: add motion events") Signed-off-by: Francesco Lavra Reviewed-by: Andy Shevchenko Acked-by: Lorenzo Bianconi --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index 216160549b5a..a09df9d772dd 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -103,6 +103,13 @@ static const struct iio_chan_spec st_lsm6dsx_acc_chann= els[] =3D { IIO_CHAN_SOFT_TIMESTAMP(3), }; =20 +static const struct iio_chan_spec st_lsm6ds0_acc_channels[] =3D { + ST_LSM6DSX_CHANNEL(IIO_ACCEL, 0x28, IIO_MOD_X, 0), + ST_LSM6DSX_CHANNEL(IIO_ACCEL, 0x2a, IIO_MOD_Y, 1), + ST_LSM6DSX_CHANNEL(IIO_ACCEL, 0x2c, IIO_MOD_Z, 2), + IIO_CHAN_SOFT_TIMESTAMP(3), +}; + static const struct iio_chan_spec st_lsm6dsx_gyro_channels[] =3D { ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, 0x22, IIO_MOD_X, 0), ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, 0x24, IIO_MOD_Y, 1), @@ -144,8 +151,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sens= or_settings[] =3D { }, .channels =3D { [ST_LSM6DSX_ID_ACC] =3D { - .chan =3D st_lsm6dsx_acc_channels, - .len =3D ARRAY_SIZE(st_lsm6dsx_acc_channels), + .chan =3D st_lsm6ds0_acc_channels, + .len =3D ARRAY_SIZE(st_lsm6ds0_acc_channels), }, [ST_LSM6DSX_ID_GYRO] =3D { .chan =3D st_lsm6ds0_gyro_channels, @@ -1445,8 +1452,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_se= nsor_settings[] =3D { }, .channels =3D { [ST_LSM6DSX_ID_ACC] =3D { - .chan =3D st_lsm6dsx_acc_channels, - .len =3D ARRAY_SIZE(st_lsm6dsx_acc_channels), + .chan =3D st_lsm6ds0_acc_channels, + .len =3D ARRAY_SIZE(st_lsm6ds0_acc_channels), }, [ST_LSM6DSX_ID_GYRO] =3D { .chan =3D st_lsm6dsx_gyro_channels, --=20 2.39.5 From nobody Mon Dec 1 21:33:25 2025 Received: from mail-qv1-f54.google.com (mail-qv1-f54.google.com [209.85.219.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 15CA330214D for ; Mon, 1 Dec 2025 10:00:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583234; cv=none; b=qsa/Ru8Sod9IkbrfH64E3ANm0ETxYpe88JrMPtIvgoJR5/YT3hH3xEw2mrLKBgI5OBpqtBYPpa3DJHgdUHdKgtK+HyEOdAtyokbSE+aJurB9vpqdJxR5SgNlxNyBuOgzs0vK8ouqxvO97xy1mBQNYL4p4pl6qgGWEfaSIM6C3DI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583234; c=relaxed/simple; bh=n+tWKmHDIKPoB17m8PDbku2hGkPzuoaQtqpngbiJb08=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HI0ZyiYiz/2m6o9d+fE2qboNeLCFw7ee55UAGXe2r+hrvfFcZmirOPQb9GxCatip0uWf/NNZJcK7as8AaqLfVMQPPEWGFdDvktr4460eo529wm5FgI4tNmn/EGtX154ltbI6LZYYgtuSgtUzNiZKJwQ++K36NeNXZqmncoQ/f7E= 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=xMjTgRff; arc=none smtp.client-ip=209.85.219.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="xMjTgRff" Received: by mail-qv1-f54.google.com with SMTP id 6a1803df08f44-8823e39c581so61059226d6.3 for ; Mon, 01 Dec 2025 02:00:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1764583231; x=1765188031; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BOpKIjBtp3jglLtC7+Xd90dUysNa5e26fWUT0wH80JA=; b=xMjTgRfffyTgpfBUiiQw1EuE1NXu6vpNhJdlmedw4yUy12EL0IMCDSN6JQFas6ueQ0 m/8O8dwibhNOWtydmR1AOd5wYHCkF00diA8GEUSh+H72d5oAYvCebZyajuVrkLmgIRhZ OFQSESpIG6D1/f2JjHLGeaGKG3V1wT+aCR+p2ixydsAeF+2PsZjoM+MzXbbqx+trAN+g 7/w9cAdJVX8APhAKRpjRXav1fO9ru/KzOYd5adM8/IpXx5YWAadfcr0j8p7s134jOBoW 2ntntuopHpPv+Rato8WGjeggiOUR5UmjxuzhcKoLfH1JIvRw/SXHOfh7jLvJUkc+aQnH eYFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764583231; x=1765188031; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=BOpKIjBtp3jglLtC7+Xd90dUysNa5e26fWUT0wH80JA=; b=ru3EfSkuhzbujSprg5+drOdcoxyr88Z1jJfp5j4DtqbehkR/GzHs6JWU8EYe3O6uaS vEVDQrTbqYKY8yLUdqK9zurKk986zO+/YSdEvJ7eAwjDbd5zWGE2TFpnDSL76+X0MOyR FY1AoKMNn9XOf4y6HAeD2mGFuwkC5g7qdqgFDBwBtIvp9QOA9MFGFr3ipmJjQnQPPiDt 4pMbeW8FBMARBz68WOts+VbC5BZXdg65tjcKg9CCB7ORMhPkZAgvkgsDC0fLuGMio23d idZ++0fvVzZDtXhLqJIM1MKs6E3/05jJxDUCkROEmgd+te5FBUIU0yenzMEjYGGB8Dvf lUuA== X-Forwarded-Encrypted: i=1; AJvYcCXvQRcdN88ceAf+e23sZ0OcFkaRvngXDxsz3Sd/2k2tnTs3/RpdFc5Hv84KioGCNWhqX6ZWHhT5h5R6IaU=@vger.kernel.org X-Gm-Message-State: AOJu0Ywq5W3LOpGYNREF9FuwjgtxlARjHn3LBYu7fRjJSdgkP0RN3a0B anQEbVMrvaiqRgfJ7lpgpFpkGp017QsWmYBZ2g7VBTENUfMH/vdJbhqvUylzC5JjP6E= X-Gm-Gg: ASbGncti1HqWb+27S5vbqQutrDg/ZdRMkcYqZ23g2uortvN+KoIGAOzcRlJ4KRnALl6 7kT9GN1QcQ/cTLZk7yWVQql/dgUlS9/GlWI8LtAGZ8Mx6XAlKWkcOgmsCzfAgwkgJelkoOxAX5Q 5y+PO86DgxY0xmhYyD90i8+AFsHnsnYP1Wuk3jQDIVj1Ds9G20/UYDKVeP0q0TVXCQLMulnJQtH BUABQeRHAPlaR+qJJmWBnL9y6Or6IJYC7FtP9IAYp9XSKjLePmcVTNFb8uVKpl+VLLeuDpCLDU7 wX7PPLAPrC18eeXRfTpikBtTiot0LRcM5McpPDbQNMXzbB9tzrYTaFz81xDNsjhl/LcixrF4pRG 2MkYsgRZs1QOA5y/urjS79vBMgNNaoyYUFxWZ2rS8kCscHV9F6N6MA5yC X-Google-Smtp-Source: AGHT+IGSO5IwGs6hZGHFBf6IPOzV6kaFdfaImnLXAS0LDmC8e/1YF9ZtBCdiJdYjdxb3iZycnGP9bQ== X-Received: by 2002:ad4:5de3:0:b0:882:3492:b405 with SMTP id 6a1803df08f44-8847c535bd3mr580065226d6.54.1764583229987; Mon, 01 Dec 2025 02:00:29 -0800 (PST) Received: from localhost ([151.35.151.28]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-88652b494ebsm79665276d6.34.2025.12.01.02.00.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 02:00:29 -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 Cc: Andy Shevchenko Subject: [PATCH v4 2/9] iio: imu: st_lsm6dsx: make event_settings more generic Date: Mon, 1 Dec 2025 11:00:11 +0100 Message-Id: <20251201100018.426749-3-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251201100018.426749-1-flavra@baylibre.com> References: <20251201100018.426749-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=8599; i=flavra@baylibre.com; h=from:subject; bh=n+tWKmHDIKPoB17m8PDbku2hGkPzuoaQtqpngbiJb08=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpLWb4qZsTWGnvQ5y4mMPFAjXdt7beAc/oZJiro kTDzMLWF1KJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaS1m+AAKCRDt8TtzzpQ2 X20jC/9t7ppVndnMBWP+U587sGMD5i/XWATa+g0Nlsc6QqXFDIy15yFk5EVIfdYknynDhk7iIm4 A6BSijW7JIuY43e94n6y+9bmCthvnVep5UFKe61pm+kgt0c+UgSKaD7cK+mx4RnBakKj2gVIfX3 KZMpMGfIDB7TwYKbUQGxi6hhF6lGXG9NK8BKWn1zagQN43Cx/bzdMLzx8TSLebpyFOZe4YoSFga wErEwaQlHrO7G/GDZFQqhAZjr1T7AxX9Jj/4HWzfM4zGiBtJ7RT+oNZkQuoerOTfjt1iwEQS4bJ cpMndp0HI2vkOrcy73zpJ8l67KtFG+IyohWLwkPlBaIzrtDl0sxJjp7Y70HfQTlpWHkhIDhSpOU ioPbbnXpBl/HvoSGCihXRCAjwU9Rk7nE7Wgw1QgOUqd2tjb47Vj7ww5Es3wWlELX52J3865nEwm mS6F/VVZ8kdZxSf/6BhkGKMcPRCM3qRvTCtueq9JyBZGJ0Gc7JCTyBdPj8S25butU7ong= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The st_lsm6dsx_event_settings structure contains fields specific for one event type (wakeup). In preparation for adding support for more event types, introduce an event id enum and a generic event source structure, and replace wakeup-specific data in struct st_lsm6dsx_event_settings with an array of event source structures. Signed-off-by: Francesco Lavra Reviewed-by: Andy Shevchenko Acked-by: Lorenzo Bianconi --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 20 ++- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 146 ++++++++++++------- 2 files changed, 106 insertions(+), 60 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index a4f558899767..80bc5686454b 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -242,14 +242,22 @@ struct st_lsm6dsx_shub_settings { u8 pause; }; =20 +enum st_lsm6dsx_event_id { + ST_LSM6DSX_EVENT_WAKEUP, + ST_LSM6DSX_EVENT_MAX +}; + +struct st_lsm6dsx_event_src { + struct st_lsm6dsx_reg value; + struct st_lsm6dsx_reg status; + u8 status_x_mask; + u8 status_y_mask; + u8 status_z_mask; +}; + struct st_lsm6dsx_event_settings { struct st_lsm6dsx_reg enable_reg; - struct st_lsm6dsx_reg wakeup_reg; - u8 wakeup_src_reg; - u8 wakeup_src_status_mask; - u8 wakeup_src_z_mask; - u8 wakeup_src_y_mask; - u8 wakeup_src_x_mask; + struct st_lsm6dsx_event_src sources[ST_LSM6DSX_EVENT_MAX]; }; =20 enum st_lsm6dsx_ext_sensor_id { diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index a09df9d772dd..e8f0a2ff91be 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -388,15 +388,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_se= nsor_settings[] =3D { }, }, .event_settings =3D { - .wakeup_reg =3D { - .addr =3D 0x5B, - .mask =3D GENMASK(5, 0), + .sources =3D { + [ST_LSM6DSX_EVENT_WAKEUP] =3D { + .value =3D { + .addr =3D 0x5b, + .mask =3D GENMASK(5, 0), + }, + .status =3D { + .addr =3D 0x1b, + .mask =3D BIT(3), + }, + .status_z_mask =3D BIT(0), + .status_y_mask =3D BIT(1), + .status_x_mask =3D BIT(2), + }, }, - .wakeup_src_reg =3D 0x1b, - .wakeup_src_status_mask =3D BIT(3), - .wakeup_src_z_mask =3D BIT(0), - .wakeup_src_y_mask =3D BIT(1), - .wakeup_src_x_mask =3D BIT(2), }, }, { @@ -554,15 +560,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_se= nsor_settings[] =3D { }, }, .event_settings =3D { - .wakeup_reg =3D { - .addr =3D 0x5B, - .mask =3D GENMASK(5, 0), + .sources =3D { + [ST_LSM6DSX_EVENT_WAKEUP] =3D { + .value =3D { + .addr =3D 0x5b, + .mask =3D GENMASK(5, 0), + }, + .status =3D { + .addr =3D 0x1b, + .mask =3D BIT(3), + }, + .status_z_mask =3D BIT(0), + .status_y_mask =3D BIT(1), + .status_x_mask =3D BIT(2), + }, }, - .wakeup_src_reg =3D 0x1b, - .wakeup_src_status_mask =3D BIT(3), - .wakeup_src_z_mask =3D BIT(0), - .wakeup_src_y_mask =3D BIT(1), - .wakeup_src_x_mask =3D BIT(2), }, }, { @@ -791,15 +803,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_se= nsor_settings[] =3D { .addr =3D 0x58, .mask =3D BIT(7), }, - .wakeup_reg =3D { - .addr =3D 0x5B, - .mask =3D GENMASK(5, 0), + .sources =3D { + [ST_LSM6DSX_EVENT_WAKEUP] =3D { + .value =3D { + .addr =3D 0x5b, + .mask =3D GENMASK(5, 0), + }, + .status =3D { + .addr =3D 0x1b, + .mask =3D BIT(3), + }, + .status_z_mask =3D BIT(0), + .status_y_mask =3D BIT(1), + .status_x_mask =3D BIT(2), + }, }, - .wakeup_src_reg =3D 0x1b, - .wakeup_src_status_mask =3D BIT(3), - .wakeup_src_z_mask =3D BIT(0), - .wakeup_src_y_mask =3D BIT(1), - .wakeup_src_x_mask =3D BIT(2), }, }, { @@ -1028,15 +1046,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_= sensor_settings[] =3D { .addr =3D 0x58, .mask =3D BIT(7), }, - .wakeup_reg =3D { - .addr =3D 0x5b, - .mask =3D GENMASK(5, 0), + .sources =3D { + [ST_LSM6DSX_EVENT_WAKEUP] =3D { + .value =3D { + .addr =3D 0x5b, + .mask =3D GENMASK(5, 0), + }, + .status =3D { + .addr =3D 0x1b, + .mask =3D BIT(3), + }, + .status_z_mask =3D BIT(0), + .status_y_mask =3D BIT(1), + .status_x_mask =3D BIT(2), + }, }, - .wakeup_src_reg =3D 0x1b, - .wakeup_src_status_mask =3D BIT(3), - .wakeup_src_z_mask =3D BIT(0), - .wakeup_src_y_mask =3D BIT(1), - .wakeup_src_x_mask =3D BIT(2), }, }, { @@ -1209,15 +1233,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_= sensor_settings[] =3D { .addr =3D 0x58, .mask =3D BIT(7), }, - .wakeup_reg =3D { - .addr =3D 0x5B, - .mask =3D GENMASK(5, 0), + .sources =3D { + [ST_LSM6DSX_EVENT_WAKEUP] =3D { + .value =3D { + .addr =3D 0x5b, + .mask =3D GENMASK(5, 0), + }, + .status =3D { + .addr =3D 0x1b, + .mask =3D BIT(3), + }, + .status_z_mask =3D BIT(0), + .status_y_mask =3D BIT(1), + .status_x_mask =3D BIT(2), + }, }, - .wakeup_src_reg =3D 0x1b, - .wakeup_src_status_mask =3D BIT(3), - .wakeup_src_z_mask =3D BIT(0), - .wakeup_src_y_mask =3D BIT(1), - .wakeup_src_x_mask =3D BIT(2), }, }, { @@ -1415,15 +1445,21 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_= sensor_settings[] =3D { .addr =3D 0x50, .mask =3D BIT(7), }, - .wakeup_reg =3D { - .addr =3D 0x5b, - .mask =3D GENMASK(5, 0), + .sources =3D { + [ST_LSM6DSX_EVENT_WAKEUP] =3D { + .value =3D { + .addr =3D 0x5b, + .mask =3D GENMASK(5, 0), + }, + .status =3D { + .addr =3D 0x45, + .mask =3D BIT(3), + }, + .status_z_mask =3D BIT(0), + .status_y_mask =3D BIT(1), + .status_x_mask =3D BIT(2), + }, }, - .wakeup_src_reg =3D 0x45, - .wakeup_src_status_mask =3D BIT(3), - .wakeup_src_z_mask =3D BIT(0), - .wakeup_src_y_mask =3D BIT(1), - .wakeup_src_x_mask =3D BIT(2), }, }, { @@ -1935,7 +1971,7 @@ st_lsm6dsx_write_event(struct iio_dev *iio_dev, if (val < 0 || val > 31) return -EINVAL; =20 - reg =3D &hw->settings->event_settings.wakeup_reg; + reg =3D &hw->settings->event_settings.sources[ST_LSM6DSX_EVENT_WAKEUP].va= lue; data =3D ST_LSM6DSX_SHIFT_VAL(val, reg->mask); err =3D st_lsm6dsx_update_bits_locked(hw, reg->addr, reg->mask, data); @@ -2420,6 +2456,7 @@ static bool st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw) { const struct st_lsm6dsx_event_settings *event_settings; + const struct st_lsm6dsx_event_src *src; int err, data; s64 timestamp; =20 @@ -2427,13 +2464,14 @@ st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw= *hw) return false; =20 event_settings =3D &hw->settings->event_settings; - err =3D st_lsm6dsx_read_locked(hw, event_settings->wakeup_src_reg, + src =3D &event_settings->sources[ST_LSM6DSX_EVENT_WAKEUP]; + err =3D st_lsm6dsx_read_locked(hw, src->status.addr, &data, sizeof(data)); if (err < 0) return false; =20 timestamp =3D iio_get_time_ns(hw->iio_devs[ST_LSM6DSX_ID_ACC]); - if ((data & hw->settings->event_settings.wakeup_src_z_mask) && + if ((data & src->status_z_mask) && (hw->enable_event & BIT(IIO_MOD_Z))) iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], IIO_MOD_EVENT_CODE(IIO_ACCEL, @@ -2443,7 +2481,7 @@ st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *= hw) IIO_EV_DIR_EITHER), timestamp); =20 - if ((data & hw->settings->event_settings.wakeup_src_y_mask) && + if ((data & src->status_y_mask) && (hw->enable_event & BIT(IIO_MOD_Y))) iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], IIO_MOD_EVENT_CODE(IIO_ACCEL, @@ -2453,7 +2491,7 @@ st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *= hw) IIO_EV_DIR_EITHER), timestamp); =20 - if ((data & hw->settings->event_settings.wakeup_src_x_mask) && + if ((data & src->status_x_mask) && (hw->enable_event & BIT(IIO_MOD_X))) iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], IIO_MOD_EVENT_CODE(IIO_ACCEL, @@ -2463,7 +2501,7 @@ st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *= hw) IIO_EV_DIR_EITHER), timestamp); =20 - return data & event_settings->wakeup_src_status_mask; + return data & src->status.mask; } =20 static irqreturn_t st_lsm6dsx_handler_thread(int irq, void *private) --=20 2.39.5 From nobody Mon Dec 1 21:33:25 2025 Received: from mail-ot1-f54.google.com (mail-ot1-f54.google.com [209.85.210.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 41C94302CC7 for ; Mon, 1 Dec 2025 10:00:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583238; cv=none; b=uHOEBwcstXUTMlxRKlRPDmBU/V7xPh3XmUacPzMhtM8qUdBHX1FHMw0AC7TAV8pt7tXD0U4x/mk/08aJ7EFgiBUvVsqTeGfIn+VEqx0WxgoOl7+oUV4I1B5ujp3zJZn0LcyMOGygJKDweOztA+6Biwr2E9M3Sv42Z9oVXkq5D60= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583238; c=relaxed/simple; bh=h/L2zhPfn2Gbd634jm4+Ta6MvmpxMumLED/InTCkazs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=MmQaSadPX/Zv+4IVDIj8fZ3AaDvvTuAm0t70L7POEwXY6qfF9e1mAj2glQYVm+joXHOkzf6L7X8Pm6hwb7kBF5XBf746JQHQs/bKb7O1fDtYUnzXIRwwoJJsJhkGvnedk562783rPqxpMZtUVU7UArZ24bvu0XLf7ghXPehJo/Y= 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=T9T8iShB; arc=none smtp.client-ip=209.85.210.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="T9T8iShB" Received: by mail-ot1-f54.google.com with SMTP id 46e09a7af769-7c7503c73b4so2302167a34.3 for ; Mon, 01 Dec 2025 02:00:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1764583235; x=1765188035; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vttCzqYG+Cs7YHIz7IHkrbbgN3J8iVBx1Ck/rBWwG+E=; b=T9T8iShB8aRpu+jvoV6hvCzjhXjPHvYLotqbQwyZOykGwHignw87vRsYdD1d9dwV2s vGcZ3MyUm7PzvhlM7D9z+rDPPPiTDL7e+l1y/vaaGxXMyWcmrMgeT51R3NLyIxoATu/S QB3Sthl9jTDiQfp7K3REYi9s/8DC312VJYR9heVpGKuEJbLZ1i0N4TaV7OOhrK9gGO41 A9IafUEUPW9TSJ/1+k+/q7gJePTqpgJhiNIMKcRBLs4yGFr4vv/RaMWexAwA2NtF8YUD pR6T3eVstkjfJWyqE2Sa7WN04zKSvaxGB8NamTKqikYkW0YO/glqp4eHz/26VMUAf0UM NnQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764583235; x=1765188035; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=vttCzqYG+Cs7YHIz7IHkrbbgN3J8iVBx1Ck/rBWwG+E=; b=t9AicGMxYBtL6T3bINwlyApBoC72aLgSD9bwk6RIVPt4bJpDuwfU7x0tMa2tWIWOHj XY/NDfRZLcafqqB2Wj60RE9roy9ad0g1fJ+6VKlCBYPEPx6nLZomL8S3GBI4j6ZrDdqL F1zuQB53uFOYulB6u7pGDE/dutW/RCPisYKVpdJau4jtasKPVAsAPCAIpAVZWyX00fy7 9XeglAaPgihKuAZkOy3hiZL03dFmD+YW5w/Omu51d9YL+i28jCuwsgJBb3tSuGbCQHWw JZQ7ubZHNI/hIwv/ollnLoi9Lx4pJ1SdEulpctVxJS4/4x2P0Vd6XSaGZACt86eSYU9P GkHA== X-Forwarded-Encrypted: i=1; AJvYcCWsmvNdIiHWb+I4pL1Ss9IDwvon/xYD+5tkaY9P3KAlgVH9LRoV9z0Fnimvgf+7ktePFbUF6/uWajkeaHQ=@vger.kernel.org X-Gm-Message-State: AOJu0YySTDXtOxao4o4M6KnkPpBFnXp+/SodLFJ+6F2j6jerWBuXmNAR R6uOjtWny47QpWwCPlm7xwHo/jDXWhMY8o3TXw/tV0c7eBMkxNb7awIioIiyRJQ8Zdw= X-Gm-Gg: ASbGnctlntlriwa43Twh3A18YU2B0oH3h8GqPmbGDHpSVfq/z8n9tRS6QnbrYhf1+Qm U8vv0Zmo8I5X1XryhxF3XIwIVeEPxUmsZP4GY/MI8aET3vG7NqC3llPugyHnlYgG6YrP1qNOM5J B75QuvRkWJBY8+YE/pHlRoCKu+DJMhn0KqWKl29LPYbXf5Olp23FnJYvcjC6kEqdLA1sLdgEDdc 5mDp7BdwIc+FoiXcPkhRUiS9AGRQFgXPtOHDd5Lvf7FaJYJSfLk3PuLG/m4gn4j7NtHoVErBs/t tQt8Q9MJZe6WXqseWZ8kwdWEQ1g7/SR751Hr7+TCuHYcZOY+Xvd18ouglbDwNjh+Dr03RW9Xyhh dqwJSw2R8EPUVbyF+QBnMJ8s9z3ynpOS4xNlU3CzKZoSSuEgh0tWDM/dA X-Google-Smtp-Source: AGHT+IH7ZXhKoR6QdClQKtV9d4tJbGaLp0zYNqtJ/pVkxVzNrRm1NwbNfJv/moDNWmGyhyh6+uGaNw== X-Received: by 2002:a05:6830:6f0e:b0:7bd:f7c:ee with SMTP id 46e09a7af769-7c7990938c3mr15929504a34.25.1764583234871; Mon, 01 Dec 2025 02:00:34 -0800 (PST) Received: from localhost ([151.35.151.28]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-65933ef2772sm2404465eaf.17.2025.12.01.02.00.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 02:00:33 -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 Cc: Andy Shevchenko Subject: [PATCH v4 3/9] iio: imu: st_lsm6dsx: move wakeup event enable mask to event_src Date: Mon, 1 Dec 2025 11:00:12 +0100 Message-Id: <20251201100018.426749-4-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251201100018.426749-1-flavra@baylibre.com> References: <20251201100018.426749-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=7475; i=flavra@baylibre.com; h=from:subject; bh=h/L2zhPfn2Gbd634jm4+Ta6MvmpxMumLED/InTCkazs=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpLWb4IWxqnj1iMqMM7C1xI7zGHft1pA3TgJ8Du 3wXagqwTE6JAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaS1m+AAKCRDt8TtzzpQ2 X8yZC/9QliEPg2bAB+HsEAR+Kte5NAi9Ci6IPu0GEtSkwGgkRE7RoxnywqldPG2dLob4w/2Mc7/ iyrWQoCNF3X9FBfTd9UNJrfh00Wju7Jg1rqpUk91UBr5vygfJUF6FzxfsDpol0ueUohhfuidQYO QVQ7VMNlfTG52GmT9LyDbLNgn3zSIISFAUl56jk/AeZiNpDseKTeBQEb1VovyWn/StROI2iRbVc GUogZBCzI/8uGk7ZzmiA6+adegA3G7BB0XWvCjNJtMTazpRogynaiWVQcleq3yJFxp77trwuOPR MFgR2m9ERjJ5FMp28DvWe0bpXQZ3aQly27dUL0nXFU5aKGHTqrIdXUAxQVg2yBTXjEHhzMNJNxn 7TMz3qTusODYGAgjX8LAA1po4de1bDmLSNv8RGMJONrVHh84Tz9mFdb2sQmtKJvVHl1M2t+/8gt 0qwopefsLxVzQxDmVeYopp5nxKab1qY8d87VeqyHc10EvR04t3T4BY1/cIYJkVZXRJReo= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The mask value being assigned to the irq1_func and irq2_func fields of the irq_config struct is specific to a single event source (i.e. the wakeup event), and as such it should be separate from the definition of the interrupt function registers, which cover multiple event sources. In preparation for adding support for more event types, change the irq1_func and irq2_func type from an {address, mask} pair to an address, and move the mask value to a new field of struct st_lsm6dsx_event_src. No functional changes. Signed-off-by: Francesco Lavra Reviewed-by: Andy Shevchenko Acked-by: Lorenzo Bianconi --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 7 +- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 80 +++++++------------- 2 files changed, 30 insertions(+), 57 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index 80bc5686454b..4200e5231950 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -249,6 +249,7 @@ enum st_lsm6dsx_event_id { =20 struct st_lsm6dsx_event_src { struct st_lsm6dsx_reg value; + u8 enable_mask; struct st_lsm6dsx_reg status; u8 status_x_mask; u8 status_y_mask; @@ -343,8 +344,8 @@ struct st_lsm6dsx_settings { struct { struct st_lsm6dsx_reg irq1; struct st_lsm6dsx_reg irq2; - struct st_lsm6dsx_reg irq1_func; - struct st_lsm6dsx_reg irq2_func; + u8 irq1_func; + u8 irq2_func; struct st_lsm6dsx_reg lir; struct st_lsm6dsx_reg clear_on_read; struct st_lsm6dsx_reg hla; @@ -443,7 +444,7 @@ struct st_lsm6dsx_hw { u8 ts_sip; u8 sip; =20 - const struct st_lsm6dsx_reg *irq_routing; + u8 irq_routing; u8 event_threshold; u8 enable_event; =20 diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index e8f0a2ff91be..ba163dd2ab82 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -328,14 +328,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sen= sor_settings[] =3D { .addr =3D 0x58, .mask =3D BIT(0), }, - .irq1_func =3D { - .addr =3D 0x5e, - .mask =3D BIT(5), - }, - .irq2_func =3D { - .addr =3D 0x5f, - .mask =3D BIT(5), - }, + .irq1_func =3D 0x5e, + .irq2_func =3D 0x5f, .hla =3D { .addr =3D 0x12, .mask =3D BIT(5), @@ -394,6 +388,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sens= or_settings[] =3D { .addr =3D 0x5b, .mask =3D GENMASK(5, 0), }, + .enable_mask =3D BIT(5), .status =3D { .addr =3D 0x1b, .mask =3D BIT(3), @@ -500,14 +495,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sen= sor_settings[] =3D { .addr =3D 0x58, .mask =3D BIT(0), }, - .irq1_func =3D { - .addr =3D 0x5e, - .mask =3D BIT(5), - }, - .irq2_func =3D { - .addr =3D 0x5f, - .mask =3D BIT(5), - }, + .irq1_func =3D 0x5e, + .irq2_func =3D 0x5f, .hla =3D { .addr =3D 0x12, .mask =3D BIT(5), @@ -566,6 +555,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sens= or_settings[] =3D { .addr =3D 0x5b, .mask =3D GENMASK(5, 0), }, + .enable_mask =3D BIT(5), .status =3D { .addr =3D 0x1b, .mask =3D BIT(3), @@ -702,14 +692,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sen= sor_settings[] =3D { .addr =3D 0x58, .mask =3D BIT(0), }, - .irq1_func =3D { - .addr =3D 0x5e, - .mask =3D BIT(5), - }, - .irq2_func =3D { - .addr =3D 0x5f, - .mask =3D BIT(5), - }, + .irq1_func =3D 0x5e, + .irq2_func =3D 0x5f, .hla =3D { .addr =3D 0x12, .mask =3D BIT(5), @@ -809,6 +793,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sens= or_settings[] =3D { .addr =3D 0x5b, .mask =3D GENMASK(5, 0), }, + .enable_mask =3D BIT(5), .status =3D { .addr =3D 0x1b, .mask =3D BIT(3), @@ -957,14 +942,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sen= sor_settings[] =3D { .addr =3D 0x56, .mask =3D BIT(6), }, - .irq1_func =3D { - .addr =3D 0x5e, - .mask =3D BIT(5), - }, - .irq2_func =3D { - .addr =3D 0x5f, - .mask =3D BIT(5), - }, + .irq1_func =3D 0x5e, + .irq2_func =3D 0x5f, .hla =3D { .addr =3D 0x12, .mask =3D BIT(5), @@ -1052,6 +1031,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_se= nsor_settings[] =3D { .addr =3D 0x5b, .mask =3D GENMASK(5, 0), }, + .enable_mask =3D BIT(5), .status =3D { .addr =3D 0x1b, .mask =3D BIT(3), @@ -1176,14 +1156,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_s= ensor_settings[] =3D { .addr =3D 0x56, .mask =3D BIT(6), }, - .irq1_func =3D { - .addr =3D 0x5e, - .mask =3D BIT(5), - }, - .irq2_func =3D { - .addr =3D 0x5f, - .mask =3D BIT(5), - }, + .irq1_func =3D 0x5e, + .irq2_func =3D 0x5f, .hla =3D { .addr =3D 0x12, .mask =3D BIT(5), @@ -1239,6 +1213,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_se= nsor_settings[] =3D { .addr =3D 0x5b, .mask =3D GENMASK(5, 0), }, + .enable_mask =3D BIT(5), .status =3D { .addr =3D 0x1b, .mask =3D BIT(3), @@ -1357,14 +1332,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_s= ensor_settings[] =3D { .addr =3D 0x56, .mask =3D BIT(0), }, - .irq1_func =3D { - .addr =3D 0x5e, - .mask =3D BIT(5), - }, - .irq2_func =3D { - .addr =3D 0x5f, - .mask =3D BIT(5), - }, + .irq1_func =3D 0x5e, + .irq2_func =3D 0x5f, .hla =3D { .addr =3D 0x03, .mask =3D BIT(4), @@ -1451,6 +1420,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_se= nsor_settings[] =3D { .addr =3D 0x5b, .mask =3D GENMASK(5, 0), }, + .enable_mask =3D BIT(5), .status =3D { .addr =3D 0x45, .mask =3D BIT(3), @@ -1911,10 +1881,11 @@ static int st_lsm6dsx_write_raw(struct iio_dev *iio= _dev, static int st_lsm6dsx_event_setup(struct st_lsm6dsx_hw *hw, bool state) { const struct st_lsm6dsx_reg *reg; + const struct st_lsm6dsx_event_src *src; unsigned int data; int err; =20 - if (!hw->settings->irq_config.irq1_func.addr) + if (!hw->irq_routing) return -ENOTSUPP; =20 reg =3D &hw->settings->event_settings.enable_reg; @@ -1927,9 +1898,10 @@ static int st_lsm6dsx_event_setup(struct st_lsm6dsx_= hw *hw, bool state) } =20 /* Enable wakeup interrupt */ - data =3D ST_LSM6DSX_SHIFT_VAL(state, hw->irq_routing->mask); - return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing->addr, - hw->irq_routing->mask, data); + src =3D &hw->settings->event_settings.sources[ST_LSM6DSX_EVENT_WAKEUP]; + data =3D ST_LSM6DSX_SHIFT_VAL(state, src->enable_mask); + return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing, + src->enable_mask, data); } =20 static int st_lsm6dsx_read_event(struct iio_dev *iio_dev, @@ -2183,11 +2155,11 @@ st_lsm6dsx_get_drdy_reg(struct st_lsm6dsx_hw *hw, =20 switch (drdy_pin) { case 1: - hw->irq_routing =3D &hw->settings->irq_config.irq1_func; + hw->irq_routing =3D hw->settings->irq_config.irq1_func; *drdy_reg =3D &hw->settings->irq_config.irq1; break; case 2: - hw->irq_routing =3D &hw->settings->irq_config.irq2_func; + hw->irq_routing =3D hw->settings->irq_config.irq2_func; *drdy_reg =3D &hw->settings->irq_config.irq2; break; default: --=20 2.39.5 From nobody Mon Dec 1 21:33:25 2025 Received: from mail-qt1-f178.google.com (mail-qt1-f178.google.com [209.85.160.178]) (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 30F68303CA2 for ; Mon, 1 Dec 2025 10:00:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583243; cv=none; b=gj/dieKuLnd65qNnnX4um0LENheFGjUVGTKjbT4WS3F7hm+2BHXkV9tM3a/FO9noUJk84jMjUf45IZwxzmbGWbrHkcN2shLLi0qZyrwaWu0nsXTksJrmz/0y+ZRxvEIzYVHKGGTqzboW374+fCC91HNRWgsefDMNWOtHQojVgR8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583243; c=relaxed/simple; bh=DqJyjrJckqTFCFbsp+ufeGsL49os8RH1HQOvg32AKQk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=c5uBx7bFzPDPrbZ3M1zPL7oL8FvviA6olLJg4oS3oPQQW/9xkrOdT0++dEHdK4q4cPmq7oXKzA1MD6MWdAGv7hNpwhib/Cy0R3uIl3Y5PRVaaFVHWX3RVly0ad5W+MGPRbcbgZtZGVSjpBDXiDK+5GHHWsYZBV6f7lO+vVJEWe8= 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=ohmCkulh; arc=none smtp.client-ip=209.85.160.178 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="ohmCkulh" Received: by mail-qt1-f178.google.com with SMTP id d75a77b69052e-4ee257e56aaso34490221cf.0 for ; Mon, 01 Dec 2025 02:00:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1764583241; x=1765188041; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=T/17Tgx9epkg1KaWaLaodjBbzP+GCzteuD35HmwuiLE=; b=ohmCkulh3dF6owAaxwyJ2yNOpptDftQdL7cylnoTwxhvdBtYHgn2H7mBNKqBbgZs8P CJ+/FbdsKT3NNbFi3W5xd/nOM0sPN5cjPV2plVsYhqxbE+76T6qRVYUbTZpU/DXFB4am ICtV/IuvIdv9VnWECnkP9YgM2mWV+8KWaJ3f326KaRNttm6wWwnKeS8rrAKc0Qle4Vp/ wivun6JasHK9POraU+Tem92JaqVgI/TukyY11YeFPD7ByHaXSBwQBh/1g72FA6SLe8eM OP7t02GKX/UruNzFJ087I7lOCQxp1aTVETEDJ08Zkhl1DntjZvAUhd9RL4ztdjf561J7 gq+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764583241; x=1765188041; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=T/17Tgx9epkg1KaWaLaodjBbzP+GCzteuD35HmwuiLE=; b=rGU2K+dER3HjIsMTn+5SrRQaMSSnmNh/bhRrnvWwzhsYLqz4tEOVVA02TseNCCPv9b xCbKaW6MAkys6kZeaodslum2JCHHk4sMwDRkUndIL7855A6zhTcCMERBgefQI0sNf6+n jyrFii8on3r44mmpFUsg8qf029lwR28eA1E9SKXEM7SIWWS/oqhSUlAwcE0UstiXyZjJ JRMHqy7zY3yQz6IR7aF4sLj7WinL0rP5c98iQ6QCoDjOUYvkx8G59rDDpDao/g5OfWt5 N36G2m1/xQvjP5wgJCrNIeBBtJox3dIeypXrqYDWPP8Dr0QigJNI0lgi2zvdImxI92kT PL7w== X-Forwarded-Encrypted: i=1; AJvYcCWznz1eYvmDcFIRoyounZNuOfE6IMTHh/82nioSgwyFlAObIfVz6X+yd4RsGgaT+2+UlBYu76yzgWiqY0o=@vger.kernel.org X-Gm-Message-State: AOJu0YyKly9dZvuWeOhmGP4w/qOoxdN2hQ+4bu3PbvH6fLY6F/fvGjqM /CAeeCg3VPcYyya8+cRGGicLesnXyG1313mUbNH19UbgMGL+f/RNvSNvL1lsrl1rPwA= X-Gm-Gg: ASbGnctXtDn2LRYnN5Rxc/1ZJVLgqwMNg0myv/pBDRb3ChBqR8g6tOnCVbv0BDynNAD hxh3BL6G1HOVC26Pkq6R4zWcnF8yUt+HhoNF5Okv8bwwqvulebMzY5eaXwQsguoon5FDUhbxCTR moy+1wRXBUnXp8fLQU94hk5EOyqaBzCObm5Z3bR0sipKmnjhoTiAENNWEvUVP9iu3mQIpXr9yBe k4bByS9Tx65flpRqI2W0U99T0iyOI3jyUdjyNnDD4nKX0qzMu5oEg/0NvEmEasmU9Sg42uDOMsX XbBCpHp5w7cqGMhzCK5SwaWfy2SUmrQLPCS1mUnKvdnPgZWKJW0UiluOJt+LbrT66Vt/LzZeg/3 4QGtaK8EuhfGDWRpu1h2rJKBSZN6+xPnPxOGyndAWiVFLr1jnzdPoDrn5Degls+M0Rps= X-Google-Smtp-Source: AGHT+IF0TOZFmwIWOLrHLyZQYtM2iUe56kUUp8TGyGHg3pPd5q5rSIt0wA202Kpwhe7oz7ic1nTIEg== X-Received: by 2002:ac8:5805:0:b0:4ee:24d0:4539 with SMTP id d75a77b69052e-4ee4b4184damr564427851cf.6.1764583240445; Mon, 01 Dec 2025 02:00:40 -0800 (PST) Received: from localhost ([151.35.151.28]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-4efd3443375sm70552381cf.29.2025.12.01.02.00.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 02:00:39 -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 Cc: Andy Shevchenko Subject: [PATCH v4 4/9] iio: imu: st_lsm6dsx: rework code to check for enabled events Date: Mon, 1 Dec 2025 11:00:13 +0100 Message-Id: <20251201100018.426749-5-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251201100018.426749-1-flavra@baylibre.com> References: <20251201100018.426749-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=2722; i=flavra@baylibre.com; h=from:subject; bh=DqJyjrJckqTFCFbsp+ufeGsL49os8RH1HQOvg32AKQk=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpLWb5MQVpJcwRohUAGn+A7Rc5GiIcg+Cr4E5+E EzqWf8+OkWJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaS1m+QAKCRDt8TtzzpQ2 XxbvDACnfrJ5wnpg/i8QGcJDLYPdI1bk0vJzhu4uQA7AZNuQPscX5gp66ogwx6x9fJwrRhnm6PI kNzXXzWjAejtTnX/JICvn5yn7oZKqCQPMqOCWW5kNggyOmAdNGAjuzEsVH18ccW4kDKJ6u6EEYa cKkr6WEzWZY0PCbN6snSbHJmPeWt3nisMW7U7bmU6bJ9U3+hpxHw4HImsn0x2L+M6jW+pB43o2Y gG4AWoA4VBSgowws/A+/jaQmL5gxRQCY8OChJbb8KScjjWQx8ge99kpHxZfHmR4s5Jt/NVRJSuX 281gQWiX7yk9a3eE6RESk33zY+23s89VTfgBANpNHzUrsmv11w5g8JkRge9JxHM97hW7u+bQRCQ y23UN8jjEVjdIj/UmJSXFb2aS1Z/355nR9vnmOGRbwmzk1ca6I3lKAUg0346h1bfA97lVGfxr/7 qjMH55y3I1PiRR9xi0O7KXGZJ3rb+iAC0ISVtK/zT5c2RBM/1HvxhBUtdPfAyZ3Ac0gzA= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The enable_event field in struct st_lsm6dsx_hw does not lend itself well to handling multiple event sources, so it will have to be modified to add support for more event sources. As a preparatory step, remove references to this field from code that does not deal with event management; rework the st_lsm6dsx_check_events() function so that it returns whether any events are currently enabled on a given sensor. Signed-off-by: Francesco Lavra Reviewed-by: Andy Shevchenko --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index ba163dd2ab82..828e495c870c 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -1756,11 +1756,11 @@ __st_lsm6dsx_sensor_set_enable(struct st_lsm6dsx_se= nsor *sensor, } =20 static int -st_lsm6dsx_check_events(struct st_lsm6dsx_sensor *sensor, bool enable) +st_lsm6dsx_check_events(struct st_lsm6dsx_sensor *sensor) { struct st_lsm6dsx_hw *hw =3D sensor->hw; =20 - if (sensor->id =3D=3D ST_LSM6DSX_ID_GYRO || enable) + if (sensor->id !=3D ST_LSM6DSX_ID_ACC) return 0; =20 return hw->enable_event; @@ -1769,7 +1769,7 @@ st_lsm6dsx_check_events(struct st_lsm6dsx_sensor *sen= sor, bool enable) int st_lsm6dsx_sensor_set_enable(struct st_lsm6dsx_sensor *sensor, bool enable) { - if (st_lsm6dsx_check_events(sensor, enable)) + if (st_lsm6dsx_check_events(sensor)) return 0; =20 return __st_lsm6dsx_sensor_set_enable(sensor, enable); @@ -1797,11 +1797,9 @@ static int st_lsm6dsx_read_oneshot(struct st_lsm6dsx= _sensor *sensor, if (err < 0) return err; =20 - if (!hw->enable_event) { - err =3D st_lsm6dsx_sensor_set_enable(sensor, false); - if (err < 0) - return err; - } + err =3D st_lsm6dsx_sensor_set_enable(sensor, false); + if (err < 0) + return err; =20 *val =3D (s16)le16_to_cpu(data); =20 @@ -2762,7 +2760,7 @@ static int st_lsm6dsx_suspend(struct device *dev) continue; =20 if (device_may_wakeup(dev) && - sensor->id =3D=3D ST_LSM6DSX_ID_ACC && hw->enable_event) { + st_lsm6dsx_check_events(sensor)) { /* Enable wake from IRQ */ enable_irq_wake(hw->irq); continue; @@ -2793,7 +2791,7 @@ static int st_lsm6dsx_resume(struct device *dev) =20 sensor =3D iio_priv(hw->iio_devs[i]); if (device_may_wakeup(dev) && - sensor->id =3D=3D ST_LSM6DSX_ID_ACC && hw->enable_event) + st_lsm6dsx_check_events(sensor)) disable_irq_wake(hw->irq); =20 if (!(hw->suspend_mask & BIT(sensor->id))) --=20 2.39.5 From nobody Mon Dec 1 21:33:25 2025 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DCE4F3043AC for ; Mon, 1 Dec 2025 10:00:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583245; cv=none; b=J48O06c4dEjhol8yRv9LjiSbH18ldPZUuX37bS/QiY33s7Yksn+ep2qx7YKg8M82ijr/SxmI5pwU6/RJiHcMe2zAELIBYzYX0tvE9s+BmYHKDeVvDN4SO1gEJFut/uOxZuOlM5EM3oiEur1ZxRgwHSO1yj0q6OhVHmITh3yDbeI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583245; c=relaxed/simple; bh=Hb1zr2alwVQYcp7QMo+P9C4EGA5XkhpF1f4WPadLW7c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DIxuMug7vYbq3oaMPsLXRIeN4EhYy8Yulcug1HYpzIJoOQTTHgsOBFqIEiQbbod7a+WEz6JDT2vXU+caFFw+9nDOCC4Eo6EJAaS0JeaCqv1oeVognKOmmOHLVk45D/oMQ5xhZBwL4w2ltnNo4mBdOYJ8z7D5Q4CVfGGMrzwpAgg= 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=IM2bHuVZ; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="IM2bHuVZ" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-b7373fba6d1so625090966b.3 for ; Mon, 01 Dec 2025 02:00:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1764583242; x=1765188042; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UfRpMGSd7y9d0byFFdqTrDp2AlO8u4+9bS6XzrmHfjQ=; b=IM2bHuVZVj7TEGeea62sVbv129+HpSuMrH3EFduTqKtSy/qLw/UigE2AiYGGxUaHdB zbm0K6HwdE0er1fG2tDjR2jkR/XPoJ8u5EWkqanhABFF4IEX69KMXman1C06YeEE3/fs nHIoIXcdB1S73UPgsh4jQB7uJkMIuPDT5k1elOob0qLrsoHi83v6rZRZKjcSW3zRZIju q3Xc04OTs6b/j21t7o6x2D8rb2mtQPm0f8SfJvR0sKZVKYTAusYyjrHKAxtXxWOhroQn AK0dhlAzqPd2x+OaGpD98z0P8akb3SA/CcfqPN4X4Xyil5KWO7PYDdVOwGWRCTgGUbpQ d2yA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764583242; x=1765188042; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=UfRpMGSd7y9d0byFFdqTrDp2AlO8u4+9bS6XzrmHfjQ=; b=FXt7DItO/QTnwD/W0sJDCLL9q4hDxycGu8XEecOJMfx+/ycKpj6YohZTXL8Gok0Rdv xpROhw1b7ASiaG0ZYuTecsXYuWCzSZF2z/ceyoi2+q0/uD2jfGicgXxqxkEVbGxvki/p Bc83w4wjgbCe2ibZs1GDVg+4oQWD9ArRdF9kaRGYfmM/UY0hNFfQHee1lvt6Yt1nO3t0 UUHBPcofORUldluIEV2WcKxHfV1JxNl1JoZgaIuhvzUkLQsMrdBhyzNp88l3/IO4xzgM BVLgr9kn6zk7gruYEjKM1qfCHJJbKHR8LY9ySiUeS9r+lf0fOj6LoXR4xP0vaGoPMpYN c0mw== X-Forwarded-Encrypted: i=1; AJvYcCVkduoidSog2LOM7YxTh2FTwAPZGNmYST/bSNtLPTF8/NpdFfFwrSQWKZEsESr1xwMnJ7kWaEXJj+E89jY=@vger.kernel.org X-Gm-Message-State: AOJu0YwBCfGO9D6TC/JA1ROCD6VVdUTXkXxbnT0ABr1oP2AYU7OjR1CN mNDl/LXNAp7ZlrWHC10fx0Hxl/IcgUe8HpkN/tsap7PinrY6eFF/EzQDCLmO5Z5hVDQ= X-Gm-Gg: ASbGncupqUTJhf7QEvHqp/5U2/464+M0GW1nvM2KtREtjDQ5c5xKI34TmWsseikMPMy rbO94Ry/SB35UDIdwixzvJXROT6IbDDjMh+6k/N0lioEP16zDegSWIXgQMzhSOnd9gKoFZFKZt7 X/e5pwaq+7Du9BvmKC2bPSZC3mqS0ot+Xho6/DTscs7YjkFuoaVOlI0RTAjKgzo993bIMfgM0Xc OrTd230PJ55DNp3KifNJIVCzHrSyjycROicI6zXLzu7f40YCSUvcW6DnAxym16IGd7Wg7SKMJbv K8bJOpyl3F9yVi6Tx6SjjVcWXUvE4IiLih1SLBSKgyv/GctxXqpZD6G2CcTEqhhPmZIIhPDX4TL z++su6/O+r69ArhjolA+Q7Jsf9UYU2kSZCO8ftc+9qy6RDysYkww8U5SAo/pyOInMgkM= X-Google-Smtp-Source: AGHT+IFG/lUWatn33AA2wWd09wsuBnOWD/+GXbAzbWeEhM/nMJxl9/I1ahJbDtANZJeZXogum1i+fA== X-Received: by 2002:a17:907:3f9c:b0:b73:7f1c:b8d8 with SMTP id a640c23a62f3a-b767129709dmr3735719366b.0.1764583242142; Mon, 01 Dec 2025 02:00:42 -0800 (PST) Received: from localhost ([151.35.151.28]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b76f59eb401sm1146916566b.54.2025.12.01.02.00.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 02:00:41 -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 Cc: Andy Shevchenko Subject: [PATCH v4 5/9] iio: imu: st_lsm6dsx: remove event_threshold field from hw struct Date: Mon, 1 Dec 2025 11:00:14 +0100 Message-Id: <20251201100018.426749-6-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251201100018.426749-1-flavra@baylibre.com> References: <20251201100018.426749-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=2908; i=flavra@baylibre.com; h=from:subject; bh=Hb1zr2alwVQYcp7QMo+P9C4EGA5XkhpF1f4WPadLW7c=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpLWb5TjcYUfLEOFcXnMU2lpB8wmZGiiVcFvMuJ mTWraWzVvOJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaS1m+QAKCRDt8TtzzpQ2 XwKdC/4yPo7OYLrz2wCIsqz/WNMYNbCJYj/1+95VGKLsCkOXpR8oYV7vAlTH6sS5WCHSrXyI0qL ARftaaLJ7AFaMnmhHXcnDKe0tYSO2zpB58PaX/WCdC1o9yrpjTsTt25tkXzmVWptUCg6vZbzCFO wod86tUpQrouL6wF+6Lt8lyfWpAOyqLEvwYJLXB6FVnSo/wscOgTimLrP7IMhx6SQxD/IfpxsqF k0HqN6WHFWm7pWtsTK7FKLlzWamHPjs3vM/mi8dLYnMrLr2A3nuOX3aWR8LexqXL9sd5EUD9gnE Z4EN4K0dNt2sAOaRL7RUptxoeqGedlkitwI1c8t4vOr53/nP2BSuZRMhn1bqO3hyJEtnRfNC/sn K9WcgxYk87GiQeKxHGn1GH+HleAl+NrPYGo7xBgwUv3zi9NvmGAm23UmGOitWxDmAS6c9omBv/z Hfm4gpRUBPjEBP6r6UecmNFlvxIoMDc4w0HVcjpbvVWTebuJ5IX4rmvpPRUc5zaN0+MGM= 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 store the wakeup event detection threshold value. When adding support for more event types, some of which may have different threshold values for different axes, storing all threshold values for all event sources would be cumbersome. Thus, remove this field altogether, and read the currently configured value from the sensor when requested by userspace. Signed-off-by: Francesco Lavra Reviewed-by: Andy Shevchenko --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 3 +-- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index 4200e5231950..b27a833d5107 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -79,6 +79,7 @@ enum st_lsm6dsx_hw_id { #define ST_LSM6DSX_MAX_TAGGED_WORD_LEN ((32 / ST_LSM6DSX_TAGGED_SAMPLE_SIZ= E) \ * ST_LSM6DSX_TAGGED_SAMPLE_SIZE) #define ST_LSM6DSX_SHIFT_VAL(val, mask) (((val) << __ffs(mask)) & (mask)) +#define st_lsm6dsx_field_get(mask, reg) ((reg & mask) >> __ffs(mask)) =20 #define ST_LSM6DSX_CHANNEL_ACC(chan_type, addr, mod, scan_idx) \ { \ @@ -421,7 +422,6 @@ struct st_lsm6dsx_sensor { * @sip: Total number of samples (acc/gyro/ts) in a given pattern. * @buff: Device read buffer. * @irq_routing: pointer to interrupt routing configuration. - * @event_threshold: wakeup event threshold. * @enable_event: enabled event bitmask. * @iio_devs: Pointers to acc/gyro iio_dev instances. * @settings: Pointer to the specific sensor settings in use. @@ -445,7 +445,6 @@ struct st_lsm6dsx_hw { u8 sip; =20 u8 irq_routing; - u8 event_threshold; u8 enable_event; =20 u8 *buff; diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index 828e495c870c..dbdf9bb9e258 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -1911,12 +1911,20 @@ static int st_lsm6dsx_read_event(struct iio_dev *ii= o_dev, { struct st_lsm6dsx_sensor *sensor =3D iio_priv(iio_dev); struct st_lsm6dsx_hw *hw =3D sensor->hw; + const struct st_lsm6dsx_reg *reg; + u8 data; + int err; =20 if (type !=3D IIO_EV_TYPE_THRESH) return -EINVAL; =20 + reg =3D &hw->settings->event_settings.sources[ST_LSM6DSX_EVENT_WAKEUP].va= lue; + err =3D st_lsm6dsx_read_locked(hw, reg->addr, &data, sizeof(data)); + if (err < 0) + return err; + *val2 =3D 0; - *val =3D hw->event_threshold; + *val =3D st_lsm6dsx_field_get(reg->mask, data); =20 return IIO_VAL_INT; } @@ -1948,8 +1956,6 @@ st_lsm6dsx_write_event(struct iio_dev *iio_dev, if (err < 0) return -EINVAL; =20 - hw->event_threshold =3D val; - return 0; } =20 --=20 2.39.5 From nobody Mon Dec 1 21:33:25 2025 Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81249304BC6 for ; Mon, 1 Dec 2025 10:00:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583247; cv=none; b=n6uGPJVI1nzL+XmLKmg/9+C/BmuGhW5UTeYsrZ1hHMVuBOcsOjSyUQbgP4W60EQ4SRoFaXAr7ezb9xJHR/T7zyux+eOBi/5E2nREj7CI2c84deO4z29gsOZTFpEHtwKbX8T5pjquABZfiJqe1OBHFgI8Pa++T6SukUTAxsXY71M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583247; c=relaxed/simple; bh=I2wP8/v8+iTwp/IbXvF+LNCirEJ4rMBvnG2GqyV2YMI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=L/4T87tLafD8oH7jaIcQuh0PN0/WczR1XJxwjBBd0wBBu8WG4YQ6WMqM6Dw4lcMy7ABucs1t+1m/7iL8VnmmKGwtIAGK6AvjfIDKJ6VlcN2I8yZOsUu8LHqwk0SUWeN1xD6hnExiN35vcaWxcvvzBE+HJ9uL7dXqYfOW1aOEE20= 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=0z9leyOb; arc=none smtp.client-ip=209.85.208.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="0z9leyOb" Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-6431b0a1948so323192a12.3 for ; Mon, 01 Dec 2025 02:00:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1764583244; x=1765188044; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0JpMgD46UuIDmNrqgcRKLqCKR6U3UNIGWYWZqhE2Z4U=; b=0z9leyOb78LnpCpQD3Box0saKxyqF9bslEd0zZFjrQXYeyk9vYLHVWtmUQ609YZSaz MfO+F0qCbLTFQvLaSmQBL0O1uWh63tG0dIYnI/P1sp7r4PtfX2vOeCR+0k8p+ndngc4d Yw6QSbCPnnOcaH1CxjShpRSep9Qz+IbctGMYSqUk9t9Ztiyli6LbOFORQp8JpJvI/CyG M1N1UfkcNjtWkBRsVO/4JJYv3h9l/48qtNVQ/JV+s5WMSiH2lrfQtrDTmSJJBC9xflx3 /MEQlEwgQAVbrxnN2PPWc5iYcaC2042yA0i7+Xbe4p0WRi95XRsTu8XNHUQJlGWhmh6s CXaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764583244; x=1765188044; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=0JpMgD46UuIDmNrqgcRKLqCKR6U3UNIGWYWZqhE2Z4U=; b=s8gpXsxDlGPb++8nyYMBlI7tWKqWttb3oritPdE8NmUmJh6neXjjN+/i+4SEMX5DVm NufCTjKxVdZ/1XYbAaYzjMXycgeBWADSabMaLp7Gg1W5UWO500ghviGbnb3e68m3Poo5 i6FkDg12ckLkCOllVpPtbdls/3fwVm3/VzGPh+v4GHeWiz1wq3O2NmrWTDlGDm22ctWX LWAv3uIDLamTDdXHnlMFhCR4rLZdB/vATMLc9Omz8ZHB04E2b+Yo7SKKHS8BTECw4NOx SL/QpX+NS1RlNKWq+78ehN+DtJoKf7JxmeuChTWY4zJQJmyP3vqfYt1eW530sIqf8Ul2 Kruw== X-Forwarded-Encrypted: i=1; AJvYcCWuCJ+ivvy9JR8d5aNcfBIl1saEFJ+HeDtuOv2Xdz1N88b8reNB6Ex1kLcQAKa71ZNmiZ20wfKdZs/dz7U=@vger.kernel.org X-Gm-Message-State: AOJu0YxXZQvRa/OMeX10bYvmf0rFFCCEOARc0UfxSeKytrxJeIXAgK9W 93bgeOc/VOSakJ69iieaR9x9tHH+QCTpa7uXCXzBNf8w8ByU5o3JJ2Az8iw0SUjTX8w= X-Gm-Gg: ASbGnct6f3Cvplqkx2lcNeGDm60eSb9CHJHoWKJPRvP8T1B213z/+T8JXApYYh8d/FW e84TuVkLyZj253ybRIkS3O0ZlM4deca+JuY44sWr8ktn6/KpJraxYmSozhYasL1mJPEujRC0ZlB Bsb5bXwi6dIoUvcwaErTLT39l78wQbm6GIuLf599oArckYgqe0uZPY4aeIk38+Wv3ZsNsW3fzoG NphQC5wiIm4euLTETr8VoA55V3lHSPH+DvkqsqTyjp21KwrkNhWZ9rC0gYoDlI2ZZeR0bqoBDoZ 8fJZvvtwLEjorCnkoDZKWLUshAb/7VlNlQeZB1W1rssiJ7jWCOoFDljw2eKVW+d+wNviuThPXyF /xXmW3IsAaWR2RD9U0yxj5e+qymbWon4TjJN1z7ySQWtLrWrpwfBp8bfX X-Google-Smtp-Source: AGHT+IGGa8xdBt3SXYflxkPq8WEDGUrHlW065EwBJ0L3P1ifoX3XoJocf/urbzR9t6D8lAQEs5qFrA== X-Received: by 2002:a05:6402:5244:b0:645:e6b:4260 with SMTP id 4fb4d7f45d1cf-645eb2a86e4mr23027176a12.20.1764583243703; Mon, 01 Dec 2025 02:00:43 -0800 (PST) Received: from localhost ([151.35.151.28]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-64751035b75sm13049937a12.20.2025.12.01.02.00.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 02:00:43 -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 Cc: Andy Shevchenko Subject: [PATCH v4 6/9] iio: imu: st_lsm6dsx: make event management functions generic Date: Mon, 1 Dec 2025 11:00:15 +0100 Message-Id: <20251201100018.426749-7-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251201100018.426749-1-flavra@baylibre.com> References: <20251201100018.426749-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=11222; i=flavra@baylibre.com; h=from:subject; bh=I2wP8/v8+iTwp/IbXvF+LNCirEJ4rMBvnG2GqyV2YMI=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpLWb6dbr+4Y1eg2Sf/ylUoDZfk6O/zYPXRoNug tM7uHmzKSKJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaS1m+gAKCRDt8TtzzpQ2 Xw/wC/9rNAn+KlJXCHUpC4iCxPmIdZvOVan1GorqjR2t6cJzjRkF3ECyPJv1RJgHNNtZOjDtpzN dU1OLYaCy9cEXTyIkzkV2YSKRCJanJ79GLOWN23yilu0Otko5Vgi+b8FL5rqB6m+uxlRWOIpoOK f8QcsIkKXghvkPMDbTVJ0GMldd8SP3Cw8YPCvqi1kRuA+jFu0WqrBekRwO8M3wQOs65F+qRMfUG PqPo7WdRdUUD9ox87lou9jHhhnTzR2sOvY4JFAMeidOZ8tqJLB+OoWBzEvNDEO6KvNEFIW/mwZF jWbLb/bs3pcMtGFDb4qoxhKtjuDi+VYaZzjqGL+ZvfC+ewlTtUFTieE6LfPqKSgPSo1IT+Nn/JL GQb9QLQMniPJqguMsirG9USRU+aWoOVEWPtCTUCw5xzP03JcNJufQzQYJC4Vq1L9vj8asvoR25p URdlE1MpmhPTLl2BFI7ow3ZevtfgoPh+00ZcplYHcvayQskyMLkhUr0Vwby9RRG1xBXRk= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In preparation for adding support for more event types, use an array indexed by event ID instead of a scalar value to store enabled events, and refactor the functions to configure and report events so that their implementation is not specific for wakeup events. Move the logic to update the global event interrupt enable flag from st_lsm6dsx_event_setup() to its calling function, so that it can take into account also event sources different from the source being configured. While changing the signature of the st_lsm6dsx_event_setup() function, opportunistically add the currently unused `axis` parameter, which will be used when adding support for enabling and disabling events on a per axis basis. Signed-off-by: Francesco Lavra Reviewed-by: Andy Shevchenko Acked-by: Lorenzo Bianconi --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 2 +- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 150 ++++++++++++++----- 2 files changed, 110 insertions(+), 42 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index b27a833d5107..2aae56b7db0b 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -445,7 +445,7 @@ struct st_lsm6dsx_hw { u8 sip; =20 u8 irq_routing; - u8 enable_event; + u8 enable_event[ST_LSM6DSX_EVENT_MAX]; =20 u8 *buff; =20 diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index dbdf9bb9e258..6dc6cda54d05 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -1759,11 +1759,16 @@ static int st_lsm6dsx_check_events(struct st_lsm6dsx_sensor *sensor) { struct st_lsm6dsx_hw *hw =3D sensor->hw; + int event; =20 if (sensor->id !=3D ST_LSM6DSX_ID_ACC) return 0; =20 - return hw->enable_event; + for (event =3D 0; event < ST_LSM6DSX_EVENT_MAX; event++) { + if (hw->enable_event[event]) + return true; + } + return false; } =20 int st_lsm6dsx_sensor_set_enable(struct st_lsm6dsx_sensor *sensor, @@ -1876,9 +1881,10 @@ static int st_lsm6dsx_write_raw(struct iio_dev *iio_= dev, return err; } =20 -static int st_lsm6dsx_event_setup(struct st_lsm6dsx_hw *hw, bool state) +static int st_lsm6dsx_event_setup(struct st_lsm6dsx_hw *hw, + enum st_lsm6dsx_event_id event, int axis, + bool state) { - const struct st_lsm6dsx_reg *reg; const struct st_lsm6dsx_event_src *src; unsigned int data; int err; @@ -1886,22 +1892,24 @@ static int st_lsm6dsx_event_setup(struct st_lsm6dsx= _hw *hw, bool state) if (!hw->irq_routing) return -ENOTSUPP; =20 - reg =3D &hw->settings->event_settings.enable_reg; - if (reg->addr) { - data =3D ST_LSM6DSX_SHIFT_VAL(state, reg->mask); - err =3D st_lsm6dsx_update_bits_locked(hw, reg->addr, - reg->mask, data); - if (err < 0) - return err; - } - - /* Enable wakeup interrupt */ - src =3D &hw->settings->event_settings.sources[ST_LSM6DSX_EVENT_WAKEUP]; + /* Enable/disable event interrupt */ + src =3D &hw->settings->event_settings.sources[event]; data =3D ST_LSM6DSX_SHIFT_VAL(state, src->enable_mask); return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing, src->enable_mask, data); } =20 +static enum st_lsm6dsx_event_id +st_lsm6dsx_get_event_id(enum iio_event_type type) +{ + switch (type) { + case IIO_EV_TYPE_THRESH: + return ST_LSM6DSX_EVENT_WAKEUP; + default: + return ST_LSM6DSX_EVENT_MAX; + } +} + static int st_lsm6dsx_read_event(struct iio_dev *iio_dev, const struct iio_chan_spec *chan, enum iio_event_type type, @@ -1909,16 +1917,17 @@ static int st_lsm6dsx_read_event(struct iio_dev *ii= o_dev, enum iio_event_info info, int *val, int *val2) { + enum st_lsm6dsx_event_id event =3D st_lsm6dsx_get_event_id(type); struct st_lsm6dsx_sensor *sensor =3D iio_priv(iio_dev); struct st_lsm6dsx_hw *hw =3D sensor->hw; const struct st_lsm6dsx_reg *reg; u8 data; int err; =20 - if (type !=3D IIO_EV_TYPE_THRESH) + if (event =3D=3D ST_LSM6DSX_EVENT_MAX) return -EINVAL; =20 - reg =3D &hw->settings->event_settings.sources[ST_LSM6DSX_EVENT_WAKEUP].va= lue; + reg =3D &hw->settings->event_settings.sources[event].value; err =3D st_lsm6dsx_read_locked(hw, reg->addr, &data, sizeof(data)); if (err < 0) return err; @@ -1937,19 +1946,20 @@ st_lsm6dsx_write_event(struct iio_dev *iio_dev, enum iio_event_info info, int val, int val2) { + enum st_lsm6dsx_event_id event =3D st_lsm6dsx_get_event_id(type); struct st_lsm6dsx_sensor *sensor =3D iio_priv(iio_dev); struct st_lsm6dsx_hw *hw =3D sensor->hw; const struct st_lsm6dsx_reg *reg; unsigned int data; int err; =20 - if (type !=3D IIO_EV_TYPE_THRESH) + if (event =3D=3D ST_LSM6DSX_EVENT_MAX) return -EINVAL; =20 if (val < 0 || val > 31) return -EINVAL; =20 - reg =3D &hw->settings->event_settings.sources[ST_LSM6DSX_EVENT_WAKEUP].va= lue; + reg =3D &hw->settings->event_settings.sources[event].value; data =3D ST_LSM6DSX_SHIFT_VAL(val, reg->mask); err =3D st_lsm6dsx_update_bits_locked(hw, reg->addr, reg->mask, data); @@ -1965,13 +1975,56 @@ st_lsm6dsx_read_event_config(struct iio_dev *iio_de= v, enum iio_event_type type, enum iio_event_direction dir) { + enum st_lsm6dsx_event_id event =3D st_lsm6dsx_get_event_id(type); struct st_lsm6dsx_sensor *sensor =3D iio_priv(iio_dev); struct st_lsm6dsx_hw *hw =3D sensor->hw; =20 - if (type !=3D IIO_EV_TYPE_THRESH) + if (event =3D=3D ST_LSM6DSX_EVENT_MAX) return -EINVAL; =20 - return !!(hw->enable_event & BIT(chan->channel2)); + return !!(hw->enable_event[event] & BIT(chan->channel2)); +} + +/** + * st_lsm6dsx_check_other_events - Check for enabled sensor events. + * @hw: Sensor hardware instance. + * @curr: Current event type. + * + * Return: whether any events other than @curr are enabled. + */ +static bool st_lsm6dsx_check_other_events(struct st_lsm6dsx_hw *hw, + enum st_lsm6dsx_event_id curr) +{ + enum st_lsm6dsx_event_id other; + + for (other =3D 0; other < ST_LSM6DSX_EVENT_MAX; other++) { + if (other !=3D curr && hw->enable_event[other]) + return true; + } + + return false; +} + +static int st_lsm6dsx_events_enable(struct st_lsm6dsx_sensor *sensor, + bool state) +{ + struct st_lsm6dsx_hw *hw =3D sensor->hw; + const struct st_lsm6dsx_reg *reg; + + reg =3D &hw->settings->event_settings.enable_reg; + if (reg->addr) { + int err; + + err =3D regmap_update_bits(hw->regmap, reg->addr, reg->mask, + ST_LSM6DSX_SHIFT_VAL(state, reg->mask)); + if (err) + return err; + } + + if (state || !(hw->fifo_mask & BIT(sensor->id))) + return __st_lsm6dsx_sensor_set_enable(sensor, state); + + return 0; } =20 static int @@ -1980,22 +2033,23 @@ st_lsm6dsx_write_event_config(struct iio_dev *iio_d= ev, enum iio_event_type type, enum iio_event_direction dir, bool state) { + enum st_lsm6dsx_event_id event =3D st_lsm6dsx_get_event_id(type); struct st_lsm6dsx_sensor *sensor =3D iio_priv(iio_dev); struct st_lsm6dsx_hw *hw =3D sensor->hw; u8 enable_event; int err; =20 - if (type !=3D IIO_EV_TYPE_THRESH) + if (event =3D=3D ST_LSM6DSX_EVENT_MAX) return -EINVAL; =20 if (state) { - enable_event =3D hw->enable_event | BIT(chan->channel2); + enable_event =3D hw->enable_event[event] | BIT(chan->channel2); =20 /* do not enable events if they are already enabled */ - if (hw->enable_event) + if (hw->enable_event[event]) goto out; } else { - enable_event =3D hw->enable_event & ~BIT(chan->channel2); + enable_event =3D hw->enable_event[event] & ~BIT(chan->channel2); =20 /* only turn off sensor if no events is enabled */ if (enable_event) @@ -2003,22 +2057,24 @@ st_lsm6dsx_write_event_config(struct iio_dev *iio_d= ev, } =20 /* stop here if no changes have been made */ - if (hw->enable_event =3D=3D enable_event) + if (hw->enable_event[event] =3D=3D enable_event) return 0; =20 - err =3D st_lsm6dsx_event_setup(hw, state); + err =3D st_lsm6dsx_event_setup(hw, event, chan->channel2, state); if (err < 0) return err; =20 mutex_lock(&hw->conf_lock); - if (enable_event || !(hw->fifo_mask & BIT(sensor->id))) - err =3D __st_lsm6dsx_sensor_set_enable(sensor, state); + if (enable_event) + err =3D st_lsm6dsx_events_enable(sensor, true); + else if (!st_lsm6dsx_check_other_events(hw, event)) + err =3D st_lsm6dsx_events_enable(sensor, false); mutex_unlock(&hw->conf_lock); if (err < 0) return err; =20 out: - hw->enable_event =3D enable_event; + hw->enable_event[event] =3D enable_event; =20 return 0; } @@ -2429,18 +2485,19 @@ static struct iio_dev *st_lsm6dsx_alloc_iiodev(stru= ct st_lsm6dsx_hw *hw, } =20 static bool -st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw) +st_lsm6dsx_report_events(struct st_lsm6dsx_hw *hw, enum st_lsm6dsx_event_i= d id, + enum iio_event_type type, enum iio_event_direction dir) { const struct st_lsm6dsx_event_settings *event_settings; const struct st_lsm6dsx_event_src *src; int err, data; s64 timestamp; =20 - if (!hw->enable_event) + if (!hw->enable_event[id]) return false; =20 event_settings =3D &hw->settings->event_settings; - src =3D &event_settings->sources[ST_LSM6DSX_EVENT_WAKEUP]; + src =3D &event_settings->sources[id]; err =3D st_lsm6dsx_read_locked(hw, src->status.addr, &data, sizeof(data)); if (err < 0) @@ -2448,38 +2505,49 @@ st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw= *hw) =20 timestamp =3D iio_get_time_ns(hw->iio_devs[ST_LSM6DSX_ID_ACC]); if ((data & src->status_z_mask) && - (hw->enable_event & BIT(IIO_MOD_Z))) + (hw->enable_event[id] & BIT(IIO_MOD_Z))) iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z, - IIO_EV_TYPE_THRESH, - IIO_EV_DIR_EITHER), + type, + dir), timestamp); =20 if ((data & src->status_y_mask) && - (hw->enable_event & BIT(IIO_MOD_Y))) + (hw->enable_event[id] & BIT(IIO_MOD_Y))) iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y, - IIO_EV_TYPE_THRESH, - IIO_EV_DIR_EITHER), + type, + dir), timestamp); =20 if ((data & src->status_x_mask) && - (hw->enable_event & BIT(IIO_MOD_X))) + (hw->enable_event[id] & BIT(IIO_MOD_X))) iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X, - IIO_EV_TYPE_THRESH, - IIO_EV_DIR_EITHER), + type, + dir), timestamp); =20 return data & src->status.mask; } =20 +static bool st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw) +{ + bool events_found; + + events_found =3D st_lsm6dsx_report_events(hw, ST_LSM6DSX_EVENT_WAKEUP, + IIO_EV_TYPE_THRESH, + IIO_EV_DIR_EITHER); + + return events_found; +} + static irqreturn_t st_lsm6dsx_handler_thread(int irq, void *private) { struct st_lsm6dsx_hw *hw =3D private; --=20 2.39.5 From nobody Mon Dec 1 21:33:25 2025 Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.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 0AB8A304BDE for ; Mon, 1 Dec 2025 10:00:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583248; cv=none; b=o12TbJyq5HTWlJDLiwTe+071kG/qiNwe3/m9O3US+SQNqWtjLQJvatA5gw7dfIJtKe6yfyjl50bAfuDwKYIkiJdB2eHP0Eh0a8IDqPeowHAfwEOUXU0Oq16TecVvIIFYe85gPm57spOvQ8AkasS5RxArE3YPsKTP1blwOj3CJDI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583248; c=relaxed/simple; bh=UZ+NdiZ3XXGhqfYf7NBT7wSKeBqxcjm3BrjMaP7yIMQ=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LsrFpBshAKZDPHmrE7oioB5y4lwr92FtP9HzB9YEXGvgLUiWZ29wKqiT0FPKrCy7npWPI/PE7NStkYKtzLwAfO1vxrzzYml4JQ2NrZ8pWEW8H/jSEwbBVYSdFvxfk4x4I5wO+GqUikayqC0mNIIvev1yojlaAUsKbalK1AP5uW8= 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=Z7Z7STF4; arc=none smtp.client-ip=209.85.208.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="Z7Z7STF4" Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-640a503fbe8so321266a12.1 for ; Mon, 01 Dec 2025 02:00:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1764583245; x=1765188045; 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=wwJPcF87ublVHeKGOaqXUL8BklErYLQR4Y/XoYD4Qmk=; b=Z7Z7STF4pO+GQq8EKLY1INeuk5ioibhnRLi6HKQudTI6GChIMp6OtqUO4xfUeOH+lF U2+dZuEJBV4FdnIKvfKt28ci0KYyFn+mW2efJb3iRhNV286oVVUQvX+ODJulrQQ7Vw+X iGGz7/9L67t0PDD+PxvTi5nj5MWNLXyRcZK0JRgmoTRIyaYq4gGsYOzffonB/g5POv2L /yPmE/JEXdK9onpS21JGNpobJCKTBJflyVF5bGFfdATKz9679EYao7cWz/8FRUvL7wPM m6y2hWwaPqHqunJx0v5QX5frVz0IULWs5uOdclqB7NjPlt/gwxFP5lTsyp9s4lTKRAAk FC7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764583245; x=1765188045; 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=wwJPcF87ublVHeKGOaqXUL8BklErYLQR4Y/XoYD4Qmk=; b=kTFdpIJeRvBXDYUE2fQH+utM9NmOg8m8csp2e0bmB9lP+M73MHsM3MSfNFpCLOq5Tx 5xxlyAfdIGXQBToeeH5SqTnYfRXUiU9DTXhK/SNrstfdW7jSy7BRz7L/93TqEIO9jiMd Cl2KZpBo1dsf1cZ4JriBCTFoX1YzXt5ebrtcQR0pV5Qht1lG5lbj9rvx3tEHRrC/2+CL ockBt1i631+jFD8nnlcojQW2HJh47oaQlyYOccamdzopUHAqa3/2QjyVzd9q7nhxUpGG nakWvLrU7NTTTJq68n6hJeqsjsnUhCj3nYzAZ5w2IwdGRhmaXw4ZNm1OnP0TCYokx7sp tiXg== X-Forwarded-Encrypted: i=1; AJvYcCUYKbjekoIKss00qqmT0rFtSl6SXHkND1D9adOPmwuBJqi1vQXiEjwxXRIcOKisS+Trft87IDde638+smM=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0njMr46VzdfQjWFPFXbEf1vJ2shY69c++s//xegCSC+H9cPls WSRWVSjFpMWJeXKq+TF9CyUb98xQhzxPlkRUEq6mMA8Sl1maTZuCiAI3+xNog6a1eBw= X-Gm-Gg: ASbGnct8Kehan7IE0JT5HUCUkvDAN+6xJseXn+99zA6jHAOYEtg/Dpvw0QOZeL4oR9q RTW1kmNw49dN5Eg7INPzwcwX6xzrFAyysthMYAHtjyOzeStXCyn5ASiHmbiahWI4R5K+Q8X4uX5 BuR+YBJt9UzE/jbYwE/b+Wl5gip2TW/keqqmp7oH3ayzBx3GT/UAVFwyvmW5U92BMVKTgDkRLWN 7YA7YboXvPjyRsThUup/1i3XRmfOM0hHyv0B+kkTDtcvrjN6UfgYcuXmVWNWFD9758VdwMalZtv gQcKd804ntd2h9j+ysYgq9bUUHbap5sJ8Zqx6cEYGM6gsAEBpCev0a2cE2EeQ7c0IN1ZseZw2B5 l0B2CvH125hrcQWYfUsgw9keNitihDNc/89c+CJ3zZF2iVXyKbPdrMxUW X-Google-Smtp-Source: AGHT+IFChMHak8SankQL+6tB2ksAC/qOZGucx8K1PhOJa9cotCvj2CZq//xGxU+Qk/xs17mlKJdgBw== X-Received: by 2002:a05:6402:3492:b0:647:5fbd:f065 with SMTP id 4fb4d7f45d1cf-6475fbdf099mr9858594a12.32.1764583245072; Mon, 01 Dec 2025 02:00:45 -0800 (PST) Received: from localhost ([151.35.151.28]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-647510508d4sm11914829a12.26.2025.12.01.02.00.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 02:00:44 -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 v4 7/9] iio: imu: st_lsm6dsx: add event configurability on a per axis basis Date: Mon, 1 Dec 2025 11:00:16 +0100 Message-Id: <20251201100018.426749-8-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251201100018.426749-1-flavra@baylibre.com> References: <20251201100018.426749-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=5625; i=flavra@baylibre.com; h=from:subject; bh=UZ+NdiZ3XXGhqfYf7NBT7wSKeBqxcjm3BrjMaP7yIMQ=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpLWb6F0mHQJw27OmiaIrbqPHW4CGVF1suZcbLy wRVqZkS/xqJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaS1m+gAKCRDt8TtzzpQ2 Xz+9C/0SYYLng6hhAgMto0esFfCfwjMkoq72PceTWmy/RVSrvuPhejFWkSRYMdrwk+ETyqEKM8d HOSwxpvZt9sUckAAthayAyxjMdr+8qOWJ9KYMAHstfC/VtcDjph+4eiaykDEO6c6FmhG+uXheUl 4T5q5ojJfdeST1WOYGBdAnYwx+Dq7BYzTg7YZ3vQY4y6QYKTOeIbJ6hB1V5iS4ykISI7HaLXn9C 2UgklnN3gwWW+YTWwTi9oWH99eCsd8nQCVRj4nJ4hYMHGP60oFgzOsVuHRBu9E+qak7vLtLWzRE j0W42HPdT/8yu5QG6/Ev6PAVQP75VsiRnF2I2OVdhPMSCzUAEzJC+5jVvCWM9JS6/bBklUku0yK UMcM+Esvn9Na0BIXVqd+QjK4gQEdu9JhnrUgq6joFMSx4x7+YKOq+LRUt2xKH72GcJovmJTsPeh Pt6EapBFLEFz62ZMyhHNE7VquSUoxP9gyTpXKF7NMB0x/r71eHBZbIrwCBiGNWAtpjkcg= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In order to be able to configure event detection on a per axis basis (for either setting an event threshold/sensitivity value, or enabling/disabling event detection), add new axis-specific fields to struct st_lsm6dsx_event_src, and modify the logic that handles event configuration to properly handle axis-specific settings when supported by a given event source. A future commit will add actual event sources with per-axis configurability. Signed-off-by: Francesco Lavra --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 7 ++ drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 95 +++++++++++++++++--- 2 files changed, 88 insertions(+), 14 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index 2aae56b7db0b..515aadbee3a4 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -250,7 +250,14 @@ enum st_lsm6dsx_event_id { =20 struct st_lsm6dsx_event_src { struct st_lsm6dsx_reg value; + struct st_lsm6dsx_reg x_value; + struct st_lsm6dsx_reg y_value; + struct st_lsm6dsx_reg z_value; u8 enable_mask; + u8 enable_axis_reg; + u8 enable_x_mask; + u8 enable_y_mask; + u8 enable_z_mask; struct st_lsm6dsx_reg status; u8 status_x_mask; u8 status_y_mask; diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index 6dc6cda54d05..e6c769049981 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -1888,12 +1888,50 @@ static int st_lsm6dsx_event_setup(struct st_lsm6dsx= _hw *hw, const struct st_lsm6dsx_event_src *src; unsigned int data; int err; + u8 old_enable, new_enable; =20 if (!hw->irq_routing) return -ENOTSUPP; =20 /* Enable/disable event interrupt */ src =3D &hw->settings->event_settings.sources[event]; + if (src->enable_axis_reg) { + u8 enable_mask; + + switch (axis) { + case IIO_MOD_X: + enable_mask =3D src->enable_x_mask; + break; + case IIO_MOD_Y: + enable_mask =3D src->enable_y_mask; + break; + case IIO_MOD_Z: + enable_mask =3D src->enable_z_mask; + break; + default: + enable_mask =3D 0; + } + if (enable_mask) { + data =3D ST_LSM6DSX_SHIFT_VAL(state, enable_mask); + err =3D st_lsm6dsx_update_bits_locked(hw, + src->enable_axis_reg, + enable_mask, data); + if (err < 0) + return err; + } + } + + /* + * If the set of axes for which the event source is enabled does not + * change from empty to non-empty or vice versa, there is nothing else + * to do. + */ + old_enable =3D hw->enable_event[event]; + new_enable =3D state ? (old_enable | BIT(axis)) : + (old_enable & ~BIT(axis)); + if (!old_enable =3D=3D !new_enable) + return 0; + data =3D ST_LSM6DSX_SHIFT_VAL(state, src->enable_mask); return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing, src->enable_mask, data); @@ -1910,6 +1948,39 @@ st_lsm6dsx_get_event_id(enum iio_event_type type) } } =20 +static const struct st_lsm6dsx_reg * +st_lsm6dsx_get_event_reg(struct st_lsm6dsx_hw *hw, + enum st_lsm6dsx_event_id event, + const struct iio_chan_spec *chan) +{ + const struct st_lsm6dsx_event_src *src; + const struct st_lsm6dsx_reg *reg; + + src =3D &hw->settings->event_settings.sources[event]; + switch (chan->channel2) { + case IIO_MOD_X: + reg =3D &src->x_value; + break; + case IIO_MOD_Y: + reg =3D &src->y_value; + break; + case IIO_MOD_Z: + reg =3D &src->z_value; + break; + default: + return NULL; + } + if (reg->addr) + return reg; + + /* + * The sensor does not support configuring this event source on a per + * axis basis: return the register to configure the event source for all + * axes. + */ + return &src->value; +} + static int st_lsm6dsx_read_event(struct iio_dev *iio_dev, const struct iio_chan_spec *chan, enum iio_event_type type, @@ -1927,7 +1998,10 @@ static int st_lsm6dsx_read_event(struct iio_dev *iio= _dev, if (event =3D=3D ST_LSM6DSX_EVENT_MAX) return -EINVAL; =20 - reg =3D &hw->settings->event_settings.sources[event].value; + reg =3D st_lsm6dsx_get_event_reg(hw, event, chan); + if (!reg) + return -EINVAL; + err =3D st_lsm6dsx_read_locked(hw, reg->addr, &data, sizeof(data)); if (err < 0) return err; @@ -1959,7 +2033,10 @@ st_lsm6dsx_write_event(struct iio_dev *iio_dev, if (val < 0 || val > 31) return -EINVAL; =20 - reg =3D &hw->settings->event_settings.sources[event].value; + reg =3D st_lsm6dsx_get_event_reg(hw, event, chan); + if (!reg) + return -EINVAL; + data =3D ST_LSM6DSX_SHIFT_VAL(val, reg->mask); err =3D st_lsm6dsx_update_bits_locked(hw, reg->addr, reg->mask, data); @@ -2042,20 +2119,11 @@ st_lsm6dsx_write_event_config(struct iio_dev *iio_d= ev, if (event =3D=3D ST_LSM6DSX_EVENT_MAX) return -EINVAL; =20 - if (state) { + if (state) enable_event =3D hw->enable_event[event] | BIT(chan->channel2); - - /* do not enable events if they are already enabled */ - if (hw->enable_event[event]) - goto out; - } else { + else enable_event =3D hw->enable_event[event] & ~BIT(chan->channel2); =20 - /* only turn off sensor if no events is enabled */ - if (enable_event) - goto out; - } - /* stop here if no changes have been made */ if (hw->enable_event[event] =3D=3D enable_event) return 0; @@ -2073,7 +2141,6 @@ st_lsm6dsx_write_event_config(struct iio_dev *iio_dev, if (err < 0) return err; =20 -out: hw->enable_event[event] =3D enable_event; =20 return 0; --=20 2.39.5 From nobody Mon Dec 1 21:33:25 2025 Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) (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 7DF92305066 for ; Mon, 1 Dec 2025 10:00:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583251; cv=none; b=AnW2dMCel56fpJAPDn8Hw3GNVHaSO1ElYBeDWmCHlWQq9JsA3j02AZBqgBSvqjXQhSdmV/ObdNl40JIXos0ro60Da/SWx0vUBLtI8EBtLPrRwG19Q0r8nHWamVfzLWHPjP8p1iUpLe++9ScqzknSVShwRYzKt/Vpe7qzWwmOv5g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583251; c=relaxed/simple; bh=VEXbt4kdhx6arib++1D6zpeorO/guWg9frDU5YFOf1g=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jvDNcVSyHI6JOPQ2E5XWnVuBsQbPiUNAOGRbWr/zL52h4W8lcjeX3QA+Bd/77wMzKI7RVL1Bded09coMVJwQHxg7+PrNVscWuuJxkt6ONc14jqXu0sye3l40MMlKtEOfDn/YUQyBic/AsQcQXQoVDR31fQo1GOJi+niISDpubt8= 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=CmADOCWG; arc=none smtp.client-ip=209.85.208.43 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="CmADOCWG" Received: by mail-ed1-f43.google.com with SMTP id 4fb4d7f45d1cf-640ca678745so6891461a12.2 for ; Mon, 01 Dec 2025 02:00:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1764583247; x=1765188047; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3o4iWlWyVTGQhQpE/OiZWMQgLCIUVL9MlPwLkSEzHMw=; b=CmADOCWGc30UY+zSocwitrtIBKz5CPIkG4VgQB7c4xVrHgOiZeA4wgAUl2SjHr/UG5 vWq7DiFKxu3z6JVIqqYHQEEeqSMaEv2MK6DZFy4Ft7JPXmTRBFsJ/onweWwaG419YK9T 3IFr8Nf8RixKt9qycsZJo12bYAvbbqFmuBc3nmsFVwLF8OsuV9Cyp4u/Zsr/l57BCIq/ apS0ue1h2fIZNurNohQuFLOkszh3+6WNFvMUQHzQ/6eTkCUGEZCSiQFLJbzzbA/i6Hba rQ8g9Hwi1ifjJo9CtSTCE/YtEiwFJDjQkhk2TfDXg0cmbJResGqdUrAQnBPvMAF5TlEt UZMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764583247; x=1765188047; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=3o4iWlWyVTGQhQpE/OiZWMQgLCIUVL9MlPwLkSEzHMw=; b=pZII/OUPhurOlkou2OVrq9VYaTvSTOCZgUEH3EnUNuwp6SAp9NRYn5sZPkqOWoCnuL K+NuZwpIUP0vl2BKpsLVy188Vf0dxCZVH3reUd+MgwmnkVP4JfLOfp5ZRCH1wCxG4RLl F3nIn4KPTEGFky5K5GuLoDt2bwgAVe5rPxXUl16uk0BTeS6x/91qbFNnPaeDWYhcgnmh RyOV462uyKPO4TlpdNyXSbSCA9T/tOM+7/jp/HOErDwMPj+b/UiHZXjm2akW+Eu1kTBT i/qQTMxNcSuigVkhiXGbeX3wNbygN1PZ/9+SGoQ+wEHO0atEglihwKD1suBHkm2K/Xax 2Srg== X-Forwarded-Encrypted: i=1; AJvYcCWPv7rLTRFyKC0JSuBJt61FjIma9U0arxI/CIN0JFy0y6EnEosTsMOnM7M4Q4m5/ZTzbWC/oPRXnYO44oQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzyIqMCKt4J3ViVHU+xpZfA0eBlRD8mmxq+6LwFQX9ni5fGMO0C qPXhB5WkPzwQEJQVa0reljKKYoacFHDZR65HRi6JieTI0RNhRf6gTdjGVGllgUyz9Pc= X-Gm-Gg: ASbGncvB3eWgsLTxDHHa/6I8kllShWzh1ccTEDLFjyTOxdoure4zxGAYjDSMmZbK4zD ayAt0KyCoU64W7+rSUJQZyOwq+5L0LNxSRkPHDVmDST71MrEoG1YSs19Ojw6HL4XkE4deQ6177n iVD0yUyaoagzLH6N+YFsrGU/FDN193fE1wJZbbzjYvISajFcOGXmE72dg78aMpC4ZmUUzmcEZx/ QZ5AqKlyhnsv946OSwSZb9xHijTTOFvuF+Vg7raQiGCh9Vn9Xg7avdHzj2uQJ+0bwmzEXSX2eSk 6N5vOHQ9ZEAhIQ2diIyjBndWidSt98/c0ekNfDe+QgiRRrdnXicLNt2iYW25bGnUBfrz5660c5g SvDKzH0TAbKO2EXeULUj1jA8eJgd8A7jp57YjTYHiuk6P6FWCmejI7Hdh X-Google-Smtp-Source: AGHT+IG5bqA8WyY3qXmWxHHH/Fj5+Ec1QuNajs2fTVSz8eFnD2YVBj4e0cBEppD2V+qHnrP70iS4qA== X-Received: by 2002:a17:906:fd8e:b0:b4a:d0cf:873f with SMTP id a640c23a62f3a-b76715159demr3862578166b.2.1764583246638; Mon, 01 Dec 2025 02:00:46 -0800 (PST) Received: from localhost ([151.35.151.28]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b76f59a6a5csm1192638866b.41.2025.12.01.02.00.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 02:00:46 -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 Cc: Andy Shevchenko Subject: [PATCH v4 8/9] iio: imu: st_lsm6dsx: add event spec parameter to iio_chan_spec initializer Date: Mon, 1 Dec 2025 11:00:17 +0100 Message-Id: <20251201100018.426749-9-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251201100018.426749-1-flavra@baylibre.com> References: <20251201100018.426749-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=3543; i=flavra@baylibre.com; h=from:subject; bh=VEXbt4kdhx6arib++1D6zpeorO/guWg9frDU5YFOf1g=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpLWb6w3EoMg4eoH1X/EuzPkJ4w8Cz7ovsBXGSb DdmD9omWjiJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaS1m+gAKCRDt8TtzzpQ2 XyPgC/9uka8VLFWqjeMm3+Zvky4dQHOu6ujgDzdW4ElKbN52L0248PexMTopgj/IBkzLTMkaVxD BN/Yog2ZWN3QftH1y7x7WngDidyW0Cd+LT1itd3JeZ4RDl51ah8ax7rXdWEd8fN9VahFVbRcESg OYE55RHjZMdmHc2YaJvJnrwURqvTbYEdAJ6MZ2Lcr2nPxqA2LVNLEI1AbaDLigCv9tKm/QR+1qH 2rb9mqcC9HQ9MVu/6zcH6/GkYAzmamvzaxwc5LvESVIF7fKFk3CEWX3K+m9WTdjytdUVk+xugkN y7LFdegzGNd21BLhUo6D7d70Zx5iLZgDupDlYb9JCSO1SEPkCuUwfGxtztuYkhx0X120+xMdQBa cpgeV9Iaq+M75PgDk1xeB/H6y8V87t3/HgS3itIhjTAzzJowpRazmOfGqCju2qtDBmPx6phB9/j yv/Pti+E4FyXTmY+1PI5xGsVpDiSrogG0hs01VGOUy5hjmLyt9wPpHtjUd6bkO6WLKZ/Q= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In preparation for adding support for more event sources, add to the ST_LSM6DSX_CHANNEL_ACC() iio_chan_spec initializer macro an iio_event_spec array argument, so that this macro can be used with different arrays by sensors that support different event sources; change the st_lsm6dsx_event struct declaration to an array (renamed as st_lsm6dsx_ev_motion) so that it can be passed to the macro (and opportunistically move it from the header file where it does not belong to the C file where it is used). In addition, remove from this macro the channel type parameter and hard-code IIO_ACCEL in the macro definition, since all callers use IIO_ACCEL as channel type argument. Signed-off-by: Francesco Lavra Reviewed-by: Andy Shevchenko --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 15 ++++----------- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index 515aadbee3a4..3edff8456a8f 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -81,9 +81,9 @@ enum st_lsm6dsx_hw_id { #define ST_LSM6DSX_SHIFT_VAL(val, mask) (((val) << __ffs(mask)) & (mask)) #define st_lsm6dsx_field_get(mask, reg) ((reg & mask) >> __ffs(mask)) =20 -#define ST_LSM6DSX_CHANNEL_ACC(chan_type, addr, mod, scan_idx) \ +#define ST_LSM6DSX_CHANNEL_ACC(addr, mod, scan_idx, events) \ { \ - .type =3D chan_type, \ + .type =3D IIO_ACCEL, \ .address =3D addr, \ .modified =3D 1, \ .channel2 =3D mod, \ @@ -97,9 +97,9 @@ enum st_lsm6dsx_hw_id { .storagebits =3D 16, \ .endianness =3D IIO_LE, \ }, \ - .event_spec =3D &st_lsm6dsx_event, \ + .event_spec =3D events, \ + .num_event_specs =3D ARRAY_SIZE(events), \ .ext_info =3D st_lsm6dsx_ext_info, \ - .num_event_specs =3D 1, \ } =20 #define ST_LSM6DSX_CHANNEL(chan_type, addr, mod, scan_idx) \ @@ -468,13 +468,6 @@ struct st_lsm6dsx_hw { } scan[ST_LSM6DSX_ID_MAX]; }; =20 -static __maybe_unused const struct iio_event_spec st_lsm6dsx_event =3D { - .type =3D IIO_EV_TYPE_THRESH, - .dir =3D IIO_EV_DIR_EITHER, - .mask_separate =3D BIT(IIO_EV_INFO_VALUE) | - BIT(IIO_EV_INFO_ENABLE) -}; - static __maybe_unused const unsigned long st_lsm6dsx_available_scan_masks[= ] =3D { 0x7, 0x0, }; diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index e6c769049981..04a3c65d4546 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -96,10 +96,19 @@ =20 #define ST_LSM6DSX_TS_SENSITIVITY 25000UL /* 25us */ =20 +static const struct iio_event_spec st_lsm6dsx_ev_motion[] =3D { + { + .type =3D IIO_EV_TYPE_THRESH, + .dir =3D IIO_EV_DIR_EITHER, + .mask_separate =3D BIT(IIO_EV_INFO_VALUE) | + BIT(IIO_EV_INFO_ENABLE), + }, +}; + static const struct iio_chan_spec st_lsm6dsx_acc_channels[] =3D { - ST_LSM6DSX_CHANNEL_ACC(IIO_ACCEL, 0x28, IIO_MOD_X, 0), - ST_LSM6DSX_CHANNEL_ACC(IIO_ACCEL, 0x2a, IIO_MOD_Y, 1), - ST_LSM6DSX_CHANNEL_ACC(IIO_ACCEL, 0x2c, IIO_MOD_Z, 2), + ST_LSM6DSX_CHANNEL_ACC(0x28, IIO_MOD_X, 0, st_lsm6dsx_ev_motion), + ST_LSM6DSX_CHANNEL_ACC(0x2a, IIO_MOD_Y, 1, st_lsm6dsx_ev_motion), + ST_LSM6DSX_CHANNEL_ACC(0x2c, IIO_MOD_Z, 2, st_lsm6dsx_ev_motion), IIO_CHAN_SOFT_TIMESTAMP(3), }; =20 --=20 2.39.5 From nobody Mon Dec 1 21:33:25 2025 Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.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 788DC3054D2 for ; Mon, 1 Dec 2025 10:00:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583251; cv=none; b=DU7FzR4mhJpiQywRnCMAafD32xqgIaIe7qKxOnlMyDETGhsonwzM3zzxlWtPpw0DkA8mbD5lBguZV1Rnyqfx8MPlnwkpU1VreccyQuMlxtSLeReg29zsUgAnzsosuZCWJnWoXHrxdzx3dzl7TNVasS1Q1eD72jqpEVoqA1NEWh8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764583251; c=relaxed/simple; bh=3AqaMzAo/SdteHE5mpmxKXza3NAKzUzx2yzL4sMysqg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LnDvXN+fSabkGo31tqEokkX5fIohMVorNcq0ydE0W15ymrKk/2AlJ1cVbgJ1rwCLd4huMkDw79Las5iW4vw/fx1Bcbqyspa3XJG75POD8diFANNZegmG1tyfi3z4N+EjrdPWNNJTo9hJFuQWlRSFPdqDkhn2nbln5ZLvLMUHdrw= 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=iyZLJA2t; arc=none smtp.client-ip=209.85.208.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="iyZLJA2t" Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-64074f01a6eso7170474a12.2 for ; Mon, 01 Dec 2025 02:00:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1764583248; x=1765188048; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9/G8mYUOngTogtLwRSsvnDIX3G5P9ST+QdTt2B0Gx9Y=; b=iyZLJA2t6gQ2WNxkkWNT3Oy07bqnFruSK+mlGj/iM1cv5oVoPds83FupSLBhjkCFEM fT91cAtAfEeDBBZsnj1DYrsCj6LIGURsZqGpTcaz5axd0JeC2oehDlD2Jaq+sxYszJkY HmlWsSAe0fxkbHJ/RXaXvCpLtWB5MQz+IU96C9lEBvl1IDqEVtwWDgGL1hwqhoJBtUuU kzyjw4KHCyVJ5scFz9UyvIclcAI1rOSAIh2xH61RlDmuy0rreJ47/9GSJ74xh9R4DYQO Wa9laNn06i6s051egwbIsae6fIVW9i1hYTcm/3DE8o8xSbJR95idckwB+NzufUNhqCNb H8ow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764583248; x=1765188048; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=9/G8mYUOngTogtLwRSsvnDIX3G5P9ST+QdTt2B0Gx9Y=; b=xGsWLQUE34qN3yjfAAvxTo9Uety3sNxonoM6yGNovqNwqpOWPtgqyHdvMKI7IU5f6M nQaAGc5UnFNpwrsUOSvhQ/GRAJAlz1XAu9sUq5s0TLdYjTmf21Je7trUkBumsvCAQA6Q sBINp6kSgxx+n8gdbFnfbKcWkogaVBPzi+aLMtakrorkHo1yz406ZnAJU+EreERbb1c2 hsD/d8wvbgO2B4lz9ND3DQKS6F3vjXhhM0fnSDOGcqZ1w9AfGQfYb4SDiz0yQSk83zZt i/+WCWQzxQwOnWEOpU/G3sHV+VAhT2OYDuwwVAEyC1iHNHTMUS8thb4uUI/MdPIEEt7o I5rQ== X-Forwarded-Encrypted: i=1; AJvYcCW0n2AhPtv69/fVT/wBPtHU7OW+NhtyJUucxCHSwJ2rPhPGOyS5h5/wW8qywdkRnkwNqm+V8VG7/ohORlQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwlGuiAB1IpFG+FdesxgpEd47mnhuUrWQR8NzbaCKApGnuzCOHq hzLyHMlluCaTGAAUvr42jo5YD3fMIm1OBt5k1dyiRTc7Au7R9dcAVQBVaiMiRBkUBy4= X-Gm-Gg: ASbGncsIjBVDR72Gz6Y15Xpqil5OUUP3ZbBLosCvP7Rkv5AT6XisWee3cZO2V/E+8pM tQdmOhJLo46fMJowuuIB+LcQppOqMgDwOO7cuqLHoYfKzSSbz+gkq55x7F0Fm7A0q1w69ye4c03 PpFNWhOiZfO4tY57dD9SEHf4fJlyHXRrptE8TAlwMw2sWDHfpd0eOw668lY0x1PN7Un8EOc/54X GgRRaTAzlWsS4ntHepviVHaVKjfT/lrtBT070rZtzBFivmdOXbopAMOpl9ivKKzcVzYvVIt3Enq hOeSgOi6qsC8kzlBdBfhCYE/rXWjq3fPUygq/clsxlwCyJw4iHP7fFrPMVYhqnJmA+x0jwpD92h WAOoaF4+CWduOZqQVWWorczjwUlZPCLUBoQp8TzdGy6LSXuoy80a/HBFy X-Google-Smtp-Source: AGHT+IGthK7Ty7J1t2xmMgR2lsVCeQrT3yEG/RN8BxEQ059Av5b9KH09w+Gv6NVNxv95SdHGMgRmNg== X-Received: by 2002:a17:906:9fc6:b0:b76:3599:649e with SMTP id a640c23a62f3a-b767168e416mr3364388566b.11.1764583247805; Mon, 01 Dec 2025 02:00:47 -0800 (PST) Received: from localhost ([151.35.151.28]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b76f59aea78sm1139206766b.36.2025.12.01.02.00.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 02:00:47 -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 Cc: Andy Shevchenko Subject: [PATCH v4 9/9] iio: imu: st_lsm6dsx: add tap event detection Date: Mon, 1 Dec 2025 11:00:18 +0100 Message-Id: <20251201100018.426749-10-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251201100018.426749-1-flavra@baylibre.com> References: <20251201100018.426749-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=4582; i=flavra@baylibre.com; h=from:subject; bh=3AqaMzAo/SdteHE5mpmxKXza3NAKzUzx2yzL4sMysqg=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpLWb7TTjJL6EHV7uldI7M8K5+O6aAHfDEcn0lg j5nmvAKlc+JAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaS1m+wAKCRDt8TtzzpQ2 XymQC/4nfpZDOY4Lk08dRDTOaBdnFI8xracqk8/m1uisl9mKmcS0eJE/64gq7UMg3lpxhr1grY6 kbsmcp/uRvYcvmQOvvBZHhTwIOlHDjWT4kvSAKpzuo2yeg+Skz/Q2wcXy3T5HGHeFERCvnX+AjS yG5iLyW4eTKitLCqVeRexLnWYtXeg+l+iZ46RMA9tO6YwQBmcs3q7R+w8/emMRLmFOMfecwt3YZ KpUUddmYXgjTupX55TwlARIPp187LVs9vV7c0eiX1TXeeZMw0YFW0CKsJrY+jiSWmPfrb8QeXMC b/dIY/LxLn2t2jp1PvZ3lExH3+YQOR6uCOiKkNlg95ikYK661+tallecLEldUAql2TikYzKDzNF Y1KUmxAEjXkfTJUOI6vEXnK3rHpElj2TwuNmKYaSlZPKDAABT5wpV37lIvcy2HmCwAPXRkeOmJA qs9U7nrujdU/Dwi15p/pjPlsM9PjYpNTfuxZywKrWlrw0lC32oyntVBs8JPH+Nvxlx3XQ= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In order to allow sensors to advertise tap event capability and report tap events, define a new struct iio_event_spec array that includes a tap event spec, and a new struct iio_chan_spec array that references the new iio_event_spec array; for the LSM6DSV chip family, use the new iio_chan_spec array and define an event source for tap events. Tested on LSMDSV16X. Signed-off-by: Francesco Lavra Reviewed-by: Andy Shevchenko Acked-by: Lorenzo Bianconi --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 1 + drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 57 +++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_l= sm6dsx/st_lsm6dsx.h index 3edff8456a8f..957dae73e13d 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -245,6 +245,7 @@ struct st_lsm6dsx_shub_settings { =20 enum st_lsm6dsx_event_id { ST_LSM6DSX_EVENT_WAKEUP, + ST_LSM6DSX_EVENT_TAP, ST_LSM6DSX_EVENT_MAX }; =20 diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index 04a3c65d4546..e99556ccacd4 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -105,6 +105,21 @@ static const struct iio_event_spec st_lsm6dsx_ev_motio= n[] =3D { }, }; =20 +static const struct iio_event_spec st_lsm6dsx_ev_motion_tap[] =3D { + { + .type =3D IIO_EV_TYPE_THRESH, + .dir =3D IIO_EV_DIR_EITHER, + .mask_separate =3D BIT(IIO_EV_INFO_VALUE) | + BIT(IIO_EV_INFO_ENABLE), + }, + { + .type =3D IIO_EV_TYPE_GESTURE, + .dir =3D IIO_EV_DIR_SINGLETAP, + .mask_separate =3D BIT(IIO_EV_INFO_VALUE) | + BIT(IIO_EV_INFO_ENABLE), + }, +}; + static const struct iio_chan_spec st_lsm6dsx_acc_channels[] =3D { ST_LSM6DSX_CHANNEL_ACC(0x28, IIO_MOD_X, 0, st_lsm6dsx_ev_motion), ST_LSM6DSX_CHANNEL_ACC(0x2a, IIO_MOD_Y, 1, st_lsm6dsx_ev_motion), @@ -119,6 +134,13 @@ static const struct iio_chan_spec st_lsm6ds0_acc_chann= els[] =3D { IIO_CHAN_SOFT_TIMESTAMP(3), }; =20 +static const struct iio_chan_spec st_lsm6dsx_acc_tap_channels[] =3D { + ST_LSM6DSX_CHANNEL_ACC(0x28, IIO_MOD_X, 0, st_lsm6dsx_ev_motion_tap), + ST_LSM6DSX_CHANNEL_ACC(0x2a, IIO_MOD_Y, 1, st_lsm6dsx_ev_motion_tap), + ST_LSM6DSX_CHANNEL_ACC(0x2c, IIO_MOD_Z, 2, st_lsm6dsx_ev_motion_tap), + IIO_CHAN_SOFT_TIMESTAMP(3), +}; + static const struct iio_chan_spec st_lsm6dsx_gyro_channels[] =3D { ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, 0x22, IIO_MOD_X, 0), ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, 0x24, IIO_MOD_Y, 1), @@ -1260,8 +1282,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_se= nsor_settings[] =3D { }, .channels =3D { [ST_LSM6DSX_ID_ACC] =3D { - .chan =3D st_lsm6dsx_acc_channels, - .len =3D ARRAY_SIZE(st_lsm6dsx_acc_channels), + .chan =3D st_lsm6dsx_acc_tap_channels, + .len =3D ARRAY_SIZE(st_lsm6dsx_acc_tap_channels), }, [ST_LSM6DSX_ID_GYRO] =3D { .chan =3D st_lsm6dsx_gyro_channels, @@ -1438,6 +1460,32 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_s= ensor_settings[] =3D { .status_y_mask =3D BIT(1), .status_x_mask =3D BIT(2), }, + [ST_LSM6DSX_EVENT_TAP] =3D { + .x_value =3D { + .addr =3D 0x57, + .mask =3D GENMASK(4, 0), + }, + .y_value =3D { + .addr =3D 0x58, + .mask =3D GENMASK(4, 0), + }, + .z_value =3D { + .addr =3D 0x59, + .mask =3D GENMASK(4, 0), + }, + .enable_mask =3D BIT(6), + .enable_axis_reg =3D 0x56, + .enable_x_mask =3D BIT(3), + .enable_y_mask =3D BIT(2), + .enable_z_mask =3D BIT(1), + .status =3D { + .addr =3D 0x46, + .mask =3D BIT(5), + }, + .status_x_mask =3D BIT(2), + .status_y_mask =3D BIT(1), + .status_z_mask =3D BIT(0), + }, }, }, }, @@ -1952,6 +2000,8 @@ st_lsm6dsx_get_event_id(enum iio_event_type type) switch (type) { case IIO_EV_TYPE_THRESH: return ST_LSM6DSX_EVENT_WAKEUP; + case IIO_EV_TYPE_GESTURE: + return ST_LSM6DSX_EVENT_TAP; default: return ST_LSM6DSX_EVENT_MAX; } @@ -2620,6 +2670,9 @@ static bool st_lsm6dsx_report_motion_event(struct st_= lsm6dsx_hw *hw) events_found =3D st_lsm6dsx_report_events(hw, ST_LSM6DSX_EVENT_WAKEUP, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER); + events_found |=3D st_lsm6dsx_report_events(hw, ST_LSM6DSX_EVENT_TAP, + IIO_EV_TYPE_GESTURE, + IIO_EV_DIR_SINGLETAP); =20 return events_found; } --=20 2.39.5