#define NEW_WRITE_LOCKING 1
 #if NEW_WRITE_LOCKING
 #define DECL      /* Nothing */
-#define LOCKIT    down (& port->port_write_sem);
-#define RELEASEIT up (&port->port_write_sem);
+#define LOCKIT    mutex_lock(& port->port_write_mutex);
+#define RELEASEIT mutex_unlock(&port->port_write_mutex);
 #else
 #define DECL      unsigned long flags;
 #define LOCKIT    save_flags (flags);cli ()
        /* get exclusive "write" access to this port (problem 3) */
        /* This is not a spinlock because we can have a disk access (page 
                 fault) in copy_from_user */
-       down (& port->port_write_sem);
+       mutex_lock(& port->port_write_mutex);
 
        while (1) {
 
                c = count;
  
                /* This is safe because we "OWN" the "head". Noone else can 
-                  change the "head": we own the port_write_sem. */
+                  change the "head": we own the port_write_mutex. */
                /* Don't overrun the end of the buffer */
                t = SERIAL_XMIT_SIZE - port->xmit_head;
                if (t < c) c = t;
                count -= c;
                total += c;
        }
-       up (& port->port_write_sem);
+       mutex_unlock(& port->port_write_mutex);
 
        gs_dprintk (GS_DEBUG_WRITE, "write: interrupts are %s\n", 
                    (port->flags & GS_TX_INTEN)?"enabled": "disabled"); 
                c = count;
 
                /* This is safe because we "OWN" the "head". Noone else can 
-                  change the "head": we own the port_write_sem. */
+                  change the "head": we own the port_write_mutex. */
                /* Don't overrun the end of the buffer */
                t = SERIAL_XMIT_SIZE - port->xmit_head;
                if (t < c) c = t;
        spin_lock_irqsave (&port->driver_lock, flags);
        if (port->tty) 
                clear_bit(TTY_IO_ERROR, &port->tty->flags);
-       init_MUTEX(&port->port_write_sem);
+       mutex_init(&port->port_write_mutex);
        port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
        spin_unlock_irqrestore(&port->driver_lock, flags);
        gs_set_termios(port->tty, NULL);
 
 #include <asm/amigahw.h>
 #include <linux/zorro.h>
 #include <asm/irq.h>
-#include <asm/semaphore.h>
+#include <linux/mutex.h>
 
 #include <linux/delay.h>
 
                port->gs.closing_wait = 30 * HZ;
                port->gs.rd = &a2232_real_driver;
 #ifdef NEW_WRITE_LOCKING
-               init_MUTEX(&(port->gs.port_write_sem));
+               init_MUTEX(&(port->gs.port_write_mutex));
 #endif
                init_waitqueue_head(&port->gs.open_wait);
                init_waitqueue_head(&port->gs.close_wait);
 
 #ifndef GENERIC_SERIAL_H
 #define GENERIC_SERIAL_H
 
+#include <linux/mutex.h>
+
 struct real_driver {
   void                    (*disable_tx_interrupts) (void *);
   void                    (*enable_tx_interrupts) (void *);
   int                     xmit_head;
   int                     xmit_tail;
   int                     xmit_cnt;
-  struct semaphore        port_write_sem;
+  struct mutex            port_write_mutex;
   int                     flags;
   wait_queue_head_t       open_wait;
   wait_queue_head_t       close_wait;