Skip to content

Commit

Permalink
i2c: core: Map OF IRQ at probe time
Browse files Browse the repository at this point in the history
I2C clients instantiated from OF get their IRQ mapped at device
registration time. This leads to the IRQ being silently ignored if the
related irqchip hasn't been proved yet.

Fix this by moving IRQ mapping at probe time using of_get_irq(). The
function operates as irq_of_parse_and_map() but additionally returns
-EPROBE_DEFER if the irqchip isn't available, allowing us to defer I2C
client probing.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
  • Loading branch information
Laurent Pinchart authored and Wolfram Sang committed Nov 10, 2014
1 parent 9eb08fb commit 2fd36c5
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions drivers/i2c/i2c-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,15 @@ static int i2c_device_probe(struct device *dev)
if (!client)
return 0;

if (!client->irq && dev->of_node) {
int irq = of_irq_get(dev->of_node, 0);

if (irq < 0)
return irq;

client->irq = irq;
}

driver = to_i2c_driver(dev->driver);
if (!driver->probe || !driver->id_table)
return -ENODEV;
Expand Down Expand Up @@ -1407,7 +1416,6 @@ static void of_i2c_register_devices(struct i2c_adapter *adap)
continue;
}

info.irq = irq_of_parse_and_map(node, 0);
info.of_node = of_node_get(node);
info.archdata = &dev_ad;

Expand All @@ -1421,7 +1429,6 @@ static void of_i2c_register_devices(struct i2c_adapter *adap)
dev_err(&adap->dev, "of_i2c: Failure registering %s\n",
node->full_name);
of_node_put(node);
irq_dispose_mapping(info.irq);
continue;
}
}
Expand Down

0 comments on commit 2fd36c5

Please sign in to comment.