diff options
Diffstat (limited to 'drivers/base')
| -rw-r--r-- | drivers/base/devres.c | 1 | ||||
| -rw-r--r-- | drivers/base/devtmpfs.c | 2 | ||||
| -rw-r--r-- | drivers/base/firmware_class.c | 11 | ||||
| -rw-r--r-- | drivers/base/platform.c | 2 | ||||
| -rw-r--r-- | drivers/base/power/clock_ops.c | 111 | ||||
| -rw-r--r-- | drivers/base/regmap/regmap.c | 5 | 
6 files changed, 68 insertions, 64 deletions
diff --git a/drivers/base/devres.c b/drivers/base/devres.c index cf7a0c78805..65cd7483245 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -397,6 +397,7 @@ static int remove_nodes(struct device *dev,  static int release_nodes(struct device *dev, struct list_head *first,  			 struct list_head *end, unsigned long flags) +	__releases(&dev->devres_lock)  {  	LIST_HEAD(todo);  	int cnt; diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index 33e1bed68fd..a4760e095ff 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c @@ -376,7 +376,7 @@ int devtmpfs_mount(const char *mntdir)  	return err;  } -static __initdata DECLARE_COMPLETION(setup_done); +static DECLARE_COMPLETION(setup_done);  static int handle(const char *name, mode_t mode, struct device *dev)  { diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index bbb03e6f725..06ed6b4e7df 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -521,11 +521,6 @@ 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", @@ -539,6 +534,12 @@ static int _request_firmware(const struct firmware **firmware_p,  		return 0;  	} +	if (WARN_ON(usermodehelper_is_disabled())) { +		dev_err(device, "firmware: %s will not be loaded\n", name); +		retval = -EBUSY; +		goto out; +	} +  	if (uevent)  		dev_dbg(device, "firmware: requesting %s\n", name); diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 4573f5ec936..7a24895543e 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -33,7 +33,7 @@ EXPORT_SYMBOL_GPL(platform_bus);  /**   * arch_setup_pdev_archdata - Allow manipulation of archdata before its used - * @dev: platform device + * @pdev: platform device   *   * This is called before platform_device_add() such that any pdev_archdata may   * be setup before the platform_notifier is called.  So if a user needs to diff --git a/drivers/base/power/clock_ops.c b/drivers/base/power/clock_ops.c index a846b2f95cf..b97294e2d95 100644 --- a/drivers/base/power/clock_ops.c +++ b/drivers/base/power/clock_ops.c @@ -19,7 +19,7 @@  struct pm_clk_data {  	struct list_head clock_list; -	struct mutex lock; +	spinlock_t lock;  };  enum pce_status { @@ -42,6 +42,22 @@ static struct pm_clk_data *__to_pcd(struct device *dev)  }  /** + * pm_clk_acquire - Acquire a device clock. + * @dev: Device whose clock is to be acquired. + * @ce: PM clock entry corresponding to the clock. + */ +static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce) +{ +	ce->clk = clk_get(dev, ce->con_id); +	if (IS_ERR(ce->clk)) { +		ce->status = PCE_STATUS_ERROR; +	} else { +		ce->status = PCE_STATUS_ACQUIRED; +		dev_dbg(dev, "Clock %s managed by runtime PM.\n", ce->con_id); +	} +} + +/**   * pm_clk_add - Start using a device clock for power management.   * @dev: Device whose clock is going to be used for power management.   * @con_id: Connection ID of the clock. @@ -73,26 +89,23 @@ int pm_clk_add(struct device *dev, const char *con_id)  		}  	} -	mutex_lock(&pcd->lock); +	pm_clk_acquire(dev, ce); + +	spin_lock_irq(&pcd->lock);  	list_add_tail(&ce->node, &pcd->clock_list); -	mutex_unlock(&pcd->lock); +	spin_unlock_irq(&pcd->lock);  	return 0;  }  /**   * __pm_clk_remove - Destroy PM clock entry.   * @ce: PM clock entry to destroy. - * - * This routine must be called under the mutex protecting the PM list of clocks - * corresponding the the @ce's device.   */  static void __pm_clk_remove(struct pm_clock_entry *ce)  {  	if (!ce)  		return; -	list_del(&ce->node); -  	if (ce->status < PCE_STATUS_ERROR) {  		if (ce->status == PCE_STATUS_ENABLED)  			clk_disable(ce->clk); @@ -123,21 +136,25 @@ void pm_clk_remove(struct device *dev, const char *con_id)  	if (!pcd)  		return; -	mutex_lock(&pcd->lock); +	spin_lock_irq(&pcd->lock);  	list_for_each_entry(ce, &pcd->clock_list, node) { -		if (!con_id && !ce->con_id) { -			__pm_clk_remove(ce); -			break; -		} else if (!con_id || !ce->con_id) { +		if (!con_id && !ce->con_id) +			goto remove; +		else if (!con_id || !ce->con_id)  			continue; -		} else if (!strcmp(con_id, ce->con_id)) { -			__pm_clk_remove(ce); -			break; -		} +		else if (!strcmp(con_id, ce->con_id)) +			goto remove;  	} -	mutex_unlock(&pcd->lock); +	spin_unlock_irq(&pcd->lock); +	return; + + remove: +	list_del(&ce->node); +	spin_unlock_irq(&pcd->lock); + +	__pm_clk_remove(ce);  }  /** @@ -158,7 +175,7 @@ int pm_clk_init(struct device *dev)  	}  	INIT_LIST_HEAD(&pcd->clock_list); -	mutex_init(&pcd->lock); +	spin_lock_init(&pcd->lock);  	dev->power.subsys_data = pcd;  	return 0;  } @@ -175,20 +192,27 @@ void pm_clk_destroy(struct device *dev)  {  	struct pm_clk_data *pcd = __to_pcd(dev);  	struct pm_clock_entry *ce, *c; +	struct list_head list;  	if (!pcd)  		return;  	dev->power.subsys_data = NULL; +	INIT_LIST_HEAD(&list); -	mutex_lock(&pcd->lock); +	spin_lock_irq(&pcd->lock);  	list_for_each_entry_safe_reverse(ce, c, &pcd->clock_list, node) -		__pm_clk_remove(ce); +		list_move(&ce->node, &list); -	mutex_unlock(&pcd->lock); +	spin_unlock_irq(&pcd->lock);  	kfree(pcd); + +	list_for_each_entry_safe_reverse(ce, c, &list, node) { +		list_del(&ce->node); +		__pm_clk_remove(ce); +	}  }  #endif /* CONFIG_PM */ @@ -196,23 +220,6 @@ void pm_clk_destroy(struct device *dev)  #ifdef CONFIG_PM_RUNTIME  /** - * pm_clk_acquire - Acquire a device clock. - * @dev: Device whose clock is to be acquired. - * @con_id: Connection ID of the clock. - */ -static void pm_clk_acquire(struct device *dev, -				    struct pm_clock_entry *ce) -{ -	ce->clk = clk_get(dev, ce->con_id); -	if (IS_ERR(ce->clk)) { -		ce->status = PCE_STATUS_ERROR; -	} else { -		ce->status = PCE_STATUS_ACQUIRED; -		dev_dbg(dev, "Clock %s managed by runtime PM.\n", ce->con_id); -	} -} - -/**   * pm_clk_suspend - Disable clocks in a device's PM clock list.   * @dev: Device to disable the clocks for.   */ @@ -220,25 +227,23 @@ int pm_clk_suspend(struct device *dev)  {  	struct pm_clk_data *pcd = __to_pcd(dev);  	struct pm_clock_entry *ce; +	unsigned long flags;  	dev_dbg(dev, "%s()\n", __func__);  	if (!pcd)  		return 0; -	mutex_lock(&pcd->lock); +	spin_lock_irqsave(&pcd->lock, flags);  	list_for_each_entry_reverse(ce, &pcd->clock_list, node) { -		if (ce->status == PCE_STATUS_NONE) -			pm_clk_acquire(dev, ce); -  		if (ce->status < PCE_STATUS_ERROR) {  			clk_disable(ce->clk);  			ce->status = PCE_STATUS_ACQUIRED;  		}  	} -	mutex_unlock(&pcd->lock); +	spin_unlock_irqrestore(&pcd->lock, flags);  	return 0;  } @@ -251,25 +256,23 @@ int pm_clk_resume(struct device *dev)  {  	struct pm_clk_data *pcd = __to_pcd(dev);  	struct pm_clock_entry *ce; +	unsigned long flags;  	dev_dbg(dev, "%s()\n", __func__);  	if (!pcd)  		return 0; -	mutex_lock(&pcd->lock); +	spin_lock_irqsave(&pcd->lock, flags);  	list_for_each_entry(ce, &pcd->clock_list, node) { -		if (ce->status == PCE_STATUS_NONE) -			pm_clk_acquire(dev, ce); -  		if (ce->status < PCE_STATUS_ERROR) {  			clk_enable(ce->clk);  			ce->status = PCE_STATUS_ENABLED;  		}  	} -	mutex_unlock(&pcd->lock); +	spin_unlock_irqrestore(&pcd->lock, flags);  	return 0;  } @@ -344,6 +347,7 @@ int pm_clk_suspend(struct device *dev)  {  	struct pm_clk_data *pcd = __to_pcd(dev);  	struct pm_clock_entry *ce; +	unsigned long flags;  	dev_dbg(dev, "%s()\n", __func__); @@ -351,12 +355,12 @@ int pm_clk_suspend(struct device *dev)  	if (!pcd || !dev->driver)  		return 0; -	mutex_lock(&pcd->lock); +	spin_lock_irqsave(&pcd->lock, flags);  	list_for_each_entry_reverse(ce, &pcd->clock_list, node)  		clk_disable(ce->clk); -	mutex_unlock(&pcd->lock); +	spin_unlock_irqrestore(&pcd->lock, flags);  	return 0;  } @@ -369,6 +373,7 @@ int pm_clk_resume(struct device *dev)  {  	struct pm_clk_data *pcd = __to_pcd(dev);  	struct pm_clock_entry *ce; +	unsigned long flags;  	dev_dbg(dev, "%s()\n", __func__); @@ -376,12 +381,12 @@ int pm_clk_resume(struct device *dev)  	if (!pcd || !dev->driver)  		return 0; -	mutex_lock(&pcd->lock); +	spin_lock_irqsave(&pcd->lock, flags);  	list_for_each_entry(ce, &pcd->clock_list, node)  		clk_enable(ce->clk); -	mutex_unlock(&pcd->lock); +	spin_unlock_irqrestore(&pcd->lock, flags);  	return 0;  } diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 0eef4da1ac6..20663f8dae4 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -168,13 +168,11 @@ struct regmap *regmap_init(struct device *dev,  	map->work_buf = kmalloc(map->format.buf_size, GFP_KERNEL);  	if (map->work_buf == NULL) {  		ret = -ENOMEM; -		goto err_bus; +		goto err_map;  	}  	return map; -err_bus: -	module_put(map->bus->owner);  err_map:  	kfree(map);  err: @@ -188,7 +186,6 @@ EXPORT_SYMBOL_GPL(regmap_init);  void regmap_exit(struct regmap *map)  {  	kfree(map->work_buf); -	module_put(map->bus->owner);  	kfree(map);  }  EXPORT_SYMBOL_GPL(regmap_exit);  |