aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorShaibal Dutta <shaibal.dutta@broadcom.com>2014-01-31 18:44:58 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-02-15 14:31:55 -0500
commitbce6618a11ca4ca3cb5d6a2a1d43c00f8301d2b2 (patch)
tree0fe8caa0391f8fbfb467512d594d151bee9e90c6 /drivers/base
parent2b1278cb651786648ba6dad285a6c0873c6788e1 (diff)
firmware: use power efficient workqueue for unloading and aborting fw load
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>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/firmware_class.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index e5808eb63b67..cb8b77917d7f 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -902,7 +902,8 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
902 dev_set_uevent_suppress(f_dev, false); 902 dev_set_uevent_suppress(f_dev, false);
903 dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id); 903 dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id);
904 if (timeout != MAX_SCHEDULE_TIMEOUT) 904 if (timeout != MAX_SCHEDULE_TIMEOUT)
905 schedule_delayed_work(&fw_priv->timeout_work, timeout); 905 queue_delayed_work(system_power_efficient_wq,
906 &fw_priv->timeout_work, timeout);
906 907
907 kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD); 908 kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD);
908 } 909 }
@@ -1574,8 +1575,8 @@ static void device_uncache_fw_images_work(struct work_struct *work)
1574 */ 1575 */
1575static void device_uncache_fw_images_delay(unsigned long delay) 1576static void device_uncache_fw_images_delay(unsigned long delay)
1576{ 1577{
1577 schedule_delayed_work(&fw_cache.work, 1578 queue_delayed_work(system_power_efficient_wq, &fw_cache.work,
1578 msecs_to_jiffies(delay)); 1579 msecs_to_jiffies(delay));
1579} 1580}
1580 1581
1581static int fw_pm_notify(struct notifier_block *notify_block, 1582static int fw_pm_notify(struct notifier_block *notify_block,