i2c: core: Map OF IRQ at probe time
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Thu, 30 Oct 2014 13:59:38 +0000 (15:59 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Mon, 10 Nov 2014 08:34:58 +0000 (09:34 +0100)
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>
drivers/i2c/i2c-core.c

index f43b4e11647a28338235b1fcba1070ab2a34f91b..a0768d6dffc28aaee9c130d35e889d9c5fd7fb7d 100644 (file)
@@ -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;
@@ -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;
 
@@ -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;
                }
        }