*/
#include <linux/config.h>
+#include <linux/mutex.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/signal.h>
static struct usb_driver sisusb_driver;
-DECLARE_MUTEX(disconnect_sem);
+DEFINE_MUTEX(disconnect_mutex);
static void
sisusb_free_buffers(struct sisusb_usb_data *sisusb)
struct usb_interface *interface;
int subminor = iminor(inode);
- down(&disconnect_sem);
+ mutex_lock(&disconnect_mutex);
if (!(interface = usb_find_interface(&sisusb_driver, subminor))) {
printk(KERN_ERR "sisusb[%d]: Failed to find interface\n",
subminor);
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
return -ENODEV;
}
if (!(sisusb = usb_get_intfdata(interface))) {
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
return -ENODEV;
}
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
if (!sisusb->present || !sisusb->ready) {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
return -ENODEV;
}
if (sisusb->isopen) {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
return -EBUSY;
}
if (!sisusb->devinit) {
if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH) {
if (sisusb_init_gfxdevice(sisusb, 0)) {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
printk(KERN_ERR
"sisusbvga[%d]: Failed to initialize "
"device\n",
return -EIO;
}
} else {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
printk(KERN_ERR
"sisusbvga[%d]: Device not attached to "
"USB 2.0 hub\n",
file->private_data = sisusb;
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
return 0;
}
struct sisusb_usb_data *sisusb;
int myminor;
- down(&disconnect_sem);
+ mutex_lock(&disconnect_mutex);
if (!(sisusb = (struct sisusb_usb_data *)file->private_data)) {
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
return -ENODEV;
}
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
if (sisusb->present) {
/* Wait for all URBs to finish if device still present */
sisusb->isopen = 0;
file->private_data = NULL;
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
/* decrement the usage count on our device */
kref_put(&sisusb->kref, sisusb_delete);
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
return 0;
}
if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
return -ENODEV;
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
/* Sanity check */
if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -ENODEV;
}
(*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + 0x5c) {
if (count != 4) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -EINVAL;
}
(*ppos) += bytes_read;
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return errno ? errno : bytes_read;
}
if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
return -ENODEV;
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
/* Sanity check */
if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -ENODEV;
}
(*ppos) <= SISUSB_PCI_PSEUDO_PCIBASE + SISUSB_PCI_PCONFSIZE) {
if (count != 4) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -EINVAL;
}
(*ppos) += bytes_written;
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return errno ? errno : bytes_written;
}
if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
return -ENODEV;
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
/* Sanity check */
if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -ENODEV;
}
ret = -EINVAL;
}
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return ret;
}
if (!(sisusb = (struct sisusb_usb_data *)file->private_data))
return -ENODEV;
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
/* Sanity check */
if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
}
err_out:
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return retval;
}
}
kref_init(&sisusb->kref);
- init_MUTEX(&(sisusb->lock));
+ mutex_init(&(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.
*/
- down(&disconnect_sem);
+ mutex_lock(&disconnect_mutex);
- down(&sisusb->lock);
+ mutex_lock(&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;
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
/* decrement our usage count */
kref_put(&sisusb->kref, sisusb_delete);
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
printk(KERN_INFO "sisusbvga[%d]: Disconnected\n", minor);
}
*/
#include <linux/config.h>
+#include <linux/mutex.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/signal.h>
/* Forward declaration */
static const struct consw sisusb_con;
-extern struct semaphore disconnect_sem;
+extern struct mutex disconnect_mutex;
static inline void
sisusbcon_memsetw(u16 *s, u16 c, unsigned int count)
if (!(sisusb = sisusb_get_sisusb(console)))
return NULL;
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
if (!sisusb_sisusb_valid(sisusb) ||
!sisusb->havethisconsole[console]) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return NULL;
}
* are set up/restored.
*/
- down(&disconnect_sem);
+ mutex_lock(&disconnect_mutex);
if (!(sisusb = sisusb_get_sisusb(c->vc_num))) {
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
return;
}
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
if (!sisusb_sisusb_valid(sisusb)) {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
return;
}
if (!*c->vc_uni_pagedir_loc)
con_set_default_unimap(c);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
if (init) {
c->vc_cols = cols;
* and others, ie not under our control.
*/
- down(&disconnect_sem);
+ mutex_lock(&disconnect_mutex);
if (!(sisusb = sisusb_get_sisusb(c->vc_num))) {
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
return;
}
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
/* Clear ourselves in mysisusbs */
mysisusbs[c->vc_num] = NULL;
}
}
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
/* decrement the usage count on our sisusb */
kref_put(&sisusb->kref, sisusb_delete);
- up(&disconnect_sem);
+ mutex_unlock(&disconnect_mutex);
}
/* interface routine */
#endif
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return;
}
sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y),
(u32)SISUSB_HADDR(x, y), 2, &written);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
}
/* Interface routine */
sisusbcon_writew(sisusbcon_readw(s++), dest++);
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return;
}
sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(x, y),
(u32)SISUSB_HADDR(x, y), count * 2, &written);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
}
/* Interface routine */
}
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return;
}
sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(x, y),
(u32)SISUSB_HADDR(x, y), length, &written);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
}
/* Interface routine */
#endif
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return;
}
sisusb_copy_memory(sisusb, (unsigned char *)SISUSB_VADDR(dx, dy),
(u32)SISUSB_HADDR(dx, dy), length, &written);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
}
/* interface routine */
/* Don't write to screen if in gfx mode */
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 0;
}
* as origin.
*/
if (c->vc_origin == (unsigned long)c->vc_screenbuf) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
printk(KERN_DEBUG "sisusb: ASSERT ORIGIN != SCREENBUF!\n");
return 0;
}
(u32)SISUSB_HADDR(0, 0),
length, &written);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 0;
}
/* sisusb->lock is down */
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return;
}
sisusbcon_memcpyw((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin,
length);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
}
/* interface routine */
/* sisusb->lock is down */
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -EINVAL;
}
break;
}
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 0;
}
sisusb->is_gfx = blank ? 1 : 0;
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 0;
}
cr63 = 0x40;
break;
default:
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -EINVAL;
}
}
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return ret;
}
/* sisusb->lock is down */
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 0;
}
sisusbcon_set_start_address(sisusb, c);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 1;
}
/* sisusb->lock is down */
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return;
}
if (mode == CM_ERASE) {
sisusb_setidxregor(sisusb, SISCR, 0x0a, 0x20);
sisusb->sisusb_cursor_size_to = -1;
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return;
}
sisusb->sisusb_cursor_size_to = to;
}
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
}
static int
sisusb_copy_memory(sisusb, (char *)SISUSB_VADDR(0, t),
(u32)SISUSB_HADDR(0, t), length, &written);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 1;
}
/* sisusb->lock is down */
if (sisusb_is_inactive(c, sisusb)) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 0;
}
c->vc_pos = c->vc_pos - oldorigin + c->vc_origin;
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 1;
}
/* sisusb->lock is down */
if (sisusb_is_inactive(c, sisusb) || sisusb->con_blanked) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 0;
}
sisusb->con_rolled_over = 0;
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 1;
}
fh = sisusb->current_font_height;
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
/* We are quite unflexible as regards resizing. The vt code
* handles sizes where the line length isn't equal the pitch
if ((slot != 0 && slot != 2) || !fh) {
if (uplock)
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -EINVAL;
}
}
if (uplock)
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
if (dorecalc && c) {
int i, rows = c->vc_scan_lines / fh;
font_op_error:
if (uplock)
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -EIO;
}
font->charcount = 256;
if (!font->data) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 0;
}
if (!sisusb->font_backup) {
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return -ENODEV;
}
/* Copy 256 chars only, like vgacon */
memcpy(font->data, sisusb->font_backup, 256 * 32);
- up(&sisusb->lock);
+ mutex_unlock(&sisusb->lock);
return 0;
}
{
int i, ret, minor = sisusb->minor;
- down(&disconnect_sem);
+ mutex_lock(&disconnect_mutex);
- down(&sisusb->lock);
+ mutex_lock(&sisusb->lock);
/* Erm.. that should not happen */
if (sisusb->haveconsole || !sisusb->SiS_Pr) {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
return 1;
}
if (first > last ||
first > MAX_NR_CONSOLES ||
last > MAX_NR_CONSOLES) {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
return 1;
}
/* If gfxcore not initialized or no consoles given, quit graciously */
if (!sisusb->gfxinit || first < 1 || last < 1) {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
return 0;
}
/* Set up text mode (and upload default font) */
if (sisusb_reset_text_mode(sisusb, 1)) {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
printk(KERN_ERR
"sisusbvga[%d]: Failed to set up text mode\n",
minor);
/* Allocate screen buffer */
if (!(sisusb->scrbuf = (unsigned long)vmalloc(sisusb->scrbuf_size))) {
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
printk(KERN_ERR
"sisusbvga[%d]: Failed to allocate screen buffer\n",
minor);
return 1;
}
- up(&sisusb->lock);
- up(&disconnect_sem);
+ mutex_unlock(&sisusb->lock);
+ mutex_unlock(&disconnect_mutex);
/* Now grab the desired console(s) */
ret = take_over_console(&sisusb_con, first - 1, last - 1, 0);