Merge tag 'asoc-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound...
[cascardo/linux.git] / drivers / extcon / extcon-max8997.c
index a4ed30b..ef9090a 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/mfd/max8997.h>
 #include <linux/mfd/max8997-private.h>
 #include <linux/extcon.h>
+#include <linux/irqdomain.h>
 
 #define        DEV_NAME                        "max8997-muic"
 
@@ -77,6 +78,7 @@
 struct max8997_muic_irq {
        unsigned int irq;
        const char *name;
+       unsigned int virq;
 };
 
 static struct max8997_muic_irq muic_irqs[] = {
@@ -343,12 +345,10 @@ static void max8997_muic_irq_work(struct work_struct *work)
 {
        struct max8997_muic_info *info = container_of(work,
                        struct max8997_muic_info, irq_work);
-       struct max8997_dev *max8997 = i2c_get_clientdata(info->muic);
        u8 status[2];
        u8 adc, chg_type;
-
-       int irq_type = info->irq - max8997->irq_base;
-       int ret;
+       int irq_type = 0;
+       int i, ret;
 
        mutex_lock(&info->mutex);
 
@@ -363,6 +363,10 @@ static void max8997_muic_irq_work(struct work_struct *work)
        dev_dbg(info->dev, "%s: STATUS1:0x%x, 2:0x%x\n", __func__,
                        status[0], status[1]);
 
+       for (i = 0 ; i < ARRAY_SIZE(muic_irqs) ; i++)
+               if (info->irq == muic_irqs[i].virq)
+                       irq_type = muic_irqs[i].irq;
+
        switch (irq_type) {
        case MAX8997_MUICIRQ_ADC:
                adc = status[0] & STATUS1_ADC_MASK;
@@ -448,11 +452,15 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev)
 
        for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) {
                struct max8997_muic_irq *muic_irq = &muic_irqs[i];
+               int virq = 0;
+
+               virq = irq_create_mapping(max8997->irq_domain, muic_irq->irq);
+               if (!virq)
+                       goto err_irq;
+               muic_irq->virq = virq;
 
-               ret = request_threaded_irq(pdata->irq_base + muic_irq->irq,
-                               NULL, max8997_muic_irq_handler,
-                               0, muic_irq->name,
-                               info);
+               ret = request_threaded_irq(virq, NULL,max8997_muic_irq_handler,
+                               0, muic_irq->name, info);
                if (ret) {
                        dev_err(&pdev->dev,
                                "failed: irq request (IRQ: %d,"
@@ -496,7 +504,7 @@ err_extcon:
        kfree(info->edev);
 err_irq:
        while (--i >= 0)
-               free_irq(pdata->irq_base + muic_irqs[i].irq, info);
+               free_irq(muic_irqs[i].virq, info);
        kfree(info);
 err_kfree:
        return ret;
@@ -505,11 +513,10 @@ err_kfree:
 static int __devexit max8997_muic_remove(struct platform_device *pdev)
 {
        struct max8997_muic_info *info = platform_get_drvdata(pdev);
-       struct max8997_dev *max8997 = i2c_get_clientdata(info->muic);
        int i;
 
        for (i = 0; i < ARRAY_SIZE(muic_irqs); i++)
-               free_irq(max8997->irq_base + muic_irqs[i].irq, info);
+               free_irq(muic_irqs[i].virq, info);
        cancel_work_sync(&info->irq_work);
 
        extcon_dev_unregister(info->edev);