aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/firmware_class.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base/firmware_class.c')
-rw-r--r--drivers/base/firmware_class.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index 8e6c62b4f512..d45d1e1c40a4 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -50,6 +50,7 @@ struct firmware_priv {
50 int page_array_size; 50 int page_array_size;
51 const char *vdata; 51 const char *vdata;
52 struct timer_list timeout; 52 struct timer_list timeout;
53 bool nowait;
53}; 54};
54 55
55#ifdef CONFIG_FW_LOADER 56#ifdef CONFIG_FW_LOADER
@@ -112,6 +113,8 @@ static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
112 return -ENOMEM; 113 return -ENOMEM;
113 if (add_uevent_var(env, "TIMEOUT=%i", loading_timeout)) 114 if (add_uevent_var(env, "TIMEOUT=%i", loading_timeout))
114 return -ENOMEM; 115 return -ENOMEM;
116 if (add_uevent_var(env, "ASYNC=%d", fw_priv->nowait))
117 return -ENOMEM;
115 118
116 return 0; 119 return 0;
117} 120}
@@ -441,7 +444,7 @@ error_kfree:
441 444
442static int fw_setup_device(struct firmware *fw, struct device **dev_p, 445static int fw_setup_device(struct firmware *fw, struct device **dev_p,
443 const char *fw_name, struct device *device, 446 const char *fw_name, struct device *device,
444 int uevent) 447 int uevent, bool nowait)
445{ 448{
446 struct device *f_dev; 449 struct device *f_dev;
447 struct firmware_priv *fw_priv; 450 struct firmware_priv *fw_priv;
@@ -457,6 +460,8 @@ static int fw_setup_device(struct firmware *fw, struct device **dev_p,
457 460
458 fw_priv = dev_get_drvdata(f_dev); 461 fw_priv = dev_get_drvdata(f_dev);
459 462
463 fw_priv->nowait = nowait;
464
460 fw_priv->fw = fw; 465 fw_priv->fw = fw;
461 sysfs_bin_attr_init(&fw_priv->attr_data); 466 sysfs_bin_attr_init(&fw_priv->attr_data);
462 retval = sysfs_create_bin_file(&f_dev->kobj, &fw_priv->attr_data); 467 retval = sysfs_create_bin_file(&f_dev->kobj, &fw_priv->attr_data);
@@ -484,7 +489,7 @@ out:
484 489
485static int 490static int
486_request_firmware(const struct firmware **firmware_p, const char *name, 491_request_firmware(const struct firmware **firmware_p, const char *name,
487 struct device *device, int uevent) 492 struct device *device, int uevent, bool nowait)
488{ 493{
489 struct device *f_dev; 494 struct device *f_dev;
490 struct firmware_priv *fw_priv; 495 struct firmware_priv *fw_priv;
@@ -516,7 +521,8 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
516 if (uevent) 521 if (uevent)
517 dev_dbg(device, "firmware: requesting %s\n", name); 522 dev_dbg(device, "firmware: requesting %s\n", name);
518 523
519 retval = fw_setup_device(firmware, &f_dev, name, device, uevent); 524 retval = fw_setup_device(firmware, &f_dev, name, device,
525 uevent, nowait);
520 if (retval) 526 if (retval)
521 goto error_kfree_fw; 527 goto error_kfree_fw;
522 528
@@ -573,7 +579,7 @@ request_firmware(const struct firmware **firmware_p, const char *name,
573 struct device *device) 579 struct device *device)
574{ 580{
575 int uevent = 1; 581 int uevent = 1;
576 return _request_firmware(firmware_p, name, device, uevent); 582 return _request_firmware(firmware_p, name, device, uevent, false);
577} 583}
578 584
579/** 585/**
@@ -619,7 +625,7 @@ request_firmware_work_func(void *arg)
619 return 0; 625 return 0;
620 } 626 }
621 ret = _request_firmware(&fw, fw_work->name, fw_work->device, 627 ret = _request_firmware(&fw, fw_work->name, fw_work->device,
622 fw_work->uevent); 628 fw_work->uevent, true);
623 629
624 fw_work->cont(fw, fw_work->context); 630 fw_work->cont(fw, fw_work->context);
625 631