diff options
Diffstat (limited to 'src/drivers/i2c')
-rw-r--r-- | src/drivers/i2c/generic/chip.h | 13 | ||||
-rw-r--r-- | src/drivers/i2c/generic/generic.c | 19 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/drivers/i2c/generic/chip.h b/src/drivers/i2c/generic/chip.h index 8e13ffc7bb..227cb61e18 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 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); |