summaryrefslogtreecommitdiff
path: root/drivers/mfd/cpcap-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mfd/cpcap-core.c')
-rw-r--r--drivers/mfd/cpcap-core.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/drivers/mfd/cpcap-core.c b/drivers/mfd/cpcap-core.c
index b248c9d0d4a..dde418c0346 100644
--- a/drivers/mfd/cpcap-core.c
+++ b/drivers/mfd/cpcap-core.c
@@ -20,6 +20,8 @@
#include <linux/miscdevice.h>
#include <linux/module.h>
#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/irq.h>
#include <linux/regulator/machine.h>
#include <linux/spi/spi.h>
#include <linux/spi/cpcap.h>
@@ -351,10 +353,10 @@ int cpcap_device_register(struct platform_device *pdev)
static int cpcap_probe(struct spi_device *spi)
{
- int retval = -EINVAL;
+ int i, retval = -EINVAL;
struct cpcap_device *cpcap;
struct cpcap_platform_data *data;
- int i;
+ unsigned int irq;
struct cpcap_driver_info *info;
cpcap = kzalloc(sizeof(*cpcap), GFP_KERNEL);
@@ -362,12 +364,32 @@ static int cpcap_probe(struct spi_device *spi)
return -ENOMEM;
cpcap->spi = spi;
- data = spi->controller_data;
+ data = cpcap_get_plat_data(cpcap);
+ if (data == NULL) {
+ dev_info(&(spi->dev), "No platform data found for CPCAP\n");
+ goto free_mem;
+ }
+
+ /* fixup struct spi_device for backward compatibility */
+ spi->controller_data = data;
spi_set_drvdata(spi, cpcap);
+ /* setup IRQ GPIO (previously done in board file) */
+ retval = gpio_request(data->irq_gpio, "cpcap-irq");
+ if (retval)
+ goto free_mem;
+
+ retval = gpio_direction_input(data->irq_gpio);
+ if (retval)
+ goto free_gpio;
+
+ irq = gpio_to_irq(data->irq_gpio);
+ irq_set_irq_type(irq, IRQ_TYPE_EDGE_RISING);
+ spi->irq = irq;
+
retval = cpcap_regacc_init(cpcap);
if (retval < 0)
- goto free_mem;
+ goto free_gpio;
retval = cpcap_irq_init(cpcap);
if (retval < 0)
goto free_cpcap_irq;
@@ -430,6 +452,8 @@ static int cpcap_probe(struct spi_device *spi)
free_cpcap_irq:
cpcap_irq_shutdown(cpcap);
+free_gpio:
+ gpio_free(data->irq_gpio);
free_mem:
kfree(cpcap);
return retval;