mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-22 00:40:03 +00:00
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal into for-rc
This commit is contained in:
commit
8bf93f2476
4 changed files with 20 additions and 14 deletions
|
@ -229,7 +229,8 @@ static int allocate_power(struct thermal_zone_device *tz,
|
|||
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,16 +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,
|
||||
BUILD_BUG_ON(sizeof(*req_power) != sizeof(*weighted_req_power));
|
||||
req_power = devm_kcalloc(&tz->device, num_actors * 5,
|
||||
sizeof(*req_power), GFP_KERNEL);
|
||||
if (!req_power) {
|
||||
ret = -ENOMEM;
|
||||
|
@ -266,8 +268,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 +293,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 +308,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;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config EXYNOS_THERMAL
|
||||
tristate "Exynos thermal management unit driver"
|
||||
depends on OF
|
||||
depends on THERMAL_OF
|
||||
help
|
||||
If you say yes here you get support for the TMU (Thermal Management
|
||||
Unit) driver for SAMSUNG EXYNOS series of SoCs. This driver initialises
|
||||
|
|
|
@ -1296,7 +1296,6 @@ static struct thermal_zone_of_device_ops exynos_sensor_ops = {
|
|||
|
||||
static int exynos_tmu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct exynos_tmu_platform_data *pdata;
|
||||
struct exynos_tmu_data *data;
|
||||
int ret;
|
||||
|
||||
|
@ -1318,8 +1317,6 @@ static int exynos_tmu_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
goto err_sensor;
|
||||
|
||||
pdata = data->pdata;
|
||||
|
||||
INIT_WORK(&data->irq_work, exynos_tmu_work);
|
||||
|
||||
data->clk = devm_clk_get(&pdev->dev, "tmu_apbif");
|
||||
|
@ -1392,6 +1389,8 @@ static int exynos_tmu_probe(struct platform_device *pdev)
|
|||
if (!IS_ERR(data->clk_sec))
|
||||
clk_unprepare(data->clk_sec);
|
||||
err_sensor:
|
||||
if (!IS_ERR_OR_NULL(data->regulator))
|
||||
regulator_disable(data->regulator);
|
||||
thermal_zone_of_sensor_unregister(&pdev->dev, data->tzd);
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -1333,6 +1333,7 @@ int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz,
|
|||
return -ENODEV;
|
||||
|
||||
unbind:
|
||||
device_remove_file(&tz->device, &pos->weight_attr);
|
||||
device_remove_file(&tz->device, &pos->attr);
|
||||
sysfs_remove_link(&tz->device.kobj, pos->name);
|
||||
release_idr(&tz->idr, &tz->lock, pos->id);
|
||||
|
|
Loading…
Reference in a new issue