From bba6a21625a744899581364a627e3ffd6d6cda5b Mon Sep 17 00:00:00 2001 From: Sean Rhodes Date: Tue, 23 Jan 2024 15:10:59 +0000 Subject: i2c/drivers/generic: Add support for including a rotation matrix The Rotation Matrix allows the specification of a 3x3 matrix representing the orientation of devices, such as accelerometers. Each value in the matrix can be one of -1, 0, or 1, indicating the transformation applied to the device's axes. It is expected by Linux and required for the OS to interpret the data from the device correctly. It is used by various drivers, mainly in `iio/accel`. It was tested on Ubuntu, by rotating the device and verifying the orientation was correct. Signed-off-by: Sean Rhodes Change-Id: Id4a940d999a0e300a6fe21269f18bab6e3c0523c Reviewed-on: https://review.coreboot.org/c/coreboot/+/80179 Reviewed-by: Matt DeVillier Tested-by: build bot (Jenkins) Reviewed-by: Felix Held --- src/drivers/i2c/generic/generic.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/drivers/i2c/generic/generic.c') diff --git a/src/drivers/i2c/generic/generic.c b/src/drivers/i2c/generic/generic.c index 2a4acb242f..03018eed55 100644 --- a/src/drivers/i2c/generic/generic.c +++ b/src/drivers/i2c/generic/generic.c @@ -160,6 +160,25 @@ void i2c_generic_fill_ssdt(const struct device *dev, acpi_device_add_power_res(&power_res_params); } + /* Rotation Matrix */ + if (config->has_rotation_matrix) { + acpigen_write_method("ROTM", 0); + acpigen_write_package(3); + + for (int i = 0; i < 3; i++) { + char matrix_row[12]; + snprintf(matrix_row, sizeof(matrix_row), "%d %d %d", + config->rotation_matrix[i * 3 + 0], + config->rotation_matrix[i * 3 + 1], + config->rotation_matrix[i * 3 + 2]); + + acpigen_write_string(matrix_row); + } + + acpigen_pop_len(); + acpigen_pop_len(); + } + /* Callback if any. */ if (callback) callback(dev); -- cgit v1.2.3