firmware: use power efficient workqueue for unloading and aborting fw load
authorShaibal Dutta <shaibal.dutta@broadcom.com>
Fri, 31 Jan 2014 23:44:58 +0000 (15:44 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 15 Feb 2014 19:31:55 +0000 (11:31 -0800)
Allow the scheduler to select the most appropriate CPU for running the
firmware load timeout routine and delayed routine for firmware unload.
This extends idle residency times and conserves power.

This functionality is enabled when CONFIG_WQ_POWER_EFFICIENT is selected.

Cc: Ming Lei <ming.lei@canonical.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Shaibal Dutta <shaibal.dutta@broadcom.com>
[zoran.markovic@linaro.org: Rebased to latest kernel, added commit message.
Fixed code alignment.]
Signed-off-by: Zoran Markovic <zoran.markovic@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/firmware_class.c

index e5808eb63b67321de4b16e4a2e1b643e0e4f0d4b..cb8b77917d7fa069f76e637b83a82fad6ed60670 100644 (file)
@@ -902,7 +902,8 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
                dev_set_uevent_suppress(f_dev, false);
                dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id);
                if (timeout != MAX_SCHEDULE_TIMEOUT)
-                       schedule_delayed_work(&fw_priv->timeout_work, timeout);
+                       queue_delayed_work(system_power_efficient_wq,
+                                          &fw_priv->timeout_work, timeout);
 
                kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD);
        }
@@ -1574,8 +1575,8 @@ static void device_uncache_fw_images_work(struct work_struct *work)
  */
 static void device_uncache_fw_images_delay(unsigned long delay)
 {
-       schedule_delayed_work(&fw_cache.work,
-                       msecs_to_jiffies(delay));
+       queue_delayed_work(system_power_efficient_wq, &fw_cache.work,
+                          msecs_to_jiffies(delay));
 }
 
 static int fw_pm_notify(struct notifier_block *notify_block,