]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/base/firmware_class.c
Merge 3.14-rc5 into driver-core-next
[karo-tx-linux.git] / drivers / base / firmware_class.c
index c30df50e4440c3af5639af58dd567c37e8bf40e6..d276e33880be1e632a95f5a960e4c0eab6c7f983 100644 (file)
@@ -649,7 +649,9 @@ static ssize_t firmware_loading_store(struct device *dev,
                         * see the mapped 'buf->data' once the loading
                         * is completed.
                         * */
-                       fw_map_pages_buf(fw_buf);
+                       if (fw_map_pages_buf(fw_buf))
+                               dev_err(dev, "%s: map pages failed\n",
+                                       __func__);
                        list_del_init(&fw_buf->pending_list);
                        complete_all(&fw_buf->completion);
                        break;
@@ -900,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);
        }
@@ -908,6 +911,8 @@ static int _request_firmware_load(struct firmware_priv *fw_priv,
        wait_for_completion(&buf->completion);
 
        cancel_delayed_work_sync(&fw_priv->timeout_work);
+       if (!buf->data)
+               retval = -ENOMEM;
 
        device_remove_file(f_dev, &dev_attr_loading);
 err_del_bin_attr:
@@ -1570,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,