summaryrefslogtreecommitdiff
path: root/drivers/mfd/wm831x-core.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2009-07-27 14:45:53 +0100
committerSamuel Ortiz <sameo@linux.intel.com>2009-09-17 09:46:57 +0200
commit7d4d0a3e7343e3190afaa17253073db58e3d9bff (patch)
tree586ad0e591e512a567e90588a35670034fd2a6ff /drivers/mfd/wm831x-core.c
parentd2bedfe7a8b2f34beee2cad9cae74a088ee8ed07 (diff)
mfd: Add WM831x interrupt support
The WM831x includes an interrupt controller managing interrupts for the various functions on the chip. This patch adds support for the core interrupt block on the device. Ideally this would be supported by genirq, particularly for the GPIOs, but currently genirq is unable to cope with controllers on interrupt driven buses so we cut'n'paste the generic interface. Once genirq is able to cope chips like this it should be a case of filing the prefixes off the code and redoing wm831x-irq.c to move over. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/mfd/wm831x-core.c')
-rw-r--r--drivers/mfd/wm831x-core.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/mfd/wm831x-core.c b/drivers/mfd/wm831x-core.c
index cc1040c9d46c..eb63d22160d1 100644
--- a/drivers/mfd/wm831x-core.c
+++ b/drivers/mfd/wm831x-core.c
@@ -19,6 +19,7 @@
#include <linux/mfd/wm831x/core.h>
#include <linux/mfd/wm831x/pdata.h>
+#include <linux/mfd/wm831x/irq.h>
enum wm831x_parent {
WM8310 = 0,
@@ -1189,6 +1190,10 @@ static int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
}
}
+ ret = wm831x_irq_init(wm831x, irq);
+ if (ret != 0)
+ goto err;
+
/* The core device is up, instantiate the subdevices. */
switch (parent) {
case WM8310:
@@ -1216,19 +1221,21 @@ static int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
if (ret != 0) {
dev_err(wm831x->dev, "Failed to add children\n");
- goto err;
+ goto err_irq;
}
if (pdata && pdata->post_init) {
ret = pdata->post_init(wm831x);
if (ret != 0) {
dev_err(wm831x->dev, "post_init() failed: %d\n", ret);
- goto err;
+ goto err_irq;
}
}
return 0;
+err_irq:
+ wm831x_irq_exit(wm831x);
err:
mfd_remove_devices(wm831x->dev);
kfree(wm831x);
@@ -1238,6 +1245,7 @@ err:
static void wm831x_device_exit(struct wm831x *wm831x)
{
mfd_remove_devices(wm831x->dev);
+ wm831x_irq_exit(wm831x);
kfree(wm831x);
}