* [PATCH] iio: acpi: Accept comma separated values in ROTM strings
@ 2026-10-12 7:41 Yu-Hsiang Tseng
2026-10-12 20:55 ` Andy Shevchenko
0 siblings, 1 reply; 2+ messages in thread
From: Yu-Hsiang Tseng @ 2026-10-12 7:41 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, linux-iio, linux-kernel, stable
The ROTM method of the MXC6655 accelerometer on the Higole F9B, an
Alder Lake-N handheld (AMI BIOS F9D_16G_P800217, DMI strings are all
"Default string"), separates the values with a comma and a space:
Method (ROTM, 0, NotSerialized)
{
Name (SBUF, Package (0x03)
{
"-1, 0, 0",
"0, 1, 0",
"0, 0, 1"
})
Return (SBUF)
}
iio_read_acpi_mount_matrix() only accepts the space separated form used
in Microsoft's example ("0 1 0"). It rejects this matrix and mxc4005
falls back to the identity matrix:
mxc4005 i2c-MXC6655:00: Incorrect ACPI mount matrix string format
mxc4005 i2c-MXC6655:00: mounting matrix not found: using identity...
With the X axis not inverted, iio-sensor-proxy reports left-up when the
device is held right-up and vice versa, so the desktop turns the
picture upside down whenever the handheld is held in landscape.
It is not the only BIOS written this way. The BOSC0200 on the AYANEO
Air Plus uses commas in its ROMS method as well, with a space before
one of them, and its ROMK method has "1, 0,0":
Method (ROMS, 0, NotSerialized)
{
Name (SBUF, Package (0x03)
{
"-1, 0, 0",
"0, -1 , 0",
"0, 0, -1"
})
Return (SBUF)
}
The kernel's sscanf() does not support '%*[', so there is no clean way
to take both separators in a single format string. That leaves either
a second sscanf() call with a comma format, or normalizing the
separator first. Do the latter: turn the commas into spaces before
parsing, so the existing "%d %d %d" format, which already takes any
amount of white space around the values, keeps working unchanged. The
strings live in the buffer acpi_evaluate_object() allocated for us, so
they can be modified in place.
With this change in_accel_mount_matrix on the Higole F9B reads
"-1, 0, 0; 0, 1, 0; 0, 0, 1" and, with no udev hwdb override, the
desktop rotates correctly in all four orientations. The AYANEO Air
Plus was not tested; systemd's hwdb has an entry for it, which
iio-sensor-proxy prefers over the kernel's matrix.
Link: https://github.com/hhd-dev/hwinfo/blob/d9508123bee46ae3a59dc24826030ef51ea95058/devices/ayaneo_airplus/acpi/decoded/dsdt.dsl
Cc: stable@vger.kernel.org # 6.10.x
Assisted-by: LLM
Signed-off-by: Yu-Hsiang Tseng <asas1asas200@gmail.com>
---
drivers/iio/industrialio-acpi.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/iio/industrialio-acpi.c b/drivers/iio/industrialio-acpi.c
index d67a43843..c77926f6d 100644
--- a/drivers/iio/industrialio-acpi.c
+++ b/drivers/iio/industrialio-acpi.c
@@ -6,6 +6,7 @@
#include <linux/export.h>
#include <linux/iio/iio.h>
#include <linux/sprintf.h>
+#include <linux/string.h>
/**
* iio_read_acpi_mount_matrix() - Read accelerometer mount matrix info from ACPI
@@ -63,6 +64,14 @@ bool iio_read_acpi_mount_matrix(struct device *dev,
}
str = elements[i].string.pointer;
+ /*
+ * Microsoft's example separates the values with spaces, "0 1 0".
+ * Some BIOSes use commas instead, with or without spaces around
+ * them: "0, 1, 0", "0, -1 , 0", "1, 0,0". The string lives in
+ * the buffer allocated for us above, so turn the commas into
+ * spaces in place before parsing.
+ */
+ strreplace(str, ',', ' ');
if (sscanf(str, "%d %d %d", &val[0], &val[1], &val[2]) != 3) {
dev_err(dev, "Incorrect ACPI mount matrix string format\n");
goto out_free_buffer;
base-commit: a3b3580713f3ac5a32dc2874ee546828977a1d68
--
2.55.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] iio: acpi: Accept comma separated values in ROTM strings
2026-10-12 7:41 [PATCH] iio: acpi: Accept comma separated values in ROTM strings Yu-Hsiang Tseng
@ 2026-10-12 20:55 ` Andy Shevchenko
0 siblings, 0 replies; 2+ messages in thread
From: Andy Shevchenko @ 2026-10-12 20:55 UTC (permalink / raw)
To: Yu-Hsiang Tseng
Cc: Jonathan Cameron, David Lechner, Nuno Sá,
Andy Shevchenko, linux-iio, linux-kernel, stable
On Mon, Oct 12, 2026 at 03:41:44PM +0800, Yu-Hsiang Tseng wrote:
> The ROTM method of the MXC6655 accelerometer on the Higole F9B, an
> Alder Lake-N handheld (AMI BIOS F9D_16G_P800217, DMI strings are all
> "Default string"), separates the values with a comma and a space:
>
> Method (ROTM, 0, NotSerialized)
> {
> Name (SBUF, Package (0x03)
> {
> "-1, 0, 0",
> "0, 1, 0",
> "0, 0, 1"
> })
> Return (SBUF)
> }
>
> iio_read_acpi_mount_matrix() only accepts the space separated form used
> in Microsoft's example ("0 1 0"). It rejects this matrix and mxc4005
> falls back to the identity matrix:
>
> mxc4005 i2c-MXC6655:00: Incorrect ACPI mount matrix string format
> mxc4005 i2c-MXC6655:00: mounting matrix not found: using identity...
>
> With the X axis not inverted, iio-sensor-proxy reports left-up when the
> device is held right-up and vice versa, so the desktop turns the
> picture upside down whenever the handheld is held in landscape.
>
> It is not the only BIOS written this way. The BOSC0200 on the AYANEO
> Air Plus uses commas in its ROMS method as well, with a space before
> one of them, and its ROMK method has "1, 0,0":
>
> Method (ROMS, 0, NotSerialized)
> {
> Name (SBUF, Package (0x03)
> {
> "-1, 0, 0",
> "0, -1 , 0",
> "0, 0, -1"
> })
> Return (SBUF)
> }
>
> The kernel's sscanf() does not support '%*[', so there is no clean way
> to take both separators in a single format string. That leaves either
> a second sscanf() call with a comma format, or normalizing the
> separator first. Do the latter: turn the commas into spaces before
> parsing, so the existing "%d %d %d" format, which already takes any
> amount of white space around the values, keeps working unchanged. The
> strings live in the buffer acpi_evaluate_object() allocated for us, so
> they can be modified in place.
>
> With this change in_accel_mount_matrix on the Higole F9B reads
> "-1, 0, 0; 0, 1, 0; 0, 0, 1" and, with no udev hwdb override, the
> desktop rotates correctly in all four orientations. The AYANEO Air
> Plus was not tested; systemd's hwdb has an entry for it, which
> iio-sensor-proxy prefers over the kernel's matrix.
Makes sense, and fix is neat.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-10-12 20:55 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-12 7:41 [PATCH] iio: acpi: Accept comma separated values in ROTM strings Yu-Hsiang Tseng
2026-10-12 20:55 ` Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®