diff options
author | Peter Rosin <peda@axentia.se> | 2017-05-07 01:16:30 -0400 |
---|---|---|
committer | Peter Rosin <peda@axentia.se> | 2017-05-15 12:44:58 -0400 |
commit | 68118e0e73aa3a6291c8b9eb1ee708e05f110cea (patch) | |
tree | 0ecef28ca690016a93e63294d6edf4e540e63bd9 | |
parent | 2ea659a9ef488125eb46da6eb571de5eae5c43f6 (diff) |
i2c: mux: reg: put away the parent i2c adapter on probe failure
It is only prudent to let go of resources that are not used.
Fixes: b3fdd32799d8 ("i2c: mux: Add register-based mux i2c-mux-reg")
Signed-off-by: Peter Rosin <peda@axentia.se>
-rw-r--r-- | drivers/i2c/muxes/i2c-mux-reg.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/i2c/muxes/i2c-mux-reg.c b/drivers/i2c/muxes/i2c-mux-reg.c index 406d5059072c..11974e3cd1e5 100644 --- a/drivers/i2c/muxes/i2c-mux-reg.c +++ b/drivers/i2c/muxes/i2c-mux-reg.c | |||
@@ -196,20 +196,25 @@ static int i2c_mux_reg_probe(struct platform_device *pdev) | |||
196 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 196 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
197 | mux->data.reg_size = resource_size(res); | 197 | mux->data.reg_size = resource_size(res); |
198 | mux->data.reg = devm_ioremap_resource(&pdev->dev, res); | 198 | mux->data.reg = devm_ioremap_resource(&pdev->dev, res); |
199 | if (IS_ERR(mux->data.reg)) | 199 | if (IS_ERR(mux->data.reg)) { |
200 | return PTR_ERR(mux->data.reg); | 200 | ret = PTR_ERR(mux->data.reg); |
201 | goto err_put_parent; | ||
202 | } | ||
201 | } | 203 | } |
202 | 204 | ||
203 | if (mux->data.reg_size != 4 && mux->data.reg_size != 2 && | 205 | if (mux->data.reg_size != 4 && mux->data.reg_size != 2 && |
204 | mux->data.reg_size != 1) { | 206 | mux->data.reg_size != 1) { |
205 | dev_err(&pdev->dev, "Invalid register size\n"); | 207 | dev_err(&pdev->dev, "Invalid register size\n"); |
206 | return -EINVAL; | 208 | ret = -EINVAL; |
209 | goto err_put_parent; | ||
207 | } | 210 | } |
208 | 211 | ||
209 | muxc = i2c_mux_alloc(parent, &pdev->dev, mux->data.n_values, 0, 0, | 212 | muxc = i2c_mux_alloc(parent, &pdev->dev, mux->data.n_values, 0, 0, |
210 | i2c_mux_reg_select, NULL); | 213 | i2c_mux_reg_select, NULL); |
211 | if (!muxc) | 214 | if (!muxc) { |
212 | return -ENOMEM; | 215 | ret = -ENOMEM; |
216 | goto err_put_parent; | ||
217 | } | ||
213 | muxc->priv = mux; | 218 | muxc->priv = mux; |
214 | 219 | ||
215 | platform_set_drvdata(pdev, muxc); | 220 | platform_set_drvdata(pdev, muxc); |
@@ -233,6 +238,8 @@ static int i2c_mux_reg_probe(struct platform_device *pdev) | |||
233 | 238 | ||
234 | add_adapter_failed: | 239 | add_adapter_failed: |
235 | i2c_mux_del_adapters(muxc); | 240 | i2c_mux_del_adapters(muxc); |
241 | err_put_parent: | ||
242 | i2c_put_adapter(parent); | ||
236 | 243 | ||
237 | return ret; | 244 | return ret; |
238 | } | 245 | } |