static int timeout = 5000;     /* in msec ( 5 sec ) */
 module_param(timeout, int, 0644);
 
-static struct ps3av ps3av;
+static struct ps3av {
+       int available;
+       struct mutex mutex;
+       struct work_struct work;
+       struct completion done;
+       struct workqueue_struct *wq;
+       int open_count;
+       struct ps3_vuart_port_device *dev;
+
+       int region;
+       struct ps3av_pkt_av_get_hw_conf av_hw_conf;
+       u32 av_port[PS3AV_AV_PORT_MAX + PS3AV_OPT_PORT_MAX];
+       u32 opt_port[PS3AV_OPT_PORT_MAX];
+       u32 head[PS3AV_HEAD_MAX];
+       u32 audio_port;
+       int ps3av_mode;
+       int ps3av_mode_old;
+} ps3av;
 
 static struct ps3_vuart_port_device ps3av_dev = {
        .match_id = PS3_MATCH_ID_AV_SETTINGS
                 struct ps3av_send_hdr *buf)
 {
        int res = 0;
-       union {
+       static union {
                struct ps3av_reply_hdr reply_hdr;
                u8 raw[PS3AV_BUF_SIZE];
        } recv_buf;
 
        BUG_ON(!ps3av.available);
 
-       if (down_interruptible(&ps3av.sem))
-               return -ERESTARTSYS;
+       mutex_lock(&ps3av.mutex);
 
        table = ps3av_search_cmd_table(cid, PS3AV_CID_MASK);
        BUG_ON(!table);
                goto err;
        }
 
-       up(&ps3av.sem);
+       mutex_unlock(&ps3av.mutex);
        return 0;
 
       err:
-       up(&ps3av.sem);
+       mutex_unlock(&ps3av.mutex);
        printk(KERN_ERR "%s: failed cid:%x res:%d\n", __FUNCTION__, cid, res);
        return res;
 }
 
        memset(&ps3av, 0, sizeof(ps3av));
 
-       init_MUTEX(&ps3av.sem);
        mutex_init(&ps3av.mutex);
        ps3av.ps3av_mode = 0;
        ps3av.dev = dev;
 
 #ifndef _ASM_POWERPC_PS3AV_H_
 #define _ASM_POWERPC_PS3AV_H_
 
-#include <linux/mutex.h>
-
 /** command for ioctl() **/
 #define PS3AV_VERSION 0x205    /* version of ps3av command */
 
        u8 buf[PS3AV_PKT_AVB_PARAM_MAX_BUF_SIZE];
 };
 
-struct ps3av {
-       int available;
-       struct semaphore sem;
-       struct work_struct work;
-       struct completion done;
-       struct workqueue_struct *wq;
-       struct mutex mutex;
-       int open_count;
-       struct ps3_vuart_port_device *dev;
-
-       int region;
-       struct ps3av_pkt_av_get_hw_conf av_hw_conf;
-       u32 av_port[PS3AV_AV_PORT_MAX + PS3AV_OPT_PORT_MAX];
-       u32 opt_port[PS3AV_OPT_PORT_MAX];
-       u32 head[PS3AV_HEAD_MAX];
-       u32 audio_port;
-       int ps3av_mode;
-       int ps3av_mode_old;
-};
 
 /** command status **/
 #define PS3AV_STATUS_SUCCESS                   0x0000  /* success */
 extern int ps3av_cmd_video_get_monitor_info(struct ps3av_pkt_av_get_monitor_info *,
                                            u32);
 
+struct ps3_vuart_port_device;
 extern int ps3av_vuart_write(struct ps3_vuart_port_device *dev,
                             const void *buf, unsigned long size);
 extern int ps3av_vuart_read(struct ps3_vuart_port_device *dev, void *buf,