summaryrefslogtreecommitdiff
path: root/drivers/usb/misc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2022-12-16 03:22:53 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2022-12-16 03:22:53 -0800
commit58bcac11fd94f950abc7b8466c5ceac7be07a00e (patch)
tree69ccedd64b1aab0f387d303376593bc2c1aa7032 /drivers/usb/misc
parent84e57d292203a45c96dbcb2e6be9dd80961d981a (diff)
parent81c25247a2a03a0f97e4805d7aff7541ccff6baa (diff)
downloadlinux-58bcac11fd94f950abc7b8466c5ceac7be07a00e.tar.gz
linux-58bcac11fd94f950abc7b8466c5ceac7be07a00e.tar.bz2
linux-58bcac11fd94f950abc7b8466c5ceac7be07a00e.zip
Merge tag 'usb-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB and Thunderbolt driver updates from Greg KH: "Here is the large set of USB and Thunderbolt driver changes for 6.2-rc1. Overall, thanks to the removal of a driver, more lines were removed than added, a nice change. Highlights include: - removal of the sisusbvga driver that was not used by anyone anymore - minor thunderbolt driver changes and tweaks - chipidea driver updates - usual set of typec driver features and hardware support added - musb minor driver fixes - fotg210 driver fixes, bringing that hardware back from the "dead" - minor dwc3 driver updates - addition, and then removal, of a list.h helper function for many USB and other subsystem drivers, that ended up breaking the build. That will come back for 6.3-rc1, it missed this merge window. - usual xhci updates and enhancements - usb-serial driver updates and support for new devices - other minor USB driver updates All of these have been in linux-next for a while with no reported problems" * tag 'usb-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (153 commits) usb: gadget: uvc: Rename bmInterfaceFlags -> bmInterlaceFlags usb: dwc2: power on/off phy for peripheral mode in dual-role mode usb: dwc2: disable lpm feature on Rockchip SoCs dt-bindings: usb: mtk-xhci: add support for mt7986 usb: dwc3: core: defer probe on ulpi_read_id timeout usb: ulpi: defer ulpi_register on ulpi_read_id timeout usb: misc: onboard_usb_hub: add Genesys Logic GL850G hub support dt-bindings: usb: Add binding for Genesys Logic GL850G hub controller dt-bindings: vendor-prefixes: add Genesys Logic usb: fotg210-udc: fix potential memory leak in fotg210_udc_probe() usb: typec: tipd: Set mode of operation for USB Type-C connector usb: gadget: udc: drop obsolete dependencies on COMPILE_TEST usb: musb: remove extra check in musb_gadget_vbus_draw usb: gadget: uvc: Prevent buffer overflow in setup handler usb: dwc3: qcom: Fix memory leak in dwc3_qcom_interconnect_init usb: typec: wusb3801: fix fwnode refcount leak in wusb3801_probe() usb: storage: Add check for kcalloc USB: sisusbvga: use module_usb_driver() USB: sisusbvga: rename sisusb.c to sisusbvga.c USB: sisusbvga: remove console support ...
Diffstat (limited to 'drivers/usb/misc')
-rw-r--r--drivers/usb/misc/Kconfig2
-rw-r--r--drivers/usb/misc/ftdi-elan.c4
-rw-r--r--drivers/usb/misc/onboard_usb_hub.c2
-rw-r--r--drivers/usb/misc/onboard_usb_hub.h5
-rw-r--r--drivers/usb/misc/sisusbvga/Kconfig34
-rw-r--r--drivers/usb/misc/sisusbvga/Makefile3
-rw-r--r--drivers/usb/misc/sisusbvga/sisusb.h21
-rw-r--r--drivers/usb/misc/sisusbvga/sisusb_con.c1496
-rw-r--r--drivers/usb/misc/sisusbvga/sisusb_init.c955
-rw-r--r--drivers/usb/misc/sisusbvga/sisusb_init.h180
-rw-r--r--drivers/usb/misc/sisusbvga/sisusbvga.c (renamed from drivers/usb/misc/sisusbvga/sisusb.c)289
-rw-r--r--drivers/usb/misc/usb251xb.c5
-rw-r--r--drivers/usb/misc/usb3503.c5
-rw-r--r--drivers/usb/misc/usb4604.c5
14 files changed, 21 insertions, 2985 deletions
diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig
index 9367c12c7e6f..a5f7652db7da 100644
--- a/drivers/usb/misc/Kconfig
+++ b/drivers/usb/misc/Kconfig
@@ -298,7 +298,7 @@ config BRCM_USB_PINMAP
config USB_ONBOARD_HUB
tristate "Onboard USB hub support"
- depends on OF || COMPILE_TEST
+ depends on OF
help
Say Y here if you want to support discrete onboard USB hubs that
don't require an additional control bus for initialization, but
diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
index b2f980409d0b..8ce191e3a4c0 100644
--- a/drivers/usb/misc/ftdi-elan.c
+++ b/drivers/usb/misc/ftdi-elan.c
@@ -1624,7 +1624,6 @@ wait:if (ftdi->disconnected > 0) {
char data[30 *3 + 4];
char *d = data;
int m = (sizeof(data) - 1) / 3 - 1;
- int l = 0;
struct u132_target *target = &ftdi->target[ed];
struct u132_command *command = &ftdi->command[
COMMAND_MASK & ftdi->command_next];
@@ -1647,7 +1646,6 @@ wait:if (ftdi->disconnected > 0) {
} else if (i++ < m) {
int w = sprintf(d, " %02X", *b++);
d += w;
- l += w;
} else
d += sprintf(d, " ..");
}
@@ -1956,7 +1954,6 @@ static int ftdi_elan_synchronize(struct usb_ftdi *ftdi)
int long_stop = 10;
int retry_on_timeout = 5;
int retry_on_empty = 10;
- int err_count = 0;
retval = ftdi_elan_flush_input_fifo(ftdi);
if (retval)
return retval;
@@ -2051,7 +2048,6 @@ static int ftdi_elan_synchronize(struct usb_ftdi *ftdi)
continue;
}
} else {
- err_count += 1;
dev_err(&ftdi->udev->dev, "error = %d\n",
retval);
if (read_stop-- > 0) {
diff --git a/drivers/usb/misc/onboard_usb_hub.c b/drivers/usb/misc/onboard_usb_hub.c
index d63c63942af1..94e7966e199d 100644
--- a/drivers/usb/misc/onboard_usb_hub.c
+++ b/drivers/usb/misc/onboard_usb_hub.c
@@ -331,6 +331,7 @@ static struct platform_driver onboard_hub_driver = {
/************************** USB driver **************************/
+#define VENDOR_ID_GENESYS 0x05e3
#define VENDOR_ID_MICROCHIP 0x0424
#define VENDOR_ID_REALTEK 0x0bda
#define VENDOR_ID_TI 0x0451
@@ -407,6 +408,7 @@ static void onboard_hub_usbdev_disconnect(struct usb_device *udev)
}
static const struct usb_device_id onboard_hub_id_table[] = {
+ { USB_DEVICE(VENDOR_ID_GENESYS, 0x0608) }, /* Genesys Logic GL850G USB 2.0 */
{ USB_DEVICE(VENDOR_ID_MICROCHIP, 0x2514) }, /* USB2514B USB 2.0 */
{ USB_DEVICE(VENDOR_ID_REALTEK, 0x0411) }, /* RTS5411 USB 3.1 */
{ USB_DEVICE(VENDOR_ID_REALTEK, 0x5411) }, /* RTS5411 USB 2.1 */
diff --git a/drivers/usb/misc/onboard_usb_hub.h b/drivers/usb/misc/onboard_usb_hub.h
index 34beab8bce3d..62129a6a1ba5 100644
--- a/drivers/usb/misc/onboard_usb_hub.h
+++ b/drivers/usb/misc/onboard_usb_hub.h
@@ -22,10 +22,15 @@ static const struct onboard_hub_pdata ti_tusb8041_data = {
.reset_us = 3000,
};
+static const struct onboard_hub_pdata genesys_gl850g_data = {
+ .reset_us = 3,
+};
+
static const struct of_device_id onboard_hub_match[] = {
{ .compatible = "usb424,2514", .data = &microchip_usb424_data, },
{ .compatible = "usb451,8140", .data = &ti_tusb8041_data, },
{ .compatible = "usb451,8142", .data = &ti_tusb8041_data, },
+ { .compatible = "usb5e3,608", .data = &genesys_gl850g_data, },
{ .compatible = "usbbda,411", .data = &realtek_rts5411_data, },
{ .compatible = "usbbda,5411", .data = &realtek_rts5411_data, },
{ .compatible = "usbbda,414", .data = &realtek_rts5411_data, },
diff --git a/drivers/usb/misc/sisusbvga/Kconfig b/drivers/usb/misc/sisusbvga/Kconfig
index c12cdd015410..42f81c8eaa92 100644
--- a/drivers/usb/misc/sisusbvga/Kconfig
+++ b/drivers/usb/misc/sisusbvga/Kconfig
@@ -3,7 +3,6 @@
config USB_SISUSBVGA
tristate "USB 2.0 SVGA dongle support (Net2280/SiS315)"
depends on (USB_MUSB_HDRC || USB_EHCI_HCD)
- select FONT_SUPPORT if USB_SISUSBVGA_CON
help
Say Y here if you intend to attach a USB2VGA dongle based on a
Net2280 and a SiS315 chip.
@@ -13,36 +12,3 @@ config USB_SISUSBVGA
To compile this driver as a module, choose M here; the module will be
called sisusbvga. If unsure, say N.
-
-config USB_SISUSBVGA_CON
- bool "Text console and mode switching support" if USB_SISUSBVGA
- depends on VT && BROKEN
- select FONT_8x16
- help
- Say Y here if you want a VGA text console via the USB dongle or
- want to support userland applications that utilize the driver's
- display mode switching capabilities.
-
- Note that this console supports VGA/EGA text mode only.
-
- By default, the console part of the driver will not kick in when
- the driver is initialized. If you want the driver to take over
- one or more of the consoles, you need to specify the number of
- the first and last consoles (starting at 1) as driver parameters.
-
- For example, if the driver is compiled as a module:
-
- modprobe sisusbvga first=1 last=5
-
- If you use hotplug, add this to your modutils config files with
- the "options" keyword, such as eg.
-
- options sisusbvga first=1 last=5
-
- If the driver is compiled into the kernel image, the parameters
- must be given in the kernel command like, such as
-
- sisusbvga.first=1 sisusbvga.last=5
-
-
-
diff --git a/drivers/usb/misc/sisusbvga/Makefile b/drivers/usb/misc/sisusbvga/Makefile
index 6551bce68ac5..28aa1e6ef823 100644
--- a/drivers/usb/misc/sisusbvga/Makefile
+++ b/drivers/usb/misc/sisusbvga/Makefile
@@ -4,6 +4,3 @@
#
obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga.o
-
-sisusbvga-y := sisusb.o
-sisusbvga-$(CONFIG_USB_SISUSBVGA_CON) += sisusb_con.o sisusb_init.o
diff --git a/drivers/usb/misc/sisusbvga/sisusb.h b/drivers/usb/misc/sisusbvga/sisusb.h
index c0fb9e1c5361..e5b1228655d0 100644
--- a/drivers/usb/misc/sisusbvga/sisusb.h
+++ b/drivers/usb/misc/sisusbvga/sisusb.h
@@ -48,7 +48,6 @@
/* Include console and mode switching code? */
-#include <linux/console.h>
#include <linux/vt_kern.h>
#include "sisusb_struct.h"
@@ -126,26 +125,6 @@ struct sisusb_usb_data {
unsigned char gfxinit; /* graphics core initialized? */
unsigned short chipid, chipvendor;
unsigned short chiprevision;
-#ifdef CONFIG_USB_SISUSBVGA_CON
- struct SiS_Private *SiS_Pr;
- unsigned long scrbuf;
- unsigned int scrbuf_size;
- int haveconsole, con_first, con_last;
- int havethisconsole[MAX_NR_CONSOLES];
- int textmodedestroyed;
- unsigned int sisusb_num_columns; /* real number, not vt's idea */
- int cur_start_addr, con_rolled_over;
- int sisusb_cursor_loc, bad_cursor_pos;
- int sisusb_cursor_size_from;
- int sisusb_cursor_size_to;
- int current_font_height, current_font_512;
- int font_backup_size, font_backup_height, font_backup_512;
- char *font_backup;
- int font_slot;
- struct vc_data *sisusb_display_fg;
- int is_gfx;
- int con_blanked;
-#endif
};
#define to_sisusb_dev(d) container_of(d, struct sisusb_usb_data, kref)
diff --git a/drivers/usb/misc/sisusbvga/sisusb_con.c b/drivers/usb/misc/sisusbvga/sisusb_con.c
deleted file mode 100644
index fcb95fb639e0..000000000000
--- a/drivers/usb/misc/sisusbvga/sisusb_con.c
+++ /dev/null
@@ -1,1496 +0,0 @@
-// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
-/*
- * sisusb - usb kernel driver for SiS315(E) based USB2VGA dongles
- *
- * VGA text mode console part
- *
- * Copyright (C) 2005 by Thomas Winischhofer, Vienna, Austria
- *
- * If distributed as part of the Linux kernel, this code is licensed under the
- * terms of the GPL v2.
- *
- * Otherwise, the following license terms apply:
- *
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific psisusbr written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
- *
- * Portions based on vgacon.c which are
- * Created 28 Sep 1997 by Geert Uytterhoeven
- * Rewritten by Martin Mares <mj@ucw.cz>, July 1998
- * based on code Copyright (C) 1991, 1992 Linus Torvalds
- * 1995 Jay Estabrook
- *
- * A note on using in_atomic() in here: We can't handle console
- * calls from non-schedulable context due to our USB-dependend
- * nature. For now, this driver just ignores any calls if it
- * detects this state.
- *
- */
-
-#include <linux/mutex.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/fs.h>
-#include <linux/usb.h>
-#include <linux/tty.h>
-#include <linux/console.h>
-#include <linux/string.h>
-#include <linux/kd.h>
-#include <linux/init.h>
-#include <linux/vt_kern.h>
-#include <linux/selection.h>
-#include <linux/spinlock.h>
-#include <linux/kref.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/vmalloc.h>
-
-#include "sisusb.h"
-#include "sisusb_init.h"
-
-/* vc_data -> sisusb conversion table */
-static struct sisusb_usb_data *mysisusbs[MAX_NR_CONSOLES];
-
-/* Forward declaration */
-static const struct consw sisusb_con;
-
-static inline void
-sisusbcon_memsetw(u16 *s, u16 c, unsigned int count)
-{
- memset16(s, c, count / 2);
-}
-
-static inline void
-sisusb_initialize(struct sisusb_usb_data *sisusb)
-{
- /* Reset cursor and start address */
- if (sisusb_setidxreg(sisusb, SISCR, 0x0c, 0x00))
- return;
- if (sisusb_setidxreg(sisusb, SISCR, 0x0d, 0x00))
- return;
- if (sisusb_setidxreg(sisusb, SISCR, 0x0e, 0x00))
- return;
- sisusb_setidxreg(sisusb, SISCR, 0x0f, 0x00);
-}
-
-static inline void
-sisusbcon_set_start_address(struct sisusb_usb_data *sisusb, struct vc_data *c)
-{
- sisusb->cur_start_addr = (c->vc_visible_origin - sisusb->scrbuf) / 2;
-
- sisusb_setidxreg(sisusb, SISCR, 0x0c, (sisusb->cur_start_addr >> 8));
- sisusb_setidxreg(sisusb, SISCR, 0x0d, (sisusb->cur_start_addr & 0xff));
-}
-
-void
-sisusb_set_cursor(struct sisusb_usb_data *sisusb, unsigned int location)
-{
- if (sisusb->sisusb_cursor_loc == location)
- return;
-
- sisusb->sisusb_cursor_loc = location;
-
- /* Hardware bug: Text cursor appears twice or not at all
- * at some positions. Work around it with the cursor skew
- * bits.
- */
-
- if ((location & 0x0007) == 0x0007) {
- sisusb->bad_cursor_pos = 1;
- location--;
- if (sisusb_setidxregandor(sisusb, SISCR, 0x0b, 0x1f, 0x20))
- return;
- } else if (sisusb->bad_cursor_pos) {
- if (sisusb_setidxregand(sisusb, SISCR, 0x0b, 0x1f))
- return;
- sisusb->bad_cursor_pos = 0;
- }
-
- if (sisusb_setidxreg(sisusb, SISCR, 0x0e, (location >> 8)))
- return;
- sisusb_setidxreg(sisusb, SISCR, 0x0f, (location & 0xff));
-}
-
-static inline struct sisusb_usb_data *
-sisusb_get_sisusb(unsigned short console)
-{
- return mysisusbs[console];
-}
-
-static inline int
-sisusb_sisusb_valid(struct sisusb_usb_data *sisusb)
-{
- if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev)
- return 0;
-
- return 1;
-}
-
-static struct sisusb_usb_data *
-sisusb_get_sisusb_lock_and_check(unsigned short console)
-{
- struct sisusb_usb_data *sisusb;
-
- /* We can't handle console calls in non-schedulable
- * context due to our locks and the USB transport.
- * So we simply ignore them. This should only affect
- * some calls to printk.
- */
- if (in_atomic())
- return NULL;
-
- sisusb = sisusb_get_sisusb(console);
- if (!sisusb)
- return NULL;
-
- mutex_lock(&sisusb->lock);
-
- if (!sisusb_sisusb_valid(sisusb) ||
- !sisusb->havethisconsole[console]) {
- mutex_unlock(&sisusb->lock);
- return NULL;
- }
-
- return sisusb;
-}
-
-static int
-sisusb_is_inactive(struct vc_data *c, struct sisusb_usb_data *sisusb)
-{
- if (sisusb->is_gfx ||
- sisusb->textmodedestroyed ||
- c->vc_mode != KD_TEXT)
- return 1;
-
- return 0;
-}
-
-/* con_startup console interface routine */
-static const char *
-sisusbcon_startup(void)
-{
- return "SISUSBCON";
-}
-
-/* con_init console interface routine */
-static void
-sisusbcon_init(struct vc_data *c, int init)
-{
- struct sisusb_usb_data *sisusb;
- int cols, rows;
-
- /* This is called by do_take_over_console(),
- * ie by us/under our control. It is
- * only called after text mode and fonts
- * are set up/restored.
- */
-
- sisusb = sisusb_get_sisusb(c->vc_num);
- if (!sisusb)
- return;
-
- mutex_lock(&sisusb->lock);
-
- if (!sisusb_sisusb_valid(sisusb)) {
- mutex_unlock(&sisusb->lock);
- return;
- }
-
- c->vc_can_do_color = 1;
-
- c->vc_complement_mask = 0x7700;
-
- c->vc_hi_font_mask = sisusb->current_font_512 ? 0x0800 : 0;
-
- sisusb->haveconsole = 1;
-
- sisusb->havethisconsole[c->vc_num] = 1;
-
- /* We only support 640x400 */
- c->vc_scan_lines = 400;
-
- c->vc_font.height = sisusb->current_font_height;
-
- /* We only support width = 8 */
- cols = 80;
- rows = c->vc_scan_lines / c->vc_font.height;
-
- /* Increment usage count for our sisusb.
- * Doing so saves us from upping/downing
- * the disconnect semaphore; we can't
- * lose our sisusb until this is undone
- * in con_deinit. For all other console
- * interface functions, it suffices to
- * use sisusb->lock and do a quick check
- * of sisusb for device disconnection.
- */
- kref_get(&sisusb->kref);
-
- if (!*c->uni_pagedict_loc)
- con_set_default_unimap(c);
-
- mutex_unlock(&sisusb->lock);
-
- if (init) {
- c->vc_cols = cols;
- c->vc_rows = rows;
- } else
- vc_resize(c, cols, rows);
-}
-
-/* con_deinit console interface routine */
-static void
-sisusbcon_deinit(struct vc_data *c)
-{
- struct sisusb_usb_data *sisusb;
- int i;
-
- /* This is called by do_take_over_console()
- * and others, ie not under our control.
- */
-
- sisusb = sisusb_get_sisusb(c->vc_num);
- if (!sisusb)
- return;
-
- mutex_lock(&sisusb->lock);
-
- /* Clear ourselves in mysisusbs */
- mysisusbs[c->vc_num] = NULL;
-
- sisusb->havethisconsole[c->vc_num] = 0;
-
- /* Free our font buffer if all consoles are gone */
- if (sisusb->font_backup) {
- for(i = 0; i < MAX_NR_CONSOLES; i++) {
- if (sisusb->havethisconsole[c->vc_num])
- break;
- }
- if (i == MAX_NR_CONSOLES) {
- vfree(sisusb->font_backup);
- sisusb->font_backup = NULL;
- }
- }
-
- mutex_unlock(&sisusb->lock);
-
- /* decrement the usage count on our sisusb */
- kref_put(&sisusb->kref, sisusb_delete);
-}
-
-/* interface routine */
-static u8
-sisusbcon_build_attr(struct vc_data *c, u8 color, enum vc_intensity intensity,
- bool blink, bool underline, bool reverse,
- bool unused)
-{
- u8 attr = color;
-
- if (underline)
- attr = (attr & 0xf0) | c->vc_ulcolor;
- else if (intensity == VCI_HALF_BRIGHT)
- attr = (attr & 0xf0) | c->vc_halfcolor;
-
- if (reverse)
- attr = ((attr) & 0x88) |
- ((((attr) >> 4) |
- ((attr) << 4)) & 0x77);
-
- if (blink)
- attr ^= 0x80;
-
- if (intensity == VCI_BOLD)
- attr ^= 0x08;
-
- return attr;
-}
-
-/* Interface routine */
-static void
-sisusbcon_invert_region(struct vc_data *vc, u16 *p, int count)
-{
- /* Invert a region. This is called with a pointer
- * to the console's internal screen buffer. So we
- * simply do the inversion there and rely on
- * a call to putc(s) to update the real screen.
- */
-
- while (count--) {
- u16 a = *p;
-
- *p++ = ((a) & 0x88ff) |
- (((a) & 0x7000) >> 4) |
- (((a) & 0x0700) << 4);
- }
-}
-
-static inline void *sisusb_vaddr(const struct sisusb_usb_data *sisusb,
- const struct vc_data *c, unsigned int x, unsigned int y)
-{
- return (u16 *)c->vc_origin + y * sisusb->sisusb_num_columns + x;
-}
-
-static inline unsigned long sisusb_haddr(const struct sisusb_usb_data *sisusb,
- const struct vc_data *c, unsigned int x, unsigned int y)
-{
- unsigned long offset = c->vc_origin - sisusb->scrbuf;
-
- /* 2 bytes per each character */
- offset += 2 * (y * sisusb->sisusb_num_columns + x);
-
- return sisusb->vrambase + offset;
-}
-
-/* Interface routine */
-static void
-sisusbcon_putc(struct vc_data *c, int ch, int y, int x)
-{
- struct sisusb_usb_data *sisusb;
-
- sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
- if (!sisusb)
- return;
-
- /* sisusb->lock is down */
- if (sisusb_is_inactive(c, sisusb)) {
- mutex_unlock(&sisusb->lock);
- return;
- }
-
- sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, x, y),
- sisusb_haddr(sisusb, c, x, y), 2);
-
- mutex_unlock(&sisusb->lock);
-}
-
-/* Interface routine */
-static void
-sisusbcon_putcs(struct vc_data *c, const unsigned short *s,
- int count, int y, int x)
-{
- struct sisusb_usb_data *sisusb;
-
- sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
- if (!sisusb)
- return;
-
- /* sisusb->lock is down */
-
- /* Need to put the characters into the buffer ourselves,
- * because the vt does this AFTER calling us.
- */
-
- memcpy(sisusb_vaddr(sisusb, c, x, y), s, count * 2);
-
- if (sisusb_is_inactive(c, sisusb)) {
- mutex_unlock(&sisusb->lock);
- return;
- }
-
- sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, x, y),
- sisusb_haddr(sisusb, c, x, y), count * 2);
-
- mutex_unlock(&sisusb->lock);
-}
-
-/* Interface routine */
-static void
-sisusbcon_clear(struct vc_data *c, int y, int x, int height, int width)
-{
- struct sisusb_usb_data *sisusb;
- u16 eattr = c->vc_video_erase_char;
- int i, length, cols;
- u16 *dest;
-
- if (width <= 0 || height <= 0)
- return;
-
- sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
- if (!sisusb)
- return;
-
- /* sisusb->lock is down */
-
- /* Need to clear buffer ourselves, because the vt does
- * this AFTER calling us.
- */
-
- dest = sisusb_vaddr(sisusb, c, x, y);
-
- cols = sisusb->sisusb_num_columns;
-
- if (width > cols)
- width = cols;
-
- if (x == 0 && width >= c->vc_cols) {
-
- sisusbcon_memsetw(dest, eattr, height * cols * 2);
-
- } else {
-
- for (i = height; i > 0; i--, dest += cols)
- sisusbcon_memsetw(dest, eattr, width * 2);
-
- }
-
- if (sisusb_is_inactive(c, sisusb)) {
- mutex_unlock(&sisusb->lock);
- return;
- }
-
- length = ((height * cols) - x - (cols - width - x)) * 2;
-
-
- sisusb_copy_memory(sisusb, sisusb_vaddr(sisusb, c, x, y),
- sisusb_haddr(sisusb, c, x, y), length);
-
- mutex_unlock(&sisusb->lock);
-}
-
-/* interface routine */
-static int
-sisusbcon_switch(struct vc_data *c)
-{
- struct sisusb_usb_data *sisusb;
- int length;
-
- /* Returnvalue 0 means we have fully restored screen,
- * and vt doesn't need to call do_update_region().
- * Returnvalue != 0 naturally means the opposite.
- */
-
- sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
- if (!sisusb)
- return 0;
-
- /* sisusb->lock is down */
-
- /* Don't write to screen if in gfx mode */
- if (sisusb_is_inactive(c, sisusb)) {
- mutex_unlock(&sisusb->lock);
- return 0;
- }
-
- /* That really should not happen. It would mean we are
- * being called while the vc is using its private buffer
- * as origin.
- */
- if (c->vc_origin == (unsigned long)c->vc_screenbuf) {
- mutex_unlock(&sisusb->lock);
- dev_dbg(&sisusb->sisusb_dev->dev, "ASSERT ORIGIN != SCREENBUF!\n");
- return 0;
- }
-
- /* Check that we don't copy too much */
- length = min((int)c->vc_screenbuf_size,
- (int)(sisusb->scrbuf + sisusb->scrbuf_size - c->vc_origin));
-
- /* Restore the screen contents */
- memcpy((u16 *)c->vc_origin, (u16 *)c->vc_screenbuf, length);
-
- sisusb_copy_memory(sisusb, (u8 *)c->vc_origin,
- sisusb_haddr(sisusb, c, 0, 0), length);
-
- mutex_unlock(&sisusb->lock);
-
- return 0;
-}
-
-/* interface routine */
-static void
-sisusbcon_save_screen(struct vc_data *c)
-{
- struct sisusb_usb_data *sisusb;
- int length;
-
- /* Save the current screen contents to vc's private
- * buffer.
- */
-
- sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
- if (!sisusb)
- return;
-
- /* sisusb->lock is down */
-
- if (sisusb_is_inactive(c, sisusb)) {
- mutex_unlock(&sisusb->lock);
- return;
- }
-
- /* Check that we don't copy too much */
- length = min((int)c->vc_screenbuf_size,
- (int)(sisusb->scrbuf + sisusb->scrbuf_size - c->vc_origin));
-
- /* Save the screen contents to vc's private buffer */
- memcpy((u16 *)c->vc_screenbuf, (u16 *)c->vc_origin, length);
-
- mutex_unlock(&sisusb->lock);
-}
-
-/* interface routine */
-static void
-sisusbcon_set_palette(struct vc_data *c, const unsigned char *table)
-{
- struct sisusb_usb_data *sisusb;
- int i, j;
-
- /* Return value not used by vt */
-
- if (!con_is_visible(c))
- return;
-
- sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
- if (!sisusb)
- return;
-
- /* sisusb->lock is down */
-
- if (sisusb_is_inactive(c, sisusb)) {
- mutex_unlock(&sisusb->lock);
- return;
- }
-
- for (i = j = 0; i < 16; i++) {
- if (sisusb_setreg(sisusb, SISCOLIDX, table[i]))
- break;
- if (sisusb_setreg(sisusb, SISCOLDATA, c->vc_palette[j++] >> 2))
- break;
- if (sisusb_setreg(sisusb, SISCOLDATA, c->vc_palette[j++] >> 2))
- break;
- if (sisusb_setreg(sisusb, SISCOLDATA, c->vc_palette[j++] >> 2))
- break;
- }
-
- mutex_unlock(&sisusb->lock);
-}
-
-/* interface routine */
-static int
-sisusbcon_blank(struct vc_data *c, int blank, int mode_switch)
-{
- struct sisusb_usb_data *sisusb;
- u8 sr1, cr17, pmreg, cr63;
- int ret = 0;
-
- sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
- if (!sisusb)
- return 0;
-
- /* sisusb->lock is down */
-
- if (mode_switch)
- sisusb->is_gfx = blank ? 1 : 0;
-
- if (sisusb_is_inactive(c, sisusb)) {
- mutex_unlock(&sisusb->lock);
- return 0;
- }
-
- switch (blank) {
-
- case 1: /* Normal blanking: Clear screen */
- case -1:
- sisusbcon_memsetw((u16 *)c->vc_origin,
- c->vc_video_erase_char,
- c->vc_screenbuf_size);
- sisusb_copy_memory(sisusb, (u8 *)c->vc_origin,
- sisusb_haddr(sisusb, c, 0, 0),
- c->vc_screenbuf_size);
- sisusb->con_blanked = 1;
- ret = 1;
- break;
-
- default: /* VESA blanking */
- switch (blank) {
- case 0: /* Unblank */
- sr1 = 0x00;
- cr17 = 0x80;
- pmreg = 0x00;
- cr63 = 0x00;
- ret = 1;
- sisusb->con_blanked = 0;
- break;
- case VESA_VSYNC_SUSPEND + 1:
- sr1 = 0x20;
- cr17 = 0x80;
- pmreg = 0x80;
- cr63 = 0x40;
- break;
- case VESA_HSYNC_SUSPEND + 1:
- sr1 = 0x20;
- cr17 = 0x80;
- pmreg = 0x40;
- cr63 = 0x40;
- break;
- case VESA_POWERDOWN + 1:
- sr1 = 0x20;
- cr17 = 0x00;
- pmreg = 0xc0;
- cr63 = 0x40;
- break;
- default:
- mutex_unlock(&sisusb->lock);
- return -EINVAL;
- }
-
- sisusb_setidxregandor(sisusb, SISSR, 0x01, ~0x20, sr1);
- sisusb_setidxregandor(sisusb, SISCR, 0x17, 0x7f, cr17);
- sisusb_setidxregandor(sisusb, SISSR, 0x1f, 0x3f, pmreg);
- sisusb_setidxregandor(sisusb, SISCR, 0x63, 0xbf, cr63);
-
- }
-
- mutex_unlock(&sisusb->lock);
-
- return ret;
-}
-
-/* interface routine */
-static void
-sisusbcon_scrolldelta(struct vc_data *c, int lines)
-{
- struct sisusb_usb_data *sisusb;
-
- sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
- if (!sisusb)
- return;
-
- /* sisusb->lock is down */
-
- if (sisusb_is_inactive(c, sisusb)) {
- mutex_unlock(&sisusb->lock);
- return;
- }
-
- vc_scrolldelta_helper(c, lines, sisusb->con_rolled_over,
- (void *)sisusb->scrbuf, sisusb->scrbuf_size);
-
- sisusbcon_set_start_address(sisusb, c);
-
- mutex_unlock(&sisusb->lock);
-}
-
-/* Interface routine */
-static void
-sisusbcon_cursor(struct vc_data *c, int mode)
-{
- struct sisusb_usb_data *sisusb;
- int from, to, baseline;
-
- sisusb = sisusb_get_sisusb_lock_and_check(c->vc_num);
- if (!sisusb)
- return;
-
- /* sisusb->lock is down */
-
- if (sisusb_is_inactive(c, sisusb)) {
- mutex_unlock(&sisusb->lock);
- return;
- }
-
- if (c->vc_origin != c->vc_visible_origin) {
- c->vc_visible_origin = c->vc_origin;
- sisusbcon_set_start_address(sisusb, c);
- }
-
- if (mode == CM_ERASE) {
- sisusb_setidxregor(sisusb, SISCR, 0x0a, 0x20);
- sisusb->sisusb_cursor_size_to = -1;
- mutex_unlock(&sisusb->lock);
- return;
- }
-
- sisusb_set_cursor(sisusb, (c->vc_pos - sisusb->scrbuf) / 2);
-
- baseline = c->vc_font.height - (c->vc_font.height < 10 ? 1 : 2);
-
- switch (CUR_SIZE(c->vc_cursor_type)) {
- case CUR_BLOCK: from = 1;
- to = c->vc_font.height;
- break;
- case CUR_TWO_THIRDS: from = c->vc_font.height / 3;
- to = baseline;
- break;
- case CUR_LOWER_HALF: from = c->vc_font.height / 2;
- to = baseline;
- break;
- case CUR_LOWER_THIRD: from = (c->vc_font.height * 2) / 3;
- to = baseline;
- break;
- case CUR_NONE: from = 31;
- to = 30;
- break;
- default:
- case CUR_UNDERLINE: from = baseline - 1;
- to = baseline;
- break;
- }
-
- if (sisusb->sisusb_cursor_size_from != from ||
- sisusb->sisusb_cursor_size_to != to) {
-