mfd: pcf50633: Reconnect -ENOMEM error path
authorLee Jones <lee.jones@linaro.org>
Tue, 1 Jul 2014 11:57:36 +0000 (12:57 +0100)
committerLee Jones <lee.jones@linaro.org>
Wed, 9 Jul 2014 13:58:14 +0000 (14:58 +0100)
If platform_device_alloc() or platform_device_add_data() fail during
pcf50633_probe(), the current code ignores the return error code and
continues to attempt to allocate new platform devices for each of the
supported regulators.  Instead, if any failures occur we should fail
out gracefully by cleaning up after ourselves and return the error.

Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/mfd/pcf50633-core.c

index 41ab5e34d2acb0a150f5ae9af8aab3774cfd01a3..c87f7a0a53f878948daf89f625958d3da5647fa6 100644 (file)
@@ -244,20 +244,20 @@ static int pcf50633_probe(struct i2c_client *client,
 
        for (i = 0; i < PCF50633_NUM_REGULATORS; i++) {
                struct platform_device *pdev;
+               int j;
 
                pdev = platform_device_alloc("pcf50633-regulator", i);
-               if (!pdev) {
-                       dev_err(pcf->dev, "Cannot create regulator %d\n", i);
-                       continue;
-               }
+               if (!pdev)
+                       return -ENOMEM;
 
                pdev->dev.parent = pcf->dev;
-               if (platform_device_add_data(pdev, &pdata->reg_init_data[i],
-                                       sizeof(pdata->reg_init_data[i])) < 0) {
+               ret = platform_device_add_data(pdev, &pdata->reg_init_data[i],
+                                              sizeof(pdata->reg_init_data[i]));
+               if (ret) {
                        platform_device_put(pdev);
-                       dev_err(pcf->dev, "Out of memory for regulator parameters %d\n",
-                                                                       i);
-                       continue;
+                       for (j = 0; j < i; j++)
+                               platform_device_put(pcf->regulator_pdev[j]);
+                       return ret;
                }
                pcf->regulator_pdev[i] = pdev;