Loading drivers/mfd/88pm860x-i2c.c +20 −52 Original line number Diff line number Diff line Loading @@ -157,65 +157,39 @@ 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; struct pm860x_chip *chip; if (pdata == NULL) { if (!pdata) { pr_info("No platform data in %s!\n", __func__); return -EINVAL; } /* * Both client and companion client shares same platform driver. * Driver distinguishes them by pdata->companion_addr. * pdata->companion_addr is only assigned if companion chip exists. * 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. * Both client and companion client shares same platform driver. * Driver distinguishes them by pdata->companion_addr. * pdata->companion_addr is only assigned if companion chip exists. * At the same time, the companion_addr shouldn't equal to client * address. */ chip->companion = i2c_new_device(client->adapter, &i2c_info); } 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); } /* * 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; i2c_set_clientdata(chip->companion, chip); pm860x_device_init(chip, pdata); } return 0; } Loading @@ -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); Loading Loading
drivers/mfd/88pm860x-i2c.c +20 −52 Original line number Diff line number Diff line Loading @@ -157,65 +157,39 @@ 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; struct pm860x_chip *chip; if (pdata == NULL) { if (!pdata) { pr_info("No platform data in %s!\n", __func__); return -EINVAL; } /* * Both client and companion client shares same platform driver. * Driver distinguishes them by pdata->companion_addr. * pdata->companion_addr is only assigned if companion chip exists. * 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. * Both client and companion client shares same platform driver. * Driver distinguishes them by pdata->companion_addr. * pdata->companion_addr is only assigned if companion chip exists. * At the same time, the companion_addr shouldn't equal to client * address. */ chip->companion = i2c_new_device(client->adapter, &i2c_info); } 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); } /* * 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; i2c_set_clientdata(chip->companion, chip); pm860x_device_init(chip, pdata); } return 0; } Loading @@ -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); Loading