diff options
Diffstat (limited to 'drivers/base')
| -rw-r--r-- | drivers/base/dd.c | 6 | ||||
| -rw-r--r-- | drivers/base/firmware_class.c | 5 | ||||
| -rw-r--r-- | drivers/base/power/main.c | 1 | ||||
| -rw-r--r-- | drivers/base/power/sysfs.c | 4 | ||||
| -rw-r--r-- | drivers/base/power/wakeup.c | 3 | 
5 files changed, 12 insertions, 7 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index da57ee9d63f..29917c7506c 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -316,8 +316,7 @@ static void __device_release_driver(struct device *dev)  	drv = dev->driver;  	if (drv) { -		pm_runtime_get_noresume(dev); -		pm_runtime_barrier(dev); +		pm_runtime_get_sync(dev);  		driver_sysfs_remove(dev); @@ -326,6 +325,8 @@ static void __device_release_driver(struct device *dev)  						     BUS_NOTIFY_UNBIND_DRIVER,  						     dev); +		pm_runtime_put_sync(dev); +  		if (dev->bus && dev->bus->remove)  			dev->bus->remove(dev);  		else if (drv->remove) @@ -338,7 +339,6 @@ static void __device_release_driver(struct device *dev)  						     BUS_NOTIFY_UNBOUND_DRIVER,  						     dev); -		pm_runtime_put_sync(dev);  	}  } diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 8c798ef7f13..bbb03e6f725 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -521,6 +521,11 @@ static int _request_firmware(const struct firmware **firmware_p,  	if (!firmware_p)  		return -EINVAL; +	if (WARN_ON(usermodehelper_is_disabled())) { +		dev_err(device, "firmware: %s will not be loaded\n", name); +		return -EBUSY; +	} +  	*firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL);  	if (!firmware) {  		dev_err(device, "%s: kmalloc(struct firmware) failed\n", diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index fbc5b6e7c59..abe3ab709e8 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -63,6 +63,7 @@ void device_pm_init(struct device *dev)  	dev->power.wakeup = NULL;  	spin_lock_init(&dev->power.lock);  	pm_runtime_init(dev); +	INIT_LIST_HEAD(&dev->power.entry);  }  /** diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c index fff49bee781..a9f5b897961 100644 --- a/drivers/base/power/sysfs.c +++ b/drivers/base/power/sysfs.c @@ -212,8 +212,9 @@ static ssize_t autosuspend_delay_ms_store(struct device *dev,  static DEVICE_ATTR(autosuspend_delay_ms, 0644, autosuspend_delay_ms_show,  		autosuspend_delay_ms_store); -#endif +#endif /* CONFIG_PM_RUNTIME */ +#ifdef CONFIG_PM_SLEEP  static ssize_t  wake_show(struct device * dev, struct device_attribute *attr, char * buf)  { @@ -248,7 +249,6 @@ wake_store(struct device * dev, struct device_attribute *attr,  static DEVICE_ATTR(wakeup, 0644, wake_show, wake_store); -#ifdef CONFIG_PM_SLEEP  static ssize_t wakeup_count_show(struct device *dev,  				struct device_attribute *attr, char *buf)  { diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c index 4573c83df6d..84f7c7d5a09 100644 --- a/drivers/base/power/wakeup.c +++ b/drivers/base/power/wakeup.c @@ -110,7 +110,6 @@ void wakeup_source_add(struct wakeup_source *ws)  	spin_lock_irq(&events_lock);  	list_add_rcu(&ws->entry, &wakeup_sources);  	spin_unlock_irq(&events_lock); -	synchronize_rcu();  }  EXPORT_SYMBOL_GPL(wakeup_source_add); @@ -258,7 +257,7 @@ void device_set_wakeup_capable(struct device *dev, bool capable)  	if (!!dev->power.can_wakeup == !!capable)  		return; -	if (device_is_registered(dev)) { +	if (device_is_registered(dev) && !list_empty(&dev->power.entry)) {  		if (capable) {  			if (wakeup_sysfs_add(dev))  				return;  |