diff options
Diffstat (limited to 'drivers/acpi/thermal.c')
| -rw-r--r-- | drivers/acpi/thermal.c | 70 | 
1 files changed, 43 insertions, 27 deletions
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 0b4b844f9d4c..4720a3649a61 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c @@ -419,10 +419,9 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)  					 * the next higher trip point  					 */  					tz->trips.active[i-1].temperature = -						(tz->trips.active[i-2].temperature < -						celsius_to_deci_kelvin(act) ? -						tz->trips.active[i-2].temperature : -						celsius_to_deci_kelvin(act)); +						min_t(unsigned long, +						      tz->trips.active[i-2].temperature, +						      celsius_to_deci_kelvin(act));  				break;  			} else { @@ -498,7 +497,7 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz)  static int thermal_get_temp(struct thermal_zone_device *thermal, int *temp)  { -	struct acpi_thermal *tz = thermal->devdata; +	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);  	int result;  	if (!tz) @@ -516,7 +515,7 @@ static int thermal_get_temp(struct thermal_zone_device *thermal, int *temp)  static int thermal_get_trip_type(struct thermal_zone_device *thermal,  				 int trip, enum thermal_trip_type *type)  { -	struct acpi_thermal *tz = thermal->devdata; +	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);  	int i;  	if (!tz || trip < 0) @@ -560,7 +559,7 @@ static int thermal_get_trip_type(struct thermal_zone_device *thermal,  static int thermal_get_trip_temp(struct thermal_zone_device *thermal,  				 int trip, int *temp)  { -	struct acpi_thermal *tz = thermal->devdata; +	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);  	int i;  	if (!tz || trip < 0) @@ -613,7 +612,7 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal,  static int thermal_get_crit_temp(struct thermal_zone_device *thermal,  				int *temperature)  { -	struct acpi_thermal *tz = thermal->devdata; +	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);  	if (tz->trips.critical.flags.valid) {  		*temperature = deci_kelvin_to_millicelsius_with_offset( @@ -628,7 +627,7 @@ static int thermal_get_crit_temp(struct thermal_zone_device *thermal,  static int thermal_get_trend(struct thermal_zone_device *thermal,  			     int trip, enum thermal_trend *trend)  { -	struct acpi_thermal *tz = thermal->devdata; +	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);  	enum thermal_trip_type type;  	int i; @@ -670,7 +669,7 @@ static int thermal_get_trend(struct thermal_zone_device *thermal,  static void acpi_thermal_zone_device_hot(struct thermal_zone_device *thermal)  { -	struct acpi_thermal *tz = thermal->devdata; +	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);  	acpi_bus_generate_netlink_event(tz->device->pnp.device_class,  					dev_name(&tz->device->dev), @@ -679,7 +678,7 @@ static void acpi_thermal_zone_device_hot(struct thermal_zone_device *thermal)  static void acpi_thermal_zone_device_critical(struct thermal_zone_device *thermal)  { -	struct acpi_thermal *tz = thermal->devdata; +	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);  	acpi_bus_generate_netlink_event(tz->device->pnp.device_class,  					dev_name(&tz->device->dev), @@ -693,7 +692,7 @@ static int acpi_thermal_cooling_device_cb(struct thermal_zone_device *thermal,  					  bool bind)  {  	struct acpi_device *device = cdev->devdata; -	struct acpi_thermal *tz = thermal->devdata; +	struct acpi_thermal *tz = thermal_zone_device_priv(thermal);  	struct acpi_device *dev;  	acpi_handle handle;  	int i; @@ -787,6 +786,32 @@ static struct thermal_zone_device_ops acpi_thermal_zone_ops = {  	.critical = acpi_thermal_zone_device_critical,  }; +static int acpi_thermal_zone_sysfs_add(struct acpi_thermal *tz) +{ +	struct device *tzdev = thermal_zone_device(tz->thermal_zone); +	int ret; + +	ret = sysfs_create_link(&tz->device->dev.kobj, +				&tzdev->kobj, "thermal_zone"); +	if (ret) +		return ret; + +	ret = sysfs_create_link(&tzdev->kobj, +				   &tz->device->dev.kobj, "device"); +	if (ret) +		sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone"); + +	return ret; +} + +static void acpi_thermal_zone_sysfs_remove(struct acpi_thermal *tz) +{ +	struct device *tzdev = thermal_zone_device(tz->thermal_zone); + +	sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone"); +	sysfs_remove_link(&tzdev->kobj, "device"); +} +  static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)  {  	int trips = 0; @@ -820,21 +845,15 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)  	if (IS_ERR(tz->thermal_zone))  		return -ENODEV; -	result = sysfs_create_link(&tz->device->dev.kobj, -				   &tz->thermal_zone->device.kobj, "thermal_zone"); +	result = acpi_thermal_zone_sysfs_add(tz);  	if (result)  		goto unregister_tzd; -	result = sysfs_create_link(&tz->thermal_zone->device.kobj, -				   &tz->device->dev.kobj, "device"); -	if (result) -		goto remove_tz_link; -  	status =  acpi_bus_attach_private_data(tz->device->handle,  					       tz->thermal_zone);  	if (ACPI_FAILURE(status)) {  		result = -ENODEV; -		goto remove_dev_link; +		goto remove_links;  	}  	result = thermal_zone_device_enable(tz->thermal_zone); @@ -842,16 +861,14 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)  		goto acpi_bus_detach;  	dev_info(&tz->device->dev, "registered as thermal_zone%d\n", -		 tz->thermal_zone->id); +		 thermal_zone_device_id(tz->thermal_zone));  	return 0;  acpi_bus_detach:  	acpi_bus_detach_private_data(tz->device->handle); -remove_dev_link: -	sysfs_remove_link(&tz->thermal_zone->device.kobj, "device"); -remove_tz_link: -	sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone"); +remove_links: +	acpi_thermal_zone_sysfs_remove(tz);  unregister_tzd:  	thermal_zone_device_unregister(tz->thermal_zone); @@ -860,8 +877,7 @@ unregister_tzd:  static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)  { -	sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone"); -	sysfs_remove_link(&tz->thermal_zone->device.kobj, "device"); +	acpi_thermal_zone_sysfs_remove(tz);  	thermal_zone_device_unregister(tz->thermal_zone);  	tz->thermal_zone = NULL;  	acpi_bus_detach_private_data(tz->device->handle);  |