summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/i2c/generic/chip.h25
-rw-r--r--src/drivers/i2c/generic/generic.c7
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);