Skip to content

Commit

Permalink
thermal: exynos: Make the zone handling use trip information
Browse files Browse the repository at this point in the history
This code simplifies the zone handling to use the trip information passed
by the TMU driver and not the hardcoded macros. This also helps in adding
more zone support.

Acked-by: Kukjin Kim <kgene.kim@samsung.com>
Acked-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
Signed-off-by: Amit Daniel Kachhap <amit.daniel@samsung.com>
Signed-off-by: Eduardo Valentin <eduardo.valentin@ti.com>
  • Loading branch information
Amit Daniel Kachhap authored and Eduardo Valentin committed Aug 13, 2013
1 parent 23a3eb1 commit 5c3cf55
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 28 deletions.
67 changes: 42 additions & 25 deletions drivers/thermal/samsung/exynos_thermal_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,17 +79,24 @@ static int exynos_set_mode(struct thermal_zone_device *thermal,
static int exynos_get_trip_type(struct thermal_zone_device *thermal, int trip,
enum thermal_trip_type *type)
{
switch (GET_ZONE(trip)) {
case MONITOR_ZONE:
case WARN_ZONE:
*type = THERMAL_TRIP_ACTIVE;
break;
case PANIC_ZONE:
struct exynos_thermal_zone *th_zone = thermal->devdata;
int max_trip = th_zone->sensor_conf->trip_data.trip_count;
int trip_type;

if (trip < 0 || trip >= max_trip)
return -EINVAL;

trip_type = th_zone->sensor_conf->trip_data.trip_type[trip];

if (trip_type == SW_TRIP)
*type = THERMAL_TRIP_CRITICAL;
break;
default:
else if (trip_type == THROTTLE_ACTIVE)
*type = THERMAL_TRIP_ACTIVE;
else if (trip_type == THROTTLE_PASSIVE)
*type = THERMAL_TRIP_PASSIVE;
else
return -EINVAL;
}

return 0;
}

Expand All @@ -98,8 +105,9 @@ static int exynos_get_trip_temp(struct thermal_zone_device *thermal, int trip,
unsigned long *temp)
{
struct exynos_thermal_zone *th_zone = thermal->devdata;
int max_trip = th_zone->sensor_conf->trip_data.trip_count;

if (trip < GET_TRIP(MONITOR_ZONE) || trip > GET_TRIP(PANIC_ZONE))
if (trip < 0 || trip >= max_trip)
return -EINVAL;

*temp = th_zone->sensor_conf->trip_data.trip_val[trip];
Expand All @@ -113,10 +121,10 @@ static int exynos_get_trip_temp(struct thermal_zone_device *thermal, int trip,
static int exynos_get_crit_temp(struct thermal_zone_device *thermal,
unsigned long *temp)
{
int ret;
/* Panic zone */
ret = exynos_get_trip_temp(thermal, GET_TRIP(PANIC_ZONE), temp);
return ret;
struct exynos_thermal_zone *th_zone = thermal->devdata;
int max_trip = th_zone->sensor_conf->trip_data.trip_count;
/* Get the temp of highest trip*/
return exynos_get_trip_temp(thermal, max_trip - 1, temp);
}

/* Bind callback functions for thermal zone */
Expand Down Expand Up @@ -348,19 +356,28 @@ int exynos_register_thermal(struct thermal_sensor_conf *sensor_conf)
return -ENOMEM;

th_zone->sensor_conf = sensor_conf;
cpumask_set_cpu(0, &mask_val);
th_zone->cool_dev[0] = cpufreq_cooling_register(&mask_val);
if (IS_ERR(th_zone->cool_dev[0])) {
pr_err("Failed to register cpufreq cooling device\n");
ret = -EINVAL;
goto err_unregister;
/*
* TODO: 1) Handle multiple cooling devices in a thermal zone
* 2) Add a flag/name in cooling info to map to specific
* sensor
*/
if (sensor_conf->cooling_data.freq_clip_count > 0) {
cpumask_set_cpu(0, &mask_val);
th_zone->cool_dev[th_zone->cool_dev_size] =
cpufreq_cooling_register(&mask_val);
if (IS_ERR(th_zone->cool_dev[th_zone->cool_dev_size])) {
pr_err("Failed to register cpufreq cooling device\n");
ret = -EINVAL;
goto err_unregister;
}
th_zone->cool_dev_size++;
}
th_zone->cool_dev_size++;

th_zone->therm_dev = thermal_zone_device_register(sensor_conf->name,
EXYNOS_ZONE_COUNT, 0, th_zone, &exynos_dev_ops, NULL, 0,
sensor_conf->trip_data.trigger_falling ?
0 : IDLE_INTERVAL);
th_zone->therm_dev = thermal_zone_device_register(
sensor_conf->name, sensor_conf->trip_data.trip_count,
0, th_zone, &exynos_dev_ops, NULL, 0,
sensor_conf->trip_data.trigger_falling ? 0 :
IDLE_INTERVAL);

if (IS_ERR(th_zone->therm_dev)) {
pr_err("Failed to register thermal zone device\n");
Expand Down
3 changes: 1 addition & 2 deletions drivers/thermal/samsung/exynos_thermal_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@
#define GET_ZONE(trip) (trip + 2)
#define GET_TRIP(zone) (zone - 2)

#define EXYNOS_ZONE_COUNT 3

enum trigger_type {
THROTTLE_ACTIVE = 1,
THROTTLE_PASSIVE,
Expand All @@ -69,6 +67,7 @@ struct freq_clip_table {

struct thermal_trip_point_conf {
int trip_val[MAX_TRIP_COUNT];
int trip_type[MAX_TRIP_COUNT];
int trip_count;
unsigned char trigger_falling;
};
Expand Down
5 changes: 4 additions & 1 deletion drivers/thermal/samsung/exynos_tmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,9 +509,12 @@ static int exynos_tmu_probe(struct platform_device *pdev)
pdata->trigger_enable[1] + pdata->trigger_enable[2]+
pdata->trigger_enable[3];

for (i = 0; i < exynos_sensor_conf.trip_data.trip_count; i++)
for (i = 0; i < exynos_sensor_conf.trip_data.trip_count; i++) {
exynos_sensor_conf.trip_data.trip_val[i] =
pdata->threshold + pdata->trigger_levels[i];
exynos_sensor_conf.trip_data.trip_type[i] =
pdata->trigger_type[i];
}

exynos_sensor_conf.trip_data.trigger_falling = pdata->threshold_falling;

Expand Down

0 comments on commit 5c3cf55

Please sign in to comment.