Skip to content

Commit

Permalink
Thermal: do not clear passive state during system sleep
Browse files Browse the repository at this point in the history
[ Upstream commit 964f4843a455d2ffb199512b08be8d5f077c4cac ]

commit ff140fe ("Thermal: handle thermal zone device properly
during system sleep") added PM hook to call thermal zone reset during
sleep. However resetting thermal zone will also clear the passive state
and thus cancel the polling queue which leads the passive cooling device
state not being cleared properly after sleep.

thermal_pm_notify => thermal_zone_device_reset set passive to 0
thermal_zone_trip_update will skip update passive as `old_target ==
instance->target'.
monitor_thermal_zone => thermal_zone_device_set_polling will cancel
tz->poll_queue, so the cooling device state will not be changed
afterwards.

Reported-by: Kame Wang <[email protected]>
Signed-off-by: Wei Wang <[email protected]>
Signed-off-by: Zhang Rui <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
  • Loading branch information
weivincewang authored and gregkh committed Feb 12, 2019
1 parent 6084611 commit a61cdb8
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions drivers/thermal/thermal_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -597,16 +597,20 @@ static void update_temperature(struct thermal_zone_device *tz)
tz->last_temperature, tz->temperature);
}

static void thermal_zone_device_reset(struct thermal_zone_device *tz)
static void thermal_zone_device_init(struct thermal_zone_device *tz)
{
struct thermal_instance *pos;

tz->temperature = THERMAL_TEMP_INVALID;
tz->passive = 0;
list_for_each_entry(pos, &tz->thermal_instances, tz_node)
pos->initialized = false;
}

static void thermal_zone_device_reset(struct thermal_zone_device *tz)
{
tz->passive = 0;
thermal_zone_device_init(tz);
}

void thermal_zone_device_update(struct thermal_zone_device *tz,
enum thermal_notify_event event)
{
Expand Down Expand Up @@ -2297,7 +2301,7 @@ static int thermal_pm_notify(struct notifier_block *nb,
case PM_POST_SUSPEND:
atomic_set(&in_suspend, 0);
list_for_each_entry(tz, &thermal_tz_list, node) {
thermal_zone_device_reset(tz);
thermal_zone_device_init(tz);
thermal_zone_device_update(tz,
THERMAL_EVENT_UNSPECIFIED);
}
Expand Down

0 comments on commit a61cdb8

Please sign in to comment.