mfd: Use i2c_dummy in 88pm860x
authorHaojian Zhuang <haojian.zhuang@marvell.com>
Wed, 3 Feb 2010 20:38:12 +0000 (15:38 -0500)
committerSamuel Ortiz <sameo@linux.intel.com>
Sun, 7 Mar 2010 21:17:18 +0000 (22:17 +0100)
Use i2c_dummy in 88pm860x driver to avoid using static in probe function.

Signed-off-by: Haojian Zhuang <haojian.zhuang@marvell.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/88pm860x-i2c.c

index 6d7dba2bce8af6a183459830d0a2d4cad9f87dba..c37e12bf3004b943cdbcd9d9d7b58936cd9c5687 100644 (file)
@@ -157,18 +157,24 @@ static int __devinit pm860x_probe(struct i2c_client *client,
                                  const struct i2c_device_id *id)
 {
        struct pm860x_platform_data *pdata = client->dev.platform_data;
-       static struct pm860x_chip *chip;
-       struct i2c_board_info i2c_info = {
-               .type           = "88PM860x",
-               .platform_data  = client->dev.platform_data,
-       };
-       int addr_c, found_companion = 0;
-
-       if (pdata == NULL) {
+       struct pm860x_chip *chip;
+
+       if (!pdata) {
                pr_info("No platform data in %s!\n", __func__);
                return -EINVAL;
        }
 
+       chip = kzalloc(sizeof(struct pm860x_chip), GFP_KERNEL);
+       if (chip == NULL)
+               return -ENOMEM;
+
+       chip->id = verify_addr(client);
+       chip->client = client;
+       i2c_set_clientdata(client, chip);
+       chip->dev = &client->dev;
+       mutex_init(&chip->io_lock);
+       dev_set_drvdata(chip->dev, chip);
+
        /*
         * Both client and companion client shares same platform driver.
         * Driver distinguishes them by pdata->companion_addr.
@@ -176,46 +182,14 @@ static int __devinit pm860x_probe(struct i2c_client *client,
         * At the same time, the companion_addr shouldn't equal to client
         * address.
         */
-       addr_c = pdata->companion_addr;
-       if (addr_c && (addr_c != client->addr)) {
-               i2c_info.addr = addr_c;
-               found_companion = 1;
-       }
-
-       if (found_companion || (addr_c == 0)) {
-               chip = kzalloc(sizeof(struct pm860x_chip), GFP_KERNEL);
-               if (chip == NULL)
-                       return -ENOMEM;
-
-               chip->id = verify_addr(client);
-               chip->companion_addr = addr_c;
-               chip->client = client;
-               i2c_set_clientdata(client, chip);
-               chip->dev = &client->dev;
-               mutex_init(&chip->io_lock);
-               dev_set_drvdata(chip->dev, chip);
-
-               if (found_companion) {
-                       /*
-                        * If this driver is built in, probe function is
-                        * recursive.
-                        * If this driver is built as module, the next probe
-                        * function is called after the first one finished.
-                        */
-                       chip->companion = i2c_new_device(client->adapter,
-                                                        &i2c_info);
-               }
-       }
-
-       /*
-        * If companion chip existes, it's called by companion probe.
-        * If there's no companion chip, it's called by client probe.
-        */
-       if ((addr_c == 0) || (addr_c == client->addr)) {
-               chip->companion = client;
+       if (pdata->companion_addr && (pdata->companion_addr != client->addr)) {
+               chip->companion_addr = pdata->companion_addr;
+               chip->companion = i2c_new_dummy(chip->client->adapter,
+                                               chip->companion_addr);
                i2c_set_clientdata(chip->companion, chip);
-               pm860x_device_init(chip, pdata);
        }
+
+       pm860x_device_init(chip, pdata);
        return 0;
 }
 
@@ -223,12 +197,6 @@ static int __devexit pm860x_remove(struct i2c_client *client)
 {
        struct pm860x_chip *chip = i2c_get_clientdata(client);
 
-       /*
-        * If companion existes, companion client is removed first.
-        * Because companion client is registered last and removed first.
-        */
-       if (chip->companion_addr == client->addr)
-               return 0;
        pm860x_device_exit(chip);
        i2c_unregister_device(chip->companion);
        i2c_set_clientdata(chip->companion, NULL);