aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/i2c-core.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2014-10-30 09:59:38 -0400
committerWolfram Sang <wsa@the-dreams.de>2014-11-10 03:34:58 -0500
commit2fd36c55264926e268deb50f6de5f43fa5e490f7 (patch)
treec168e12f6e984893a1ed9b9d1ac0e0028a64d309 /drivers/i2c/i2c-core.c
parent9eb08fb3d15896bfff57fcd4c87e3fd5b19d8581 (diff)
i2c: core: Map OF IRQ at probe time
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>
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r--drivers/i2c/i2c-core.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index f43b4e11647a..a0768d6dffc2 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -626,6 +626,15 @@ static int i2c_device_probe(struct device *dev)
626 if (!client) 626 if (!client)
627 return 0; 627 return 0;
628 628
629 if (!client->irq && dev->of_node) {
630 int irq = of_irq_get(dev->of_node, 0);
631
632 if (irq < 0)
633 return irq;
634
635 client->irq = irq;
636 }
637
629 driver = to_i2c_driver(dev->driver); 638 driver = to_i2c_driver(dev->driver);
630 if (!driver->probe || !driver->id_table) 639 if (!driver->probe || !driver->id_table)
631 return -ENODEV; 640 return -ENODEV;
@@ -1407,7 +1416,6 @@ static void of_i2c_register_devices(struct i2c_adapter *adap)
1407 continue; 1416 continue;
1408 } 1417 }
1409 1418
1410 info.irq = irq_of_parse_and_map(node, 0);
1411 info.of_node = of_node_get(node); 1419 info.of_node = of_node_get(node);
1412 info.archdata = &dev_ad; 1420 info.archdata = &dev_ad;
1413 1421
@@ -1421,7 +1429,6 @@ static void of_i2c_register_devices(struct i2c_adapter *adap)
1421 dev_err(&adap->dev, "of_i2c: Failure registering %s\n", 1429 dev_err(&adap->dev, "of_i2c: Failure registering %s\n",
1422 node->full_name); 1430 node->full_name);
1423 of_node_put(node); 1431 of_node_put(node);
1424 irq_dispose_mapping(info.irq);
1425 continue; 1432 continue;
1426 } 1433 }
1427 } 1434 }