Commit d7817ff2 authored by Eduardo Valentin's avatar Eduardo Valentin
Browse files

hwmon: convert scpi-hwmon to use devm_thermal_zone_of_sensor_register



This changes the driver to use the devm_ version
of thermal_zone_of_sensor_register and cleans
up the  local points and unregister calls.

Cc: Jean Delvare <jdelvare@suse.com>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: lm-sensors@lm-sensors.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: default avatarEduardo Valentin <edubezval@gmail.com>
parent 51b77fd7
Loading
Loading
Loading
Loading
+9 −39
Original line number Diff line number Diff line
@@ -31,10 +31,8 @@ struct sensor_data {
};

struct scpi_thermal_zone {
	struct list_head list;
	int sensor_id;
	struct scpi_sensors *scpi_sensors;
	struct thermal_zone_device *tzd;
};

struct scpi_sensors {
@@ -92,20 +90,6 @@ scpi_show_label(struct device *dev, struct device_attribute *attr, char *buf)
	return sprintf(buf, "%s\n", sensor->info.name);
}

static void
unregister_thermal_zones(struct platform_device *pdev,
			 struct scpi_sensors *scpi_sensors)
{
	struct list_head *pos;

	list_for_each(pos, &scpi_sensors->thermal_zones) {
		struct scpi_thermal_zone *zone;

		zone = list_entry(pos, struct scpi_thermal_zone, list);
		thermal_zone_of_sensor_unregister(&pdev->dev, zone->tzd);
	}
}

static struct thermal_zone_of_device_ops scpi_sensor_ops = {
	.get_temp = scpi_read_temp,
};
@@ -118,7 +102,7 @@ static int scpi_hwmon_probe(struct platform_device *pdev)
	struct scpi_ops *scpi_ops;
	struct device *hwdev, *dev = &pdev->dev;
	struct scpi_sensors *scpi_sensors;
	int ret, idx;
	int idx, ret;

	scpi_ops = get_scpi_ops();
	if (!scpi_ops)
@@ -232,47 +216,34 @@ static int scpi_hwmon_probe(struct platform_device *pdev)
	INIT_LIST_HEAD(&scpi_sensors->thermal_zones);
	for (i = 0; i < nr_sensors; i++) {
		struct sensor_data *sensor = &scpi_sensors->data[i];
		struct thermal_zone_device *z;
		struct scpi_thermal_zone *zone;

		if (sensor->info.class != TEMPERATURE)
			continue;

		zone = devm_kzalloc(dev, sizeof(*zone), GFP_KERNEL);
		if (!zone) {
			ret = -ENOMEM;
			goto unregister_tzd;
		}
		if (!zone)
			return -ENOMEM;

		zone->sensor_id = i;
		zone->scpi_sensors = scpi_sensors;
		zone->tzd = thermal_zone_of_sensor_register(dev,
				sensor->info.sensor_id, zone, &scpi_sensor_ops);
		z = devm_thermal_zone_of_sensor_register(dev,
							 sensor->info.sensor_id,
							 zone,
							 &scpi_sensor_ops);
		/*
		 * The call to thermal_zone_of_sensor_register returns
		 * an error for sensors that are not associated with
		 * any thermal zones or if the thermal subsystem is
		 * not configured.
		 */
		if (IS_ERR(zone->tzd)) {
		if (IS_ERR(z)) {
			devm_kfree(dev, zone);
			continue;
		}
		list_add(&zone->list, &scpi_sensors->thermal_zones);
	}

	return 0;

unregister_tzd:
	unregister_thermal_zones(pdev, scpi_sensors);
	return ret;
}

static int scpi_hwmon_remove(struct platform_device *pdev)
{
	struct scpi_sensors *scpi_sensors = platform_get_drvdata(pdev);

	unregister_thermal_zones(pdev, scpi_sensors);

	return 0;
}

@@ -288,7 +259,6 @@ static struct platform_driver scpi_hwmon_platdrv = {
		.of_match_table = scpi_of_match,
	},
	.probe		= scpi_hwmon_probe,
	.remove		= scpi_hwmon_remove,
};
module_platform_driver(scpi_hwmon_platdrv);