|
|
@@ -85,7 +85,7 @@ static void driver_sysfs_remove(struct device *dev)
|
|
|
* for before calling this. (It is ok to call with no other effort
|
|
|
* from a driver's probe() method.)
|
|
|
*
|
|
|
- * This function must be called with @dev->sem held.
|
|
|
+ * This function must be called with the device lock held.
|
|
|
*/
|
|
|
int device_bind_driver(struct device *dev)
|
|
|
{
|
|
|
@@ -190,8 +190,8 @@ EXPORT_SYMBOL_GPL(wait_for_device_probe);
|
|
|
* This function returns -ENODEV if the device is not registered,
|
|
|
* 1 if the device is bound successfully and 0 otherwise.
|
|
|
*
|
|
|
- * This function must be called with @dev->sem held. When called for a
|
|
|
- * USB interface, @dev->parent->sem must be held as well.
|
|
|
+ * This function must be called with @dev lock held. When called for a
|
|
|
+ * USB interface, @dev->parent lock must be held as well.
|
|
|
*/
|
|
|
int driver_probe_device(struct device_driver *drv, struct device *dev)
|
|
|
{
|
|
|
@@ -233,13 +233,13 @@ static int __device_attach(struct device_driver *drv, void *data)
|
|
|
* 0 if no matching driver was found;
|
|
|
* -ENODEV if the device is not registered.
|
|
|
*
|
|
|
- * When called for a USB interface, @dev->parent->sem must be held.
|
|
|
+ * When called for a USB interface, @dev->parent lock must be held.
|
|
|
*/
|
|
|
int device_attach(struct device *dev)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
|
|
|
- down(&dev->sem);
|
|
|
+ device_lock(dev);
|
|
|
if (dev->driver) {
|
|
|
ret = device_bind_driver(dev);
|
|
|
if (ret == 0)
|
|
|
@@ -253,7 +253,7 @@ int device_attach(struct device *dev)
|
|
|
ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
|
|
|
pm_runtime_put_sync(dev);
|
|
|
}
|
|
|
- up(&dev->sem);
|
|
|
+ device_unlock(dev);
|
|
|
return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(device_attach);
|
|
|
@@ -276,13 +276,13 @@ static int __driver_attach(struct device *dev, void *data)
|
|
|
return 0;
|
|
|
|
|
|
if (dev->parent) /* Needed for USB */
|
|
|
- down(&dev->parent->sem);
|
|
|
- down(&dev->sem);
|
|
|
+ device_lock(dev->parent);
|
|
|
+ device_lock(dev);
|
|
|
if (!dev->driver)
|
|
|
driver_probe_device(drv, dev);
|
|
|
- up(&dev->sem);
|
|
|
+ device_unlock(dev);
|
|
|
if (dev->parent)
|
|
|
- up(&dev->parent->sem);
|
|
|
+ device_unlock(dev->parent);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
@@ -303,8 +303,8 @@ int driver_attach(struct device_driver *drv)
|
|
|
EXPORT_SYMBOL_GPL(driver_attach);
|
|
|
|
|
|
/*
|
|
|
- * __device_release_driver() must be called with @dev->sem held.
|
|
|
- * When called for a USB interface, @dev->parent->sem must be held as well.
|
|
|
+ * __device_release_driver() must be called with @dev lock held.
|
|
|
+ * When called for a USB interface, @dev->parent lock must be held as well.
|
|
|
*/
|
|
|
static void __device_release_driver(struct device *dev)
|
|
|
{
|
|
|
@@ -343,7 +343,7 @@ static void __device_release_driver(struct device *dev)
|
|
|
* @dev: device.
|
|
|
*
|
|
|
* Manually detach device from driver.
|
|
|
- * When called for a USB interface, @dev->parent->sem must be held.
|
|
|
+ * When called for a USB interface, @dev->parent lock must be held.
|
|
|
*/
|
|
|
void device_release_driver(struct device *dev)
|
|
|
{
|
|
|
@@ -352,9 +352,9 @@ void device_release_driver(struct device *dev)
|
|
|
* within their ->remove callback for the same device, they
|
|
|
* will deadlock right here.
|
|
|
*/
|
|
|
- down(&dev->sem);
|
|
|
+ device_lock(dev);
|
|
|
__device_release_driver(dev);
|
|
|
- up(&dev->sem);
|
|
|
+ device_unlock(dev);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(device_release_driver);
|
|
|
|
|
|
@@ -381,13 +381,13 @@ void driver_detach(struct device_driver *drv)
|
|
|
spin_unlock(&drv->p->klist_devices.k_lock);
|
|
|
|
|
|
if (dev->parent) /* Needed for USB */
|
|
|
- down(&dev->parent->sem);
|
|
|
- down(&dev->sem);
|
|
|
+ device_lock(dev->parent);
|
|
|
+ device_lock(dev);
|
|
|
if (dev->driver == drv)
|
|
|
__device_release_driver(dev);
|
|
|
- up(&dev->sem);
|
|
|
+ device_unlock(dev);
|
|
|
if (dev->parent)
|
|
|
- up(&dev->parent->sem);
|
|
|
+ device_unlock(dev->parent);
|
|
|
put_device(dev);
|
|
|
}
|
|
|
}
|