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 #include #include +#include #include #include #include @@ -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));