diff options
Diffstat (limited to 'drivers/thermal/thermal_core.c')
| -rw-r--r-- | drivers/thermal/thermal_core.c | 57 | 
1 files changed, 23 insertions, 34 deletions
| diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index 996c038f83a4..d20b25f40d19 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -561,24 +561,6 @@ void thermal_zone_device_update(struct thermal_zone_device *tz,  }  EXPORT_SYMBOL_GPL(thermal_zone_device_update); -/** - * thermal_notify_framework - Sensor drivers use this API to notify framework - * @tz:		thermal zone device - * @trip:	indicates which trip point has been crossed - * - * This function handles the trip events from sensor drivers. It starts - * throttling the cooling devices according to the policy configured. - * For CRITICAL and HOT trip points, this notifies the respective drivers, - * and does actual throttling for other trip points i.e ACTIVE and PASSIVE. - * The throttling policy is based on the configured platform data; if no - * platform data is provided, this uses the step_wise throttling policy. - */ -void thermal_notify_framework(struct thermal_zone_device *tz, int trip) -{ -	handle_thermal_trip(tz, trip); -} -EXPORT_SYMBOL_GPL(thermal_notify_framework); -  static void thermal_zone_device_check(struct work_struct *work)  {  	struct thermal_zone_device *tz = container_of(work, struct @@ -960,10 +942,7 @@ __thermal_cooling_device_register(struct device_node *np,  {  	struct thermal_cooling_device *cdev;  	struct thermal_zone_device *pos = NULL; -	int result; - -	if (type && strlen(type) >= THERMAL_NAME_LENGTH) -		return ERR_PTR(-EINVAL); +	int ret;  	if (!ops || !ops->get_max_state || !ops->get_cur_state ||  	    !ops->set_cur_state) @@ -973,14 +952,17 @@ __thermal_cooling_device_register(struct device_node *np,  	if (!cdev)  		return ERR_PTR(-ENOMEM); -	result = ida_simple_get(&thermal_cdev_ida, 0, 0, GFP_KERNEL); -	if (result < 0) { -		kfree(cdev); -		return ERR_PTR(result); +	ret = ida_simple_get(&thermal_cdev_ida, 0, 0, GFP_KERNEL); +	if (ret < 0) +		goto out_kfree_cdev; +	cdev->id = ret; + +	cdev->type = kstrdup(type ? type : "", GFP_KERNEL); +	if (!cdev->type) { +		ret = -ENOMEM; +		goto out_ida_remove;  	} -	cdev->id = result; -	strlcpy(cdev->type, type ? : "", sizeof(cdev->type));  	mutex_init(&cdev->lock);  	INIT_LIST_HEAD(&cdev->thermal_instances);  	cdev->np = np; @@ -990,12 +972,9 @@ __thermal_cooling_device_register(struct device_node *np,  	cdev->devdata = devdata;  	thermal_cooling_device_setup_sysfs(cdev);  	dev_set_name(&cdev->device, "cooling_device%d", cdev->id); -	result = device_register(&cdev->device); -	if (result) { -		ida_simple_remove(&thermal_cdev_ida, cdev->id); -		put_device(&cdev->device); -		return ERR_PTR(result); -	} +	ret = device_register(&cdev->device); +	if (ret) +		goto out_kfree_type;  	/* Add 'this' new cdev to the global cdev list */  	mutex_lock(&thermal_list_lock); @@ -1013,6 +992,15 @@ __thermal_cooling_device_register(struct device_node *np,  	mutex_unlock(&thermal_list_lock);  	return cdev; + +out_kfree_type: +	kfree(cdev->type); +	put_device(&cdev->device); +out_ida_remove: +	ida_simple_remove(&thermal_cdev_ida, cdev->id); +out_kfree_cdev: +	kfree(cdev); +	return ERR_PTR(ret);  }  /** @@ -1171,6 +1159,7 @@ void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)  	ida_simple_remove(&thermal_cdev_ida, cdev->id);  	device_del(&cdev->device);  	thermal_cooling_device_destroy_sysfs(cdev); +	kfree(cdev->type);  	put_device(&cdev->device);  }  EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister); | 
