Input: ads7846 - do not allow altering platform data
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 1 Jul 2010 16:01:50 +0000 (09:01 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sat, 3 Jul 2010 20:13:22 +0000 (13:13 -0700)
Tested-by: Anatolij Gustschin <agust@denx.de>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/touchscreen/ads7846.c
include/linux/spi/ads7846.h

index 69210cb..a377160 100644 (file)
@@ -878,14 +878,15 @@ static int __devinit setup_pendown(struct spi_device *spi, struct ads7846 *ts)
 
 static int __devinit ads7846_probe(struct spi_device *spi)
 {
-       struct ads7846                  *ts;
-       struct ads7846_packet           *packet;
-       struct input_dev                *input_dev;
-       struct ads7846_platform_data    *pdata = spi->dev.platform_data;
-       struct spi_message              *m;
-       struct spi_transfer             *x;
-       int                             vref;
-       int                             err;
+       struct ads7846 *ts;
+       struct ads7846_packet *packet;
+       struct input_dev *input_dev;
+       const struct ads7846_platform_data *pdata = spi->dev.platform_data;
+       struct spi_message *m;
+       struct spi_transfer *x;
+       unsigned long irq_flags;
+       int vref;
+       int err;
 
        if (!spi->irq) {
                dev_dbg(&spi->dev, "no IRQ?\n");
@@ -1174,20 +1175,22 @@ static int __devinit ads7846_probe(struct spi_device *spi)
                goto err_put_regulator;
        }
 
-       if (!pdata->irq_flags)
-               pdata->irq_flags = IRQF_TRIGGER_FALLING;
+       irq_flags = pdata->irq_flags ? : IRQF_TRIGGER_FALLING;
 
-       if (request_irq(spi->irq, ads7846_irq, pdata->irq_flags,
-                       spi->dev.driver->name, ts)) {
+       err = request_irq(spi->irq, ads7846_irq, irq_flags,
+                         spi->dev.driver->name, ts);
+
+       if (err && !pdata->irq_flags) {
                dev_info(&spi->dev,
                        "trying pin change workaround on irq %d\n", spi->irq);
                err = request_irq(spi->irq, ads7846_irq,
                                  IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
                                  spi->dev.driver->name, ts);
-               if (err) {
-                       dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
-                       goto err_disable_regulator;
-               }
+       }
+
+       if (err) {
+               dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
+               goto err_disable_regulator;
        }
 
        err = ads784x_hwmon_register(spi, ts);
index 95d36bf..92bd083 100644 (file)
@@ -48,7 +48,7 @@ struct ads7846_platform_data {
                                         * state if get_pendown_state == NULL
                                         */
        int     (*get_pendown_state)(void);
-       int     (*filter_init)  (struct ads7846_platform_data *pdata,
+       int     (*filter_init)  (const struct ads7846_platform_data *pdata,
                                 void **filter_data);
        int     (*filter)       (void *filter_data, int data_idx, int *val);
        void    (*filter_cleanup)(void *filter_data);