/* Structure to hold all of our device specific stuff */
 struct lego_usb_tower {
-       struct semaphore        sem;            /* locks this structure */
+       struct mutex            lock;           /* locks this structure */
        struct usb_device*      udev;           /* save off the usb device pointer */
        unsigned char           minor;          /* the starting minor number for this device */
 
        }
 
        /* lock this device */
-       if (down_interruptible (&dev->sem)) {
+       if (mutex_lock_interruptible(&dev->lock)) {
                mutex_unlock(&open_disc_mutex);
                retval = -ERESTARTSYS;
                goto exit;
        file->private_data = dev;
 
 unlock_exit:
-       up (&dev->sem);
+       mutex_unlock(&dev->lock);
 
 exit:
        dbg(2, "%s: leave, return value %d ", __FUNCTION__, retval);
        }
 
        mutex_lock(&open_disc_mutex);
-       if (down_interruptible (&dev->sem)) {
+       if (mutex_lock_interruptible(&dev->lock)) {
                retval = -ERESTARTSYS;
                goto exit;
        }
        }
        if (dev->udev == NULL) {
                /* the device was unplugged before the file was released */
-               up (&dev->sem); /* unlock here as tower_delete frees dev */
+
+               /* unlock here as tower_delete frees dev */
+               mutex_unlock(&dev->lock);
                tower_delete (dev);
                goto exit;
        }
        dev->open_count = 0;
 
 unlock_exit:
-       up (&dev->sem);
+       mutex_unlock(&dev->lock);
 
 exit:
        mutex_unlock(&open_disc_mutex);
        dev = (struct lego_usb_tower *)file->private_data;
 
        /* lock this object */
-       if (down_interruptible (&dev->sem)) {
+       if (mutex_lock_interruptible(&dev->lock)) {
                retval = -ERESTARTSYS;
                goto exit;
        }
 
 unlock_exit:
        /* unlock the device */
-       up (&dev->sem);
+       mutex_unlock(&dev->lock);
 
 exit:
        dbg(2, "%s: leave, return value %d", __FUNCTION__, retval);
        dev = (struct lego_usb_tower *)file->private_data;
 
        /* lock this object */
-       if (down_interruptible (&dev->sem)) {
+       if (mutex_lock_interruptible(&dev->lock)) {
                retval = -ERESTARTSYS;
                goto exit;
        }
 
 unlock_exit:
        /* unlock the device */
-       up (&dev->sem);
+       mutex_unlock(&dev->lock);
 
 exit:
        dbg(2, "%s: leave, return value %d", __FUNCTION__, retval);
                goto exit;
        }
 
-       init_MUTEX (&dev->sem);
+       mutex_init(&dev->lock);
 
        dev->udev = udev;
        dev->open_count = 0;
        /* give back our minor */
        usb_deregister_dev (interface, &tower_class);
 
-       down (&dev->sem);
+       mutex_lock(&dev->lock);
        mutex_unlock(&open_disc_mutex);
 
        /* if the device is not opened, then we clean up right now */
        if (!dev->open_count) {
-               up (&dev->sem);
+               mutex_unlock(&dev->lock);
                tower_delete (dev);
        } else {
                dev->udev = NULL;
-               up (&dev->sem);
+               mutex_unlock(&dev->lock);
        }
 
        info("LEGO USB Tower #%d now disconnected", (minor - LEGO_USB_TOWER_MINOR_BASE));