Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8343dda authored by Haojian Zhuang's avatar Haojian Zhuang Committed by Samuel Ortiz
Browse files

mfd: Use i2c_dummy in 88pm860x



Use i2c_dummy in 88pm860x driver to avoid using static in probe function.

Signed-off-by: default avatarHaojian Zhuang <haojian.zhuang@marvell.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 34c91208
Loading
Loading
Loading
Loading
+20 −52
Original line number Diff line number Diff line
@@ -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;
}

@@ -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);