int ret = 0;
        int i;
        unsigned submit_size;
+       unsigned long flags;
 
-       mutex_lock(&dev_priv->mutex_2d);
+       spin_lock_irqsave(&dev_priv->lock_2d, flags);
        while (size > 0) {
                submit_size = (size < 0x60) ? size : 0x60;
                size -= submit_size;
 
                (void)PSB_RSGX32(PSB_SGX_2D_SLAVE_PORT + i - 4);
        }
-       mutex_unlock(&dev_priv->mutex_2d);
+       spin_unlock_irqrestore(&dev_priv->lock_2d, flags);
        return ret;
 }
 
        struct drm_psb_private *dev_priv = dev->dev_private;
        unsigned long _end = jiffies + DRM_HZ;
        int busy = 0;
+       unsigned long flags;
 
-       mutex_lock(&dev_priv->mutex_2d);
+       spin_lock_irqsave(&dev_priv->lock_2d, flags);
        /*
         * First idle the 2D engine.
         */
                                        _PSB_C2B_STATUS_BUSY) != 0);
 
 out:
-       mutex_unlock(&dev_priv->mutex_2d);
+       spin_unlock_irqrestore(&dev_priv->lock_2d, flags);
        return (busy) ? -EBUSY : 0;
 }
 
 
 
        spin_lock_init(&dev_priv->irqmask_lock);
-       mutex_init(&dev_priv->mutex_2d);
+       spin_lock_init(&dev_priv->lock_2d);
 
        PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK0);
        PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK1);