summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/drivers/i2c/generic/chip.h13
-rw-r--r--src/drivers/i2c/generic/generic.c19
2 files changed, 32 insertions, 0 deletions
diff --git a/src/drivers/i2c/generic/chip.h b/src/drivers/i2c/generic/chip.h
index 8e13ffc7bb85..227cb61e1811 100644
--- a/src/drivers/i2c/generic/chip.h
+++ b/src/drivers/i2c/generic/chip.h
@@ -69,6 +69,19 @@ struct drivers_i2c_generic_config {
/* Delay to be inserted after enabling stop. */
unsigned int stop_off_delay_ms;
+ /*
+ * The Rotation Matrix' allows specifying 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 correctly interpret
+ * the data from the device.
+ */
+ bool has_rotation_matrix;
+ int rotation_matrix[9];
+
+
/* Generic properties for exporting device-specific data to the OS */
struct acpi_dp property_list[MAX_GENERIC_PROPERTY_LIST];
int property_count;
diff --git a/src/drivers/i2c/generic/generic.c b/src/drivers/i2c/generic/generic.c
index 2a4acb242f48..03018eed555f 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);