When I2C devices are enumerated/instantiated through ACPI tables then a single ACPI device may describe multiple separate I2C connected ICs. This is handled by the drivers/platform/x86/i2c-multi-instantiate.c code which contains a table which maps the ACPI-device-id to the information necessary to instantiate the i2c-clients (type and IRQ routing for each described IC). In some cases the i2c-driver may need access to the ACPI-fwnode as that may contain ACPI-methods supplying e.g. orientation-matrix info for accelerometers. Currently setting i2c_board_info.fwnode to point to the ACPI-fwnode will cause the i2c-core to call i2c_acpi_get_irq() for any i2c-clients for which i2c-multi-instantiate.c has not passed an IRQ in i2c_board_info.irq, messing up the IRQ routing done by i2c-multi-instantiate.c. Make i2c_device_probe() accept a client->init_irq value < 0 to skip the i2c-core IRQ handling, while still setting client->irq to 0 after checking for this, since most i2c-drivers expect client->irq == 0 for clients without an IRQ. This allows i2c-multi-instantiate.c to set i2c_board_info.irq = -ENOENT for clients without an IRQ and pass the ACPI-fwnode without issues. Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> --- drivers/i2c/i2c-core-base.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 573b5da145d1..1887e2267031 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -467,11 +467,10 @@ static int i2c_device_probe(struct device *dev) goto put_sync_adapter; } - if (irq < 0) - irq = 0; - client->irq = irq; } + if (client->irq < 0) + client->irq = 0; driver = to_i2c_driver(dev->driver); -- 2.28.0