Commit 7ddca588 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

thermal: core: Rearrange PM notification code



Move the code run for each thermal zone by the thermal PM notify
handler to separate functions.

This will help to make some subsequent changes look somewhat more
straightforward, among other things.

No intentional functional impact.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/2299090.iZASKD2KPV@rjwysocki.net


Reviewed-by: default avatarLukasz Luba <lukasz.luba@arm.com>
parent 662f920f
Loading
Loading
Loading
Loading
+46 −42
Original line number Diff line number Diff line
@@ -1684,26 +1684,15 @@ static void thermal_zone_device_resume(struct work_struct *work)
	mutex_unlock(&tz->lock);
}

static int thermal_pm_notify(struct notifier_block *nb,
			     unsigned long mode, void *_unused)
static void thermal_zone_pm_prepare(struct thermal_zone_device *tz)
{
	struct thermal_zone_device *tz;

	switch (mode) {
	case PM_HIBERNATION_PREPARE:
	case PM_RESTORE_PREPARE:
	case PM_SUSPEND_PREPARE:
		mutex_lock(&thermal_list_lock);

		list_for_each_entry(tz, &thermal_tz_list, node) {
	mutex_lock(&tz->lock);

	if (tz->resuming) {
		/*
				 * thermal_zone_device_resume() queued up for
				 * this zone has not acquired the lock yet, so
				 * release it to let the function run and wait
				 * util it has done the work.
		 * thermal_zone_device_resume() queued up for this zone has not
		 * acquired the lock yet, so release it to let the function run
		 * and wait util it has done the work.
		 */
		mutex_unlock(&tz->lock);

@@ -1717,14 +1706,8 @@ static int thermal_pm_notify(struct notifier_block *nb,
	mutex_unlock(&tz->lock);
}

		mutex_unlock(&thermal_list_lock);
		break;
	case PM_POST_HIBERNATION:
	case PM_POST_RESTORE:
	case PM_POST_SUSPEND:
		mutex_lock(&thermal_list_lock);

		list_for_each_entry(tz, &thermal_tz_list, node) {
static void thermal_zone_pm_complete(struct thermal_zone_device *tz)
{
	mutex_lock(&tz->lock);

	cancel_delayed_work(&tz->poll_queue);
@@ -1733,19 +1716,40 @@ static int thermal_pm_notify(struct notifier_block *nb,
	tz->resuming = true;

	/*
			 * Replace the work function with the resume one, which
			 * will restore the original work function and schedule
			 * the polling work if needed.
	 * Replace the work function with the resume one, which will restore the
	 * original work function and schedule the polling work if needed.
	 */
			INIT_DELAYED_WORK(&tz->poll_queue,
					  thermal_zone_device_resume);
	INIT_DELAYED_WORK(&tz->poll_queue, thermal_zone_device_resume);
	/* Queue up the work without a delay. */
			mod_delayed_work(system_freezable_power_efficient_wq,
					 &tz->poll_queue, 0);
	mod_delayed_work(system_freezable_power_efficient_wq, &tz->poll_queue, 0);

	mutex_unlock(&tz->lock);
}

static int thermal_pm_notify(struct notifier_block *nb,
			     unsigned long mode, void *_unused)
{
	struct thermal_zone_device *tz;

	switch (mode) {
	case PM_HIBERNATION_PREPARE:
	case PM_RESTORE_PREPARE:
	case PM_SUSPEND_PREPARE:
		mutex_lock(&thermal_list_lock);

		list_for_each_entry(tz, &thermal_tz_list, node)
			thermal_zone_pm_prepare(tz);

		mutex_unlock(&thermal_list_lock);
		break;
	case PM_POST_HIBERNATION:
	case PM_POST_RESTORE:
	case PM_POST_SUSPEND:
		mutex_lock(&thermal_list_lock);

		list_for_each_entry(tz, &thermal_tz_list, node)
			thermal_zone_pm_complete(tz);

		mutex_unlock(&thermal_list_lock);
		break;
	default: