summaryrefslogtreecommitdiff
path: root/drivers/mfd
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2012-07-26 16:30:58 +0530
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-07-31 03:41:28 -0700
commit2bd2f90abcaf21b130beb3b5310d74664f21a5d5 (patch)
tree10b39abc075cbf61f211eaa1f28160a85d2c44e3 /drivers/mfd
parentca288fa18ca9f8fb2601925904c6b53cd5e3e134 (diff)
mfd: tps80031: rewrite exit path in probe failure
Rewrite exit path in case of failure in registration in probe. Change-Id: I6c2a8ce3d4fcc01dff97eeea63124d2da419da27 Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-on: http://git-master/r/118956 Reviewed-by: Automatic_Commit_Validation_User
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/tps80031.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/mfd/tps80031.c b/drivers/mfd/tps80031.c
index 691c9d2ee798..42e1faaa3155 100644
--- a/drivers/mfd/tps80031.c
+++ b/drivers/mfd/tps80031.c
@@ -1303,7 +1303,7 @@ static int __devinit tps80031_i2c_probe(struct i2c_client *client,
if (!tps->client) {
dev_err(&client->dev, "can't attach client %d\n", i);
ret = -ENOMEM;
- goto fail;
+ goto fail_client_reg;
}
i2c_set_clientdata(tps->client, tps80031);
mutex_init(&tps->lock);
@@ -1314,7 +1314,7 @@ static int __devinit tps80031_i2c_probe(struct i2c_client *client,
ret = PTR_ERR(tps80031->regmap[i]);
dev_err(&client->dev,
"regmap %d init failed, err %d\n", i, ret);
- goto fail;
+ goto fail_client_reg;
}
}
@@ -1323,7 +1323,7 @@ static int __devinit tps80031_i2c_probe(struct i2c_client *client,
pdata->irq_base);
if (ret) {
dev_err(&client->dev, "IRQ init failed: %d\n", ret);
- goto fail;
+ goto fail_client_reg;
}
}
@@ -1334,7 +1334,7 @@ static int __devinit tps80031_i2c_probe(struct i2c_client *client,
ret = tps80031_add_subdevs(tps80031, pdata);
if (ret) {
dev_err(&client->dev, "add devices failed: %d\n", ret);
- goto fail;
+ goto fail_add_subdev;
}
tps80031_gpio_init(tps80031, pdata);
@@ -1352,8 +1352,18 @@ static int __devinit tps80031_i2c_probe(struct i2c_client *client,
return 0;
-fail:
- tps80031_i2c_remove(client);
+fail_add_subdev:
+ if (client->irq)
+ free_irq(client->irq, tps80031);
+
+fail_client_reg:
+ for (i = 0; i < TPS_NUM_SLAVES; i++) {
+ struct tps80031_client *tps = &tps80031->tps_clients[i];
+ if (tps->client && tps->client != client)
+ i2c_unregister_device(tps->client);
+ tps80031->tps_clients[i].client = NULL;
+ mutex_destroy(&tps->lock);
+ }
return ret;
}