You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/dtor/input
* master.kernel.org:/pub/scm/linux/kernel/git/dtor/input: (26 commits) Input: add support for Braille devices Input: synaptics - limit rate to 40pps on Toshiba Protege M300 Input: gamecon - add SNES mouse support Input: make modalias code respect allowed buffer size Input: convert /proc handling to seq_file Input: limit attributes' output to PAGE_SIZE Input: gameport - fix memory leak Input: serio - fix memory leak Input: zaurus keyboard driver updates Input: i8042 - fix logic around pnp_register_driver() Input: ns558 - fix logic around pnp_register_driver() Input: pcspkr - separate device and driver registration Input: atkbd - allow disabling on X86_PC (if EMBEDDED) Input: atkbd - disable softrepeat for dumb keyboards Input: atkbd - fix complaints about 'releasing unknown key 0x7f' Input: HID - fix duplicate key mapping for Logitech UltraX remote Input: use kzalloc() throughout the code Input: fix input_free_device() implementation Input: initialize serio and gameport at subsystem level Input: uinput - semaphore to mutex conversion ...
This commit is contained in:
@@ -36,12 +36,12 @@ with them.
|
||||
|
||||
All NES and SNES use the same synchronous serial protocol, clocked from
|
||||
the computer's side (and thus timing insensitive). To allow up to 5 NES
|
||||
and/or SNES gamepads connected to the parallel port at once, the output
|
||||
lines of the parallel port are shared, while one of 5 available input lines
|
||||
is assigned to each gamepad.
|
||||
and/or SNES gamepads and/or SNES mice connected to the parallel port at once,
|
||||
the output lines of the parallel port are shared, while one of 5 available
|
||||
input lines is assigned to each gamepad.
|
||||
|
||||
This protocol is handled by the gamecon.c driver, so that's the one
|
||||
you'll use for NES and SNES gamepads.
|
||||
you'll use for NES, SNES gamepads and SNES mice.
|
||||
|
||||
The main problem with PC parallel ports is that they don't have +5V power
|
||||
source on any of their pins. So, if you want a reliable source of power
|
||||
@@ -106,7 +106,7 @@ A, Turbo B, Select and Start, and is connected through 5 wires, then it is
|
||||
either a NES or NES clone and will work with this connection. SNES gamepads
|
||||
also use 5 wires, but have more buttons. They will work as well, of course.
|
||||
|
||||
Pinout for NES gamepads Pinout for SNES gamepads
|
||||
Pinout for NES gamepads Pinout for SNES gamepads and mice
|
||||
|
||||
+----> Power +-----------------------\
|
||||
| 7 | o o o o | x x o | 1
|
||||
@@ -454,6 +454,7 @@ uses the following kernel/module command line:
|
||||
6 | N64 pad
|
||||
7 | Sony PSX controller
|
||||
8 | Sony PSX DDR controller
|
||||
9 | SNES mouse
|
||||
|
||||
The exact type of the PSX controller type is autoprobed when used so
|
||||
hot swapping should work (but is not recomended).
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/seq_file.h>
|
||||
@@ -1478,3 +1479,20 @@ alpha_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
|
||||
#endif
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static __init int add_pcspkr(void)
|
||||
{
|
||||
struct platform_device *pd;
|
||||
int ret;
|
||||
|
||||
pd = platform_device_alloc("pcspkr", -1);
|
||||
if (!pd)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = platform_device_add(pd);
|
||||
if (ret)
|
||||
platform_device_put(pd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
device_initcall(add_pcspkr);
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/root_dev.h>
|
||||
@@ -1547,6 +1548,23 @@ void __init setup_arch(char **cmdline_p)
|
||||
#endif
|
||||
}
|
||||
|
||||
static __init int add_pcspkr(void)
|
||||
{
|
||||
struct platform_device *pd;
|
||||
int ret;
|
||||
|
||||
pd = platform_device_alloc("pcspkr", -1);
|
||||
if (!pd)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = platform_device_add(pd);
|
||||
if (ret)
|
||||
platform_device_put(pd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
device_initcall(add_pcspkr);
|
||||
|
||||
#include "setup_arch_post.h"
|
||||
/*
|
||||
* Local Variables:
|
||||
|
||||
@@ -233,6 +233,7 @@ config MACH_JAZZ
|
||||
select ARC32
|
||||
select ARCH_MAY_HAVE_PC_FDC
|
||||
select GENERIC_ISA_DMA
|
||||
select I8253
|
||||
select I8259
|
||||
select ISA
|
||||
select SYS_HAS_CPU_R4X00
|
||||
@@ -530,6 +531,7 @@ config QEMU
|
||||
select DMA_COHERENT
|
||||
select GENERIC_ISA_DMA
|
||||
select HAVE_STD_PC_SERIAL_PORT
|
||||
select I8253
|
||||
select I8259
|
||||
select ISA
|
||||
select SWAP_IO_SPACE
|
||||
@@ -714,6 +716,7 @@ config SNI_RM200_PCI
|
||||
select HAVE_STD_PC_SERIAL_PORT
|
||||
select HW_HAS_EISA
|
||||
select HW_HAS_PCI
|
||||
select I8253
|
||||
select I8259
|
||||
select ISA
|
||||
select SYS_HAS_CPU_R4X00
|
||||
@@ -1721,6 +1724,9 @@ config MMU
|
||||
bool
|
||||
default y
|
||||
|
||||
config I8253
|
||||
bool
|
||||
|
||||
source "drivers/pcmcia/Kconfig"
|
||||
|
||||
source "drivers/pci/hotplug/Kconfig"
|
||||
|
||||
@@ -59,6 +59,8 @@ obj-$(CONFIG_PROC_FS) += proc.o
|
||||
|
||||
obj-$(CONFIG_64BIT) += cpu-bugs64.o
|
||||
|
||||
obj-$(CONFIG_I8253) += i8253.o
|
||||
|
||||
CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi)
|
||||
|
||||
EXTRA_AFLAGS := $(CFLAGS)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright (C) 2006 IBM Corporation
|
||||
*
|
||||
* Implements device information for i8253 timer chip
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version
|
||||
* 2 as published by the Free Software Foundation
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
static __init int add_pcspkr(void)
|
||||
{
|
||||
struct platform_device *pd;
|
||||
int ret;
|
||||
|
||||
pd = platform_device_alloc("pcspkr", -1);
|
||||
if (!pd)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = platform_device_add(pd);
|
||||
if (ret)
|
||||
platform_device_put(pd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
device_initcall(add_pcspkr);
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/ioport.h>
|
||||
@@ -462,6 +463,29 @@ static int __init early_xmon(char *p)
|
||||
early_param("xmon", early_xmon);
|
||||
#endif
|
||||
|
||||
static __init int add_pcspkr(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
struct platform_device *pd;
|
||||
int ret;
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "pnpPNP,100");
|
||||
of_node_put(np);
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
pd = platform_device_alloc("pcspkr", -1);
|
||||
if (!pd)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = platform_device_add(pd);
|
||||
if (ret)
|
||||
platform_device_put(pd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
device_initcall(add_pcspkr);
|
||||
|
||||
void probe_machine(void)
|
||||
{
|
||||
extern struct machdep_calls __machine_desc_start;
|
||||
|
||||
+1
-3
@@ -25,9 +25,6 @@ obj-$(CONFIG_CONNECTOR) += connector/
|
||||
obj-$(CONFIG_FB_I810) += video/i810/
|
||||
obj-$(CONFIG_FB_INTEL) += video/intelfb/
|
||||
|
||||
# we also need input/serio early so serio bus is initialized by the time
|
||||
# serial drivers start registering their serio ports
|
||||
obj-$(CONFIG_SERIO) += input/serio/
|
||||
obj-y += serial/
|
||||
obj-$(CONFIG_PARPORT) += parport/
|
||||
obj-y += base/ block/ misc/ mfd/ net/ media/
|
||||
@@ -53,6 +50,7 @@ obj-$(CONFIG_TC) += tc/
|
||||
obj-$(CONFIG_USB) += usb/
|
||||
obj-$(CONFIG_PCI) += usb/
|
||||
obj-$(CONFIG_USB_GADGET) += usb/gadget/
|
||||
obj-$(CONFIG_SERIO) += input/serio/
|
||||
obj-$(CONFIG_GAMEPORT) += input/gameport/
|
||||
obj-$(CONFIG_INPUT) += input/
|
||||
obj-$(CONFIG_I2O) += message/
|
||||
|
||||
+101
-17
@@ -74,7 +74,7 @@ void compute_shiftstate(void);
|
||||
k_self, k_fn, k_spec, k_pad,\
|
||||
k_dead, k_cons, k_cur, k_shift,\
|
||||
k_meta, k_ascii, k_lock, k_lowercase,\
|
||||
k_slock, k_dead2, k_ignore, k_ignore
|
||||
k_slock, k_dead2, k_brl, k_ignore
|
||||
|
||||
typedef void (k_handler_fn)(struct vc_data *vc, unsigned char value,
|
||||
char up_flag, struct pt_regs *regs);
|
||||
@@ -100,7 +100,7 @@ static fn_handler_fn *fn_handler[] = { FN_HANDLERS };
|
||||
const int max_vals[] = {
|
||||
255, ARRAY_SIZE(func_table) - 1, ARRAY_SIZE(fn_handler) - 1, NR_PAD - 1,
|
||||
NR_DEAD - 1, 255, 3, NR_SHIFT - 1, 255, NR_ASCII - 1, NR_LOCK - 1,
|
||||
255, NR_LOCK - 1, 255
|
||||
255, NR_LOCK - 1, 255, NR_BRL - 1
|
||||
};
|
||||
|
||||
const int NR_TYPES = ARRAY_SIZE(max_vals);
|
||||
@@ -126,7 +126,7 @@ static unsigned long key_down[NBITS(KEY_MAX)]; /* keyboard key bitmap */
|
||||
static unsigned char shift_down[NR_SHIFT]; /* shift state counters.. */
|
||||
static int dead_key_next;
|
||||
static int npadch = -1; /* -1 or number assembled on pad */
|
||||
static unsigned char diacr;
|
||||
static unsigned int diacr;
|
||||
static char rep; /* flag telling character repeat */
|
||||
|
||||
static unsigned char ledstate = 0xff; /* undefined */
|
||||
@@ -394,22 +394,30 @@ void compute_shiftstate(void)
|
||||
* Otherwise, conclude that DIACR was not combining after all,
|
||||
* queue it and return CH.
|
||||
*/
|
||||
static unsigned char handle_diacr(struct vc_data *vc, unsigned char ch)
|
||||
static unsigned int handle_diacr(struct vc_data *vc, unsigned int ch)
|
||||
{
|
||||
int d = diacr;
|
||||
unsigned int d = diacr;
|
||||
unsigned int i;
|
||||
|
||||
diacr = 0;
|
||||
|
||||
for (i = 0; i < accent_table_size; i++) {
|
||||
if (accent_table[i].diacr == d && accent_table[i].base == ch)
|
||||
return accent_table[i].result;
|
||||
if ((d & ~0xff) == BRL_UC_ROW) {
|
||||
if ((ch & ~0xff) == BRL_UC_ROW)
|
||||
return d | ch;
|
||||
} else {
|
||||
for (i = 0; i < accent_table_size; i++)
|
||||
if (accent_table[i].diacr == d && accent_table[i].base == ch)
|
||||
return accent_table[i].result;
|
||||
}
|
||||
|
||||
if (ch == ' ' || ch == d)
|
||||
if (ch == ' ' || ch == (BRL_UC_ROW|0) || ch == d)
|
||||
return d;
|
||||
|
||||
put_queue(vc, d);
|
||||
if (kbd->kbdmode == VC_UNICODE)
|
||||
to_utf8(vc, d);
|
||||
else if (d < 0x100)
|
||||
put_queue(vc, d);
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
@@ -419,7 +427,10 @@ static unsigned char handle_diacr(struct vc_data *vc, unsigned char ch)
|
||||
static void fn_enter(struct vc_data *vc, struct pt_regs *regs)
|
||||
{
|
||||
if (diacr) {
|
||||
put_queue(vc, diacr);
|
||||
if (kbd->kbdmode == VC_UNICODE)
|
||||
to_utf8(vc, diacr);
|
||||
else if (diacr < 0x100)
|
||||
put_queue(vc, diacr);
|
||||
diacr = 0;
|
||||
}
|
||||
put_queue(vc, 13);
|
||||
@@ -615,7 +626,7 @@ static void k_lowercase(struct vc_data *vc, unsigned char value, char up_flag, s
|
||||
printk(KERN_ERR "keyboard.c: k_lowercase was called - impossible\n");
|
||||
}
|
||||
|
||||
static void k_self(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs)
|
||||
static void k_unicode(struct vc_data *vc, unsigned int value, char up_flag, struct pt_regs *regs)
|
||||
{
|
||||
if (up_flag)
|
||||
return; /* no action, if this is a key release */
|
||||
@@ -628,7 +639,10 @@ static void k_self(struct vc_data *vc, unsigned char value, char up_flag, struct
|
||||
diacr = value;
|
||||
return;
|
||||
}
|
||||
put_queue(vc, value);
|
||||
if (kbd->kbdmode == VC_UNICODE)
|
||||
to_utf8(vc, value);
|
||||
else if (value < 0x100)
|
||||
put_queue(vc, value);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -636,13 +650,23 @@ static void k_self(struct vc_data *vc, unsigned char value, char up_flag, struct
|
||||
* dead keys modifying the same character. Very useful
|
||||
* for Vietnamese.
|
||||
*/
|
||||
static void k_dead2(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs)
|
||||
static void k_deadunicode(struct vc_data *vc, unsigned int value, char up_flag, struct pt_regs *regs)
|
||||
{
|
||||
if (up_flag)
|
||||
return;
|
||||
diacr = (diacr ? handle_diacr(vc, value) : value);
|
||||
}
|
||||
|
||||
static void k_self(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs)
|
||||
{
|
||||
k_unicode(vc, value, up_flag, regs);
|
||||
}
|
||||
|
||||
static void k_dead2(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs)
|
||||
{
|
||||
k_deadunicode(vc, value, up_flag, regs);
|
||||
}
|
||||
|
||||
/*
|
||||
* Obsolete - for backwards compatibility only
|
||||
*/
|
||||
@@ -650,7 +674,7 @@ static void k_dead(struct vc_data *vc, unsigned char value, char up_flag, struct
|
||||
{
|
||||
static unsigned char ret_diacr[NR_DEAD] = {'`', '\'', '^', '~', '"', ',' };
|
||||
value = ret_diacr[value];
|
||||
k_dead2(vc, value, up_flag, regs);
|
||||
k_deadunicode(vc, value, up_flag, regs);
|
||||
}
|
||||
|
||||
static void k_cons(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs)
|
||||
@@ -835,6 +859,62 @@ static void k_slock(struct vc_data *vc, unsigned char value, char up_flag, struc
|
||||
}
|
||||
}
|
||||
|
||||
/* by default, 300ms interval for combination release */
|
||||
static long brl_timeout = 300;
|
||||
MODULE_PARM_DESC(brl_timeout, "Braille keys release delay in ms (0 for combination on first release, < 0 for dead characters)");
|
||||
module_param(brl_timeout, long, 0644);
|
||||
static void k_brl(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs)
|
||||
{
|
||||
static unsigned pressed,committing;
|
||||
static unsigned long releasestart;
|
||||
|
||||
if (kbd->kbdmode != VC_UNICODE) {
|
||||
if (!up_flag)
|
||||
printk("keyboard mode must be unicode for braille patterns\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!value) {
|
||||
k_unicode(vc, BRL_UC_ROW, up_flag, regs);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value > 8)
|
||||
return;
|
||||
|
||||
if (brl_timeout < 0) {
|
||||
k_deadunicode(vc, BRL_UC_ROW | (1 << (value - 1)), up_flag, regs);
|
||||
return;
|
||||
}
|
||||
|
||||
if (up_flag) {
|
||||
if (brl_timeout) {
|
||||
if (!committing ||
|
||||
jiffies - releasestart > (brl_timeout * HZ) / 1000) {
|
||||
committing = pressed;
|
||||
releasestart = jiffies;
|
||||
}
|
||||
pressed &= ~(1 << (value - 1));
|
||||
if (!pressed) {
|
||||
if (committing) {
|
||||
k_unicode(vc, BRL_UC_ROW | committing, 0, regs);
|
||||
committing = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (committing) {
|
||||
k_unicode(vc, BRL_UC_ROW | committing, 0, regs);
|
||||
committing = 0;
|
||||
}
|
||||
pressed &= ~(1 << (value - 1));
|
||||
}
|
||||
} else {
|
||||
pressed |= 1 << (value - 1);
|
||||
if (!brl_timeout)
|
||||
committing = pressed;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The leds display either (i) the status of NumLock, CapsLock, ScrollLock,
|
||||
* or (ii) whatever pattern of lights people want to show using KDSETLED,
|
||||
@@ -1125,9 +1205,13 @@ static void kbd_keycode(unsigned int keycode, int down,
|
||||
}
|
||||
|
||||
if (keycode > NR_KEYS)
|
||||
return;
|
||||
if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8)
|
||||
keysym = K(KT_BRL, keycode - KEY_BRL_DOT1 + 1);
|
||||
else
|
||||
return;
|
||||
else
|
||||
keysym = key_map[keycode];
|
||||
|
||||
keysym = key_map[keycode];
|
||||
type = KTYP(keysym);
|
||||
|
||||
if (type < 0xf0) {
|
||||
|
||||
@@ -49,9 +49,8 @@ static struct input_handle *evbug_connect(struct input_handler *handler, struct
|
||||
{
|
||||
struct input_handle *handle;
|
||||
|
||||
if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL)))
|
||||
if (!(handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL)))
|
||||
return NULL;
|
||||
memset(handle, 0, sizeof(struct input_handle));
|
||||
|
||||
handle->dev = dev;
|
||||
handle->handler = handler;
|
||||
|
||||
@@ -130,9 +130,8 @@ static int evdev_open(struct inode * inode, struct file * file)
|
||||
if ((accept_err = input_accept_process(&(evdev_table[i]->handle), file)))
|
||||
return accept_err;
|
||||
|
||||
if (!(list = kmalloc(sizeof(struct evdev_list), GFP_KERNEL)))
|
||||
if (!(list = kzalloc(sizeof(struct evdev_list), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
memset(list, 0, sizeof(struct evdev_list));
|
||||
|
||||
list->evdev = evdev_table[i];
|
||||
list_add_tail(&list->node, &evdev_table[i]->list);
|
||||
@@ -609,9 +608,8 @@ static struct input_handle *evdev_connect(struct input_handler *handler, struct
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(evdev = kmalloc(sizeof(struct evdev), GFP_KERNEL)))
|
||||
if (!(evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL)))
|
||||
return NULL;
|
||||
memset(evdev, 0, sizeof(struct evdev));
|
||||
|
||||
INIT_LIST_HEAD(&evdev->list);
|
||||
init_waitqueue_head(&evdev->wait);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/sched.h> /* HZ */
|
||||
#include <linux/mutex.h>
|
||||
|
||||
/*#include <asm/io.h>*/
|
||||
|
||||
@@ -43,10 +44,10 @@ EXPORT_SYMBOL(gameport_start_polling);
|
||||
EXPORT_SYMBOL(gameport_stop_polling);
|
||||
|
||||
/*
|
||||
* gameport_sem protects entire gameport subsystem and is taken
|
||||
* gameport_mutex protects entire gameport subsystem and is taken
|
||||
* every time gameport port or driver registrered or unregistered.
|
||||
*/
|
||||
static DECLARE_MUTEX(gameport_sem);
|
||||
static DEFINE_MUTEX(gameport_mutex);
|
||||
|
||||
static LIST_HEAD(gameport_list);
|
||||
|
||||
@@ -265,6 +266,7 @@ static void gameport_queue_event(void *object, struct module *owner,
|
||||
if ((event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC))) {
|
||||
if (!try_module_get(owner)) {
|
||||
printk(KERN_WARNING "gameport: Can't get module reference, dropping event %d\n", event_type);
|
||||
kfree(event);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -342,7 +344,7 @@ static void gameport_handle_event(void)
|
||||
struct gameport_event *event;
|
||||
struct gameport_driver *gameport_drv;
|
||||
|
||||
down(&gameport_sem);
|
||||
mutex_lock(&gameport_mutex);
|
||||
|
||||
/*
|
||||
* Note that we handle only one event here to give swsusp
|
||||
@@ -379,7 +381,7 @@ static void gameport_handle_event(void)
|
||||
gameport_free_event(event);
|
||||
}
|
||||
|
||||
up(&gameport_sem);
|
||||
mutex_unlock(&gameport_mutex);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -464,7 +466,7 @@ static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribut
|
||||
struct device_driver *drv;
|
||||
int retval;
|
||||
|
||||
retval = down_interruptible(&gameport_sem);
|
||||
retval = mutex_lock_interruptible(&gameport_mutex);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
@@ -484,7 +486,7 @@ static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribut
|
||||
retval = -EINVAL;
|
||||
}
|
||||
|
||||
up(&gameport_sem);
|
||||
mutex_unlock(&gameport_mutex);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -521,7 +523,7 @@ static void gameport_init_port(struct gameport *gameport)
|
||||
|
||||
__module_get(THIS_MODULE);
|
||||
|
||||
init_MUTEX(&gameport->drv_sem);
|
||||
mutex_init(&gameport->drv_mutex);
|
||||
device_initialize(&gameport->dev);
|
||||
snprintf(gameport->dev.bus_id, sizeof(gameport->dev.bus_id),
|
||||
"gameport%lu", (unsigned long)atomic_inc_return(&gameport_no) - 1);
|
||||
@@ -661,10 +663,10 @@ void __gameport_register_port(struct gameport *gameport, struct module *owner)
|
||||
*/
|
||||
void gameport_unregister_port(struct gameport *gameport)
|
||||
{
|
||||
down(&gameport_sem);
|
||||
mutex_lock(&gameport_mutex);
|
||||
gameport_disconnect_port(gameport);
|
||||
gameport_destroy_port(gameport);
|
||||
up(&gameport_sem);
|
||||
mutex_unlock(&gameport_mutex);
|
||||
}
|
||||
|
||||
|
||||
@@ -717,7 +719,7 @@ void gameport_unregister_driver(struct gameport_driver *drv)
|
||||
{
|
||||
struct gameport *gameport;
|
||||
|
||||
down(&gameport_sem);
|
||||
mutex_lock(&gameport_mutex);
|
||||
drv->ignore = 1; /* so gameport_find_driver ignores it */
|
||||
|
||||
start_over:
|
||||
@@ -731,7 +733,7 @@ start_over:
|
||||
}
|
||||
|
||||
driver_unregister(&drv->driver);
|
||||
up(&gameport_sem);
|
||||
mutex_unlock(&gameport_mutex);
|
||||
}
|
||||
|
||||
static int gameport_bus_match(struct device *dev, struct device_driver *drv)
|
||||
@@ -743,9 +745,9 @@ static int gameport_bus_match(struct device *dev, struct device_driver *drv)
|
||||
|
||||
static void gameport_set_drv(struct gameport *gameport, struct gameport_driver *drv)
|
||||
{
|
||||
down(&gameport->drv_sem);
|
||||
mutex_lock(&gameport->drv_mutex);
|
||||
gameport->drv = drv;
|
||||
up(&gameport->drv_sem);
|
||||
mutex_unlock(&gameport->drv_mutex);
|
||||
}
|
||||
|
||||
int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode)
|
||||
@@ -796,5 +798,5 @@ static void __exit gameport_exit(void)
|
||||
kthread_stop(gameport_task);
|
||||
}
|
||||
|
||||
module_init(gameport_init);
|
||||
subsys_initcall(gameport_init);
|
||||
module_exit(gameport_exit);
|
||||
|
||||
@@ -252,14 +252,14 @@ static struct pnp_driver ns558_pnp_driver;
|
||||
|
||||
#endif
|
||||
|
||||
static int pnp_registered = 0;
|
||||
|
||||
static int __init ns558_init(void)
|
||||
{
|
||||
int i = 0;
|
||||
int error;
|
||||
|
||||
if (pnp_register_driver(&ns558_pnp_driver) >= 0)
|
||||
pnp_registered = 1;
|
||||
error = pnp_register_driver(&ns558_pnp_driver);
|
||||
if (error && error != -ENODEV) /* should be ENOSYS really */
|
||||
return error;
|
||||
|
||||
/*
|
||||
* Probe ISA ports after PnP, so that PnP ports that are already
|
||||
@@ -270,7 +270,7 @@ static int __init ns558_init(void)
|
||||
while (ns558_isa_portlist[i])
|
||||
ns558_isa_probe(ns558_isa_portlist[i++]);
|
||||
|
||||
return (list_empty(&ns558_list) && !pnp_registered) ? -ENODEV : 0;
|
||||
return list_empty(&ns558_list) && error ? -ENODEV : 0;
|
||||
}
|
||||
|
||||
static void __exit ns558_exit(void)
|
||||
@@ -283,8 +283,7 @@ static void __exit ns558_exit(void)
|
||||
kfree(ns558);
|
||||
}
|
||||
|
||||
if (pnp_registered)
|
||||
pnp_unregister_driver(&ns558_pnp_driver);
|
||||
pnp_unregister_driver(&ns558_pnp_driver);
|
||||
}
|
||||
|
||||
module_init(ns558_init);
|
||||
|
||||
+271
-169
File diff suppressed because it is too large
Load Diff
@@ -171,9 +171,8 @@ static int joydev_open(struct inode *inode, struct file *file)
|
||||
if (i >= JOYDEV_MINORS || !joydev_table[i])
|
||||
return -ENODEV;
|
||||
|
||||
if (!(list = kmalloc(sizeof(struct joydev_list), GFP_KERNEL)))
|
||||
if (!(list = kzalloc(sizeof(struct joydev_list), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
memset(list, 0, sizeof(struct joydev_list));
|
||||
|
||||
list->joydev = joydev_table[i];
|
||||
list_add_tail(&list->node, &joydev_table[i]->list);
|
||||
@@ -457,9 +456,8 @@ static struct input_handle *joydev_connect(struct input_handler *handler, struct
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(joydev = kmalloc(sizeof(struct joydev), GFP_KERNEL)))
|
||||
if (!(joydev = kzalloc(sizeof(struct joydev), GFP_KERNEL)))
|
||||
return NULL;
|
||||
memset(joydev, 0, sizeof(struct joydev));
|
||||
|
||||
INIT_LIST_HEAD(&joydev->list);
|
||||
init_waitqueue_head(&joydev->wait);
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/amigahw.h>
|
||||
@@ -52,7 +53,7 @@ MODULE_PARM_DESC(map, "Map of attached joysticks in form of <a>,<b> (default is
|
||||
__obsolete_setup("amijoy=");
|
||||
|
||||
static int amijoy_used;
|
||||
static DECLARE_MUTEX(amijoy_sem);
|
||||
static DEFINE_MUTEX(amijoy_mutex);
|
||||
static struct input_dev *amijoy_dev[2];
|
||||
static char *amijoy_phys[2] = { "amijoy/input0", "amijoy/input1" };
|
||||
|
||||
@@ -85,7 +86,7 @@ static int amijoy_open(struct input_dev *dev)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = down_interruptible(&amijoy_sem);
|
||||
err = mutex_lock_interruptible(&amijoy_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -97,16 +98,16 @@ static int amijoy_open(struct input_dev *dev)
|
||||
|
||||
amijoy_used++;
|
||||
out:
|
||||
up(&amijoy_sem);
|
||||
mutex_unlock(&amijoy_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void amijoy_close(struct input_dev *dev)
|
||||
{
|
||||
down(&amijoy_sem);
|
||||
mutex_lock(&amijoy_mutex);
|
||||
if (!--amijoy_used)
|
||||
free_irq(IRQ_AMIGA_VERTB, amijoy_interrupt);
|
||||
up(&amijoy_sem);
|
||||
mutex_unlock(&amijoy_mutex);
|
||||
}
|
||||
|
||||
static int __init amijoy_init(void)
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/parport.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION("Atari, Amstrad, Commodore, Amiga, Sega, etc. joystick driver");
|
||||
@@ -111,7 +112,7 @@ struct db9 {
|
||||
struct pardevice *pd;
|
||||
int mode;
|
||||
int used;
|
||||
struct semaphore sem;
|
||||
struct mutex mutex;
|
||||
char phys[DB9_MAX_DEVICES][32];
|
||||
};
|
||||
|
||||
@@ -525,7 +526,7 @@ static int db9_open(struct input_dev *dev)
|
||||
struct parport *port = db9->pd->port;
|
||||
int err;
|
||||
|
||||
err = down_interruptible(&db9->sem);
|
||||
err = mutex_lock_interruptible(&db9->mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -539,7 +540,7 @@ static int db9_open(struct input_dev *dev)
|
||||
mod_timer(&db9->timer, jiffies + DB9_REFRESH_TIME);
|
||||
}
|
||||
|
||||
up(&db9->sem);
|
||||
mutex_unlock(&db9->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -548,14 +549,14 @@ static void db9_close(struct input_dev *dev)
|
||||
struct db9 *db9 = dev->private;
|
||||
struct parport *port = db9->pd->port;
|
||||
|
||||
down(&db9->sem);
|
||||
mutex_lock(&db9->mutex);
|
||||
if (!--db9->used) {
|
||||
del_timer_sync(&db9->timer);
|
||||
parport_write_control(port, 0x00);
|
||||
parport_data_forward(port);
|
||||
parport_release(db9->pd);
|
||||
}
|
||||
up(&db9->sem);
|
||||
mutex_unlock(&db9->mutex);
|
||||
}
|
||||
|
||||
static struct db9 __init *db9_probe(int parport, int mode)
|
||||
@@ -603,7 +604,7 @@ static struct db9 __init *db9_probe(int parport, int mode)
|
||||
goto err_unreg_pardev;
|
||||
}
|
||||
|
||||
init_MUTEX(&db9->sem);
|
||||
mutex_init(&db9->mutex);
|
||||
db9->pd = pd;
|
||||
db9->mode = mode;
|
||||
init_timer(&db9->timer);
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
* Based on the work of:
|
||||
* Andree Borrmann John Dahlstrom
|
||||
* David Kuder Nathan Hand
|
||||
* Raphael Assenat
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -36,6 +37,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/parport.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
|
||||
MODULE_DESCRIPTION("NES, SNES, N64, MultiSystem, PSX gamepad driver");
|
||||
@@ -72,8 +74,9 @@ __obsolete_setup("gc_3=");
|
||||
#define GC_N64 6
|
||||
#define GC_PSX 7
|
||||
#define GC_DDR 8
|
||||
#define GC_SNESMOUSE 9
|
||||
|
||||
#define GC_MAX 8
|
||||
#define GC_MAX 9
|
||||
|
||||
#define GC_REFRESH_TIME HZ/100
|
||||
|
||||
@@ -83,7 +86,7 @@ struct gc {
|
||||
struct timer_list timer;
|
||||
unsigned char pads[GC_MAX + 1];
|
||||
int used;
|
||||
struct semaphore sem;
|
||||
struct mutex mutex;
|
||||
char phys[GC_MAX_DEVICES][32];
|
||||
};
|
||||
|
||||
@@ -93,7 +96,7 @@ static int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 };
|
||||
|
||||
static char *gc_names[] = { NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick",
|
||||
"Multisystem 2-button joystick", "N64 controller", "PSX controller",
|
||||
"PSX DDR controller" };
|
||||
"PSX DDR controller", "SNES mouse" };
|
||||
/*
|
||||
* N64 support.
|
||||
*/
|
||||
@@ -205,9 +208,12 @@ static void gc_n64_process_packet(struct gc *gc)
|
||||
* NES/SNES support.
|
||||
*/
|
||||
|
||||
#define GC_NES_DELAY 6 /* Delay between bits - 6us */
|
||||
#define GC_NES_LENGTH 8 /* The NES pads use 8 bits of data */
|
||||
#define GC_SNES_LENGTH 12 /* The SNES true length is 16, but the last 4 bits are unused */
|
||||
#define GC_NES_DELAY 6 /* Delay between bits - 6us */
|
||||
#define GC_NES_LENGTH 8 /* The NES pads use 8 bits of data */
|
||||
#define GC_SNES_LENGTH 12 /* The SNES true length is 16, but the
|
||||
last 4 bits are unused */
|
||||
#define GC_SNESMOUSE_LENGTH 32 /* The SNES mouse uses 32 bits, the first
|
||||
16 bits are equivalent to a gamepad */
|
||||
|
||||
#define GC_NES_POWER 0xfc
|
||||
#define GC_NES_CLOCK 0x01
|
||||
@@ -242,11 +248,15 @@ static void gc_nes_read_packet(struct gc *gc, int length, unsigned char *data)
|
||||
|
||||
static void gc_nes_process_packet(struct gc *gc)
|
||||
{
|
||||
unsigned char data[GC_SNES_LENGTH];
|
||||
unsigned char data[GC_SNESMOUSE_LENGTH];
|
||||
struct input_dev *dev;
|
||||
int i, j, s;
|
||||
int i, j, s, len;
|
||||
char x_rel, y_rel;
|
||||
|
||||
gc_nes_read_packet(gc, gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH, data);
|
||||
len = gc->pads[GC_SNESMOUSE] ? GC_SNESMOUSE_LENGTH :
|
||||
(gc->pads[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH);
|
||||
|
||||
gc_nes_read_packet(gc, len, data);
|
||||
|
||||
for (i = 0; i < GC_MAX_DEVICES; i++) {
|
||||
|
||||
@@ -269,6 +279,44 @@ static void gc_nes_process_packet(struct gc *gc)
|
||||
for (j = 0; j < 8; j++)
|
||||
input_report_key(dev, gc_snes_btn[j], s & data[gc_snes_bytes[j]]);
|
||||
|
||||
if (s & gc->pads[GC_SNESMOUSE]) {
|
||||
/*
|
||||
* The 4 unused bits from SNES controllers appear to be ID bits
|
||||
* so use them to make sure iwe are dealing with a mouse.
|
||||
* gamepad is connected. This is important since
|
||||
* my SNES gamepad sends 1's for bits 16-31, which
|
||||
* cause the mouse pointer to quickly move to the
|
||||
* upper left corner of the screen.
|
||||
*/
|
||||
if (!(s & data[12]) && !(s & data[13]) &&
|
||||
!(s & data[14]) && (s & data[15])) {
|
||||
input_report_key(dev, BTN_LEFT, s & data[9]);
|
||||
input_report_key(dev, BTN_RIGHT, s & data[8]);
|
||||
|
||||
x_rel = y_rel = 0;
|
||||
for (j = 0; j < 7; j++) {
|
||||
x_rel <<= 1;
|
||||
if (data[25 + j] & s)
|
||||
x_rel |= 1;
|
||||
|
||||
y_rel <<= 1;
|
||||
if (data[17 + j] & s)
|
||||
y_rel |= 1;
|
||||
}
|
||||
|
||||
if (x_rel) {
|
||||
if (data[24] & s)
|
||||
x_rel = -x_rel;
|
||||
input_report_rel(dev, REL_X, x_rel);
|
||||
}
|
||||
|
||||
if (y_rel) {
|
||||
if (data[16] & s)
|
||||
y_rel = -y_rel;
|
||||
input_report_rel(dev, REL_Y, y_rel);
|
||||
}
|
||||
}
|
||||
}
|
||||
input_sync(dev);
|
||||
}
|
||||
}
|
||||
@@ -524,10 +572,10 @@ static void gc_timer(unsigned long private)
|
||||
gc_n64_process_packet(gc);
|
||||
|
||||
/*
|
||||
* NES and SNES pads
|
||||
* NES and SNES pads or mouse
|
||||
*/
|
||||
|
||||
if (gc->pads[GC_NES] || gc->pads[GC_SNES])
|
||||
if (gc->pads[GC_NES] || gc->pads[GC_SNES] || gc->pads[GC_SNESMOUSE])
|
||||
gc_nes_process_packet(gc);
|
||||
|
||||
/*
|
||||
@@ -552,7 +600,7 @@ static int gc_open(struct input_dev *dev)
|
||||
struct gc *gc = dev->private;
|
||||
int err;
|
||||
|
||||
err = down_interruptible(&gc->sem);
|
||||
err = mutex_lock_interruptible(&gc->mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -562,7 +610,7 @@ static int gc_open(struct input_dev *dev)
|
||||
mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME);
|
||||
}
|
||||
|
||||
up(&gc->sem);
|
||||
mutex_unlock(&gc->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -570,13 +618,13 @@ static void gc_close(struct input_dev *dev)
|
||||
{
|
||||
struct gc *gc = dev->private;
|
||||
|
||||
down(&gc->sem);
|
||||
mutex_lock(&gc->mutex);
|
||||
if (!--gc->used) {
|
||||
del_timer_sync(&gc->timer);
|
||||
parport_write_control(gc->pd->port, 0x00);
|
||||
parport_release(gc->pd);
|
||||
}
|
||||
up(&gc->sem);
|
||||
mutex_unlock(&gc->mutex);
|
||||
}
|
||||
|
||||
static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type)
|
||||
@@ -609,10 +657,13 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type)
|
||||
input_dev->open = gc_open;
|
||||
input_dev->close = gc_close;
|
||||
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
if (pad_type != GC_SNESMOUSE) {
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
input_set_abs_params(input_dev, ABS_X + i, -1, 1, 0, 0);
|
||||
for (i = 0; i < 2; i++)
|
||||
input_set_abs_params(input_dev, ABS_X + i, -1, 1, 0, 0);
|
||||
} else
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
|
||||
|
||||
gc->pads[0] |= gc_status_bit[idx];
|
||||
gc->pads[pad_type] |= gc_status_bit[idx];
|
||||
@@ -630,6 +681,13 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type)
|
||||
|
||||
break;
|
||||
|
||||
case GC_SNESMOUSE:
|
||||
set_bit(BTN_LEFT, input_dev->keybit);
|
||||
set_bit(BTN_RIGHT, input_dev->keybit);
|
||||
set_bit(REL_X, input_dev->relbit);
|
||||
set_bit(REL_Y, input_dev->relbit);
|
||||
break;
|
||||
|
||||
case GC_SNES:
|
||||
for (i = 4; i < 8; i++)
|
||||
set_bit(gc_snes_btn[i], input_dev->keybit);
|
||||
@@ -693,7 +751,7 @@ static struct gc __init *gc_probe(int parport, int *pads, int n_pads)
|
||||
goto err_unreg_pardev;
|
||||
}
|
||||
|
||||
init_MUTEX(&gc->sem);
|
||||
mutex_init(&gc->mutex);
|
||||
gc->pd = pd;
|
||||
init_timer(&gc->timer);
|
||||
gc->timer.data = (long) gc;
|
||||
|
||||
@@ -42,14 +42,14 @@ static int make_magnitude_modifier(struct iforce* iforce,
|
||||
unsigned char data[3];
|
||||
|
||||
if (!no_alloc) {
|
||||
down(&iforce->mem_mutex);
|
||||
mutex_lock(&iforce->mem_mutex);
|
||||
if (allocate_resource(&(iforce->device_memory), mod_chunk, 2,
|
||||
iforce->device_memory.start, iforce->device_memory.end, 2L,
|
||||
NULL, NULL)) {
|
||||
up(&iforce->mem_mutex);
|
||||
mutex_unlock(&iforce->mem_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
up(&iforce->mem_mutex);
|
||||
mutex_unlock(&iforce->mem_mutex);
|
||||
}
|
||||
|
||||
data[0] = LO(mod_chunk->start);
|
||||
@@ -75,14 +75,14 @@ static int make_period_modifier(struct iforce* iforce,
|
||||
period = TIME_SCALE(period);
|
||||
|
||||
if (!no_alloc) {
|
||||
down(&iforce->mem_mutex);
|
||||
mutex_lock(&iforce->mem_mutex);
|
||||
if (allocate_resource(&(iforce->device_memory), mod_chunk, 0x0c,
|
||||
iforce->device_memory.start, iforce->device_memory.end, 2L,
|
||||
NULL, NULL)) {
|
||||
up(&iforce->mem_mutex);
|
||||
mutex_unlock(&iforce->mem_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
up(&iforce->mem_mutex);
|
||||
mutex_unlock(&iforce->mem_mutex);
|
||||
}
|
||||
|
||||
data[0] = LO(mod_chunk->start);
|
||||
@@ -115,14 +115,14 @@ static int make_envelope_modifier(struct iforce* iforce,
|
||||
fade_duration = TIME_SCALE(fade_duration);
|
||||
|
||||
if (!no_alloc) {
|
||||
down(&iforce->mem_mutex);
|
||||
mutex_lock(&iforce->mem_mutex);
|
||||
if (allocate_resource(&(iforce->device_memory), mod_chunk, 0x0e,
|
||||
iforce->device_memory.start, iforce->device_memory.end, 2L,
|
||||
NULL, NULL)) {
|
||||
up(&iforce->mem_mutex);
|
||||
mutex_unlock(&iforce->mem_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
up(&iforce->mem_mutex);
|
||||
mutex_unlock(&iforce->mem_mutex);
|
||||
}
|
||||
|
||||
data[0] = LO(mod_chunk->start);
|
||||
@@ -152,14 +152,14 @@ static int make_condition_modifier(struct iforce* iforce,
|
||||
unsigned char data[10];
|
||||
|
||||
if (!no_alloc) {
|
||||
down(&iforce->mem_mutex);
|
||||
mutex_lock(&iforce->mem_mutex);
|
||||
if (allocate_resource(&(iforce->device_memory), mod_chunk, 8,
|
||||
iforce->device_memory.start, iforce->device_memory.end, 2L,
|
||||
NULL, NULL)) {
|
||||
up(&iforce->mem_mutex);
|
||||
mutex_unlock(&iforce->mem_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
up(&iforce->mem_mutex);
|
||||
mutex_unlock(&iforce->mem_mutex);
|
||||
}
|
||||
|
||||
data[0] = LO(mod_chunk->start);
|
||||
|
||||
@@ -350,7 +350,7 @@ int iforce_init_device(struct iforce *iforce)
|
||||
|
||||
init_waitqueue_head(&iforce->wait);
|
||||
spin_lock_init(&iforce->xmit_lock);
|
||||
init_MUTEX(&iforce->mem_mutex);
|
||||
mutex_init(&iforce->mem_mutex);
|
||||
iforce->xmit.buf = iforce->xmit_data;
|
||||
iforce->dev = input_dev;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user