static void ccw_device_unregister(struct ccw_device *cdev)
 {
+       mutex_lock(&cdev->reg_mutex);
        if (device_is_registered(&cdev->dev)) {
                /* Undo device_add(). */
                device_del(&cdev->dev);
        }
+       mutex_unlock(&cdev->reg_mutex);
+
        if (cdev->private->flags.initialized) {
                cdev->private->flags.initialized = 0;
                /* Release reference from device_initialize(). */
 {
        int ret;
 
+       mutex_lock(&cdev->reg_mutex);
        if (device_is_registered(&cdev->dev)) {
                device_release_driver(&cdev->dev);
                ret = device_attach(&cdev->dev);
                WARN_ON(ret == -ENODEV);
        }
+       mutex_unlock(&cdev->reg_mutex);
 }
 
 static void
        INIT_LIST_HEAD(&priv->cmb_list);
        init_waitqueue_head(&priv->wait_q);
        timer_setup(&priv->timer, ccw_device_timeout, 0);
+       mutex_init(&cdev->reg_mutex);
 
        atomic_set(&priv->onoff, 0);
        cdev->ccwlock = sch->lock;
         * be registered). We need to reprobe since we may now have sense id
         * information.
         */
+       mutex_lock(&cdev->reg_mutex);
        if (device_is_registered(&cdev->dev)) {
                if (!cdev->drv) {
                        ret = device_reprobe(&cdev->dev);
                spin_lock_irqsave(sch->lock, flags);
                sch_set_cdev(sch, NULL);
                spin_unlock_irqrestore(sch->lock, flags);
+               mutex_unlock(&cdev->reg_mutex);
                /* Release initial device reference. */
                put_device(&cdev->dev);
                goto out_err;
        }
 out:
        cdev->private->flags.recog_done = 1;
+       mutex_unlock(&cdev->reg_mutex);
        wake_up(&cdev->private->wait_q);
 out_err:
        if (adjust_init_count && atomic_dec_and_test(&ccw_device_init_count))