Merge remote-tracking branches 'asoc/fix/audmux', 'asoc/fix/cs42l52', 'asoc/fix/fsl...
[cascardo/linux.git] / drivers / mfd / db8500-prcmu.c
index e43e6e8..7694e07 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/bitops.h>
 #include <linux/fs.h>
 #include <linux/of.h>
+#include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/uaccess.h>
 #include <linux/mfd/core.h>
@@ -2678,16 +2679,12 @@ static struct irq_domain_ops db8500_irq_ops = {
        .xlate  = irq_domain_xlate_twocell,
 };
 
-static int db8500_irq_init(struct device_node *np, int irq_base)
+static int db8500_irq_init(struct device_node *np)
 {
        int i;
 
-       /* In the device tree case, just take some IRQs */
-       if (np)
-               irq_base = 0;
-
        db8500_irq_domain = irq_domain_add_simple(
-               np, NUM_PRCMU_WAKEUPS, irq_base,
+               np, NUM_PRCMU_WAKEUPS, 0,
                &db8500_irq_ops, NULL);
 
        if (!db8500_irq_domain) {
@@ -3114,10 +3111,10 @@ static void db8500_prcmu_update_cpufreq(void)
 }
 
 static int db8500_prcmu_register_ab8500(struct device *parent,
-                                       struct ab8500_platform_data *pdata,
-                                       int irq)
+                                       struct ab8500_platform_data *pdata)
 {
-       struct resource ab8500_resource = DEFINE_RES_IRQ(irq);
+       struct device_node *np;
+       struct resource ab8500_resource;
        struct mfd_cell ab8500_cell = {
                .name = "ab8500-core",
                .of_compatible = "stericsson,ab8500",
@@ -3128,6 +3125,20 @@ static int db8500_prcmu_register_ab8500(struct device *parent,
                .num_resources = 1,
        };
 
+       if (!parent->of_node)
+               return -ENODEV;
+
+       /* Look up the device node, sneak the IRQ out of it */
+       for_each_child_of_node(parent->of_node, np) {
+               if (of_device_is_compatible(np, ab8500_cell.of_compatible))
+                       break;
+       }
+       if (!np) {
+               dev_info(parent, "could not find AB8500 node in the device tree\n");
+               return -ENODEV;
+       }
+       of_irq_to_resource_table(np, &ab8500_resource, 1);
+
        return mfd_add_devices(parent, 0, &ab8500_cell, 1, NULL, 0, NULL);
 }
 
@@ -3180,7 +3191,7 @@ static int db8500_prcmu_probe(struct platform_device *pdev)
                goto no_irq_return;
        }
 
-       db8500_irq_init(np, pdata->irq_base);
+       db8500_irq_init(np);
 
        prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET);
 
@@ -3205,8 +3216,7 @@ static int db8500_prcmu_probe(struct platform_device *pdev)
                }
        }
 
-       err = db8500_prcmu_register_ab8500(&pdev->dev, pdata->ab_platdata,
-                                          pdata->ab_irq);
+       err = db8500_prcmu_register_ab8500(&pdev->dev, pdata->ab_platdata);
        if (err) {
                mfd_remove_devices(&pdev->dev);
                pr_err("prcmu: Failed to add ab8500 subdevice\n");