|
@@ -490,10 +490,12 @@ static int ap_device_probe(struct device *dev)
|
|
int rc;
|
|
int rc;
|
|
|
|
|
|
ap_dev->drv = ap_drv;
|
|
ap_dev->drv = ap_drv;
|
|
- spin_lock_bh(&ap_device_lock);
|
|
|
|
- list_add(&ap_dev->list, &ap_device_list);
|
|
|
|
- spin_unlock_bh(&ap_device_lock);
|
|
|
|
rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
|
|
rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
|
|
|
|
+ if (!rc) {
|
|
|
|
+ spin_lock_bh(&ap_device_lock);
|
|
|
|
+ list_add(&ap_dev->list, &ap_device_list);
|
|
|
|
+ spin_unlock_bh(&ap_device_lock);
|
|
|
|
+ }
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -532,11 +534,11 @@ static int ap_device_remove(struct device *dev)
|
|
|
|
|
|
ap_flush_queue(ap_dev);
|
|
ap_flush_queue(ap_dev);
|
|
del_timer_sync(&ap_dev->timeout);
|
|
del_timer_sync(&ap_dev->timeout);
|
|
- if (ap_drv->remove)
|
|
|
|
- ap_drv->remove(ap_dev);
|
|
|
|
spin_lock_bh(&ap_device_lock);
|
|
spin_lock_bh(&ap_device_lock);
|
|
list_del_init(&ap_dev->list);
|
|
list_del_init(&ap_dev->list);
|
|
spin_unlock_bh(&ap_device_lock);
|
|
spin_unlock_bh(&ap_device_lock);
|
|
|
|
+ if (ap_drv->remove)
|
|
|
|
+ ap_drv->remove(ap_dev);
|
|
spin_lock_bh(&ap_dev->lock);
|
|
spin_lock_bh(&ap_dev->lock);
|
|
atomic_sub(ap_dev->queue_count, &ap_poll_requests);
|
|
atomic_sub(ap_dev->queue_count, &ap_poll_requests);
|
|
spin_unlock_bh(&ap_dev->lock);
|
|
spin_unlock_bh(&ap_dev->lock);
|