summaryrefslogtreecommitdiffstats
path: root/drivers/mfd/mc13783-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mfd/mc13783-core.c')
-rw-r--r--drivers/mfd/mc13783-core.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/mfd/mc13783-core.c b/drivers/mfd/mc13783-core.c
index 00b1e20aba8..f8ccafeaf82 100644
--- a/drivers/mfd/mc13783-core.c
+++ b/drivers/mfd/mc13783-core.c
@@ -22,6 +22,7 @@
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
+#include <linux/completion.h>
#include <linux/spi/spi.h>
#include <linux/mfd/mc13783.h>
#include <linux/mfd/mc13783-private.h>
@@ -168,6 +169,15 @@ static void mc13783_irq_work(struct work_struct *work)
{
struct mc13783 *mc13783 = container_of(work, struct mc13783, work);
int i;
+ unsigned int adc_sts;
+
+ /* check if the adc has finished any completion */
+ mc13783_reg_read(mc13783, MC13783_REG_INTERRUPT_STATUS_0, &adc_sts);
+ mc13783_reg_write(mc13783, MC13783_REG_INTERRUPT_STATUS_0,
+ adc_sts & MC13783_INT_STAT_ADCDONEI);
+
+ if (adc_sts & MC13783_INT_STAT_ADCDONEI)
+ complete_all(&mc13783->adc_done);
for (i = 0; i < MC13783_NUM_IRQ; i++)
if (mc13783->irq_handler[i].handler)
@@ -230,7 +240,7 @@ static void mc13783_client_dev_register(struct mc13783 *mc13783,
}
(*pdev)->dev.parent = mc13783->dev;
- platform_set_drvdata(*pdev, mc13783);
+ (*pdev)->dev.platform_data = mc13783;
ret = platform_device_add(*pdev);
if (ret != 0) {
dev_err(mc13783->dev, "Failed to register %s: %d\n", name, ret);
@@ -261,6 +271,7 @@ static int __devinit mc13783_probe(struct spi_device *spi)
INIT_WORK(&mc13783->work, mc13783_irq_work);
mutex_init(&mc13783->io_lock);
+ init_completion(&mc13783->adc_done);
if (pdata && pdata->init)
pdata->init(mc13783);
@@ -286,6 +297,8 @@ static int __devinit mc13783_probe(struct spi_device *spi)
&mc13783->codec);
mc13783_client_dev_register(mc13783, "mc13783-ts",
&mc13783->ts);
+ mc13783_client_dev_register(mc13783, "mc13783-adc",
+ &mc13783->adc);
return 0;
@@ -305,6 +318,7 @@ static int __devexit mc13783_remove(struct spi_device *spi)
platform_device_unregister(mc13783->ts);
platform_device_unregister(mc13783->codec);
+ platform_device_unregister(mc13783->adc);
if (pdata && pdata->exit)
pdata->exit();