diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2013-09-26 12:53:39 +0530 |
---|---|---|
committer | Ajay Nandakumar <anandakumarm@nvidia.com> | 2013-10-03 19:17:24 +0530 |
commit | f5a8fa21ebedf50a71562d832cbdcdf6a89f9c44 (patch) | |
tree | 57f24a64f1db95cc3a27fecf0f36ad8787982b68 /drivers/mfd | |
parent | 9f44b7fc20e947866da53b0e557b9841a38c8aec (diff) |
mfd: palmas: cleanup error path
Fix the resource leak and clean the error path.
Change-Id: I4b5697ab2cedb8bd7cc00a49e572071d7c91ab8d
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
(cherry picked from commit 62c91240337bed836e654a685d81e326b71e4b5c)
Signed-off-by: Ajay Nandakumar <anandakumarm@nvidia.com>
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/palmas.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c index c6cd452695e2..342098a7ed0e 100644 --- a/drivers/mfd/palmas.c +++ b/drivers/mfd/palmas.c @@ -1085,7 +1085,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c, dev_err(palmas->dev, "can't attach client %d\n", i); ret = -ENOMEM; - goto err; + goto free_i2c_client; } palmas->i2c_clients[i]->dev.of_node = of_node_get(node); } @@ -1096,13 +1096,13 @@ static int palmas_i2c_probe(struct i2c_client *i2c, dev_err(palmas->dev, "Failed to allocate regmap %d, err: %d\n", i, ret); - goto err; + goto free_i2c_client; } } ret = palmas_read_version_information(palmas); if (ret < 0) - goto err; + goto free_i2c_client; /* Change interrupt line output polarity */ if (pdata->irq_flags & IRQ_TYPE_LEVEL_HIGH) @@ -1114,7 +1114,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c, reg); if (ret < 0) { dev_err(palmas->dev, "POLARITY_CTRL updat failed: %d\n", ret); - goto err; + goto free_i2c_client; } /* Change IRQ into clear on read mode for efficiency */ @@ -1128,7 +1128,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c, IRQF_ONESHOT | pdata->irq_flags, pdata->irq_base, &palmas->irq_chip_data); if (ret < 0) - goto err; + goto free_i2c_client; if (palmas->id != TPS80036) palmas->ngpio = 8; @@ -1142,7 +1142,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c, ret = regmap_write(palmas->regmap[slave], addr, reg); if (ret) - goto err_irq; + goto free_irq; /* * If we are probing with DT do this the DT way and return here @@ -1151,7 +1151,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c, if (node) { ret = of_platform_populate(node, NULL, NULL, &i2c->dev); if (ret < 0) - goto err_irq; + goto free_irq; else return ret; } @@ -1171,7 +1171,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c, dev_err(palmas->dev, "Failed to update palmas long press delay" "(hard shutdown delay), err: %d\n", ret); - goto err; + goto free_irq; } } @@ -1183,7 +1183,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c, GFP_KERNEL); if (!children) { ret = -ENOMEM; - goto err_irq; + goto free_irq; } child_count = 0; @@ -1215,7 +1215,7 @@ static int palmas_i2c_probe(struct i2c_client *i2c, kfree(children); if (ret < 0) - goto err_devices; + goto free_irq; if (pdata->auto_ldousb_en) /* VBUS detection enables the LDOUSB */ @@ -1224,21 +1224,29 @@ static int palmas_i2c_probe(struct i2c_client *i2c, return ret; -err_devices: - mfd_remove_devices(palmas->dev); -err_irq: - palmas_del_irq_chip(palmas->irq, palmas->irq_chip_data); -err: +free_irq: + palmas_del_irq_chip(palmas->irq, palmas->irq_chip_data); +free_i2c_client: + for (i = 1; i < PALMAS_NUM_CLIENTS; i++) { + if (palmas->i2c_clients[i]) + i2c_unregister_device(palmas->i2c_clients[i]); + } return ret; } static int palmas_i2c_remove(struct i2c_client *i2c) { struct palmas *palmas = i2c_get_clientdata(i2c); + int i; mfd_remove_devices(palmas->dev); palmas_del_irq_chip(palmas->irq, palmas->irq_chip_data); + for (i = 1; i < PALMAS_NUM_CLIENTS; i++) { + if (palmas->i2c_clients[i]) + i2c_unregister_device(palmas->i2c_clients[i]); + } + return 0; } |