hwmon: (pmbus) Convert pmbus drivers to use devm_kzalloc
authorGuenter Roeck <linux@roeck-us.net>
Wed, 22 Feb 2012 16:56:43 +0000 (08:56 -0800)
committerGuenter Roeck <guenter.roeck@ericsson.com>
Mon, 19 Mar 2012 01:27:45 +0000 (18:27 -0700)
Marginally less code and eliminate the possibility of memory leaks.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pmbus/adm1275.c
drivers/hwmon/pmbus/lm25066.c
drivers/hwmon/pmbus/ltc2978.c
drivers/hwmon/pmbus/pmbus.c
drivers/hwmon/pmbus/pmbus_core.c
drivers/hwmon/pmbus/ucd9000.c
drivers/hwmon/pmbus/ucd9200.c
drivers/hwmon/pmbus/zl6100.c

index fe52c3cf87baaa6ab3105ccbfe92d624a76b4dcb..f81cb4adaebab72a79104b29107acf2cc18274be 100644 (file)
@@ -229,7 +229,8 @@ static int adm1275_probe(struct i2c_client *client,
        if (device_config < 0)
                return device_config;
 
-       data = kzalloc(sizeof(struct adm1275_data), GFP_KERNEL);
+       data = devm_kzalloc(&client->dev, sizeof(struct adm1275_data),
+                           GFP_KERNEL);
        if (!data)
                return -ENOMEM;
 
@@ -297,23 +298,12 @@ static int adm1275_probe(struct i2c_client *client,
                break;
        }
 
-       ret = pmbus_do_probe(client, id, info);
-       if (ret)
-               goto err_mem;
-       return 0;
-
-err_mem:
-       kfree(data);
-       return ret;
+       return pmbus_do_probe(client, id, info);
 }
 
 static int adm1275_remove(struct i2c_client *client)
 {
-       const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
-       const struct adm1275_data *data = to_adm1275_data(info);
-
        pmbus_do_remove(client);
-       kfree(data);
        return 0;
 }
 
index 86ac15ade6abcc545d7089e504817a4d6a1544b8..e70d4ca14fbe5bd46a9857507b68b644bfc3d071 100644 (file)
@@ -176,7 +176,6 @@ static int lm25066_probe(struct i2c_client *client,
                          const struct i2c_device_id *id)
 {
        int config;
-       int ret;
        struct lm25066_data *data;
        struct pmbus_driver_info *info;
 
@@ -184,15 +183,14 @@ static int lm25066_probe(struct i2c_client *client,
                                     I2C_FUNC_SMBUS_READ_BYTE_DATA))
                return -ENODEV;
 
-       data = kzalloc(sizeof(struct lm25066_data), GFP_KERNEL);
+       data = devm_kzalloc(&client->dev, sizeof(struct lm25066_data),
+                           GFP_KERNEL);
        if (!data)
                return -ENOMEM;
 
        config = i2c_smbus_read_byte_data(client, LM25066_DEVICE_SETUP);
-       if (config < 0) {
-               ret = config;
-               goto err_mem;
-       }
+       if (config < 0)
+               return config;
 
        data->id = id->driver_data;
        info = &data->info;
@@ -291,27 +289,15 @@ static int lm25066_probe(struct i2c_client *client,
                }
                break;
        default:
-               ret = -ENODEV;
-               goto err_mem;
+               return -ENODEV;
        }
 
-       ret = pmbus_do_probe(client, id, info);
-       if (ret)
-               goto err_mem;
-       return 0;
-
-err_mem:
-       kfree(data);
-       return ret;
+       return pmbus_do_probe(client, id, info);
 }
 
 static int lm25066_remove(struct i2c_client *client)
 {
-       const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
-       const struct lm25066_data *data = to_lm25066_data(info);
-
        pmbus_do_remove(client);
-       kfree(data);
        return 0;
 }
 
index c9e4dd20bf9c676d16da76c8a95328e5a33c4963..5e07a363b3e9f8dda18eb6d5c7ba9e05a1e93bc6 100644 (file)
@@ -287,7 +287,7 @@ MODULE_DEVICE_TABLE(i2c, ltc2978_id);
 static int ltc2978_probe(struct i2c_client *client,
                         const struct i2c_device_id *id)
 {
-       int chip_id, ret, i;
+       int chip_id, i;
        struct ltc2978_data *data;
        struct pmbus_driver_info *info;
 
@@ -295,15 +295,14 @@ static int ltc2978_probe(struct i2c_client *client,
                                     I2C_FUNC_SMBUS_READ_WORD_DATA))
                return -ENODEV;
 
-       data = kzalloc(sizeof(struct ltc2978_data), GFP_KERNEL);
+       data = devm_kzalloc(&client->dev, sizeof(struct ltc2978_data),
+                           GFP_KERNEL);
        if (!data)
                return -ENOMEM;
 
        chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID);
-       if (chip_id < 0) {
-               ret = chip_id;
-               goto err_mem;
-       }
+       if (chip_id < 0)
+               return chip_id;
 
        if (chip_id == LTC2978_ID_REV1 || chip_id == LTC2978_ID_REV2) {
                data->id = ltc2978;
@@ -311,8 +310,7 @@ static int ltc2978_probe(struct i2c_client *client,
                data->id = ltc3880;
        } else {
                dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
-               ret = -ENODEV;
-               goto err_mem;
+               return -ENODEV;
        }
        if (data->id != id->driver_data)
                dev_warn(&client->dev,
@@ -357,27 +355,15 @@ static int ltc2978_probe(struct i2c_client *client,
                data->vout_min[1] = 0xffff;
                break;
        default:
-               ret = -ENODEV;
-               goto err_mem;
+               return -ENODEV;
        }
 
-       ret = pmbus_do_probe(client, id, info);
-       if (ret)
-               goto err_mem;
-       return 0;
-
-err_mem:
-       kfree(data);
-       return ret;
+       return pmbus_do_probe(client, id, info);
 }
 
 static int ltc2978_remove(struct i2c_client *client)
 {
-       const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
-       const struct ltc2978_data *data = to_ltc2978_data(info);
-
        pmbus_do_remove(client);
-       kfree(data);
        return 0;
 }
 
index da5fe361a94051c9230d3ff8a7f2feaa3d1bdd17..b94bec23d95ca3b9f213f706f7ff841c924e0687 100644 (file)
@@ -166,32 +166,21 @@ static int pmbus_probe(struct i2c_client *client,
                       const struct i2c_device_id *id)
 {
        struct pmbus_driver_info *info;
-       int ret;
 
-       info = kzalloc(sizeof(struct pmbus_driver_info), GFP_KERNEL);
+       info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info),
+                           GFP_KERNEL);
        if (!info)
                return -ENOMEM;
 
        info->pages = id->driver_data;
        info->identify = pmbus_identify;
 
-       ret = pmbus_do_probe(client, id, info);
-       if (ret < 0)
-               goto out;
-       return 0;
-
-out:
-       kfree(info);
-       return ret;
+       return pmbus_do_probe(client, id, info);
 }
 
 static int pmbus_remove(struct i2c_client *client)
 {
-       const struct pmbus_driver_info *info;
-
-       info = pmbus_get_driver_info(client);
        pmbus_do_remove(client);
-       kfree(info);
        return 0;
 }
 
index f571388d88fd1f68b4ad6215f7d479fd00422c95..26b6542a90cd55d35801f40664dfb7ec0012f29f 100644 (file)
@@ -1676,7 +1676,7 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
                                     | I2C_FUNC_SMBUS_WORD_DATA))
                return -ENODEV;
 
-       data = kzalloc(sizeof(*data), GFP_KERNEL);
+       data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
        if (!data) {
                dev_err(&client->dev, "No memory to allocate driver data\n");
                return -ENOMEM;
@@ -1688,8 +1688,7 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
        /* Bail out if PMBus status register does not exist. */
        if (i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE) < 0) {
                dev_err(&client->dev, "PMBus status register not found\n");
-               ret = -ENODEV;
-               goto out_data;
+               return -ENODEV;
        }
 
        if (pdata)
@@ -1702,50 +1701,49 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
                ret = (*info->identify)(client, info);
                if (ret < 0) {
                        dev_err(&client->dev, "Chip identification failed\n");
-                       goto out_data;
+                       return ret;
                }
        }
 
        if (info->pages <= 0 || info->pages > PMBUS_PAGES) {
                dev_err(&client->dev, "Bad number of PMBus pages: %d\n",
                        info->pages);
-               ret = -ENODEV;
-               goto out_data;
+               return -ENODEV;
        }
 
        ret = pmbus_identify_common(client, data);
        if (ret < 0) {
                dev_err(&client->dev, "Failed to identify chip capabilities\n");
-               goto out_data;
+               return ret;
        }
 
        ret = -ENOMEM;
-       data->sensors = kzalloc(sizeof(struct pmbus_sensor) * data->max_sensors,
-                               GFP_KERNEL);
+       data->sensors = devm_kzalloc(&client->dev, sizeof(struct pmbus_sensor)
+                                    * data->max_sensors, GFP_KERNEL);
        if (!data->sensors) {
                dev_err(&client->dev, "No memory to allocate sensor data\n");
-               goto out_data;
+               return -ENOMEM;
        }
 
-       data->booleans = kzalloc(sizeof(struct pmbus_boolean)
+       data->booleans = devm_kzalloc(&client->dev, sizeof(struct pmbus_boolean)
                                 * data->max_booleans, GFP_KERNEL);
        if (!data->booleans) {
                dev_err(&client->dev, "No memory to allocate boolean data\n");
-               goto out_sensors;
+               return -ENOMEM;
        }
 
-       data->labels = kzalloc(sizeof(struct pmbus_label) * data->max_labels,
-                              GFP_KERNEL);
+       data->labels = devm_kzalloc(&client->dev, sizeof(struct pmbus_label)
+                                   * data->max_labels, GFP_KERNEL);
        if (!data->labels) {
                dev_err(&client->dev, "No memory to allocate label data\n");
-               goto out_booleans;
+               return -ENOMEM;
        }
 
-       data->attributes = kzalloc(sizeof(struct attribute *)
-                                  * data->max_attributes, GFP_KERNEL);
+       data->attributes = devm_kzalloc(&client->dev, sizeof(struct attribute *)
+                                       * data->max_attributes, GFP_KERNEL);
        if (!data->attributes) {
                dev_err(&client->dev, "No memory to allocate attribute data\n");
-               goto out_labels;
+               return -ENOMEM;
        }
 
        pmbus_find_attributes(client, data);
@@ -1756,8 +1754,7 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
         */
        if (!data->num_attributes) {
                dev_err(&client->dev, "No attributes found\n");
-               ret = -ENODEV;
-               goto out_attributes;
+               return -ENODEV;
        }
 
        /* Register sysfs hooks */
@@ -1765,7 +1762,7 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
        ret = sysfs_create_group(&client->dev.kobj, &data->group);
        if (ret) {
                dev_err(&client->dev, "Failed to create sysfs entries\n");
-               goto out_attributes;
+               return ret;
        }
        data->hwmon_dev = hwmon_device_register(&client->dev);
        if (IS_ERR(data->hwmon_dev)) {
@@ -1777,16 +1774,6 @@ int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
 
 out_hwmon_device_register:
        sysfs_remove_group(&client->dev.kobj, &data->group);
-out_attributes:
-       kfree(data->attributes);
-out_labels:
-       kfree(data->labels);
-out_booleans:
-       kfree(data->booleans);
-out_sensors:
-       kfree(data->sensors);
-out_data:
-       kfree(data);
        return ret;
 }
 EXPORT_SYMBOL_GPL(pmbus_do_probe);
@@ -1796,11 +1783,6 @@ void pmbus_do_remove(struct i2c_client *client)
        struct pmbus_data *data = i2c_get_clientdata(client);
        hwmon_device_unregister(data->hwmon_dev);
        sysfs_remove_group(&client->dev.kobj, &data->group);
-       kfree(data->attributes);
-       kfree(data->labels);
-       kfree(data->booleans);
-       kfree(data->sensors);
-       kfree(data);
 }
 EXPORT_SYMBOL_GPL(pmbus_do_remove);
 
index 759a563de636045b580bf6d546429fcd6ff8844a..e0573459447cc3b256ab87b91f0042a311e51b25 100644 (file)
@@ -155,7 +155,8 @@ static int ucd9000_probe(struct i2c_client *client,
                           "Device mismatch: Configured %s, detected %s\n",
                           id->name, mid->name);
 
-       data = kzalloc(sizeof(struct ucd9000_data), GFP_KERNEL);
+       data = devm_kzalloc(&client->dev, sizeof(struct ucd9000_data),
+                           GFP_KERNEL);
        if (!data)
                return -ENOMEM;
        info = &data->info;
@@ -164,13 +165,12 @@ static int ucd9000_probe(struct i2c_client *client,
        if (ret < 0) {
                dev_err(&client->dev,
                        "Failed to read number of active pages\n");
-               goto out;
+               return ret;
        }
        info->pages = ret;
        if (!info->pages) {
                dev_err(&client->dev, "No pages configured\n");
-               ret = -ENODEV;
-               goto out;
+               return -ENODEV;
        }
 
        /* The internal temperature sensor is always active */
@@ -181,8 +181,7 @@ static int ucd9000_probe(struct i2c_client *client,
                                        block_buffer);
        if (ret <= 0) {
                dev_err(&client->dev, "Failed to read configuration data\n");
-               ret = -ENODEV;
-               goto out;
+               return -ENODEV;
        }
        for (i = 0; i < ret; i++) {
                int page = UCD9000_MON_PAGE(block_buffer[i]);
@@ -218,7 +217,7 @@ static int ucd9000_probe(struct i2c_client *client,
                                                        UCD9000_FAN_CONFIG,
                                                        data->fan_data[i]);
                        if (ret < 0)
-                               goto out;
+                               return ret;
                }
                i2c_smbus_write_byte_data(client, UCD9000_FAN_CONFIG_INDEX, 0);
 
@@ -227,23 +226,12 @@ static int ucd9000_probe(struct i2c_client *client,
                  | PMBUS_HAVE_FAN34 | PMBUS_HAVE_STATUS_FAN34;
        }
 
-       ret = pmbus_do_probe(client, mid, info);
-       if (ret < 0)
-               goto out;
-       return 0;
-
-out:
-       kfree(data);
-       return ret;
+       return pmbus_do_probe(client, mid, info);
 }
 
 static int ucd9000_remove(struct i2c_client *client)
 {
-       struct ucd9000_data *data;
-
-       data = to_ucd9000_data(pmbus_get_driver_info(client));
        pmbus_do_remove(client);
-       kfree(data);
        return 0;
 }
 
index 629d0c93cac6deb76d97b0806266f667b3d5ec3e..c0d41b993a53c2f70ad851250102af1c57011e27 100644 (file)
@@ -81,7 +81,8 @@ static int ucd9200_probe(struct i2c_client *client,
                           "Device mismatch: Configured %s, detected %s\n",
                           id->name, mid->name);
 
-       info = kzalloc(sizeof(struct pmbus_driver_info), GFP_KERNEL);
+       info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info),
+                           GFP_KERNEL);
        if (!info)
                return -ENOMEM;
 
@@ -89,7 +90,7 @@ static int ucd9200_probe(struct i2c_client *client,
                                        block_buffer);
        if (ret < 0) {
                dev_err(&client->dev, "Failed to read phase information\n");
-               goto out;
+               return ret;
        }
 
        /*
@@ -106,8 +107,7 @@ static int ucd9200_probe(struct i2c_client *client,
        }
        if (!info->pages) {
                dev_err(&client->dev, "No rails configured\n");
-               ret = -ENODEV;
-               goto out;
+               return -ENODEV;
        }
        dev_info(&client->dev, "%d rails configured\n", info->pages);
 
@@ -137,7 +137,7 @@ static int ucd9200_probe(struct i2c_client *client,
                if (ret < 0) {
                        dev_err(&client->dev,
                                "Failed to initialize PHASE registers\n");
-                       goto out;
+                       return ret;
                }
        }
        if (info->pages > 1)
@@ -160,22 +160,12 @@ static int ucd9200_probe(struct i2c_client *client,
        if (mid->driver_data == ucd9240)
                info->func[0] |= PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12;
 
-       ret = pmbus_do_probe(client, mid, info);
-       if (ret < 0)
-               goto out;
-       return 0;
-out:
-       kfree(info);
-       return ret;
+       return pmbus_do_probe(client, mid, info);
 }
 
 static int ucd9200_remove(struct i2c_client *client)
 {
-       const struct pmbus_driver_info *info;
-
-       info = pmbus_get_driver_info(client);
        pmbus_do_remove(client);
-       kfree(info);
        return 0;
 }
 
index 8ae658118bec345a43d6f5ba8c9c7f28f899ae19..9d3b84535e73b3a736f071b0b7bcedfe1326f567 100644 (file)
@@ -193,7 +193,8 @@ static int zl6100_probe(struct i2c_client *client,
                           "Device mismatch: Configured %s, detected %s\n",
                           id->name, mid->name);
 
-       data = kzalloc(sizeof(struct zl6100_data), GFP_KERNEL);
+       data = devm_kzalloc(&client->dev, sizeof(struct zl6100_data),
+                           GFP_KERNEL);
        if (!data)
                return -ENOMEM;
 
@@ -223,7 +224,8 @@ static int zl6100_probe(struct i2c_client *client,
 
        ret = i2c_smbus_read_word_data(client, ZL6100_MFR_CONFIG);
        if (ret < 0)
-               goto err_mem;
+               return ret;
+
        if (ret & ZL6100_MFR_XTEMP_ENABLE)
                info->func[0] |= PMBUS_HAVE_TEMP2;
 
@@ -235,23 +237,12 @@ static int zl6100_probe(struct i2c_client *client,
        info->write_word_data = zl6100_write_word_data;
        info->write_byte = zl6100_write_byte;
 
-       ret = pmbus_do_probe(client, mid, info);
-       if (ret)
-               goto err_mem;
-       return 0;
-
-err_mem:
-       kfree(data);
-       return ret;
+       return pmbus_do_probe(client, mid, info);
 }
 
 static int zl6100_remove(struct i2c_client *client)
 {
-       const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
-       const struct zl6100_data *data = to_zl6100_data(info);
-
        pmbus_do_remove(client);
-       kfree(data);
        return 0;
 }