From nobody Tue Dec 2 02:06:40 2025 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.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 18D9630C61B for ; Thu, 20 Nov 2025 08:26:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627182; cv=none; b=Xy5cdAVrcAg0DZHHIJYHaSJzjuepbRbrFlEqXUQVq6PbY2+BG4nyawN+zNlIKKP7dP4xqO+AxgvORkn35wUlh6g8UX4NEG9ypWeweQ6mYzJKa0ERwWN7woh86KS5QYeWLF/h9pz5tXUsSqIC1PBS/Fgltz7mCFmGItfqcGNlVUc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627182; c=relaxed/simple; bh=NJ9+ni9tjiEFyLqyjknlb8H77fEVqdcPkQvWufgkhRg=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=giaIHotUrO2X1Wb2zyxGTE9ZZlllJsF0e0Mkq3lOaigCGjlCLkJ4sRuQ7neFeKUH5MISrrGbfgG1ZFB+cAVTTleBK5jQeFcSEiVVkwiyFvmnDSWHzXg3VHeu5ztH2NRW7lt5p9RMGDsWLoJDrK/OgZm6Y9C8/E+F8z5NhHWEFx4= 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=TDw2ufj5; arc=none smtp.client-ip=209.85.128.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="TDw2ufj5" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-47798ded6fcso3148585e9.1 for ; Thu, 20 Nov 2025 00:26:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1763627178; x=1764231978; 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=tbaQKfxHLaDmuudc50zb/1EfAh1OSh/uCcSH2yo6k94=; b=TDw2ufj5js5l87CdVI09BTcyqb/WCwVG/pX9v5f9PN/tsOjEqbZWaMt3iS7MINymri ntl105tX5dJT8IfLppojp4uNefgP2CJJVpSfKE3g/AN1xWZPpudeU14lqzkYn5R0s77i Xcsekzn2/8iK3+NGtQ6JyZ4xIn6hP4nwkbKzx9gZ61YevAkdfRFnXF/UdlP7snHyb3up 3eCQpF5kFeuADOMSNJALhBPrzNyY+e7q483bIoyHUndS9gJdajjRkFZgGcM8N6/OTNRM cLSV3U3tffCw0uXmM+WrSsQVN0s/zog1z3p0foobPfJxBNKDrjl5fAp7PSJ9FOcAQ2JG aJ5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763627178; x=1764231978; 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=tbaQKfxHLaDmuudc50zb/1EfAh1OSh/uCcSH2yo6k94=; b=DLUVPQBs4T1XbPpNJo/Xg4KlGDWstncaYjKlhN+QEKkti+DrI+kF6SqBqsnFpRimSL 7n7fhRgaKwLy73PocDiiQpdEDWSSW7U8Nv0Re6o5gkjFCDBnMg4OCzVX/gw8i0wP/pYp 5Pxk/tA7TPVLwp4CRMdONiDWRS768EccdTPlR8Tej1xUuVcZc55L9HUV56qDtxYtPdD7 FhRDnMioikefnmTMuxXjlpiZNaMtG6SYvzb6qFkAo+ITQpFE4bhcGvPg3qyloED7uZg0 JkjK3pMzPUnHBvPtjsG8Yg+tWTaXOQnB9fZwZIOMUqAslUcdnz7xmvm8LoMZpL8bMapK z6WQ== X-Forwarded-Encrypted: i=1; AJvYcCWwlKGeT1ltAjjfrlecC3GbIKtpl1e/7z9vrc1qBDg4zfX6ZTiWzNvwYqgLFQXGGb5rsxnBTeQTLXNB06A=@vger.kernel.org X-Gm-Message-State: AOJu0YwCQOmcrz7zvRKqyhWo5rI7AlEVP5G9WO1r/v8Uo074lvkGnFGR qGrIld2Ho/rdjWnUTwRzDnphTpMykIr/3ZFUyqB77n22oMtGygZz9rkwHzIbbmP1fvs= X-Gm-Gg: ASbGncsJEFN9QVLRBsHOEjapYRohB0SnlkDNcceywRJdGcvSXzCVBP4nGLy1Hok5pHK T2/+BHMC7fKrbjvX3Du92c7X5AwWJiXFCyosbRtVaptil3TcqOOpOyHpvpCN1xKk86httD/XPHM 9VnIsjAwpedEd1ayehVJgmQ+zPuyR7kfYhA3ujVz8ydEzGJ3JgIzH+oO8OgHyFNQVaRodyXj9I2 /2yHx99yXGFMbK+X2TRC+eev4E4iAPbnZvo1w20okVWnMIn0xVtsW+bk749zyQJoG/6fJfWU/Fd TZk3WnCYZ8fC3rHm+I75EqWtQh3VGceM/PIb7llsZUDq9v4XR6MbIWbnn/NPomJ4oUZBXnEmNGx zvmKFvDTxNdETauDggNUjA4hApVtGcPSxcqShSFZCjz429ZxE20PDcfg= X-Google-Smtp-Source: AGHT+IFYCfLo55w9X/Ry2+e45PLt6auk6ctX1o6IT5ZsjL0OQ6wgMf8aLPBxQuXgVokm2RvvZDFL6g== X-Received: by 2002:a05:600c:1c14:b0:477:8b2e:aa7d with SMTP id 5b1f17b1804b1-477b8aa0ed3mr27973975e9.30.1763627178328; Thu, 20 Nov 2025 00:26:18 -0800 (PST) Received: from localhost ([151.35.219.2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42cb7f34fddsm4206625f8f.14.2025.11.20.00.26.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 00:26:18 -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 v2 1/9] iio: imu: st_lsm6dsx: fix iio_chan_spec for sensors without event detection Date: Thu, 20 Nov 2025 09:26:07 +0100 Message-Id: <20251120082615.3263892-2-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251120082615.3263892-1-flavra@baylibre.com> References: <20251120082615.3263892-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=2506; i=flavra@baylibre.com; h=from:subject; bh=NJ9+ni9tjiEFyLqyjknlb8H77fEVqdcPkQvWufgkhRg=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpHtB4X4JCEU27Jb2F/dd3AOO4o39IAMFbxS5DF 0Lku7/jV4yJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaR7QeAAKCRDt8TtzzpQ2 X0ekC/9Ji/sg23f3L/hsVRFo/MHNBkNygKuQmy/IZTpew2oOwonCw/s6HsycI0RPkILwIw8/J2Y m8NzUSmQp2XbiALOGhY+syijYf1vQs4sebrd8rvnH7TIu2DnhlCqckJMfacpT2DjO7F8xDxgqkP s8+s9E3ZQ+SXroJoUx94pCZzgvHf5arBCMdHl/H5jCBrri2cuBAKphzuT2c4D+85vdrOS4ffozW U8roOHaIWEHAQLXT7KM+AQM9O6UAN/Rp8LdUFIPOZYY9RDuSDL20Jjw9wYGIrtDTcU4siXgfT33 III8zXEUt8uvioTngS+WXsPuWB6654zTOf/2kGaDBtBBjignpwZrUnteNsUIASsZUEUDAl8nWv2 93iWyMOo8RqUa/R2qQJOlDnF8kkV3/QFqkH1fMDO6xzyOPwb8l647IIpIUQ+KKHbIL/tx8Q+qr5 uM/Akox5o6Ye8McCYPkgxCpcFUoM7+b1f2dJABb9h7/sNX5I862mMfEtyXR5L1lodDexM= 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 Acked-by: Lorenzo Bianconi Reviewed-by: Andy Shevchenko --- 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 Tue Dec 2 02:06:40 2025 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6ECCF3093D8 for ; Thu, 20 Nov 2025 08:26:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627183; cv=none; b=EyI8AmI+iYo2I9QPNrfqcoRhDsBFMLRDqtigCnwmvRE1pjionMTYgt8CsPg8XYBSp3wg9bPRLZnqt1oTP24rIXQpNAqKHNtZjCzKA0zzRQhc28SDsfRWpzBvkSmReVAS1u5EhQX0zJj07lLzM7Zzj7tKnNTEQjqx4Vv6dnZy1mw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627183; c=relaxed/simple; bh=47mPrZHijqjGm1AMWrbG+8cwdi3Wv5j/BmTxIhmQBEw=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LtFS79Um20u75dLIkHA+rxvsDS67fxb5xDfzJOKTt9C8LfhHiymNXjhakVABZIDzBolAduys15YRr4LuR+7o9Csw+7oJ7l8FlcWJtN11E4pQ6+w1ShzNgZuq3eeAI+7CI/BpRRrXsmo62U+y953kZGy3IMReUTlmCUEOvpHHYRc= 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=cqcNsUiy; arc=none smtp.client-ip=209.85.221.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="cqcNsUiy" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-42b387483bbso371753f8f.1 for ; Thu, 20 Nov 2025 00:26:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1763627180; x=1764231980; 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=lPSxFWZnb/6QKSItrwTL8YBNanLm9rz5scONQu9zZ0Y=; b=cqcNsUiy2TTU+DDR764pRMv5B5q2TdszTOC6DshpuuReVyLBi8gHGgK7gFBsPgcCO6 sgMs9vy7n40xt3X6P1qA85+/4SuMEnDQDpa8GXkjYDvFkQUWtjsU2LSWMma/ofxG3Bb5 9b5DfidXEoO60CLZn5pjAwQ4i+66CaIRtxsmft2hldDsE3xhMvzSB+A/wMewrIz/9EbA R+5XhAuRLfCTcVmBmMpmGJViVCFpHoiLfaU0JEEH4706n0kEmGX8ci9UjgD/aO2qfzfc b+qEMb5xEUoDivh+BUSG1OuzbiIxsMV7ao+axYuPl0gtzE+49dejF0izlj/rGmetoGOF vL1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763627180; x=1764231980; 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=lPSxFWZnb/6QKSItrwTL8YBNanLm9rz5scONQu9zZ0Y=; b=Xkcx1qy6mwisFW6CnReElPVKnSEeZviZjX8npz8pMEthKfMqFsZ9S4lWHNbjhbGZmL 7E2Q13x0W2iJlxBrv51NvD++Bln9DSNnPcNA2R/bhs9WIXHAS0Ldd/CNM1JIBdpNgbR1 izRk/GKJQExzd2nyC4xqHKnU0DCOXCUml9Oc6eFFqyGho3Tww1sICzryBf+Nhe+GhGyz Dq9oCD46ImpCKUH89KlG9o+ekgLfJBUQuaML5TSZtjmSJ8otLkhPAa07ZNAgP2czZyYx WhHEmTaDZhX7sFUO7w7tkRJTplvnpizAegIAy2okRSt4v6MeMZmgwH6Q8TOPO0DkJaeP wjTA== X-Forwarded-Encrypted: i=1; AJvYcCUWYUGNEafsJsLBoYJp7EhCd7rgev68UI7UCe5OW0Jj37juMB8QFZrAYygPyTtE4h28IP1sMouyNNRlKbM=@vger.kernel.org X-Gm-Message-State: AOJu0YyQdfl8LCWil8PadEWzt4XZ/RZaS2ehjfPWKH/qalKQshYTTM+C nthl0fP7seFzlMWVy4Q/QoHuTbFRFg7pr02TonvY7kG1JMh0GWILuQOoVgK/V68Qxtc= X-Gm-Gg: ASbGncuzBNcv1YlpfyCBPfoLjByhkbZv+ygrR+sWD/LxXdEjUb2rvCptZMet8WRXlxK d2PnzzW/tXiY7xrqkb0kLNN/xHRE3ak9XdK1Vdc9i7yqUXVGJ/5pnXFAruzatjWmPNeXjS+ZpwN GwilD1vc0ETu0JttjO5las4SwuhMd2IbbATzsyNKRUV8bD8+S9HOcypbnjzpigEx8lwA7hPDk00 l0jkjSAtDr6xU4LYykTmgb3qEkZNJb5yZb8v8kheV9TEOHoAdsxtVjqy8/UH4ysvlt2robg4d98 b0KU8bp/mKe7ou4R/8NDX3zZXsy/rCeOmMHEKQRMAX7x2+ufC7QFnJ06XzPpTBbDMFjA7oU1y4K IyYB/IWoEaaHYvOEQF7Ef12Fsb/pO6gSPNwj0YYMLZbtZtqWgegy4C00= X-Google-Smtp-Source: AGHT+IFaIl00qIG4e442uJoYOLlCW4eU3tv1KImChCNKtIRML0L/ku2AMvpYaIrNrF2rsZ6awug8Cg== X-Received: by 2002:a05:6000:288f:b0:429:ef82:585b with SMTP id ffacd0b85a97d-42cb9a0c689mr1817244f8f.9.1763627179616; Thu, 20 Nov 2025 00:26:19 -0800 (PST) Received: from localhost ([151.35.219.2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42cb7fb8e62sm4013666f8f.35.2025.11.20.00.26.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 00:26:19 -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 v2 2/9] iio: imu: st_lsm6dsx: make event_settings more generic Date: Thu, 20 Nov 2025 09:26:08 +0100 Message-Id: <20251120082615.3263892-3-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251120082615.3263892-1-flavra@baylibre.com> References: <20251120082615.3263892-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=8384; i=flavra@baylibre.com; h=from:subject; bh=47mPrZHijqjGm1AMWrbG+8cwdi3Wv5j/BmTxIhmQBEw=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpHtB59m6Jh10y8zsCS9pO++AMDbpz3lwlF7nmT y56gCrKdbeJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaR7QeQAKCRDt8TtzzpQ2 X26xDACmOnjzcLOdsDuEy9HEjdlskDOXOdtcyxEF1uIYEziYNGU0CxGJBZr82BXkHA8J/6BKjj4 qBv1UcQsVoaM5Zs/A/64dEcvAzzBjrdxD6Vfm5YCXUQ4vKkGVqup7LvQZzqDI+fqOaY++Boom7d nOJl6v7ZDjPJHWE51tptaS5ShtOzBbozXxpzQjk9sUdFeAuEigOKzhvT6FYFmH8d2b9t30Wg99o CSpmaK+Ql5WINqy+91z012YWhD/DFlC2NXEDLsfmPe7Q/ATDLRvhwZrsGjr9LVxtCSG3Iu384ne QmaD1rxbzNWWrFaxvIaqHQRzKCibmhpNyGp4XZNex2Ga69ax5GEvWyyo1XnJQZWoG05gA68MaZ6 9jFTllKM6uL413Su7igpn6eA1VfLpfB+lT10tU6FjepdkT9cLo35EyMR1tzy7yusJYVeEYnAF+y gn8MUCmN5wL8XRwnFK4kIm6o9NK+fF42UvLQaGrexluY0Za2WybmVRWtJrj6ZIJ7jDhZ4= 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 Acked-by: Lorenzo Bianconi Reviewed-by: Andy Shevchenko --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 21 ++- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 134 +++++++++++-------- 2 files changed, 95 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..4c3ff1cc0097 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -242,14 +242,23 @@ 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; + u8 status_reg; + u8 status_mask; + 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..a71174e75f44 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -388,15 +388,19 @@ 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_reg =3D 0x1b, + .status_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 +558,19 @@ 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_reg =3D 0x1b, + .status_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 +799,19 @@ 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_reg =3D 0x1b, + .status_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 +1040,19 @@ 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_reg =3D 0x1b, + .status_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 +1225,19 @@ 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_reg =3D 0x1b, + .status_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 +1435,19 @@ 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_reg =3D 0x45, + .status_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 +1959,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 +2444,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 +2452,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_reg, &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 +2469,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 +2479,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 +2489,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 Tue Dec 2 02:06:40 2025 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.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 90D1D30E849 for ; Thu, 20 Nov 2025 08:26:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627184; cv=none; b=CdCsodpZ3akiE/dfYvF48+Nf2L05aUoQXLjV7uwPlRGRCz6EnJK710QN9C3rJzxZ0gYyVmxh6B/fpvpI53wTBx9VS36JxglKBZt98xNY5WVtXtY6S9q2Op/sfivwmAlTdZ9vndNj4k0csk+gHchHeLE98SXWnewUD0G7U7eZ94Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627184; c=relaxed/simple; bh=W7dRYFBp5zbk0lTntGV+cJ+DU2JAhLbFX8VsL4eBjeo=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=YijLlCZgGlbrsMSY11WQkAr5jjq/IJ9ic8jvUi6OSSoAwa648FRKPySEMvqKuX0H2jVuHgrVSptrGE5JCoWru0+3BUIKX7f7BtKBZK27YBd8GH7t/AkdP8yo7CzDI6HuzBHa9lFUIrkkJXjAI72WxsFgIJeiz98UsKX0zfHTnbs= 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=KHKZD4ME; arc=none smtp.client-ip=209.85.128.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="KHKZD4ME" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-477b5e0323bso8503605e9.0 for ; Thu, 20 Nov 2025 00:26:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1763627181; x=1764231981; 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=7PnQ4g/3MCD+/CeDtkg6cQ8hBr+h2xXlLFe41ou95fQ=; b=KHKZD4ME0utNLFid9hCZvDQtFKdqHox2TzKuROM6s5NQt8Ov+OBIPW3CqfWxkiF3yu RQaY5eyE/7RymOwDdGEa5CJPpj3l3/e6M83PZLetgrTtsRWtUVKpxMJaeUKp8cMwCSdG zQhcEg9wZfOeeNA/E4NKokDWbgZwo1AGE21EtY7bH3RFxO520eDx9XCCMyP+8wt1d7aR CWBcCO28NSolRcWNPrGyxNMgj+Ab8+SKQ8anTrwLy+XVH6vp0PCw13hpclKsP3DJFoQT FBCALIw7o67fHxPORkQhj0nNw1vykdCdzYkHRDdCJWqnJx87zjIVN0tn4gtOEW2SWOia 53aQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763627181; x=1764231981; 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=7PnQ4g/3MCD+/CeDtkg6cQ8hBr+h2xXlLFe41ou95fQ=; b=t3p7gIQjMFviL1eKpYxEiMTNcANCmkbrbaUcldFOON/GEevOqCNEiH1JE8Xwnj5j+n Mb5PxFwtC2wwT+Mkz6PX+vOZb81xBb1lgx56cpHD0unB98gyPC9lgappiUY1KDsNXRCU 2oHXPjFL1DPrmcYIbBBhrGIlsVjwcn4cvA83g1rCGPJysGhMsiBM+oAJF4OaJid7zUsL r9WzZ4EuRLeyc0pis8ukXzuNkqfOz24FCrZtS0pjpsKDoOhwrYBM2EwbWukMZdWBS7vI 9m2+JM5rIMX2dTCPqvo+swpCVlzxvqIG+0HnvpeUPsdvY1/LMiBu1aGa6yTGT76f8LFo H3Sw== X-Forwarded-Encrypted: i=1; AJvYcCWb6G8l7L9qHurrPNzFZmELUdeXXho3BHjRO/lCpzhxHao5B0CIMRAIr/NCo7Uc7DWTt2k6v0kyTY0A8Xc=@vger.kernel.org X-Gm-Message-State: AOJu0YzuXFLPw2Vj2yXcRe4tBrlOdPSjS+bq54DC032daI0Zk6+RuhZf XSKlHkVmrdWTH7jtDJdgE4A54/lA5I0G78qQmb/+mRrAwx3RmFP+oO1PYqpL4ng5Qjbi0Pk8oO1 SxEYr X-Gm-Gg: ASbGncuq3g7J0qSEMmH95hIN/+aiFBHhQm80W0EQMaWG5UFWnkoWpYLqdDKNprDYAj+ KZIawCh8T7ICR/W6G82Q3YIyFUSc/fwMXmRCihfKpfHJeUeY7lyKHzovtwDcqWPJFeHG5CYKE5F j8+4rd6TF75R4XFKJN1NUdKbXIld/1cWDH1NWlr0uHnYqSHJlvtxAzcFVB3ZiC44ncPRe3Akvfo FMKa2N7k6RNJ7QgHSBDQ0qhNTPT9d53Ondq9S8JA0C2JSU5ht6XAV9kK0lJyPqRJUSKSR8/v684 khOd//XL5Ad5eTD61LgH7anjyOSKewLNZNB21fTMWwnNDBgE81S78sK3wB5ALpyqBP1IVD152y5 tw1TWamXYccD8QXpf2tjruwiPQYkgcIBL3VFrwV2rCIDEz3qVuazAWRyDJVSm4/jU4g== X-Google-Smtp-Source: AGHT+IErXVHOiL3+XMt6VKRG0OihyK1Ccu27CSbMzfghO9tn3MZRV/0yEewjwJ9mgYVHs5nlQmU41A== X-Received: by 2002:a05:600c:4184:b0:477:a2f7:74de with SMTP id 5b1f17b1804b1-477b9ea3508mr8601435e9.3.1763627180835; Thu, 20 Nov 2025 00:26:20 -0800 (PST) Received: from localhost ([151.35.219.2]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-477b1076865sm93400045e9.13.2025.11.20.00.26.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 00:26:20 -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 v2 3/9] iio: imu: st_lsm6dsx: move wakeup event enable mask to event_src Date: Thu, 20 Nov 2025 09:26:09 +0100 Message-Id: <20251120082615.3263892-4-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251120082615.3263892-1-flavra@baylibre.com> References: <20251120082615.3263892-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=7525; i=flavra@baylibre.com; h=from:subject; bh=W7dRYFBp5zbk0lTntGV+cJ+DU2JAhLbFX8VsL4eBjeo=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpHtB5qOw5JEdmXERyjwBdrBVvmU1TaXh0S5YdX RcIpIuUQXGJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaR7QeQAKCRDt8TtzzpQ2 XyhZDACdPs2v2eVq6BOYprhQVzlCtevYM7Gs9XfUjl2+ZblLi8C1x6kvPqAjeFXQq8qChBHuAD7 1K2+yClFHflK/kbjDLPRMvACqy5HoV1rawX8wBTSHL4dEpcEv8mJamoE2t9V3Hv1/27KG/SQp7p lNmlDLeNOe/jXkVRPIzPlAU8wVL6Qlx3PibwwpGk8A7EJxhHd4tqz6n4NAPMh46iGYqg76X7yaO lB5GUtdrSIcPcUKu5G1fT/eIuEJgPd+Tf/HhQSA1BPLOK8hqyK7QB6YFeqYHXDehHb2ZIfXTGy5 oB7SMAQaUpRpx7rm1BD3WZx7eklSlPfJYo+js5fQqp1rLxrPp56M71W7MZdX7nby/u/uI22XHaS nzz3rLUyREFDlUPQc9KodKdej0gDgzKIKJL/cERJtcZ8Lh10/k+owcuo47zhwqdIGejCqfjsCOl NJnHiKUi2aaJBGIL5/HmsdaBobCFJK1jFwdvpzuB5HgkUnu3+tmIjgvrD8kZdb3T6nB2U= 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 Acked-by: Lorenzo Bianconi Reviewed-by: Andy Shevchenko --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 7 +- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 81 +++++++------------- 2 files changed, 31 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 4c3ff1cc0097..bbb967b2754b 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; u8 status_reg; u8 status_mask; u8 status_x_mask; @@ -344,8 +345,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; @@ -444,7 +445,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 a71174e75f44..ce5f9213d476 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_reg =3D 0x1b, .status_mask =3D BIT(3), .status_z_mask =3D BIT(0), @@ -498,14 +493,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), @@ -564,6 +553,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_reg =3D 0x1b, .status_mask =3D BIT(3), .status_z_mask =3D BIT(0), @@ -698,14 +688,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), @@ -805,6 +789,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_reg =3D 0x1b, .status_mask =3D BIT(3), .status_z_mask =3D BIT(0), @@ -951,14 +936,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), @@ -1046,6 +1025,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_reg =3D 0x1b, .status_mask =3D BIT(3), .status_z_mask =3D BIT(0), @@ -1168,14 +1148,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), @@ -1231,6 +1205,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_reg =3D 0x1b, .status_mask =3D BIT(3), .status_z_mask =3D BIT(0), @@ -1347,14 +1322,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), @@ -1441,6 +1410,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_reg =3D 0x45, .status_mask =3D BIT(3), .status_z_mask =3D BIT(0), @@ -1899,10 +1869,12 @@ 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; + u8 enable_mask; 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; @@ -1915,9 +1887,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]; + enable_mask =3D src->enable_mask; + data =3D ST_LSM6DSX_SHIFT_VAL(state, enable_mask); + return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing, enable_mask, da= ta); } =20 static int st_lsm6dsx_read_event(struct iio_dev *iio_dev, @@ -2171,11 +2144,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 Tue Dec 2 02:06:40 2025 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C98A230F537 for ; Thu, 20 Nov 2025 08:26:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627186; cv=none; b=R9QzAekI44bbfgrDO4ae0J5HJS0ud8zqOA5LMaY8SBxjGgNwLdZco93vhAW+Voip8Cjgti3TvFlz/Ra0W2nIZ3LB4w1TdtXuacUP86qouJUQf1p5S2uX7CrjgdhvmlEMaoYG8wDyu7VNNVKDwqgCGglqihGybLQmSBArX/+4HL4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627186; c=relaxed/simple; bh=25QT/Oyvs+VzKW4Otq89F7gvg8t4NUxIgeUi+pJJoj0=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=cwocLk4gU+QFAy6mxL6m5hoenDihgM/95kUAeeDZ1KhDru9m3eQrIj+sBlulofsn9jqLZOyI3SuoLQy5AUObnBMa5tdk9p9B9tvNjYwrxOqfrP9OHNAmDQUplQAhOlHbiUFUEg7mnOXH6o17+/2qGsXtyDv8A1wgqTEgHxUeHzg= 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=2W4YMWS0; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="2W4YMWS0" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-4775e891b5eso2449635e9.2 for ; Thu, 20 Nov 2025 00:26:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1763627182; x=1764231982; 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=kBH3fRFH4M/FwjnqWt9jTxX8M6Ls1YgPRJmEH7mUtY8=; b=2W4YMWS04o1+NpNxTcHuPREZiOnzrPshVC8dsCYgoSQyBrrsWodWERnXQ1/Z3yiPRU v9VdHvaMhxajy3z8zUZ2rpNV+vmZ1DRWxv9JJ9TCpmaMUt36AtF6zGlFwH+mWeIdrOGo 6XWNeFNbG7pCn1wa55h2MX+GEUWN0u+9i3BjRVzKZKB7UTos+3xOBPG1neTJZaa9XGpi Qtgvwzfso/IVN5YwYmuAvxPdIaalGw2kVjEgUv4XrBzlcGQ6SpAbVsZNR/8JIIdimGZD mvjJNKysUTlg1ImklaRQ7VC6/Qk0tJXX6nUfLFhe4i08qUBQOgRZA0HsYoMOzYDdm3k1 wc9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763627182; x=1764231982; 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=kBH3fRFH4M/FwjnqWt9jTxX8M6Ls1YgPRJmEH7mUtY8=; b=LMzAtUhYWXIGL+oa4NRsD86f4B0hYa+4SCTIVX6ibaOMwCuzK39Vu6ADkY9QKZaF8Z 5McwmzC7EvLnWm6QhnTtf0JyuewD2M7tvyoQP0yZiepMySCIy04n3njg03UUznpzG3nV fz4Cdbi4zZ5x/HetF+UOb5PBGDPLFjGT/mtqR3yGUZgwffgtgZSrTLO+epVFsa6/BfQf 7X0n66cqr7Ka0XppS9LrzGvPQEHO8PFaTV+UZhQ8kBHwaHAgY4RI22k5p0VVHJNXfrX3 8AeXwAer+ig1DyWDHvhMW/ResQpNuXTJ852A4eH0DshM1U0XYm3E45KAg6+m+gnRcNR8 kBiA== X-Forwarded-Encrypted: i=1; AJvYcCXw9W4aMQ4GnZz4sJ6gTnnCJsMwM8XrKkoCk8Msuun/9Ep+Uz+tfxs5Fe1MrATphQ4dpB4CriRzOqchqLY=@vger.kernel.org X-Gm-Message-State: AOJu0YxXHhFK6/gNy8GgfIBhiG1SWmlQRk0hKMcVvFHq6v7/uSBF66QO KkJZ8b1DmOGgz2OrY6TMZOq/h+lAjPPrHG5A0xap4IBK/L/jcS27Ca1ntCaDq6UCtqE= X-Gm-Gg: ASbGncstiVL55pPCofFL5eJKJqA9c3aFzedYcWRtmFNqtw/MzJdkasPX4ZA/bBIK5gP H/oLBvt2WzSBuz9q4+7qOp/6gG+utLDLXOfCUweIPpbwu0+rHwgMSyNNGZOrJxemWJn0hOsVEdZ wK9mIIT++tCMyc3+nt+PCH2LvzDL0Wy+qtuHpjMqrf55x27pFG9/qFpod+qvtjFLu6YmN3tCN4b WUSZBeJ1eb8T2VQmCIuo52TA7IPqiaKbzzVO0TnmCzyTyCC3u0d53O2ysPs1usoA7ahBIAUYd8J AiUGAIQyuznt3LqF0x2ri8zHKGAy03s5QlQSbeD+X+ljJhZ96E8CFne2Hz6cVil8ALJxUiNvfpk +1cdRLvL2m4l1Qem/vq6xjfj8JBKFePX3DZ7rtTo75y2WETSDZ+SETPs= X-Google-Smtp-Source: AGHT+IHYdRAJ0MjypVv2B6ep3jcVagNqKYXVFmR3fielCDe8rS2OhTTpZ+xq+r9wR2uQVZKEA4G6bQ== X-Received: by 2002:a05:600c:4e89:b0:477:afc5:fb02 with SMTP id 5b1f17b1804b1-477b9e2f1b1mr13397055e9.21.1763627182135; Thu, 20 Nov 2025 00:26:22 -0800 (PST) Received: from localhost ([151.35.219.2]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-477b0faf295sm96398725e9.0.2025.11.20.00.26.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 00:26:21 -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 v2 4/9] iio: imu: st_lsm6dsx: rework code to check for enabled events Date: Thu, 20 Nov 2025 09:26:10 +0100 Message-Id: <20251120082615.3263892-5-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251120082615.3263892-1-flavra@baylibre.com> References: <20251120082615.3263892-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=2662; i=flavra@baylibre.com; h=from:subject; bh=25QT/Oyvs+VzKW4Otq89F7gvg8t4NUxIgeUi+pJJoj0=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpHtB6bzyNqh8c0zL5/TICty48+WT6YlFWVAecf KmrNtbnVmCJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaR7QegAKCRDt8TtzzpQ2 XzzdDACtB4vJocur7IXgtO3oVjSKvnFWhNb4owiwQJv0PeL1rpusqIZRLNVnU34P9cU/n/4xdMu vF408whT47G/Q1Sd9keEmkneidKRopmTON3dE5ieUTN5mWndc+jRLnEruGc99iq8QAxk3WBhu+K YYZA506ygNhVyIztjTYUWU4CoEOH6JDg4sevKYmYBxN5B8JqrS+fez8UVhXQGqNuQuVdkptUtIm t1PcI0VVcduU8LQ1P5l0fSVGHx9duEy2dQWuZ7nPI+z2Cv/YRlTvqQP6Nz1kTzpkWasJB01hOZ3 WO+jsseAygAGBUsCcBsSpDAS6Lz6YXkhfuDFzEQz4EUsBABhsFsfGbNB7FrcbW1sAEQIAd/cYst bptzja3TfCSkZK99jmHlhhpf9alWB2aJxnaijLjgXqNaH10HX74z4h58wpUY6gEEryOgcAC8cpF Au4Xw9U+stKd37iGiCWY9ORJkHAEJYGH4UaCsQ70d6HGFmT69fK0PZYEctlJVms0ijl5s= 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 ce5f9213d476..287a85d4bd58 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -1744,11 +1744,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; @@ -1757,7 +1757,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); @@ -1785,11 +1785,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 @@ -2751,7 +2749,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; @@ -2782,7 +2780,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 Tue Dec 2 02:06:40 2025 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (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 F2F0730FC10 for ; Thu, 20 Nov 2025 08:26:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627187; cv=none; b=Ezw0jysDP+lCqWnOVRZhdj8aE8wLP0S8jntG6PBNyfNM7RfcBjtDB+vQErIGvKHUMljbAdhCoKujuRCV8fjo3TiXreODzPjv/9lLM+SfItm+keMhFRphoKZx50/0Ha/VFvcp0GdzBZ9bNhnZK+BBz1EGtTUr+8qacgKzq5Ancs0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627187; c=relaxed/simple; bh=NvUI5aXQ+dzQGpbFuILdCLUkAgQReaU1kD9uDURqAcA=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tC7OGBib8t624HjDkTgpAdPFZ69ThBUp9yJpH3tt5QXXlU6/jss2CuKaGjFeYCeHy9ioMJC3wj/PtlObHrokEW1l7yqFRGVSGXg6v0buEl/fNN2c53ehp2UtygKyU207iNRQFd7wZ0z7+d07NVdOdaMcHxMR5fbBpHms5AzOiMo= 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=IyJZS54h; arc=none smtp.client-ip=209.85.128.49 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="IyJZS54h" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-477a2ab455fso6520195e9.3 for ; Thu, 20 Nov 2025 00:26:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1763627183; x=1764231983; 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=j20uSIc1dPSouiwWtpqYLhuamnLIKHo+zwTXtyi4/Rk=; b=IyJZS54hJnJahV9aaK+VjjNo9F98lq4U+2+ssKGpQfj/9dqiR/fghvQWy7YFPNIh1N GV10Wr1JzORJ4IdR3Sb+X/c7KPzl5RSwUBfnTItJDNcxoSBKRXP92ou8993W3rAaTotQ /z4gXZ1UydOL2VEf0gZVzXJ/SKxyLvD8EvdsYttxvEu6KDli//C/00gECGo7dhC7LD6W 8VRLgR4F7HAtOULPzlmOqrREbOwXQDRyTK+I9RsFQpG93+qFl8c7NzzUiD2psN8inX83 Nh1wC9rgLk7p2+4O/nU7kUxQ5MfqoVZgoLDxnqiz6L6aPUutKRPkFpQe8yBNgO44ORE5 6m2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763627183; x=1764231983; 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=j20uSIc1dPSouiwWtpqYLhuamnLIKHo+zwTXtyi4/Rk=; b=iCbK0E5hDyVboMmBYtDNIhsPsbNTlY8u4v0GJamEMc52MVo6ZaXIUVv1tqJ0tdW2Ax p+by6Am0bm3UjkZY+NQ5db+LzyfXKfW509QPkKQwgx0rHkfyMlZzQCb9Nt7gatgvMKXu TLSxLMnE1i7FdtjehNj5+WrRt62orCQI8iOMikcTmlIzKPRYiAAGKFSriQDqPHlV2/HS IueCLHI04fKYvsVmpybzonGRmZ7YcySji4id00jGe24JObJDOk4kBaWaAP4gYsYGq4xI UED5jw945ak9j5sK/aV9LtPa6vIaPEAa6ICrWe/0K70EK1rbUZHNn8qb3cJ0joXbxCvH E8tg== X-Forwarded-Encrypted: i=1; AJvYcCXWwTQtq1omG7KYJcYy1a7JN9WBbcMQuFR3HC/4XKxUvcIya/4fYyoXUpj6yiCqN63wvYBrdYMjEPmwDn8=@vger.kernel.org X-Gm-Message-State: AOJu0Yz89wnqVWHdGe4KTqnr48WkJ8L2Zp94qDgYLTgMbR6hOYPYya5H Fx1SFcNXQwj2KRw5kEWR5m9CIhTtzITza7q1G7zz6ZSJJlxIGxC/78vrGWsSWNWqSg0= X-Gm-Gg: ASbGnctZjG8e3ho0aKaaZK0VwQgf46D/nornfuIsrMTvesE12R4Gw05RpZ2kuI8RxAm t2mi9hAE9960EWrDgQHuMONrXMV7Y40ijA4u2QSPJto30SC+y2plzCzTgXo/XBZ1iorElUtrf2r H9R8dkmhLewDt3cUPb4JGM5mIDdPSmcmUFVZGlXztN5aCIcBzu3YzD2aXpoAEetKUnXePft65pu m9K5SOOpE4NsFLK6KghHamdM0iffWd0nKCW3n8u+wOaZ8C1wlpCcjAhc3eMSnhifXVeYuz9pKoF 7q7DQHJiYr3ZH6hwdPpBTdO5rGX8j16MSh33/FumPjehGWaFkGSsrVp0qU2cPk6Sbq/9HYzu0x+ z3iqeZwiOVELFCX5/1dERS9ZjO7mJuWvIc4aoB6ItrAHj2Ts+L8Lg52I= X-Google-Smtp-Source: AGHT+IH5Mq6z5UQiK7NPi1NRx4HPxcHQdYbblNPbJx5w5sNBeGCJb6k/1tpoCGKvUJVh/4rQ5RkbgQ== X-Received: by 2002:a05:600c:35c6:b0:477:9976:9e1a with SMTP id 5b1f17b1804b1-477b86716f7mr17640575e9.6.1763627183337; Thu, 20 Nov 2025 00:26:23 -0800 (PST) Received: from localhost ([151.35.219.2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42cb7fb9190sm4142194f8f.33.2025.11.20.00.26.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 00:26:23 -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 v2 5/9] iio: imu: st_lsm6dsx: remove event_threshold field from hw struct Date: Thu, 20 Nov 2025 09:26:11 +0100 Message-Id: <20251120082615.3263892-6-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251120082615.3263892-1-flavra@baylibre.com> References: <20251120082615.3263892-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=2848; i=flavra@baylibre.com; h=from:subject; bh=NvUI5aXQ+dzQGpbFuILdCLUkAgQReaU1kD9uDURqAcA=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpHtB66q7Z2wwpif3kDRqjCw/vZVbCw4wQuA5Gn NqSPdDNphWJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaR7QegAKCRDt8TtzzpQ2 X0OsC/9h2sKQte4FveeBl5J6EyJrVGlXIvii/lxSTXaAXj2T2R0fzNHwMhaJNfWmtBrabnc3eJt nNHsCMkm9RQFIb6q1gLDNshWhH7ZoapBvGaUinmD8OCic0MObuy1Ys3QESncZFT0I7DY9W4bdI5 uaizc94Pcnnqicl2fwfnyL9PksPqS6kV978ZU4LRLtCukFofkW0RJPVWgtCdelMUNR0DBp4TAfD ZarMMzMGJMLQ1xM+MwdoJWKJPScPp4m8F1vdAq4ClLBQ8TqXjpDSzVHBFNQ6J2qge6eCPJa6UsC g6II/AVzXALuHDXZ1UyV9Kx6OGpqTfT2QWwtrmq1QYhg2V2D6KZkzRQfwLP2DzRLWRax70nPRRQ IS6M7WKkWs6juu7/NDEXwPHvKP6Qi+eJkvSevuM2j53qk2A5FW73lkiV2zNaDRHqucRlJgYckQn 6N2ZcHmptMG+cJrd6lsYTvZBKZ+SpuXs5WfRN/7OQZEeJ8C/W44ZP6y2hCHvotijfJNnw= 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 Acked-by: Lorenzo Bianconi 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 bbb967b2754b..e727a87413e5 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) \ { \ @@ -422,7 +423,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. @@ -446,7 +446,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 287a85d4bd58..117ecb080d8e 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -1900,12 +1900,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; } @@ -1937,8 +1945,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 Tue Dec 2 02:06:40 2025 Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 600813115A5 for ; Thu, 20 Nov 2025 08:26:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627189; cv=none; b=K5PMU7d0z11o/tLeURvbnD+YB6bRtjeqvjDZKUPxOFm9JlrWznqs6FCPJerXFVUaiQJJHX2zJdMAbfeEf9RoamN4KegRpV4XvbEnQEJdOy5UsqNYiHIsFay0+tG0gf119rdCQAu1j9oi6134nXiltbKQOMCwaEEBZwC2vLfK7tw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627189; c=relaxed/simple; bh=Pl7seLKP3VzGqHLHa4t0wj/0Xdcp2dmyAr7jQ8/rApo=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=q8UbJEqlu98aYvyQbbl58oMOg/M9r1CUizbQBmimA5N6v6rU6Gs6PTvz1301RpcWw77JXLBUj589krutEpWLFVPtPt1kItqQC0FAXrTO29bpGF3kqCnhbt2ikVazKID1DV3A5YDbwUX7pm3tdTeM0BZG8RyqXYPORToqK4eN4Ls= 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=yZjh0eGI; arc=none smtp.client-ip=209.85.221.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="yZjh0eGI" Received: by mail-wr1-f50.google.com with SMTP id ffacd0b85a97d-42b387483bbso371831f8f.1 for ; Thu, 20 Nov 2025 00:26:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1763627185; x=1764231985; 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=2NH9HL3lDQ8mwoCbjiBXJSaunGp8CcA2sbb0lLadFpI=; b=yZjh0eGILSzm/+sdx+jRO09dzJtrIAogB0G+TeoCVbaSLOTLNotMSoWPKeYi/ZkJKS Jmu/xe+W+m8JhTpBB7S/+tD0PTXfDkhhmvVQTlSgjsKH07g2d/47P3AJccqNIU/uJC3W NvzQbsTzpCRf8cSRku13JJMpmhg0qPXBFlLeawEjCoAL/+K8vZeWNuJ6rvSqmMsTQ1Ih TQve9oJPd11O4M6IptXttO5GxYTRlJI/5KQS1Mzu+ibnaVhXmr+Ply7Gmpg75K29HlnT aZvlAhKTruZi4vW3xgdT5LVSL+jXEE9vKcUBsE8gSC+/sOIyrCkdkmzc65o5EgC/2XL3 zmuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763627185; x=1764231985; 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=2NH9HL3lDQ8mwoCbjiBXJSaunGp8CcA2sbb0lLadFpI=; b=ozSU00LwH/r86gPyZLfElRhJ1JEZW3giCg1A96iOW9eFYCiDvXxgtYMyBFSB6hJiZB OgCDeK5A3DHIk+TUUJFELzzcXDjNUdz286eOzZTXKN9o5Jlr+UYL4QHPVR01AtJ/qEMt iRPLLwGm5X07IJb4V1RSo+Sst5TCQ1MHN1XHw+W1T10Ha0OAM/TO9MFQx+9IIdyyeBqY ojoFdF/5fXwdlaTBM+N2t4l30hZlONMWuMiqDeRRAubIdXoXuxdf7+Ha6h9PcMSmd17T E4y0SNXpYKPucNeyY1XbagHSayyF15w7MEF1AGZnxkoooYJY08mmgsbX6k+jqi45ND6p N3ww== X-Forwarded-Encrypted: i=1; AJvYcCV1IEP5XSh3FZtAAIkl/pyGAuRnX7LFE4WnSn30qQ93wotE57Zg30e/qlv9x1yCg9KiFN0rohGYxJmWpIU=@vger.kernel.org X-Gm-Message-State: AOJu0YzegUTKWVJRgz1bYU5Ez5coPlSJusX0yTIOlH7rwKbWID16ESr7 UK+CCK7UOYOvEDhdRctE8xI8t2lm4EwiWpn4SqXv9M4tUWg6sb2PXZtUhcIKU/XqXxw= X-Gm-Gg: ASbGncvINhxOtHGXTzIIFuvlVc5pC2iq8g50nW7lWPr1F38dZA9E3ib8BogmLOkxbs/ DJFAMRH3YrIbGtfEwVImX5GOoMqM9r2syYU7uEaEoZbAdF5PkCMl1ddFXm4Hc87BH6hwPLF1IW2 erWtc4foRird5f2J3O3e1+x9w22oxGsd7gztHPHiHmw5l/vFcBGWyTGCyfrkXmCt87OrirDGJod RXxSAhonDSfFG6kh41fSFQN4KVJB6FmUNYvuUmk/o7fjPOkhiFku2rIs/A2sl53fJLTzr3/aEUq AtPO8imr9q9xtgG0j8VAkN3w4TyRwQ36RzBPKjxbpCYv/3UOhW5SN+u9kuHdQPbXhN546BCHfwc 5pmwPPJAQAqdZXW5KmqWfi/cFeHN5vEsKy/irSU1mrXJdsZnH4NaK6Es= X-Google-Smtp-Source: AGHT+IFEUrV71RTzljkgRY/G1TQEE5I1P4a/M9mSlHB0tzKZW2HL6p+RFLaptnK5/KKq1bQArqRnHg== X-Received: by 2002:a05:6000:1846:b0:42b:4061:241d with SMTP id ffacd0b85a97d-42cb9a67ca6mr1531560f8f.59.1763627184504; Thu, 20 Nov 2025 00:26:24 -0800 (PST) Received: from localhost ([151.35.219.2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42cb7fa41d2sm3961947f8f.22.2025.11.20.00.26.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 00:26:24 -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 v2 6/9] iio: imu: st_lsm6dsx: make event management functions generic Date: Thu, 20 Nov 2025 09:26:12 +0100 Message-Id: <20251120082615.3263892-7-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251120082615.3263892-1-flavra@baylibre.com> References: <20251120082615.3263892-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=11134; i=flavra@baylibre.com; h=from:subject; bh=Pl7seLKP3VzGqHLHa4t0wj/0Xdcp2dmyAr7jQ8/rApo=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpHtB61sRMP968t26t5QkmoT0h6RB0mUWcPl9dZ QPSc0jT59iJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaR7QegAKCRDt8TtzzpQ2 Xy4sC/9HBeRr3bt9wpSbUlhFhWUczJR+3QvUXUP/bnTcJcbs7DsggNKkNnelU6M059c++KxXdPy +2/0hMeDPBrWRCSHSh+OcyU4SwDB7+2Frc1ECp9c5YiZIj3bzum7uoM5Y8sjxwuqeZlO784Otg7 bc0LOgc5/HcOoBhPu0i0zJGgrKVYbDyg6iJua6uHlyUDWjqCiBsS2jcRYQvwhG+uJPKWiauHVOF dxmprFF+vv4r0s2gBZjg37pnyjQ6/+tzpksJjHcpz3iDwxqIwONnlOr6wHoF9AET5qg5LHQDDjj FYHHlC0M34nbja97awhNHBe7RJCfHIVkvS94a/b5QWgnh6VL2CUqeKg6/WsfSHRTFa3k7FHWHgN nghsqp+P7kVdVFW/L2/XhTurTs0rvq2XErKIkgP0OPx1RY4XNTdHvxwr8THz3WliC425mkx1Rku JdFgw/ok+54v3F/HtqFirTSVCQpPqR+DaM/sqdJUi1LWEtL9x2j1GUMqYkedGWDkHo5cQ= 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 Acked-by: Lorenzo Bianconi Reviewed-by: Andy Shevchenko --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 2 +- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 149 ++++++++++++++----- 2 files changed, 109 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 e727a87413e5..037b3b817e83 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -446,7 +446,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 117ecb080d8e..18a09ed6907c 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -1747,11 +1747,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, @@ -1864,9 +1869,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; u8 enable_mask; unsigned int data; @@ -1875,22 +1881,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]; enable_mask =3D src->enable_mask; data =3D ST_LSM6DSX_SHIFT_VAL(state, enable_mask); return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing, enable_mask, da= ta); } =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, @@ -1898,16 +1906,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; @@ -1926,19 +1935,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); @@ -1954,13 +1964,53 @@ 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 @@ -1969,22 +2019,24 @@ 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; + int axis =3D chan->channel2; 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(axis); =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(axis); =20 /* only turn off sensor if no events is enabled */ if (enable_event) @@ -1992,22 +2044,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, axis, 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; } @@ -2418,18 +2472,20 @@ 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) { + u8 enable_event =3D hw->enable_event[id]; 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 (!enable_event) 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_reg, &data, sizeof(data)); if (err < 0) @@ -2437,38 +2493,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))) + (enable_event & 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))) + (enable_event & 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))) + (enable_event & 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 Tue Dec 2 02:06:40 2025 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.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 7EF20326921 for ; Thu, 20 Nov 2025 08:26:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627189; cv=none; b=W4r0Xpnc0hJT4Q/I/codLk+8QOopuB5oJA2ziqFh/XQ1x/hOr0X4iVEYzHmgzUtFLq6JU6hjNEEPyhK960KDPVmhlJR7Q/61AXa1XwyVvEIQZ+Q/G8rganT/PCSb2mq9/79IBsC1LU4FnKcIzl3oH8vUaU7rtawow6Dm8C5u/sY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627189; c=relaxed/simple; bh=M2xi7kmYS8FYoUjEZg0XBnuh1zE891+q0kJi1ZGVBrQ=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=sPyQqX0v08HndjpsNqJog1gdz8UrnbMPIBYBXrGZOxTwixBGd+LsFv59gBpOxTaEJkIBqNzEniKfHRA15JhMwK0UIG7nN3a81xGHbj5hnf1wFq9EGBaJswWX///5YSTPgCrHvA+qZDgoaoQfRGbDWPUZ1d26C3qi1K+giMYje9w= 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=Q2weYyzk; arc=none smtp.client-ip=209.85.221.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="Q2weYyzk" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-42b32a5494dso286661f8f.2 for ; Thu, 20 Nov 2025 00:26:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1763627186; x=1764231986; 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=b/6WYSWNnQnuNFEM1VMeHztnE0M2zVKGUMsSbsYzHHU=; b=Q2weYyzkehxTkNNx0IWfmaUfC7aZPkTYxdH2nvYqKwfULAvs+jRo7fUx5Eoy7TVXLZ MCYk4QbNCvNT609ozMc2ehZjwDCKbXhptS6RHuf9+0hVY6wW/qQRxKo3oQlugqcPcyqq 4A+6c9YMXRhqdBkhGh2F8OBJHZGXYca6PnxGx5cRi4I1vtBkGq7phjT4uGlEW9LbHvvI EdP4eRoLPsiP10NFuKIIhUEItqRt2wBNzxGKc40+0p6Tm40JxXu5n0WUpbxADUxpfATR 9XMH6dKrf1m4Pwu5cJD190qZD2yY793BmPfmKPQPnIXWRrBLI6BOjcMNfoL3FHEZmw/Q oAMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763627186; x=1764231986; 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=b/6WYSWNnQnuNFEM1VMeHztnE0M2zVKGUMsSbsYzHHU=; b=P7krnz5EqI2f3fygRI5uMMe9fyn2ilwCaOPvOJHVZAncwA7v5MgeQMqnvNNInVOvTo aGtabFeKjOjCXDKFrTrqmjaZIrghnLz49jZdWQM6agFwnBbSr0LvL4f+DvG0nZqsx4Va tvqj+07hJqCA+BeQTIJiwRylnZFZR9Z+b9r1IiMre749FUX79M9WIUlAurAdzbobtsl7 Al/03/pL9QfdCvLBQBPcynECMI8y4IiwV4837dEPxjrcGdBVxUc+l648ifLMP6IqLy8n qWQ8EAiGOiS5NVFrshn3rHFuWNiN+wsLvKWQRJNka9I+kNFiS5TZ5ajhegOwI9gwWvnm UEbA== X-Forwarded-Encrypted: i=1; AJvYcCVwHl+XRPr4gwc3YKEyL27M6ylr9je1Sw8xd5BLpF2As03WOgOYL6WZ6qJe4jbouNJm68FETVU2m03L7dw=@vger.kernel.org X-Gm-Message-State: AOJu0YxWx7k/9gf2a1tBMNJyCWQHRO20HMJqgmwAskbcZi33xp9BSm32 UCtE10bJ6l0ImnrKbfy4tWsG1KvPydyW33XupUhgjrJJ/yNMdyD0sqORtx701mzXWMY= X-Gm-Gg: ASbGncugjKtfz8QHWDH3x50x8XF9RomZxFhSt+mASJdTjzTrQVqxFgXKB+DUZp3IOLQ CPp7DngkLIXw0JTkKk/ZEMkgfWLfzC/nY/WoM6tKrIBzUQgqp0KX7ehnEhxYMQvB0GJh/WgOe3B lg5BwEIAtvtyQ4ECCWcVN1pPme4g7wQqXptmR6aRDFOBqJ17+YPtDPmvcvnk4rSYbTHDLHGJhNK nTVaBqNoNs9cwVesPYiokaWrVdsUitJSivKuykCiBh+qQNs6dV5zWGaG0VST3pkJDxEum9aoud2 pSXPjR/JsQ+0Yper3REdJhAnh9Zj4b+VDBe/I3G41jOUaYOT/l+Qshp3O0Ev9ITcE6DYKcCjjY3 GuHNtemcmXY98CclFfxUBIWPqaxp49FL5RXjuNTuB3Clhqzec8+lIlTY= X-Google-Smtp-Source: AGHT+IG1R/Xrbs/polljSQlJxwd47c4tbTlgz8tUqGVrTueBAkGCPO0V8tDFfeEC1TKUoHay87Gtpw== X-Received: by 2002:a05:6000:184a:b0:42b:3dbe:3a55 with SMTP id ffacd0b85a97d-42cbb2783b8mr1199692f8f.14.1763627185638; Thu, 20 Nov 2025 00:26:25 -0800 (PST) Received: from localhost ([151.35.219.2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42cb7f2e598sm4062507f8f.4.2025.11.20.00.26.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 00:26: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 Subject: [PATCH v2 7/9] iio: imu: st_lsm6dsx: add event configurability on a per axis basis Date: Thu, 20 Nov 2025 09:26:13 +0100 Message-Id: <20251120082615.3263892-8-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251120082615.3263892-1-flavra@baylibre.com> References: <20251120082615.3263892-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=5556; i=flavra@baylibre.com; h=from:subject; bh=M2xi7kmYS8FYoUjEZg0XBnuh1zE891+q0kJi1ZGVBrQ=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpHtB7JmIOK5wxn5U6F6GBQIAq8rARghItco41w jT2Mew0noeJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaR7QewAKCRDt8TtzzpQ2 X4B+C/wLgy/c03T3WHkbmVMNtLN4rsjGLmqbOkI++eEE6fzNbYP6UmcFbskWrsjK2UeqeEf7fR8 +lMwqqR2zjFywx3iqOR1ldl9c6Tt41pCfzu0lQIl2Z3pgZh9NJxPeaoNbIoHoB4pAtL6AR/d0Zk zFSpJHoH/CuP/IL0Zkjedz4ewpoVYidA5ka1rEyPOwOxlAf1uVTdbbJruPbgq9AfRaiz7aH54/o IMQeLc8G8YcNilL1TKHbg+ewZ8uUno2ReeejVbp2TNxGKcW3U558LhVBdJTOj7pA32rXaLLFQdf +x+RTpLQWXgrAmGq66GPtThBG87x7xsb6zmnCfzBWUJr5njK+De8uDpOdNnOnGM0ES9qJ0SKGIN hCMu/eTieEVi7+SgU4P6tctt5VQv8PKXr5TA2C/4fFsivMoc4JKd94pe8p+/sfsMATYa8w7sQfh 8xhmF/dh/Us/qJ4lAMSovG7uxTMNzZ7buuSl2bRLSEio7FxgG2vmf4+yeye7XUkTt0UOw= 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 Reviewed-by: Andy Shevchenko --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 7 ++ drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 93 +++++++++++++++++--- 2 files changed, 86 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 037b3b817e83..6f68508e5769 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; u8 status_reg; u8 status_mask; u8 status_x_mask; diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu= /st_lsm6dsx/st_lsm6dsx_core.c index 18a09ed6907c..da914a58a875 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -1877,12 +1877,48 @@ static int st_lsm6dsx_event_setup(struct st_lsm6dsx= _hw *hw, u8 enable_mask; 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) { + 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; + enable_mask =3D src->enable_mask; data =3D ST_LSM6DSX_SHIFT_VAL(state, enable_mask); return st_lsm6dsx_update_bits_locked(hw, hw->irq_routing, enable_mask, da= ta); @@ -1899,6 +1935,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, @@ -1916,7 +1985,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; @@ -1948,7 +2020,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); @@ -2029,20 +2104,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(axis); - - /* 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(axis); =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; @@ -2060,7 +2126,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 Tue Dec 2 02:06:41 2025 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.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 62705326D6B for ; Thu, 20 Nov 2025 08:26:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627190; cv=none; b=fJBgEi7CFb7rJ6JT5i+muwplUpgIYcyOVIbjaMVGaUC+t2drpjlxIcLXjSmb5EK7SMdVYz8XeGRwE61qWgNB39QwRqIuxIV5mpkmFNI9WPu8lp+wF0hPTQNXA/mhSxTHqyc/FgbORcb+bbFU/UdP1Qk28TNoYSKeeNzYsSqgxv4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627190; c=relaxed/simple; bh=K/Kx2VbEDfL4oHgE4vCOHbqOhUH6e20qujkg/9y5Ho0=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=PrOQuAvipPwABFyzFkOZaJ4ia9sLo+7Ox/gnDUzAEdiuNhgs7QwVMu2kTX0xWFWko6bpNrAsqPwHOFr/5dTYNujAz4WeVfPpZo1p/5/V4KA0pwzaqamvunV59zEOvt0pOM/y6A2zC0Z5p8t4slITMC+S75VLsS1LPcV09/tNknc= 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=abd/Ko/Z; arc=none smtp.client-ip=209.85.128.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="abd/Ko/Z" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-47775fb6c56so5098495e9.1 for ; Thu, 20 Nov 2025 00:26:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1763627187; x=1764231987; 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=KGqFACH/HkVCJjUX6Ee9GAnpXzUkKAqrFu9bfRLxaHs=; b=abd/Ko/ZK+iJKfu1T/zNLT1eIA91srp0x/QmgwvcsS25JyLWLnuZQPtqgg5gZO/+vr NkRkM3jlxOrralFT8BULLKYil+FpIBWkAD7aBCA7buPpEOuq0ItyVi+80zbltu/i0XqV 5bhvFoTpIK1SlomwDcILnLmxWO0IH8uVETk+g24NFPfHUUAUm4JHI6IX3n9dDM20ef57 ncA36uq50WjB/uQtMrZVLHQMnaQqWHNJMTDkbUVoqGYtrUT6QW2ecr+LWKi8IUuxBY1p yFVZRDv56MTpED8/jHDyudC6ZcBZNgI5/n7tW7FsVRtn/PKon4rC4QYShtAvwkJkX8mk DrJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763627187; x=1764231987; 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=KGqFACH/HkVCJjUX6Ee9GAnpXzUkKAqrFu9bfRLxaHs=; b=kLKERyojMpyGeJdEKgQreSKHsOdG9F9DtM5WVs4UBxNS1WSHoRlswYtLH+wqEglkDO sOlQVewkzqDxmzUAN6IdErzEW8ap92iQ4xhm4ffbPfXK39khGOpc7Xson48WY84zo+jS sJJkNG0gGMwWRVyINKCwd5up0+P7seymriGyKX82HxiTlnV8Ip3NLpj+SATMW0u4jpmP RxpEw2XIRBC60eEB+fryfANab/6uWGxUnkiSR/8dMZHPQyBwNtswUCoJ1kgpHhXUwEEu 0HMxOFyB5vnjyq2aBLi88Th6De6v3zAnzD4UqZ5QWW+Vfte8P+aob3eVzjoQYwsaox6P pzeA== X-Forwarded-Encrypted: i=1; AJvYcCW2eaX/sZuNLAOpIigMCMt7AefWtSscgRF8s2r31Frxx+2tUHjc05254AKM0M9yybR0DSHfXByuS+sqMmw=@vger.kernel.org X-Gm-Message-State: AOJu0YzAiRkwhFX5PTy3QJ9FklUpQ7HPicwawBXsfdbhvy9jx1M20e4a n8LkmDxpmLx6ej1SXvYwCDawXfez57ZsiPGey0rZfGgF6e3nIF0XFik2xhYii2XZKv0= X-Gm-Gg: ASbGnctzfFTrnQSLpg/Vug/lv1FahhbsJxhAOLOQatBlEGFxIsEKobT3B3Gpqoy+ugf X5V3UsMRsd3SpqbTlcUPhaGaVh9hm/luULougRUOfLUMiFI4525eOwp7xDBNnpK+nAIcb/NT1/H r8VQjxqzp9Brym33f2WGCfwZJ6Uw9WTferBYYGt+FR4dJI04FhPoDS9+xEPc0z/2ldDAUMqRAOT vPipOcBGIs84goxDL2T5/jxHrUZDAS9kxmthdMBPu9Yd6IeIZ0oSjexv7pj13COUiT/2/6KRsCB 0eeGzWlnGE/3iVqYIY7hPRHTa8N/PhvaNDXLOjwlW/Vaxwrmelu1cnIv3g3QHYxnQLznHtKDuaP W5pRwikwEN2at4rE6DyeOPR8lFHNgl/19tJHvH9M0Uckf07wzdBlXpUg= X-Google-Smtp-Source: AGHT+IGypkUV/VzoWTzOaqQfFG9GB1sWrnoHEOhRUWD8sKoUwzZ7+2zS/Gxes1QuD0FpTMBaXZHAwQ== X-Received: by 2002:a05:600c:1550:b0:477:b0b9:3131 with SMTP id 5b1f17b1804b1-477b8951fe9mr19532675e9.8.1763627186741; Thu, 20 Nov 2025 00:26:26 -0800 (PST) Received: from localhost ([151.35.219.2]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-477b82cc6c4sm41891105e9.2.2025.11.20.00.26.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 00:26:26 -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 v2 8/9] iio: imu: st_lsm6dsx: add event spec parameter to iio_chan_spec initializer Date: Thu, 20 Nov 2025 09:26:14 +0100 Message-Id: <20251120082615.3263892-9-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251120082615.3263892-1-flavra@baylibre.com> References: <20251120082615.3263892-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=3483; i=flavra@baylibre.com; h=from:subject; bh=K/Kx2VbEDfL4oHgE4vCOHbqOhUH6e20qujkg/9y5Ho0=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpHtB7IN101XbBsRr0amGEISqgWrInYK8eYv6eC OFTgE1sBJmJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaR7QewAKCRDt8TtzzpQ2 X70KC/9MBp24o7acI41gAAgjhCHXoQo1UNiW6xBH7/53rquR2RcFT+6bCrXDaF4D2yVabMOzrsY 6Y4haFqOz/vV/IKlf7yD5scsaaFojUQ/h1g6S5Rm37HQPf1A8pNbTltY+PQgWpx2cUqLc+M2YH2 uEyaPHig4tJW9Yd8yCUiAvEWRG25XU6fM4s87Tw7prx+geagfa/cmqvnljuJYnjPEgfaC7+WBqs 5vkWwmXmihXINVhJN++Ruy7O4FMIatbCzaOOFH9Y4i+C9lL/38h9UNjoCOpEwXW9gVluNta87Nx OvvwX+mM9dkkTjNS5fSZoqCjPjn46kDYThoyXy4I7cG3rDONaGj1E43neZFLovpEgr5kW5yToSj e4MJyp5RpuNCljyhDA2hryXss2Ag/qg4DUHqXvEmQ1LBmgcNGTmjVS5Pe0G0rQhhbI1xAMilXbK +jJ2BBqGKLji/aB5DTN5n+rcb/jEEegKxvVxoqDTV9aUkjBNIoUImNPvAuumb/HS/wlBI= 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 6f68508e5769..3b90261e6bb1 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) \ @@ -469,13 +469,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 da914a58a875..562544636f36 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 Tue Dec 2 02:06:41 2025 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B7FF6327BF0 for ; Thu, 20 Nov 2025 08:26:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627192; cv=none; b=kD+gewpBk6sV1LMAWZqaiowaY9WhLvTOasF4NElBEvvpNMI/kKHP2TWNxE1/TvpRIpMhCYaH7PnVqEIBDXdjyKRgodOqkoc0bf3nfZtoEYQS8SqQ3eDHk6ZNPJkDREbAE+yu/bx+18FnP6Bl2AWMR/LyjCNcWLmRhEdvzidOC3c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763627192; c=relaxed/simple; bh=rCueut8oKenLkzP/pdx8S5ZQVc/azzywTOOlHs8t1/A=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NwByzUY+r3R4aWSqjoeZfztQgCQxRz41LzMOh0RnQY+o105xA7YbLeOXFk8ESACDD1XVu+Tg4A414yNKjjmHHJQIJgJlKq+Kd7CwJL3JzHWjbKbGhHnhz9Kjsw8ME7zsqgcS2M+Bkzs4/nsZpKg5n5BTggnYYXY2IX70W4seBVA= 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=PV//OcXK; arc=none smtp.client-ip=209.85.221.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="PV//OcXK" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-429c82bf86bso345553f8f.1 for ; Thu, 20 Nov 2025 00:26:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1763627188; x=1764231988; 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=PX6DdzcBdAgazqaRtWaoP1G3y29Y/m2GG3jReyS8qiU=; b=PV//OcXKLO49qFfNi8bUQ7lQ7Qq62Y9+fOqVpd7C8PX5qlbKz2PxbL3e2mDmvqCmgI sslje1OwtS6oHidVezw/E0zqdxfItcyRsCke/+2sZk4YGeXQNpXsLBqBBf+Uv2Yy8pJX x1CS+pISI8SPrJeub2zNimsuthPD8lylcuQzcJydP69sNQFM/kEkgpFWQmEQscgzBK3D UaIJHV6Py9Ui58sR6J2Pf45854JT/KjBkChMVZExKSPxZ6CWMAAOmf2aPdQP+z+ToxA8 vGwfBJuOJ4fXgOvuuVtw9yDYPQAXZpOcI7xRnWjdEq3fShKMg/kS9yRGrquNS8l/H6JF 1wlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763627188; x=1764231988; 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=PX6DdzcBdAgazqaRtWaoP1G3y29Y/m2GG3jReyS8qiU=; b=H2VbmKkSiVpRpSOALFWgYD/g5zKbhLqVtyyTzp6de/lXU2/wk/4MlZljBxl7GiJmbK z8yAT7PK8KDcw4GSNWoL01rxLUBUJl4MiB0h3iNwTaeT3qza74WElLUeEQa6jGusX+Aq 4uvJY2LcXBCsHnaln/Ap1m98q1FVQ2d2E+C07SEVHjHLpfXFRE9/3ek1fjf71fKF+lfW SOGMPy1z2qf+85agIXYZaT9PH0DF06j8rM0VObuVUwbvZ0RFmcZzCGdOG32MSjnQ5D0Y /MSq2wCqiqxA42tJEcFWXgqCtfKoxvcZHwR5gWcjM7BbcUIof40spFPDBfg3M/RMnh38 HKOg== X-Forwarded-Encrypted: i=1; AJvYcCXr/I1PreDC9LMTqZPCMIo5FNMbt6mnmRPvEEt5EZ+CQsbbLAd6+F9W+Ou3bAAwlB4zJCNymKH45ctux4o=@vger.kernel.org X-Gm-Message-State: AOJu0YzL0Smaa2fQJJXGedFqYl+mhFFCGAyX9MwG8e5D0wgQI4hK3XXe TZ6xnwkiM74XcNrkHsCL43pDExnRe9vo1ZUcx/PtIq2ByF5DeansJLx3ug7e5cOMZSE= X-Gm-Gg: ASbGncsfFL52heOmS4wtF5ZvxzaqAqAFxkAc7Y8wwf0/wc9QsXLtD5XWOtXYZXlRqao 6wgkotJXOA8DV7WvtkkVwdlzt/2WMyU/C7vU3alVpmwPUKv83aVvo+wOD7KrPIPnOXXU07SyHRU R2QnXQRCuWK4MdmSAXeg8XQ1iTltUF55seRvEaCHT1D9LpAbAGXrbD93Wrh/olYSa40WYKbgE6e boUY5fZryY6BMLuuSjTqhHN+68zaUSCE9HUxVDsAXnOjP9ldg5Axamws0BEEde9RqfP7Ug3694x TC/uXd+B0/eS/loGmpevDoTNmGH1DJLpBRmqpBBHzGfEl4P8WyK8Dnex2ZkJZ4MwHcpqRU5d3CX Lncj8nk4RQ+izfUyw/lOPlwmYLVecjAnRt16/8OcGhu7fG1xdTD+oifk= X-Google-Smtp-Source: AGHT+IG802Gei6CAzXsOaDNbdW60lD9/nV5nK8bJuNWbFp6TGJvXHnh57A2zHwT6/ty7W1wS6XC4qw== X-Received: by 2002:a05:6000:428a:b0:42b:3bfc:d5cb with SMTP id ffacd0b85a97d-42cb9a55986mr1634050f8f.51.1763627188022; Thu, 20 Nov 2025 00:26:28 -0800 (PST) Received: from localhost ([151.35.219.2]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42cb7fa35c2sm3670859f8f.25.2025.11.20.00.26.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Nov 2025 00:26:27 -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 v2 9/9] iio: imu: st_lsm6dsx: add tap event detection Date: Thu, 20 Nov 2025 09:26:15 +0100 Message-Id: <20251120082615.3263892-10-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20251120082615.3263892-1-flavra@baylibre.com> References: <20251120082615.3263892-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=4455; i=flavra@baylibre.com; h=from:subject; bh=rCueut8oKenLkzP/pdx8S5ZQVc/azzywTOOlHs8t1/A=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpHtB8QOA8X/mB6mZ0YURPf5zlC0oGj0Ne0K+Cg YtUsyRJXr+JAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCaR7QfAAKCRDt8TtzzpQ2 Xx1/C/4+y62W1GV5v+dJYV9rWI6c9J4mRTAuH2Qf1wbrvJWk/wn+EDMbfzeErWGUyO8j7Qdk9Nl CvITr106a3DmMvl4OfucJD2bTo3S8v1C4Gz5cDAjs43S3162o8RNLp8LfLLupKvIl37mWCrTIbU 198/ndh6P0IJnGEIjAWaTsIjjaXWSNApSvOpg8e78eLN4os4MXe9SLXEeAroD+T2j2bmufPeo9d 9wHxGP6vj95lfp5Ont8UlYc2HyA8IeaELU/abvGRJB+6GdMwHM+AOcENJAhRH48euoR6iEuPs8R S5KV1eLp9m+UYtd6l+MFWJpi4v6NnmcZzhJSYaEsFmq8YMjdLHVIzPER9IV8Dy/qvuITMgImOuy jXIdgEH4eWzGpJasZHhBLE/ewUnxBE0AHQFXu+lqKcaNdfdoO7cHNcoTNtYuV0k8P53FgNkoJOh A6/lYE9q1ZB05RLSk6R88mPg3bqh3YSdx525CqQNvYOfryRibZ+AA+mxDb3YfQ6hIJ7wk= 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 Acked-by: Lorenzo Bianconi Reviewed-by: Andy Shevchenko --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 1 + drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 55 +++++++++++++++++++- 2 files changed, 54 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 3b90261e6bb1..5d820f2a0bce 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 562544636f36..55cd63643c52 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), @@ -1250,8 +1272,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, @@ -1426,6 +1448,30 @@ 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_reg =3D 0x46, + .status_mask =3D BIT(5), + .status_x_mask =3D BIT(2), + .status_y_mask =3D BIT(1), + .status_z_mask =3D BIT(0), + }, }, }, }, @@ -1939,6 +1985,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; } @@ -2606,6 +2654,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