diff options
-rw-r--r-- | drivers/staging/unisys/visorinput/Kconfig | 2 | ||||
-rw-r--r-- | drivers/staging/unisys/visorinput/visorinput.c | 43 |
2 files changed, 32 insertions, 13 deletions
diff --git a/drivers/staging/unisys/visorinput/Kconfig b/drivers/staging/unisys/visorinput/Kconfig index 655cd62433de..a3817e0f7e5c 100644 --- a/drivers/staging/unisys/visorinput/Kconfig +++ b/drivers/staging/unisys/visorinput/Kconfig @@ -4,7 +4,7 @@ config UNISYS_VISORINPUT tristate "Unisys visorinput driver" - depends on UNISYSSPAR && UNISYS_VISORBUS && FB && INPUT + depends on UNISYSSPAR && UNISYS_VISORBUS && INPUT ---help--- The Unisys s-Par visorinput driver provides a virtualized system console (keyboard and mouse) that is accessible through the diff --git a/drivers/staging/unisys/visorinput/visorinput.c b/drivers/staging/unisys/visorinput/visorinput.c index d8048e48658f..99730409bd7f 100644 --- a/drivers/staging/unisys/visorinput/visorinput.c +++ b/drivers/staging/unisys/visorinput/visorinput.c @@ -32,10 +32,24 @@ 0x81, 0xc3, 0x61, 0xab, 0xcd, 0xbd, 0xbd, 0x87) #define VISOR_MOUSE_CHANNEL_GUID_STR "addf07d4-94a9-46e2-81c3-61abcdbdbd87" -#define PIXELS_ACROSS_DEFAULT 800 -#define PIXELS_DOWN_DEFAULT 600 +#define PIXELS_ACROSS_DEFAULT 1024 +#define PIXELS_DOWN_DEFAULT 768 #define KEYCODE_TABLE_BYTES 256 +/* header of keyboard/mouse channels */ +struct visor_input_channel_data { + u32 n_input_reports; + union { + struct { + u16 x_res; + u16 y_res; + } mouse; + struct { + u32 flags; + } keyboard; + }; +} __packed; + enum visorinput_device_type { visorinput_keyboard, visorinput_mouse, @@ -306,10 +320,9 @@ static struct input_dev *setup_client_keyboard(void *devdata, return visorinput_dev; } -static struct input_dev *setup_client_mouse(void *devdata) +static struct input_dev *setup_client_mouse(void *devdata, unsigned int xres, + unsigned int yres) { - int xres, yres; - struct fb_info *fb0; struct input_dev *visorinput_dev = input_allocate_device(); if (!visorinput_dev) @@ -327,14 +340,10 @@ static struct input_dev *setup_client_mouse(void *devdata) set_bit(BTN_RIGHT, visorinput_dev->keybit); set_bit(BTN_MIDDLE, visorinput_dev->keybit); - if (registered_fb[0]) { - fb0 = registered_fb[0]; - xres = fb0->var.xres_virtual; - yres = fb0->var.yres_virtual; - } else { + if (xres == 0) xres = PIXELS_ACROSS_DEFAULT; + if (yres == 0) yres = PIXELS_DOWN_DEFAULT; - } input_set_abs_params(visorinput_dev, ABS_X, 0, xres, 0, 0); input_set_abs_params(visorinput_dev, ABS_Y, 0, yres, 0, 0); @@ -353,6 +362,8 @@ static struct visorinput_devdata *devdata_create( { struct visorinput_devdata *devdata = NULL; unsigned int extra_bytes = 0; + unsigned int size, xres, yres, err; + struct visor_input_channel_data data; if (devtype == visorinput_keyboard) /* allocate room for devdata->keycode_table, filled in below */ @@ -390,7 +401,15 @@ static struct visorinput_devdata *devdata_create( goto cleanups_register; break; case visorinput_mouse: - devdata->visorinput_dev = setup_client_mouse(devdata); + size = sizeof(struct visor_input_channel_data); + err = visorbus_read_channel(dev, sizeof(struct channel_header), + &data, size); + if (err) + goto cleanups_register; + xres = data.mouse.x_res; + yres = data.mouse.y_res; + devdata->visorinput_dev = setup_client_mouse(devdata, xres, + yres); if (!devdata->visorinput_dev) goto cleanups_register; break; |