diff options
Diffstat (limited to 'drivers/mfd/mc13783-core.c')
-rw-r--r-- | drivers/mfd/mc13783-core.c | 16 |
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(); |