*
*/
-#include <linux/mutex.h>
+#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/signal.h>
#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);
static struct usb_driver sisusb_driver;
-DEFINE_MUTEX(disconnect_mutex);
+DECLARE_MUTEX(disconnect_sem);
static void
sisusb_free_buffers(struct sisusb_usb_data *sisusb)
}
#endif
+#ifndef INCL_SISUSB_CON
+static
+#endif
int
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)
{
return ret;
}
+#ifndef INCL_SISUSB_CON
+static
+#endif
int
sisusb_setidxregandor(struct sisusb_usb_data *sisusb, int port, u8 idx,
u8 myand, u8 myor)
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)
{
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)
{
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)
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",
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",
file->private_data = sisusb;
- mutex_unlock(&sisusb->lock);
+ up(&sisusb->lock);
- mutex_unlock(&disconnect_mutex);
+ up(&disconnect_sem);
return 0;
}
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 */
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;
}
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;
}
(*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + 0x5c) {
if (count != 4) {
- mutex_unlock(&sisusb->lock);
+ up(&sisusb->lock);
return -EINVAL;
}
(*ppos) += bytes_read;
- mutex_unlock(&sisusb->lock);
+ up(&sisusb->lock);
return errno ? errno : bytes_read;
}
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;
}
(*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + SISUSB_PCI_PCONFSIZE) {
if (count != 4) {
- mutex_unlock(&sisusb->lock);
+ up(&sisusb->lock);
return -EINVAL;
}
(*ppos) += bytes_written;
- mutex_unlock(&sisusb->lock);
+ up(&sisusb->lock);
return errno ? errno : bytes_written;
}
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;
}
ret = -EINVAL;
}
- mutex_unlock(&sisusb->lock);
+ up(&sisusb->lock);
return ret;
}
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) {
}
err_out:
- mutex_unlock(&sisusb->lock);
+ up(&sisusb->lock);
return retval;
}
}
kref_init(&sisusb->kref);
- mutex_init(&(sisusb->lock));
+ init_MUTEX(&(sisusb->lock));
/* Register device */
if ((retval = usb_register_dev(intf, &usb_sisusb_class))) {
* 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))
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) },
{ }