diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/thermal/power_allocator.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'drivers/thermal/power_allocator.c')
| -rw-r--r-- | drivers/thermal/power_allocator.c | 51 | 
1 files changed, 28 insertions, 23 deletions
diff --git a/drivers/thermal/power_allocator.c b/drivers/thermal/power_allocator.c index 4672250b329f..9c8a7aad0252 100644 --- a/drivers/thermal/power_allocator.c +++ b/drivers/thermal/power_allocator.c @@ -92,8 +92,8 @@ struct power_allocator_params {   * Return: The power budget for the next period.   */  static u32 pid_controller(struct thermal_zone_device *tz, -			  unsigned long current_temp, -			  unsigned long control_temp, +			  int current_temp, +			  int control_temp,  			  u32 max_allocatable_power)  {  	s64 p, i, d, power_range; @@ -102,7 +102,7 @@ static u32 pid_controller(struct thermal_zone_device *tz,  	max_power_frac = int_to_frac(max_allocatable_power); -	err = ((s32)control_temp - (s32)current_temp); +	err = control_temp - current_temp;  	err = int_to_frac(err);  	/* Calculate the proportional term */ @@ -223,13 +223,14 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors,  }  static int allocate_power(struct thermal_zone_device *tz, -			  unsigned long current_temp, -			  unsigned long control_temp) +			  int current_temp, +			  int control_temp)  {  	struct thermal_instance *instance;  	struct power_allocator_params *params = tz->governor_data;  	u32 *req_power, *max_power, *granted_power, *extra_actor_power; -	u32 total_req_power, max_allocatable_power; +	u32 *weighted_req_power; +	u32 total_req_power, max_allocatable_power, total_weighted_req_power;  	u32 total_granted_power, power_range;  	int i, num_actors, total_weight, ret = 0;  	int trip_max_desired_temperature = params->trip_max_desired_temperature; @@ -247,17 +248,17 @@ static int allocate_power(struct thermal_zone_device *tz,  	}  	/* -	 * We need to allocate three arrays of the same size: -	 * req_power, max_power and granted_power.  They are going to -	 * be needed until this function returns.  Allocate them all -	 * in one go to simplify the allocation and deallocation -	 * logic. +	 * We need to allocate five arrays of the same size: +	 * req_power, max_power, granted_power, extra_actor_power and +	 * weighted_req_power.  They are going to be needed until this +	 * function returns.  Allocate them all in one go to simplify +	 * the allocation and deallocation logic.  	 */  	BUILD_BUG_ON(sizeof(*req_power) != sizeof(*max_power));  	BUILD_BUG_ON(sizeof(*req_power) != sizeof(*granted_power));  	BUILD_BUG_ON(sizeof(*req_power) != sizeof(*extra_actor_power)); -	req_power = devm_kcalloc(&tz->device, num_actors * 4, -				 sizeof(*req_power), GFP_KERNEL); +	BUILD_BUG_ON(sizeof(*req_power) != sizeof(*weighted_req_power)); +	req_power = kcalloc(num_actors * 5, sizeof(*req_power), GFP_KERNEL);  	if (!req_power) {  		ret = -ENOMEM;  		goto unlock; @@ -266,8 +267,10 @@ static int allocate_power(struct thermal_zone_device *tz,  	max_power = &req_power[num_actors];  	granted_power = &req_power[2 * num_actors];  	extra_actor_power = &req_power[3 * num_actors]; +	weighted_req_power = &req_power[4 * num_actors];  	i = 0; +	total_weighted_req_power = 0;  	total_req_power = 0;  	max_allocatable_power = 0; @@ -289,13 +292,14 @@ static int allocate_power(struct thermal_zone_device *tz,  		else  			weight = instance->weight; -		req_power[i] = frac_to_int(weight * req_power[i]); +		weighted_req_power[i] = frac_to_int(weight * req_power[i]);  		if (power_actor_get_max_power(cdev, tz, &max_power[i]))  			continue;  		total_req_power += req_power[i];  		max_allocatable_power += max_power[i]; +		total_weighted_req_power += weighted_req_power[i];  		i++;  	} @@ -303,8 +307,9 @@ static int allocate_power(struct thermal_zone_device *tz,  	power_range = pid_controller(tz, current_temp, control_temp,  				     max_allocatable_power); -	divvy_up_power(req_power, max_power, num_actors, total_req_power, -		       power_range, granted_power, extra_actor_power); +	divvy_up_power(weighted_req_power, max_power, num_actors, +		       total_weighted_req_power, power_range, granted_power, +		       extra_actor_power);  	total_granted_power = 0;  	i = 0; @@ -326,9 +331,9 @@ static int allocate_power(struct thermal_zone_device *tz,  				      granted_power, total_granted_power,  				      num_actors, power_range,  				      max_allocatable_power, current_temp, -				      (s32)control_temp - (s32)current_temp); +				      control_temp - current_temp); -	devm_kfree(&tz->device, req_power); +	kfree(req_power);  unlock:  	mutex_unlock(&tz->lock); @@ -411,7 +416,7 @@ static int power_allocator_bind(struct thermal_zone_device *tz)  {  	int ret;  	struct power_allocator_params *params; -	unsigned long switch_on_temp, control_temp; +	int switch_on_temp, control_temp;  	u32 temperature_threshold;  	if (!tz->tzp || !tz->tzp->sustainable_power) { @@ -420,7 +425,7 @@ static int power_allocator_bind(struct thermal_zone_device *tz)  		return -EINVAL;  	} -	params = devm_kzalloc(&tz->device, sizeof(*params), GFP_KERNEL); +	params = kzalloc(sizeof(*params), GFP_KERNEL);  	if (!params)  		return -ENOMEM; @@ -462,21 +467,21 @@ static int power_allocator_bind(struct thermal_zone_device *tz)  	return 0;  free: -	devm_kfree(&tz->device, params); +	kfree(params);  	return ret;  }  static void power_allocator_unbind(struct thermal_zone_device *tz)  {  	dev_dbg(&tz->device, "Unbinding from thermal zone %d\n", tz->id); -	devm_kfree(&tz->device, tz->governor_data); +	kfree(tz->governor_data);  	tz->governor_data = NULL;  }  static int power_allocator_throttle(struct thermal_zone_device *tz, int trip)  {  	int ret; -	unsigned long switch_on_temp, control_temp, current_temp; +	int switch_on_temp, control_temp, current_temp;  	struct power_allocator_params *params = tz->governor_data;  	/*  |