linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / usb / misc / sisusbvga / sisusb.c
index a1d78ca..3260d59 100644 (file)
@@ -36,7 +36,7 @@
  *
  */
 
-#include <linux/mutex.h>
+#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/signal.h>
@@ -52,7 +52,6 @@
 #include <linux/vmalloc.h>
 
 #include "sisusb.h"
-#include "sisusb_init.h"
 
 #ifdef INCL_SISUSB_CON
 #include <linux/font.h>
 /* Forward declarations / clean-up routines */
 
 #ifdef INCL_SISUSB_CON
+int    sisusb_setreg(struct sisusb_usb_data *sisusb, int port, u8 data);
+int    sisusb_getreg(struct sisusb_usb_data *sisusb, int port, u8 *data);
+int    sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data);
+int    sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data);
+int    sisusb_setidxregandor(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand, u8 myor);
+int    sisusb_setidxregor(struct sisusb_usb_data *sisusb, int port, u8 index, u8 myor);
+int    sisusb_setidxregand(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand);
+
+int    sisusb_writeb(struct sisusb_usb_data *sisusb, u32 adr, u8 data);
+int    sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data);
+int    sisusb_writew(struct sisusb_usb_data *sisusb, u32 adr, u16 data);
+int    sisusb_readw(struct sisusb_usb_data *sisusb, u32 adr, u16 *data);
+int    sisusb_copy_memory(struct sisusb_usb_data *sisusb, char *src,
+                       u32 dest, int length, size_t *bytes_written);
+
+int    sisusb_reset_text_mode(struct sisusb_usb_data *sisusb, int init);
+
+extern int  SiSUSBSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo);
+extern int  SiSUSBSetVESAMode(struct SiS_Private *SiS_Pr, unsigned short VModeNo);
+
+extern void sisusb_init_concode(void);
+extern int  sisusb_console_init(struct sisusb_usb_data *sisusb, int first, int last);
+extern void sisusb_console_exit(struct sisusb_usb_data *sisusb);
+
+extern void sisusb_set_cursor(struct sisusb_usb_data *sisusb, unsigned int location);
+
+extern int  sisusbcon_do_font_op(struct sisusb_usb_data *sisusb, int set, int slot,
+               u8 *arg, int cmapsz, int ch512, int dorecalc,
+               struct vc_data *c, int fh, int uplock);
+
 static int sisusb_first_vc = 0;
 static int sisusb_last_vc = 0;
 module_param_named(first, sisusb_first_vc, int, 0);
@@ -73,7 +102,7 @@ MODULE_PARM_DESC(last, "Number of last console to take over (1 - MAX_NR_CONSOLES
 
 static struct usb_driver sisusb_driver;
 
-DEFINE_MUTEX(disconnect_mutex);
+DECLARE_MUTEX(disconnect_sem);
 
 static void
 sisusb_free_buffers(struct sisusb_usb_data *sisusb)
@@ -1330,6 +1359,9 @@ sisusb_getreg(struct sisusb_usb_data *sisusb, int port, u8 *data)
 }
 #endif
 
+#ifndef INCL_SISUSB_CON
+static
+#endif
 int
 sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data)
 {
@@ -1339,6 +1371,9 @@ sisusb_setidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 data)
        return ret;
 }
 
+#ifndef INCL_SISUSB_CON
+static
+#endif
 int
 sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data)
 {
@@ -1348,6 +1383,9 @@ sisusb_getidxreg(struct sisusb_usb_data *sisusb, int port, u8 index, u8 *data)
        return ret;
 }
 
+#ifndef INCL_SISUSB_CON
+static
+#endif
 int
 sisusb_setidxregandor(struct sisusb_usb_data *sisusb, int port, u8 idx,
                                                        u8 myand, u8 myor)
@@ -1377,12 +1415,18 @@ sisusb_setidxregmask(struct sisusb_usb_data *sisusb, int port, u8 idx,
        return ret;
 }
 
+#ifndef INCL_SISUSB_CON
+static
+#endif
 int
 sisusb_setidxregor(struct sisusb_usb_data *sisusb, int port, u8 index, u8 myor)
 {
        return(sisusb_setidxregandor(sisusb, port, index, 0xff, myor));
 }
 
+#ifndef INCL_SISUSB_CON
+static
+#endif
 int
 sisusb_setidxregand(struct sisusb_usb_data *sisusb, int port, u8 idx, u8 myand)
 {
@@ -1404,8 +1448,6 @@ sisusb_readb(struct sisusb_usb_data *sisusb, u32 adr, u8 *data)
        return(sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, adr, data));
 }
 
-#if 0
-
 int
 sisusb_writew(struct sisusb_usb_data *sisusb, u32 adr, u16 data)
 {
@@ -1418,8 +1460,6 @@ sisusb_readw(struct sisusb_usb_data *sisusb, u32 adr, u16 *data)
        return(sisusb_read_memio_word(sisusb, SISUSB_TYPE_MEM, adr, data));
 }
 
-#endif  /*  0  */
-
 int
 sisusb_copy_memory(struct sisusb_usb_data *sisusb, char *src,
                        u32 dest, int length, size_t *bytes_written)
@@ -2512,39 +2552,39 @@ sisusb_open(struct inode *inode, struct file *file)
        struct usb_interface *interface;
        int subminor = iminor(inode);
 
-       mutex_lock(&disconnect_mutex);
+       down(&disconnect_sem);
 
        if (!(interface = usb_find_interface(&sisusb_driver, subminor))) {
                printk(KERN_ERR "sisusb[%d]: Failed to find interface\n",
                                subminor);
-               mutex_unlock(&disconnect_mutex);
+               up(&disconnect_sem);
                return -ENODEV;
        }
 
        if (!(sisusb = usb_get_intfdata(interface))) {
-               mutex_unlock(&disconnect_mutex);
+               up(&disconnect_sem);
                return -ENODEV;
        }
 
-       mutex_lock(&sisusb->lock);
+       down(&sisusb->lock);
 
        if (!sisusb->present || !sisusb->ready) {
-               mutex_unlock(&sisusb->lock);
-               mutex_unlock(&disconnect_mutex);
+               up(&sisusb->lock);
+               up(&disconnect_sem);
                return -ENODEV;
        }
 
        if (sisusb->isopen) {
-               mutex_unlock(&sisusb->lock);
-               mutex_unlock(&disconnect_mutex);
+               up(&sisusb->lock);
+               up(&disconnect_sem);
                return -EBUSY;
        }
 
        if (!sisusb->devinit) {
                if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH) {
                        if (sisusb_init_gfxdevice(sisusb, 0)) {
-                               mutex_unlock(&sisusb->lock);
-                               mutex_unlock(&disconnect_mutex);
+                               up(&sisusb->lock);
+                               up(&disconnect_sem);
                                printk(KERN_ERR
                                        "sisusbvga[%d]: Failed to initialize "
                                        "device\n",
@@ -2552,8 +2592,8 @@ sisusb_open(struct inode *inode, struct file *file)
                                return -EIO;
                        }
                } else {
-                       mutex_unlock(&sisusb->lock);
-                       mutex_unlock(&disconnect_mutex);
+                       up(&sisusb->lock);
+                       up(&disconnect_sem);
                        printk(KERN_ERR
                                "sisusbvga[%d]: Device not attached to "
                                "USB 2.0 hub\n",
@@ -2569,9 +2609,9 @@ sisusb_open(struct inode *inode, struct file *file)
 
        file->private_data = sisusb;
 
-       mutex_unlock(&sisusb->lock);
+       up(&sisusb->lock);
 
-       mutex_unlock(&disconnect_mutex);
+       up(&disconnect_sem);
 
        return 0;
 }
@@ -2602,14 +2642,14 @@ sisusb_release(struct inode *inode, struct file *file)
        struct sisusb_usb_data *sisusb;
        int myminor;
 
-       mutex_lock(&disconnect_mutex);
+       down(&disconnect_sem);
 
        if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) {
-               mutex_unlock(&disconnect_mutex);
+               up(&disconnect_sem);
                return -ENODEV;
        }
 
-       mutex_lock(&sisusb->lock);
+       down(&sisusb->lock);
 
        if (sisusb->present) {
                /* Wait for all URBs to finish if device still present */
@@ -2622,12 +2662,12 @@ sisusb_release(struct inode *inode, struct file *file)
        sisusb->isopen = 0;
        file->private_data = NULL;
 
-       mutex_unlock(&sisusb->lock);
+       up(&sisusb->lock);
 
        /* decrement the usage count on our device */
        kref_put(&sisusb->kref, sisusb_delete);
 
-       mutex_unlock(&disconnect_mutex);
+       up(&disconnect_sem);
 
        return 0;
 }
@@ -2645,11 +2685,11 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
        if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
                return -ENODEV;
 
-       mutex_lock(&sisusb->lock);
+       down(&sisusb->lock);
 
        /* Sanity check */
        if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
-               mutex_unlock(&sisusb->lock);
+               up(&sisusb->lock);
                return -ENODEV;
        }
 
@@ -2744,7 +2784,7 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
                    (*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + 0x5c) {
 
                if (count != 4) {
-                       mutex_unlock(&sisusb->lock);
+                       up(&sisusb->lock);
                        return -EINVAL;
                }
 
@@ -2768,7 +2808,7 @@ sisusb_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
 
        (*ppos) += bytes_read;
 
-       mutex_unlock(&sisusb->lock);
+       up(&sisusb->lock);
 
        return errno ? errno : bytes_read;
 }
@@ -2787,11 +2827,11 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count,
        if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
                return -ENODEV;
 
-       mutex_lock(&sisusb->lock);
+       down(&sisusb->lock);
 
        /* Sanity check */
        if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
-               mutex_unlock(&sisusb->lock);
+               up(&sisusb->lock);
                return -ENODEV;
        }
 
@@ -2890,7 +2930,7 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count,
                    (*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + SISUSB_PCI_PCONFSIZE) {
 
                if (count != 4) {
-                       mutex_unlock(&sisusb->lock);
+                       up(&sisusb->lock);
                        return -EINVAL;
                }
 
@@ -2916,7 +2956,7 @@ sisusb_write(struct file *file, const char __user *buffer, size_t count,
 
        (*ppos) += bytes_written;
 
-       mutex_unlock(&sisusb->lock);
+       up(&sisusb->lock);
 
        return errno ? errno : bytes_written;
 }
@@ -2930,11 +2970,11 @@ sisusb_lseek(struct file *file, loff_t offset, int orig)
        if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
                return -ENODEV;
 
-       mutex_lock(&sisusb->lock);
+       down(&sisusb->lock);
 
        /* Sanity check */
        if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
-               mutex_unlock(&sisusb->lock);
+               up(&sisusb->lock);
                return -ENODEV;
        }
 
@@ -2954,7 +2994,7 @@ sisusb_lseek(struct file *file, loff_t offset, int orig)
                        ret = -EINVAL;
        }
 
-       mutex_unlock(&sisusb->lock);
+       up(&sisusb->lock);
        return ret;
 }
 
@@ -3096,7 +3136,7 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
        if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
                return -ENODEV;
 
-       mutex_lock(&sisusb->lock);
+       down(&sisusb->lock);
 
        /* Sanity check */
        if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
@@ -3148,12 +3188,12 @@ sisusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                        break;
 
                default:
-                       retval = -ENOTTY;
+                       retval = -EINVAL;
                        break;
        }
 
 err_out:
-       mutex_unlock(&sisusb->lock);
+       up(&sisusb->lock);
        return retval;
 }
 
@@ -3211,14 +3251,15 @@ static int sisusb_probe(struct usb_interface *intf,
                dev->devnum);
 
        /* Allocate memory for our private */
-       if (!(sisusb = kzalloc(sizeof(*sisusb), GFP_KERNEL))) {
+       if (!(sisusb = kmalloc(sizeof(*sisusb), GFP_KERNEL))) {
                printk(KERN_ERR
                        "sisusb: Failed to allocate memory for private data\n");
                return -ENOMEM;
        }
+       memset(sisusb, 0, sizeof(*sisusb));
        kref_init(&sisusb->kref);
 
-       mutex_init(&(sisusb->lock));
+       init_MUTEX(&(sisusb->lock));
 
        /* Register device */
        if ((retval = usb_register_dev(intf, &usb_sisusb_class))) {
@@ -3389,9 +3430,9 @@ static void sisusb_disconnect(struct usb_interface *intf)
         * protect all other routines from the disconnect
         * case, not the other way round.
         */
-       mutex_lock(&disconnect_mutex);
+       down(&disconnect_sem);
 
-       mutex_lock(&sisusb->lock);
+       down(&sisusb->lock);
 
        /* Wait for all URBs to complete and kill them in case (MUST do) */
        if (!sisusb_wait_all_out_complete(sisusb))
@@ -3422,20 +3463,18 @@ static void sisusb_disconnect(struct usb_interface *intf)
        sisusb->present = 0;
        sisusb->ready = 0;
 
-       mutex_unlock(&sisusb->lock);
+       up(&sisusb->lock);
 
        /* decrement our usage count */
        kref_put(&sisusb->kref, sisusb_delete);
 
-       mutex_unlock(&disconnect_mutex);
+       up(&disconnect_sem);
 
        printk(KERN_INFO "sisusbvga[%d]: Disconnected\n", minor);
 }
 
 static struct usb_device_id sisusb_table [] = {
        { USB_DEVICE(0x0711, 0x0900) },
-       { USB_DEVICE(0x0711, 0x0901) },
-       { USB_DEVICE(0x0711, 0x0902) },
        { USB_DEVICE(0x182d, 0x021c) },
        { USB_DEVICE(0x182d, 0x0269) },
        { }