pcf857x: support working w/o platform data
authorDmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Wed, 11 Aug 2010 01:02:24 +0000 (18:02 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 11 Aug 2010 15:59:08 +0000 (08:59 -0700)
Provide sane defaults for pcf857x, so the driver can be used w/o providing
platform data (and thus can be simply bound via OF tree).

Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Cc: Jean Delvare <khali@linux-fr.org>
Cc: David Brownell <david-b@pacbell.net>
Cc: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/gpio/pcf857x.c

index 29f19ce3e80f192b071277a69bf1da9b67b8627f..879b473aab5afc8d63a23b13073f32d6e1a2966c 100644 (file)
@@ -190,7 +190,6 @@ static int pcf857x_probe(struct i2c_client *client,
        pdata = client->dev.platform_data;
        if (!pdata) {
                dev_dbg(&client->dev, "no platform data\n");
-               return -EINVAL;
        }
 
        /* Allocate, initialize, and register this gpio_chip. */
@@ -200,7 +199,7 @@ static int pcf857x_probe(struct i2c_client *client,
 
        mutex_init(&gpio->lock);
 
-       gpio->chip.base = pdata->gpio_base;
+       gpio->chip.base = pdata ? pdata->gpio_base : -1;
        gpio->chip.can_sleep = 1;
        gpio->chip.dev = &client->dev;
        gpio->chip.owner = THIS_MODULE;
@@ -278,7 +277,7 @@ static int pcf857x_probe(struct i2c_client *client,
         * to zero, our software copy of the "latch" then matches the chip's
         * all-ones reset state.  Otherwise it flags pins to be driven low.
         */
-       gpio->out = ~pdata->n_latch;
+       gpio->out = pdata ? ~pdata->n_latch : ~0;
 
        status = gpiochip_add(&gpio->chip);
        if (status < 0)
@@ -299,7 +298,7 @@ static int pcf857x_probe(struct i2c_client *client,
        /* Let platform code set up the GPIOs and their users.
         * Now is the first time anyone could use them.
         */
-       if (pdata->setup) {
+       if (pdata && pdata->setup) {
                status = pdata->setup(client,
                                gpio->chip.base, gpio->chip.ngpio,
                                pdata->context);
@@ -322,7 +321,7 @@ static int pcf857x_remove(struct i2c_client *client)
        struct pcf857x                  *gpio = i2c_get_clientdata(client);
        int                             status = 0;
 
-       if (pdata->teardown) {
+       if (pdata && pdata->teardown) {
                status = pdata->teardown(client,
                                gpio->chip.base, gpio->chip.ngpio,
                                pdata->context);