Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b313ca7 authored by Guenter Roeck's avatar Guenter Roeck Committed by Guenter Roeck
Browse files

hwmon: (pmbus) Convert pmbus drivers to use devm_kzalloc



Marginally less code and eliminate the possibility of memory leaks.

Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 07404aab
Loading
Loading
Loading
Loading
+3 −13
Original line number Diff line number Diff line
@@ -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;
}

+6 −20
Original line number Diff line number Diff line
@@ -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;
}

+8 −22
Original line number Diff line number Diff line
@@ -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;
}

+3 −14
Original line number Diff line number Diff line
@@ -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;
}

+18 −36
Original line number Diff line number Diff line
@@ -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->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);

Loading