[PATCH] mfd: use i2c_dummy in 88pm860x

Haojian Zhuang haojian.zhuang at marvell.com
Wed Feb 3 15:38:12 EST 2010


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

Signed-off-by: Haojian Zhuang <haojian.zhuang at marvell.com>
---
 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 6d7dba2..c37e12b 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);
-- 
1.5.6.5



More information about the linux-arm-kernel mailing list