Input: ucb1400_ts - allow passing IRQ through platfrom_data
authorMarek Vasut <marek.vasut@gmail.com>
Mon, 9 Nov 2009 03:45:54 +0000 (19:45 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 20 Nov 2009 08:52:05 +0000 (00:52 -0800)
This patch allows UCB1400 to get IRQ GPIO from platform data. In case
platform_data are not supplied or the IRQ supplied in the platform_data
is negative, fall back to the old IRQ detection algorithm.

Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/touchscreen/ucb1400_ts.c
drivers/mfd/ucb1400_core.c
include/linux/ucb1400.h

index 095f84b1f56e33769a4513a9d635aa3b0100f7f3..89dcbe7b4b02c770dc32c1ed753547eadf6dee05 100644 (file)
@@ -355,10 +355,13 @@ static int ucb1400_ts_probe(struct platform_device *dev)
                goto err;
        }
 
-       error = ucb1400_ts_detect_irq(ucb);
-       if (error) {
-               printk(KERN_ERR "UCB1400: IRQ probe failed\n");
-               goto err_free_devs;
+       /* Only in case the IRQ line wasn't supplied, try detecting it */
+       if (ucb->irq < 0) {
+               error = ucb1400_ts_detect_irq(ucb);
+               if (error) {
+                       printk(KERN_ERR "UCB1400: IRQ probe failed\n");
+                       goto err_free_devs;
+               }
        }
 
        init_waitqueue_head(&ucb->ts_wait);
index fa294b6d600a9d6af6f8f27d8b853b5aea7d55e3..85fd9421be94240f30dd35c9f4f6c76bb1c7dfb0 100644 (file)
@@ -51,6 +51,7 @@ static int ucb1400_core_probe(struct device *dev)
        struct ucb1400_ts ucb_ts;
        struct ucb1400_gpio ucb_gpio;
        struct snd_ac97 *ac97;
+       struct ucb1400_pdata *pdata = dev->platform_data;
 
        memset(&ucb_ts, 0, sizeof(ucb_ts));
        memset(&ucb_gpio, 0, sizeof(ucb_gpio));
@@ -88,6 +89,12 @@ static int ucb1400_core_probe(struct device *dev)
 
        /* TOUCHSCREEN */
        ucb_ts.ac97 = ac97;
+
+       if (pdata != NULL && pdata->irq >= 0)
+               ucb_ts.irq = pdata->irq;
+       else
+               ucb_ts.irq = -1;
+
        ucb->ucb1400_ts = platform_device_alloc("ucb1400_ts", -1);
        if (!ucb->ucb1400_ts) {
                err = -ENOMEM;
index adb44066680c7caf468a0c149006833fb5983cae..1b47909110520f72f13ca44d6170a29e61b6eeed 100644 (file)
@@ -110,6 +110,10 @@ struct ucb1400 {
        struct platform_device  *ucb1400_gpio;
 };
 
+struct ucb1400_pdata {
+       int     irq;
+};
+
 static inline u16 ucb1400_reg_read(struct snd_ac97 *ac97, u16 reg)
 {
        return ac97->bus->ops->read(ac97, reg);