[PATCH v4 2/2] iio: imu: st_lsm6dsx: Add ACPI ID SMOCF05 for LSM6DS3TR-C
From: Jared Wuerzburger
Date: Mon Sep 28 2026 - 14:05:04 EST
From: Samuel Dionne-Riel <samuel@xxxxxxxxxxxxxxx>
The Minisforum V3 and V3 SE tablets declare their ST LSM6DS3TR-C IMU in
the DSDT with the hardware ID SMOCF05 instead of SMO8B30, so the driver
never binds and the accelerometer and gyroscope are missing. The
Windows driver (version 1.0.4.3) binds the LSM6DS3TR-C to both IDs.
Relevant part of the DSDT, identical on both models:
Scope (_SB.I2CD) { Device (STS) {
Name (_HID, EisaId ("SMOCF05"))
Name (_CID, EisaId ("SMOCF05"))
_CRS: I2cSerialBusV2 (0x006A, ..., "\\_SB.I2CD") vendor data "SLA0"
I2cSerialBusV2 (0x006A, ..., "\\_SB.I2CD") vendor data "SLG0"
GpioInt (Edge, ActiveHigh, ..., "\\_SB.GPIO") { 9 } "SLA0"
Method (SLA0): "-1 0 0", "0 -1 0", "0 0 -1"
Method (SLG0): "1 0 0", "0 1 0", "0 0 1"
} }
Both I2C resources describe the same address; the I2C core uses the
first one.
The vendor-specific SLA0/SLG0 methods are not parsed, because SLA0 is
not usable as a mount matrix as it is. Its X and Y signs are right, but
it also negates Z. It follows the Windows sensor convention, which
reports Z = -1g with the screen facing up, while iio-sensor-proxy uses
the same X and Y signs but expects Z = +1g in that posture. Applied as
a mount matrix, SLA0 gives correct screen rotation, but iio-sensor-proxy
reports the tilt inverted. The actual mounting is a plain 180 degree
rotation about Z (-1 0 0; 0 -1 0; 0 0 1), with which orientation and
tilt are both right. As for SMOCF00, the matrix is therefore provided
by the systemd hwdb instead.
Tested on:
- V3 SE (Ryzen 7 7735U, BIOS 1.03) with this change.
- V3 (Ryzen 7 8840U, BIOS 1.06), kernel 7.2.7, with this change and
the stock firmware tables. The driver binds to i2c-SMOCF05:00, the
WHO_AM_I check passes (0x6a), and both lsm6ds3tr-c_accel and
lsm6ds3tr-c_gyro are registered. Screen auto-rotation and tilt work
with iio-sensor-proxy and the matrix above (checked with the device
renamed to SMO8B30 via a DSDT override, i.e. the same
ST_LSM6DS3TRC_ID driver data).
Closes: https://github.com/mudkipme/awesome-minisforum-v3/issues/2
Signed-off-by: Samuel Dionne-Riel <samuel@xxxxxxxxxxxxxxx>
[Jared Wuerzburger: rewrote the changelog with the DSDT excerpt, test
results and mount matrix rationale, converted the entry to C99
initializers, dropped the mount matrix patch]
Assisted-by: LLM
Signed-off-by: Jared Wuerzburger <jwuerz@xxxxxxxxx>
---
Notes:
Jonathan, when applying, could you add a Link: to this series? The
cover letter has the full DSDT excerpt, too long for the changelog.
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c
index c4097ce2bf..11e5ec3798 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c
@@ -145,6 +145,7 @@ MODULE_DEVICE_TABLE(of, st_lsm6dsx_i2c_of_match);
static const struct acpi_device_id st_lsm6dsx_i2c_acpi_match[] = {
{ .id = "SMO8B30", .driver_data = ST_LSM6DS3TRC_ID },
{ .id = "SMOCF00", .driver_data = ST_LSM6DSO_ID },
+ { .id = "SMOCF05", .driver_data = ST_LSM6DS3TRC_ID },
{ }
};
MODULE_DEVICE_TABLE(acpi, st_lsm6dsx_i2c_acpi_match);
--
2.55.0