]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/gpio/pcf857x.c
ipmi: support I/O resources in OF driver
[linux-2.6-omap-h63xx.git] / drivers / gpio / pcf857x.c
index 1106aa15ac79ad92d6807aab7a0aa2106e786784..aa6cc8b2a2bc88afbeca4dec1b67bc75c05288a0 100644 (file)
 #include <asm/gpio.h>
 
 
+static const struct i2c_device_id pcf857x_id[] = {
+       { "pcf8574", 8 },
+       { "pca8574", 8 },
+       { "pca9670", 8 },
+       { "pca9672", 8 },
+       { "pca9674", 8 },
+       { "pcf8575", 16 },
+       { "pca8575", 16 },
+       { "pca9671", 16 },
+       { "pca9673", 16 },
+       { "pca9675", 16 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, pcf857x_id);
+
 /*
  * The pcf857x, pca857x, and pca967x chips only expose one read and one
  * write register.  Writing a "one" bit (to match the reset state) lets
@@ -142,7 +157,8 @@ static void pcf857x_set16(struct gpio_chip *chip, unsigned offset, int value)
 
 /*-------------------------------------------------------------------------*/
 
-static int pcf857x_probe(struct i2c_client *client)
+static int pcf857x_probe(struct i2c_client *client,
+                        const struct i2c_device_id *id)
 {
        struct pcf857x_platform_data    *pdata;
        struct pcf857x                  *gpio;
@@ -172,13 +188,8 @@ static int pcf857x_probe(struct i2c_client *client)
         *
         * NOTE: we don't distinguish here between *4 and *4a parts.
         */
-       if (strcmp(client->name, "pcf8574") == 0
-                       || strcmp(client->name, "pca8574") == 0
-                       || strcmp(client->name, "pca9670") == 0
-                       || strcmp(client->name, "pca9672") == 0
-                       || strcmp(client->name, "pca9674") == 0
-                       ) {
-               gpio->chip.ngpio = 8;
+       gpio->chip.ngpio = id->driver_data;
+       if (gpio->chip.ngpio == 8) {
                gpio->chip.direction_input = pcf857x_input8;
                gpio->chip.get = pcf857x_get8;
                gpio->chip.direction_output = pcf857x_output8;
@@ -198,13 +209,7 @@ static int pcf857x_probe(struct i2c_client *client)
         *
         * NOTE: we don't distinguish here between '75 and '75c parts.
         */
-       } else if (strcmp(client->name, "pcf8575") == 0
-                       || strcmp(client->name, "pca8575") == 0
-                       || strcmp(client->name, "pca9671") == 0
-                       || strcmp(client->name, "pca9673") == 0
-                       || strcmp(client->name, "pca9675") == 0
-                       ) {
-               gpio->chip.ngpio = 16;
+       } else if (gpio->chip.ngpio == 16) {
                gpio->chip.direction_input = pcf857x_input16;
                gpio->chip.get = pcf857x_get16;
                gpio->chip.direction_output = pcf857x_output16;
@@ -313,6 +318,7 @@ static struct i2c_driver pcf857x_driver = {
        },
        .probe  = pcf857x_probe,
        .remove = pcf857x_remove,
+       .id_table = pcf857x_id,
 };
 
 static int __init pcf857x_init(void)