diff options
Diffstat (limited to 'drivers/mfd/88pm860x-i2c.c')
-rw-r--r-- | drivers/mfd/88pm860x-i2c.c | 72 |
1 files changed, 20 insertions, 52 deletions
diff --git a/drivers/mfd/88pm860x-i2c.c b/drivers/mfd/88pm860x-i2c.c index 6d7dba2bce8a..c37e12bf3004 100644 --- a/drivers/mfd/88pm860x-i2c.c +++ b/drivers/mfd/88pm860x-i2c.c @@ -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); |