Thermal: thermal zone governor fix

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 <rui.zhang@intel.com>
Acked-by: Javi Merino <javi.merino@arm.com>
This commit is contained in:
Zhang Rui 2014-01-24 10:23:19 +08:00
parent 5ca0cce562
commit f2234bcd03
1 changed files with 18 additions and 7 deletions

View File

@ -56,10 +56,15 @@ static LIST_HEAD(thermal_governor_list);
static DEFINE_MUTEX(thermal_list_lock); static DEFINE_MUTEX(thermal_list_lock);
static DEFINE_MUTEX(thermal_governor_lock); static DEFINE_MUTEX(thermal_governor_lock);
static struct thermal_governor *def_governor;
static struct thermal_governor *__find_governor(const char *name) static struct thermal_governor *__find_governor(const char *name)
{ {
struct thermal_governor *pos; struct thermal_governor *pos;
if (!name || !name[0])
return def_governor;
list_for_each_entry(pos, &thermal_governor_list, governor_list) list_for_each_entry(pos, &thermal_governor_list, governor_list)
if (!strnicmp(name, pos->name, THERMAL_NAME_LENGTH)) if (!strnicmp(name, pos->name, THERMAL_NAME_LENGTH))
return pos; return pos;
@ -82,17 +87,23 @@ int thermal_register_governor(struct thermal_governor *governor)
if (__find_governor(governor->name) == NULL) { if (__find_governor(governor->name) == NULL) {
err = 0; err = 0;
list_add(&governor->governor_list, &thermal_governor_list); 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); mutex_lock(&thermal_list_lock);
list_for_each_entry(pos, &thermal_tz_list, node) { 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) if (pos->governor)
continue; continue;
if (pos->tzp)
name = pos->tzp->governor_name; name = pos->tzp->governor_name;
else
name = DEFAULT_THERMAL_GOVERNOR;
if (!strnicmp(name, governor->name, THERMAL_NAME_LENGTH)) if (!strnicmp(name, governor->name, THERMAL_NAME_LENGTH))
pos->governor = governor; pos->governor = governor;
} }
@ -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, static void handle_non_critical_trips(struct thermal_zone_device *tz,
int trip, enum thermal_trip_type trip_type) int trip, enum thermal_trip_type trip_type)
{ {
if (tz->governor) tz->governor ? tz->governor->throttle(tz, trip) :
tz->governor->throttle(tz, trip); def_governor->throttle(tz, trip);
} }
static void handle_critical_trips(struct thermal_zone_device *tz, static void handle_critical_trips(struct thermal_zone_device *tz,
@ -1533,7 +1544,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
if (tz->tzp) if (tz->tzp)
tz->governor = __find_governor(tz->tzp->governor_name); tz->governor = __find_governor(tz->tzp->governor_name);
else else
tz->governor = __find_governor(DEFAULT_THERMAL_GOVERNOR); tz->governor = def_governor;
mutex_unlock(&thermal_governor_lock); mutex_unlock(&thermal_governor_lock);