Skip to content

Commit

Permalink
Thermal: thermal zone governor fix
Browse files Browse the repository at this point in the history
This patch does a cleanup about the thermal zone govenor,
setting and make the following rule.
1. For thermal zone devices that are registered w/o tz->tzp,
   they can use the default thermal governor only.
2. For thermal zone devices w/ governor name specified in
   tz->tzp->governor_name, we will use the default govenor
   if the governor specified is not available at the moment,
   and update tz->governor when the matched governor is registered.

This also fixes a problem that OF registered thermal zones
are running with no governor.

Signed-off-by: Zhang Rui <[email protected]>
Acked-by: Javi Merino <[email protected]>
  • Loading branch information
zhang-rui committed Mar 3, 2014
1 parent 5ca0cce commit f2234bc
Showing 1 changed file with 18 additions and 7 deletions.
25 changes: 18 additions & 7 deletions drivers/thermal/thermal_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,15 @@ static LIST_HEAD(thermal_governor_list);
static DEFINE_MUTEX(thermal_list_lock);
static DEFINE_MUTEX(thermal_governor_lock);

static struct thermal_governor *def_governor;

static struct thermal_governor *__find_governor(const char *name)
{
struct thermal_governor *pos;

if (!name || !name[0])
return def_governor;

list_for_each_entry(pos, &thermal_governor_list, governor_list)
if (!strnicmp(name, pos->name, THERMAL_NAME_LENGTH))
return pos;
Expand All @@ -82,17 +87,23 @@ int thermal_register_governor(struct thermal_governor *governor)
if (__find_governor(governor->name) == NULL) {
err = 0;
list_add(&governor->governor_list, &thermal_governor_list);
if (!def_governor && !strncmp(governor->name,
DEFAULT_THERMAL_GOVERNOR, THERMAL_NAME_LENGTH))
def_governor = governor;
}

mutex_lock(&thermal_list_lock);

list_for_each_entry(pos, &thermal_tz_list, node) {
/*
* only thermal zones with specified tz->tzp->governor_name
* may run with tz->govenor unset
*/
if (pos->governor)
continue;
if (pos->tzp)
name = pos->tzp->governor_name;
else
name = DEFAULT_THERMAL_GOVERNOR;

name = pos->tzp->governor_name;

if (!strnicmp(name, governor->name, THERMAL_NAME_LENGTH))
pos->governor = governor;
}
Expand Down Expand Up @@ -342,8 +353,8 @@ static void monitor_thermal_zone(struct thermal_zone_device *tz)
static void handle_non_critical_trips(struct thermal_zone_device *tz,
int trip, enum thermal_trip_type trip_type)
{
if (tz->governor)
tz->governor->throttle(tz, trip);
tz->governor ? tz->governor->throttle(tz, trip) :
def_governor->throttle(tz, trip);
}

static void handle_critical_trips(struct thermal_zone_device *tz,
Expand Down Expand Up @@ -1533,7 +1544,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
if (tz->tzp)
tz->governor = __find_governor(tz->tzp->governor_name);
else
tz->governor = __find_governor(DEFAULT_THERMAL_GOVERNOR);
tz->governor = def_governor;

mutex_unlock(&thermal_governor_lock);

Expand Down

0 comments on commit f2234bc

Please sign in to comment.