diff options
-rw-r--r-- | src/drivers/i2c/generic/chip.h | 25 | ||||
-rw-r--r-- | src/drivers/i2c/generic/generic.c | 7 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/drivers/i2c/generic/chip.h b/src/drivers/i2c/generic/chip.h index 227cb61e18..69ce29dae4 100644 --- a/src/drivers/i2c/generic/chip.h +++ b/src/drivers/i2c/generic/chip.h @@ -81,6 +81,31 @@ struct drivers_i2c_generic_config { bool has_rotation_matrix; int rotation_matrix[9]; + /* + * Chip Direct Mapping is exclusive to Windows, a allows specifying the + * position where a chip is mounted. There are 8 positions: + * 1: 90 Degrees + * 2: 270 Degrees + * 3: 180 Degrees + * 4: 0 Degrees + * 5: 90 Degrees (Inverted) + * 6: 270 Degrees (Inverted) + * 7: 180 Degrees (Inverted) + * 8: 0 Degrees (Inverted) + * + * The _CDM method should return 0xabcd0X, where X is the position. + */ + enum { + CDM_NOT_PRESENT = 0, + CDM_ROT_90, + CDM_ROT_180, + CDM_ROT_270, + CDM_ROT_0, + CDM_ROT_90_INVERT, + CDM_ROT_180_INVERT, + CDM_ROT_270_INVERT, + CDM_ROT_0_INVERT, + } cdm_index; /* Generic properties for exporting device-specific data to the OS */ struct acpi_dp property_list[MAX_GENERIC_PROPERTY_LIST]; diff --git a/src/drivers/i2c/generic/generic.c b/src/drivers/i2c/generic/generic.c index 98c59e6a05..1875bacb2d 100644 --- a/src/drivers/i2c/generic/generic.c +++ b/src/drivers/i2c/generic/generic.c @@ -165,6 +165,13 @@ void i2c_generic_fill_ssdt(const struct device *dev, acpigen_pop_len(); } + /* Chip Direct Mapping */ + if (config->cdm_index != CDM_NOT_PRESENT) { + acpigen_write_method("_CDM", 1); + acpigen_write_return_integer(0xabcd00 | config->cdm_index); + acpigen_pop_len(); + } + /* Callback if any. */ if (callback) callback(dev); |