hwmon: (pmbus) Convert pmbus drivers to use devm_kzalloc
Marginally less code and eliminate the possibility of memory leaks. Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
07404aab52
commit
8b313ca7f1
8 changed files with 56 additions and 154 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue