summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/i2c/generic/chip.h11
-rw-r--r--src/drivers/i2c/generic/generic.c12
2 files changed, 23 insertions, 0 deletions
diff --git a/src/drivers/i2c/generic/chip.h b/src/drivers/i2c/generic/chip.h
index 284c9d1967..a99b09536e 100644
--- a/src/drivers/i2c/generic/chip.h
+++ b/src/drivers/i2c/generic/chip.h
@@ -31,6 +31,17 @@ struct drivers_i2c_generic_config {
*/
int probed;
+ /*
+ * This flag will add a device property which will indicate
+ * that coreboot should attempt to detect the device on the i2c
+ * bus before generating a device entry in the SSDT.
+ *
+ * This can be used to declare a device that may not exist on
+ * the board, for example to support multiple touchpads and/or
+ * touchscreens.
+ */
+ int detect;
+
/* GPIO used to indicate if this device is present */
unsigned int device_present_gpio;
unsigned int device_present_gpio_invert;
diff --git a/src/drivers/i2c/generic/generic.c b/src/drivers/i2c/generic/generic.c
index 656b9e6c16..872891b64b 100644
--- a/src/drivers/i2c/generic/generic.c
+++ b/src/drivers/i2c/generic/generic.c
@@ -3,6 +3,7 @@
#include <acpi/acpi_device.h>
#include <acpi/acpigen.h>
#include <console/console.h>
+#include <device/i2c_bus.h>
#include <device/i2c_simple.h>
#include <device/device.h>
#include <device/path.h>
@@ -65,6 +66,17 @@ void i2c_generic_fill_ssdt(const struct device *dev,
return;
}
+ if (config->detect) {
+ struct device *const busdev = i2c_busdev(dev);
+ if (!i2c_dev_detect(busdev, dev->path.i2c.device)) {
+ printk(BIOS_SPEW, "%s: %s at %s -- NOT FOUND, skipping\n",
+ path,
+ config->desc ? : dev->chip_ops->name,
+ dev_path(dev));
+ return;
+ }
+ }
+
/* Device */
acpigen_write_scope(scope);
acpigen_write_device(acpi_device_name(dev));