Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
19450cd4
Commit
19450cd4
authored
Jun 14, 2003
by
Vojtech Pavlik
Browse files
Options
Browse Files
Download
Plain Diff
Merge suse.cz:/home/vojtech/bk/linus into suse.cz:/home/vojtech/bk/input
parents
5ba15264
009ce6ad
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
382 additions
and
30 deletions
+382
-30
drivers/char/keyboard.c
drivers/char/keyboard.c
+5
-3
drivers/char/vt_ioctl.c
drivers/char/vt_ioctl.c
+2
-2
drivers/input/evdev.c
drivers/input/evdev.c
+35
-2
drivers/input/gameport/gameport.c
drivers/input/gameport/gameport.c
+1
-1
drivers/input/input.c
drivers/input/input.c
+24
-3
drivers/input/joystick/analog.c
drivers/input/joystick/analog.c
+1
-1
drivers/input/keyboard/atkbd.c
drivers/input/keyboard/atkbd.c
+1
-1
drivers/input/keyboard/sunkbd.c
drivers/input/keyboard/sunkbd.c
+1
-1
drivers/input/misc/pcspkr.c
drivers/input/misc/pcspkr.c
+1
-1
drivers/input/serio/Kconfig
drivers/input/serio/Kconfig
+11
-0
drivers/input/serio/Makefile
drivers/input/serio/Makefile
+1
-0
drivers/input/serio/i8042-io.h
drivers/input/serio/i8042-io.h
+7
-4
drivers/input/serio/pcips2.c
drivers/input/serio/pcips2.c
+230
-0
drivers/usb/input/hid-core.c
drivers/usb/input/hid-core.c
+10
-2
drivers/usb/input/hid-input.c
drivers/usb/input/hid-input.c
+19
-0
drivers/usb/input/hid.h
drivers/usb/input/hid.h
+9
-7
drivers/usb/input/hiddev.c
drivers/usb/input/hiddev.c
+10
-0
include/asm-i386/timex.h
include/asm-i386/timex.h
+1
-1
include/asm-x86_64/timex.h
include/asm-x86_64/timex.h
+1
-1
include/linux/input.h
include/linux/input.h
+12
-0
No files found.
drivers/char/keyboard.c
View file @
19450cd4
...
...
@@ -52,11 +52,13 @@ extern void ctrl_alt_del(void);
/*
* Some laptops take the 789uiojklm,. keys as number pad when NumLock is on.
* This seems a good reason to start with NumLock off. On PC9800 however there
* is no NumLock key and everyone expects the keypad to be used for numbers.
* This seems a good reason to start with NumLock off. On PC9800 and HIL keyboards
* of PARISC machines however there is no NumLock key and everyone expects the keypad
* to be used for numbers.
*/
#ifdef CONFIG_X86_PC9800
#if defined(CONFIG_X86_PC9800) || \
defined(CONFIG_PARISC) && (defined(CONFIG_KEYBOARD_HIL) || defined(CONFIG_KEYBOARD_HIL_OLD))
#define KBD_DEFLEDS (1 << VC_NUMLOCK)
#else
#define KBD_DEFLEDS 0
...
...
drivers/char/vt_ioctl.c
View file @
19450cd4
...
...
@@ -395,7 +395,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
if
(
!
perm
)
return
-
EPERM
;
if
(
arg
)
arg
=
119318
0
/
arg
;
arg
=
119318
2
/
arg
;
kd_mksound
(
arg
,
0
);
return
0
;
...
...
@@ -412,7 +412,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
ticks
=
HZ
*
((
arg
>>
16
)
&
0xffff
)
/
1000
;
count
=
ticks
?
(
arg
&
0xffff
)
:
0
;
if
(
count
)
count
=
119318
0
/
count
;
count
=
119318
2
/
count
;
kd_mksound
(
count
,
ticks
);
return
0
;
}
...
...
drivers/input/evdev.c
View file @
19450cd4
...
...
@@ -29,6 +29,7 @@ struct evdev {
char
name
[
16
];
struct
input_handle
handle
;
wait_queue_head_t
wait
;
struct
evdev_list
*
grab
;
struct
list_head
list
;
};
...
...
@@ -48,7 +49,8 @@ static void evdev_event(struct input_handle *handle, unsigned int type, unsigned
struct
evdev
*
evdev
=
handle
->
private
;
struct
evdev_list
*
list
;
list_for_each_entry
(
list
,
&
evdev
->
list
,
node
)
{
if
(
evdev
->
grab
)
{
list
=
evdev
->
grab
;
do_gettimeofday
(
&
list
->
buffer
[
list
->
head
].
time
);
list
->
buffer
[
list
->
head
].
type
=
type
;
...
...
@@ -57,7 +59,17 @@ static void evdev_event(struct input_handle *handle, unsigned int type, unsigned
list
->
head
=
(
list
->
head
+
1
)
&
(
EVDEV_BUFFER_SIZE
-
1
);
kill_fasync
(
&
list
->
fasync
,
SIGIO
,
POLL_IN
);
}
}
else
list_for_each_entry
(
list
,
&
evdev
->
list
,
node
)
{
do_gettimeofday
(
&
list
->
buffer
[
list
->
head
].
time
);
list
->
buffer
[
list
->
head
].
type
=
type
;
list
->
buffer
[
list
->
head
].
code
=
code
;
list
->
buffer
[
list
->
head
].
value
=
value
;
list
->
head
=
(
list
->
head
+
1
)
&
(
EVDEV_BUFFER_SIZE
-
1
);
kill_fasync
(
&
list
->
fasync
,
SIGIO
,
POLL_IN
);
}
wake_up_interruptible
(
&
evdev
->
wait
);
}
...
...
@@ -88,6 +100,11 @@ static int evdev_release(struct inode * inode, struct file * file)
{
struct
evdev_list
*
list
=
file
->
private_data
;
if
(
list
->
evdev
->
grab
==
list
)
{
input_release_device
(
&
list
->
evdev
->
handle
);
list
->
evdev
->
grab
=
NULL
;
}
evdev_fasync
(
-
1
,
file
,
0
);
list_del
(
&
list
->
node
);
...
...
@@ -257,6 +274,22 @@ static int evdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
return
-
EFAULT
;
return
0
;
case
EVIOCGRAB
:
if
(
arg
)
{
if
(
evdev
->
grab
)
return
-
EBUSY
;
if
(
input_grab_device
(
&
evdev
->
handle
))
return
-
EBUSY
;
evdev
->
grab
=
list
;
return
0
;
}
else
{
if
(
evdev
->
grab
!=
list
)
return
-
EINVAL
;
input_release_device
(
&
evdev
->
handle
);
evdev
->
grab
=
NULL
;
return
0
;
}
default:
if
(
_IOC_TYPE
(
cmd
)
!=
'E'
||
_IOC_DIR
(
cmd
)
!=
_IOC_READ
)
...
...
drivers/input/gameport/gameport.c
View file @
19450cd4
...
...
@@ -37,7 +37,7 @@ static LIST_HEAD(gameport_dev_list);
#ifdef __i386__
#define DELTA(x,y) ((y)-(x)+((y)<(x)?119318
0
/HZ:0))
#define DELTA(x,y) ((y)-(x)+((y)<(x)?119318
2
/HZ:0))
#define GET_TIME(x) do { x = get_time_pit(); } while (0)
static
unsigned
int
get_time_pit
(
void
)
...
...
drivers/input/input.c
View file @
19450cd4
...
...
@@ -33,6 +33,8 @@ EXPORT_SYMBOL(input_register_device);
EXPORT_SYMBOL
(
input_unregister_device
);
EXPORT_SYMBOL
(
input_register_handler
);
EXPORT_SYMBOL
(
input_unregister_handler
);
EXPORT_SYMBOL
(
input_grab_device
);
EXPORT_SYMBOL
(
input_release_device
);
EXPORT_SYMBOL
(
input_open_device
);
EXPORT_SYMBOL
(
input_close_device
);
EXPORT_SYMBOL
(
input_accept_process
);
...
...
@@ -175,9 +177,12 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in
if
(
type
!=
EV_SYN
)
dev
->
sync
=
0
;
list_for_each_entry
(
handle
,
&
dev
->
h_list
,
d_node
)
if
(
handle
->
open
)
handle
->
handler
->
event
(
handle
,
type
,
code
,
value
);
if
(
dev
->
grab
)
dev
->
grab
->
handler
->
event
(
dev
->
grab
,
type
,
code
,
value
);
else
list_for_each_entry
(
handle
,
&
dev
->
h_list
,
d_node
)
if
(
handle
->
open
)
handle
->
handler
->
event
(
handle
,
type
,
code
,
value
);
}
static
void
input_repeat_key
(
unsigned
long
data
)
...
...
@@ -201,6 +206,21 @@ int input_accept_process(struct input_handle *handle, struct file *file)
return
0
;
}
int
input_grab_device
(
struct
input_handle
*
handle
)
{
if
(
handle
->
dev
->
grab
)
return
-
EBUSY
;
handle
->
dev
->
grab
=
handle
;
return
0
;
}
void
input_release_device
(
struct
input_handle
*
handle
)
{
if
(
handle
->
dev
->
grab
==
handle
)
handle
->
dev
->
grab
=
NULL
;
}
int
input_open_device
(
struct
input_handle
*
handle
)
{
if
(
handle
->
dev
->
pm_dev
)
...
...
@@ -221,6 +241,7 @@ int input_flush_device(struct input_handle* handle, struct file* file)
void
input_close_device
(
struct
input_handle
*
handle
)
{
input_release_device
(
handle
);
if
(
handle
->
dev
->
pm_dev
)
pm_dev_idle
(
handle
->
dev
->
pm_dev
);
if
(
handle
->
dev
->
close
)
...
...
drivers/input/joystick/analog.c
View file @
19450cd4
...
...
@@ -138,7 +138,7 @@ struct analog_port {
#ifdef __i386__
#define GET_TIME(x) do { if (cpu_has_tsc) rdtscl(x); else x = get_time_pit(); } while (0)
#define DELTA(x,y) (cpu_has_tsc?((y)-(x)):((x)-(y)+((x)<(y)?119318
0
L/HZ:0)))
#define DELTA(x,y) (cpu_has_tsc?((y)-(x)):((x)-(y)+((x)<(y)?119318
2
L/HZ:0)))
#define TIME_NAME (cpu_has_tsc?"TSC":"PIT")
static
unsigned
int
get_time_pit
(
void
)
{
...
...
drivers/input/keyboard/atkbd.c
View file @
19450cd4
...
...
@@ -39,7 +39,7 @@ static int atkbd_reset = 1;
static
unsigned
char
atkbd_set2_keycode
[
512
]
=
{
0
,
67
,
65
,
63
,
61
,
59
,
60
,
88
,
0
,
68
,
66
,
64
,
62
,
15
,
41
,
85
,
0
,
56
,
42
,
0
,
29
,
16
,
2
,
89
,
0
,
0
,
44
,
31
,
30
,
17
,
3
,
90
,
0
,
56
,
42
,
182
,
29
,
16
,
2
,
89
,
0
,
0
,
44
,
31
,
30
,
17
,
3
,
90
,
0
,
46
,
45
,
32
,
18
,
5
,
4
,
91
,
0
,
57
,
47
,
33
,
20
,
19
,
6
,
0
,
0
,
49
,
48
,
35
,
34
,
21
,
7
,
0
,
0
,
0
,
50
,
36
,
22
,
8
,
9
,
0
,
0
,
51
,
37
,
23
,
24
,
11
,
10
,
0
,
0
,
52
,
53
,
38
,
39
,
25
,
12
,
0
,
...
...
drivers/input/keyboard/sunkbd.c
View file @
19450cd4
...
...
@@ -271,7 +271,7 @@ static void sunkbd_connect(struct serio *serio, struct serio_dev *dev)
sprintf
(
sunkbd
->
name
,
"Sun Type %d keyboard"
,
sunkbd
->
type
);
memcpy
(
sunkbd
->
keycode
,
sunkbd_keycode
,
sizeof
(
sunkbd
->
keycode
));
for
(
i
=
0
;
i
<
12
7
;
i
++
)
for
(
i
=
0
;
i
<
12
8
;
i
++
)
set_bit
(
sunkbd
->
keycode
[
i
],
sunkbd
->
dev
.
keybit
);
clear_bit
(
0
,
sunkbd
->
dev
.
keybit
);
...
...
drivers/input/misc/pcspkr.c
View file @
19450cd4
...
...
@@ -43,7 +43,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c
}
if
(
value
>
20
&&
value
<
32767
)
count
=
1193182
/
value
;
count
=
CLOCK_TICK_RATE
/
value
;
spin_lock_irqsave
(
&
i8253_beep_lock
,
flags
);
...
...
drivers/input/serio/Kconfig
View file @
19450cd4
...
...
@@ -119,3 +119,14 @@ config SERIO_98KBD
The module will be called rpckbd.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
config SERIO_PCIPS2
tristate "PCI PS/2 keyboard and PS/2 mouse controller"
depends on PCI && SERIO
help
Say Y here if you have a Mobility Docking station with PS/2
keyboard and mice ports.
This driver is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called rpckbd. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
drivers/input/serio/Makefile
View file @
19450cd4
...
...
@@ -14,3 +14,4 @@ obj-$(CONFIG_SERIO_SA1111) += sa1111ps2.o
obj-$(CONFIG_SERIO_AMBAKMI)
+=
ambakmi.o
obj-$(CONFIG_SERIO_Q40KBD)
+=
q40kbd.o
obj-$(CONFIG_SERIO_98KBD)
+=
98kbd-io.o
obj-$(CONFIG_SERIO_PCIPS2)
+=
pcips2.o
drivers/input/serio/i8042-io.h
View file @
19450cd4
...
...
@@ -20,11 +20,14 @@
*/
#ifdef __alpha__
#define I8042_KBD_IRQ 1
#define I8042_AUX_IRQ (RTC_PORT(0) == 0x170 ? 9 : 12)
/* Jensen is special */
# define I8042_KBD_IRQ 1
# define I8042_AUX_IRQ (RTC_PORT(0) == 0x170 ? 9 : 12)
/* Jensen is special */
#elif defined(__ia64__)
# define I8042_KBD_IRQ isa_irq_to_vector(1)
# define I8042_AUX_IRQ isa_irq_to_vector(12)
#else
#define I8042_KBD_IRQ 1
#define I8042_AUX_IRQ 12
#
define I8042_KBD_IRQ 1
#
define I8042_AUX_IRQ 12
#endif
/*
...
...
drivers/input/serio/pcips2.c
0 → 100644
View file @
19450cd4
/*
* linux/drivers/input/serio/pcips2.c
*
* Copyright (C) 2003 Russell King, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* I'm not sure if this is a generic PS/2 PCI interface or specific to
* the Mobility Electronics docking station.
*/
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/input.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <asm/io.h>
#define PS2_CTRL (0)
#define PS2_STATUS (1)
#define PS2_DATA (2)
#define PS2_CTRL_CLK (1<<0)
#define PS2_CTRL_DAT (1<<1)
#define PS2_CTRL_TXIRQ (1<<2)
#define PS2_CTRL_ENABLE (1<<3)
#define PS2_CTRL_RXIRQ (1<<4)
#define PS2_STAT_CLK (1<<0)
#define PS2_STAT_DAT (1<<1)
#define PS2_STAT_PARITY (1<<2)
#define PS2_STAT_RXFULL (1<<5)
#define PS2_STAT_TXBUSY (1<<6)
#define PS2_STAT_TXEMPTY (1<<7)
struct
pcips2_data
{
struct
serio
io
;
unsigned
int
base
;
struct
pci_dev
*
dev
;
};
static
int
pcips2_write
(
struct
serio
*
io
,
unsigned
char
val
)
{
struct
pcips2_data
*
ps2if
=
io
->
driver
;
unsigned
int
stat
;
do
{
stat
=
inb
(
ps2if
->
base
+
PS2_STATUS
);
cpu_relax
();
}
while
(
!
(
stat
&
PS2_STAT_TXEMPTY
));
outb
(
val
,
ps2if
->
base
+
PS2_DATA
);
return
0
;
}
static
void
pcips2_interrupt
(
int
irq
,
void
*
devid
,
struct
pt_regs
*
regs
)
{
struct
pcips2_data
*
ps2if
=
devid
;
unsigned
char
status
,
scancode
;
do
{
unsigned
int
flag
;
status
=
inb
(
ps2if
->
base
+
PS2_STATUS
);
if
(
!
(
status
&
PS2_STAT_RXFULL
))
break
;
scancode
=
inb
(
ps2if
->
base
+
PS2_DATA
);
if
(
status
==
0xff
&&
scancode
==
0xff
)
break
;
flag
=
(
status
&
PS2_STAT_PARITY
)
?
0
:
SERIO_PARITY
;
if
(
hweight8
(
scancode
)
&
1
)
flag
^=
SERIO_PARITY
;
serio_interrupt
(
&
ps2if
->
io
,
scancode
,
flag
,
regs
);
}
while
(
1
);
}
static
void
pcips2_flush_input
(
struct
pcips2_data
*
ps2if
)
{
unsigned
char
status
,
scancode
;
do
{
status
=
inb
(
ps2if
->
base
+
PS2_STATUS
);
if
(
!
(
status
&
PS2_STAT_RXFULL
))
break
;
scancode
=
inb
(
ps2if
->
base
+
PS2_DATA
);
if
(
status
==
0xff
&&
scancode
==
0xff
)
break
;
}
while
(
1
);
}
static
int
pcips2_open
(
struct
serio
*
io
)
{
struct
pcips2_data
*
ps2if
=
io
->
driver
;
int
ret
,
val
=
0
;
outb
(
PS2_CTRL_ENABLE
,
ps2if
->
base
);
pcips2_flush_input
(
ps2if
);
ret
=
request_irq
(
ps2if
->
dev
->
irq
,
pcips2_interrupt
,
SA_SHIRQ
,
"pcips2"
,
ps2if
);
if
(
ret
==
0
)
val
=
PS2_CTRL_ENABLE
|
PS2_CTRL_RXIRQ
;
outb
(
val
,
ps2if
->
base
);
return
ret
;
}
static
void
pcips2_close
(
struct
serio
*
io
)
{
struct
pcips2_data
*
ps2if
=
io
->
driver
;
outb
(
0
,
ps2if
->
base
);
free_irq
(
ps2if
->
dev
->
irq
,
ps2if
);
}
static
int
__devinit
pcips2_probe
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
struct
pcips2_data
*
ps2if
;
int
ret
;
ret
=
pci_enable_device
(
dev
);
if
(
ret
)
return
ret
;
if
(
!
request_region
(
pci_resource_start
(
dev
,
0
),
pci_resource_len
(
dev
,
0
),
"pcips2"
))
{
ret
=
-
EBUSY
;
goto
disable
;
}
ps2if
=
kmalloc
(
sizeof
(
struct
pcips2_data
),
GFP_KERNEL
);
if
(
!
ps2if
)
{
ret
=
-
ENOMEM
;
goto
release
;
}
memset
(
ps2if
,
0
,
sizeof
(
struct
pcips2_data
));
ps2if
->
io
.
type
=
SERIO_8042
;
ps2if
->
io
.
write
=
pcips2_write
;
ps2if
->
io
.
open
=
pcips2_open
;
ps2if
->
io
.
close
=
pcips2_close
;
ps2if
->
io
.
name
=
dev
->
dev
.
name
;
ps2if
->
io
.
phys
=
dev
->
dev
.
bus_id
;
ps2if
->
io
.
driver
=
ps2if
;
ps2if
->
dev
=
dev
;
ps2if
->
base
=
pci_resource_start
(
dev
,
0
);
pci_set_drvdata
(
dev
,
ps2if
);
serio_register_port
(
&
ps2if
->
io
);
return
0
;
release:
release_region
(
pci_resource_start
(
dev
,
0
),
pci_resource_len
(
dev
,
0
));
disable:
pci_disable_device
(
dev
);
return
ret
;
}
static
void
__devexit
pcips2_remove
(
struct
pci_dev
*
dev
)
{
struct
pcips2_data
*
ps2if
=
pci_get_drvdata
(
dev
);
serio_unregister_port
(
&
ps2if
->
io
);
release_region
(
pci_resource_start
(
dev
,
0
),
pci_resource_len
(
dev
,
0
));
pci_set_drvdata
(
dev
,
NULL
);
kfree
(
ps2if
);
pci_disable_device
(
dev
);
}
static
struct
pci_device_id
pcips2_ids
[]
=
{
{
.
vendor
=
0x14f2
,
/* MOBILITY */
.
device
=
0x0123
,
/* Keyboard */
.
subvendor
=
PCI_ANY_ID
,
.
subdevice
=
PCI_ANY_ID
,
.
class
=
PCI_CLASS_INPUT_KEYBOARD
<<
8
,
.
class_mask
=
0xffff00
,
},
{
.
vendor
=
0x14f2
,
/* MOBILITY */
.
device
=
0x0124
,
/* Mouse */
.
subvendor
=
PCI_ANY_ID
,
.
subdevice
=
PCI_ANY_ID
,
.
class
=
PCI_CLASS_INPUT_MOUSE
<<
8
,
.
class_mask
=
0xffff00
,
},
{
0
,
}
};
static
struct
pci_driver
pcips2_driver
=
{
.
name
=
"pcips2"
,
.
id_table
=
pcips2_ids
,
.
probe
=
pcips2_probe
,
.
remove
=
__devexit_p
(
pcips2_remove
),
.
driver
=
{
.
devclass
=
&
input_devclass
,
},
};
static
int
__init
pcips2_init
(
void
)
{
return
pci_module_init
(
&
pcips2_driver
);
}
static
void
__exit
pcips2_exit
(
void
)
{
pci_unregister_driver
(
&
pcips2_driver
);
}
module_init
(
pcips2_init
);
module_exit
(
pcips2_exit
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Russell King <rmk@arm.linux.org.uk>"
);
MODULE_DESCRIPTION
(
"PCI PS/2 keyboard/mouse driver"
);
MODULE_DEVICE_TABLE
(
pci
,
pcips2_ids
);
drivers/usb/input/hid-core.c
View file @
19450cd4
...
...
@@ -957,6 +957,10 @@ static void hid_output_field(struct hid_field *field, __u8 *data)
void
hid_output_report
(
struct
hid_report
*
report
,
__u8
*
data
)
{
unsigned
n
;
if
(
report
->
id
>
0
)
*
data
++
=
report
->
id
;
for
(
n
=
0
;
n
<
report
->
maxfield
;
n
++
)
hid_output_field
(
report
->
field
[
n
],
data
);
}
...
...
@@ -1051,7 +1055,7 @@ static int hid_submit_out(struct hid_device *hid)
report
=
hid
->
out
[
hid
->
outtail
];
hid_output_report
(
report
,
hid
->
outbuf
);
hid
->
urbout
->
transfer_buffer_length
=
((
report
->
size
-
1
)
>>
3
)
+
1
;
hid
->
urbout
->
transfer_buffer_length
=
((
report
->
size
-
1
)
>>
3
)
+
1
+
(
report
->
id
>
0
)
;
hid
->
urbout
->
dev
=
hid
->
dev
;
dbg
(
"submitting out urb"
);
...
...
@@ -1075,7 +1079,7 @@ static int hid_submit_ctrl(struct hid_device *hid)
if
(
dir
==
USB_DIR_OUT
)
hid_output_report
(
report
,
hid
->
ctrlbuf
);
hid
->
urbctrl
->
transfer_buffer_length
=
((
report
->
size
-
1
)
>>
3
)
+
1
+
(
(
report
->
id
>
0
)
&&
(
dir
!=
USB_DIR_OUT
)
);
hid
->
urbctrl
->
transfer_buffer_length
=
((
report
->
size
-
1
)
>>
3
)
+
1
+
(
report
->
id
>
0
);
hid
->
urbctrl
->
pipe
=
(
dir
==
USB_DIR_OUT
)
?
usb_sndctrlpipe
(
hid
->
dev
,
0
)
:
usb_rcvctrlpipe
(
hid
->
dev
,
0
);
hid
->
urbctrl
->
dev
=
hid
->
dev
;
...
...
@@ -1351,6 +1355,9 @@ void hid_init_reports(struct hid_device *hid)
#define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f
#define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100
#define USB_VENDOR_ID_A4TECH 0x09DA
#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006
struct
hid_blacklist
{
__u16
idVendor
;
__u16
idProduct
;
...
...
@@ -1398,6 +1405,7 @@ struct hid_blacklist {
{
USB_VENDOR_ID_ONTRAK
,
USB_DEVICE_ID_ONTRAK_ADU100
+
500
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_TANGTOP
,
USB_DEVICE_ID_TANGTOP_USBPS2
,
HID_QUIRK_NOGET
},
{
USB_VENDOR_ID_ESSENTIAL_REALITY
,
USB_DEVICE_ID_ESSENTIAL_REALITY_P5
,
HID_QUIRK_IGNORE
},
{
USB_VENDOR_ID_A4TECH
,
USB_DEVICE_ID_A4TECH_WCP32PU
,
HID_QUIRK_2WHEEL_MOUSE_HACK
},
{
0
,
0
}
};
...
...
drivers/usb/input/hid-input.c
View file @
19450cd4
...
...
@@ -376,6 +376,11 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
}
set_bit
(
usage
->
type
,
input
->
evbit
);
if
((
usage
->
type
==
EV_REL
)
&&
(
device
->
quirks
&
HID_QUIRK_2WHEEL_MOUSE_HACK
)
&&
(
usage
->
code
==
REL_WHEEL
))
{
set_bit
(
REL_HWHEEL
,
bit
);
}
while
(
usage
->
code
<=
max
&&
test_and_set_bit
(
usage
->
code
,
bit
))
{
usage
->
code
=
find_next_zero_bit
(
bit
,
max
+
1
,
usage
->
code
);
...
...
@@ -426,6 +431,20 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
input_regs
(
input
,
regs
);
if
((
hid
->
quirks
&
HID_QUIRK_2WHEEL_MOUSE_HACK
)
&&
(
usage
->
code
==
BTN_BACK
))
{
if
(
value
)
hid
->
quirks
|=
HID_QUIRK_2WHEEL_MOUSE_HACK_ON
;
else
hid
->
quirks
&=
~
HID_QUIRK_2WHEEL_MOUSE_HACK_ON
;
return
;
}
if
((
hid
->
quirks
&
HID_QUIRK_2WHEEL_MOUSE_HACK_ON
)
&&
(
usage
->
code
==
REL_WHEEL
))
{
input_event
(
input
,
usage
->
type
,
REL_HWHEEL
,
value
);
return
;
}
if
(
usage
->
hat_min
!=
usage
->
hat_max
)
{
value
=
(
value
-
usage
->
hat_min
)
*
8
/
(
usage
->
hat_max
-
usage
->
hat_min
+
1
)
+
1
;
if
(
value
<
0
||
value
>
8
)
value
=
0
;
...
...
drivers/usb/input/hid.h
View file @
19450cd4
...
...
@@ -201,13 +201,15 @@ struct hid_item {
* HID device quirks.
*/
#define HID_QUIRK_INVERT 0x01
#define HID_QUIRK_NOTOUCH 0x02
#define HID_QUIRK_IGNORE 0x04
#define HID_QUIRK_NOGET 0x08
#define HID_QUIRK_HIDDEV 0x10
#define HID_QUIRK_BADPAD 0x20
#define HID_QUIRK_MULTI_INPUT 0x40
#define HID_QUIRK_INVERT 0x001
#define HID_QUIRK_NOTOUCH 0x002
#define HID_QUIRK_IGNORE 0x004
#define HID_QUIRK_NOGET 0x008
#define HID_QUIRK_HIDDEV 0x010
#define HID_QUIRK_BADPAD 0x020
#define HID_QUIRK_MULTI_INPUT 0x040
#define HID_QUIRK_2WHEEL_MOUSE_HACK 0x080
#define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x100
/*
* This is the global environment of the parser. This information is
...
...
drivers/usb/input/hiddev.c
View file @
19450cd4
...
...
@@ -442,10 +442,14 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
if
(
copy_to_user
((
void
*
)
arg
,
&
dinfo
,
sizeof
(
dinfo
)))
return
-
EFAULT
;
return
0
;
case
HIDIOCGFLAG
:
if
(
put_user
(
list
->
flags
,
(
int
*
)
arg
))
return
-
EFAULT
;
return
0
;
case
HIDIOCSFLAG
:
{
int
newflags
;
...
...
@@ -533,6 +537,8 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
if
(
copy_to_user
((
void
*
)
arg
,
&
rinfo
,
sizeof
(
rinfo
)))
return
-
EFAULT
;
return
0
;
case
HIDIOCGFIELDINFO
:
if
(
copy_from_user
(
&
finfo
,
(
void
*
)
arg
,
sizeof
(
finfo
)))
return
-
EFAULT
;
...
...
@@ -564,6 +570,8 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
if
(
copy_to_user
((
void
*
)
arg
,
&
finfo
,
sizeof
(
finfo
)))
return
-
EFAULT
;
return
0
;
case
HIDIOCGUCODE
:
if
(
copy_from_user
(
&
uref
,
(
void
*
)
arg
,
sizeof
(
uref
)))
return
-
EFAULT
;
...
...
@@ -585,6 +593,8 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
if
(
copy_to_user
((
void
*
)
arg
,
&
uref
,
sizeof
(
uref
)))
return
-
EFAULT
;
return
0
;
case
HIDIOCGUSAGE
:
case
HIDIOCSUSAGE
:
case
HIDIOCGCOLLECTIONINDEX
:
...
...
include/asm-i386/timex.h
View file @
19450cd4
...
...
@@ -15,7 +15,7 @@
#ifdef CONFIG_MELAN
# define CLOCK_TICK_RATE 1189200
/* AMD Elan has different frequency! */
#else
# define CLOCK_TICK_RATE 119318
0
/* Underlying HZ */
# define CLOCK_TICK_RATE 119318
2
/* Underlying HZ */
#endif
#endif
...
...
include/asm-x86_64/timex.h
View file @
19450cd4
...
...
@@ -10,7 +10,7 @@
#include <asm/msr.h>
#include <asm/vsyscall.h>
#define CLOCK_TICK_RATE 119318
0
/* Underlying HZ */
#define CLOCK_TICK_RATE 119318
2
/* Underlying HZ */
#define CLOCK_TICK_FACTOR 20
/* Factor of both 1000000 and CLOCK_TICK_RATE */
#define FINETUNE ((((((int)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \
(1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \
...
...
include/linux/input.h
View file @
19450cd4
...
...
@@ -77,6 +77,8 @@ struct input_absinfo {
#define EVIOCRMFF _IOW('E', 0x81, int)
/* Erase a force effect */
#define EVIOCGEFFECTS _IOR('E', 0x84, int)
/* Report number of effects playable at the same time */
#define EVIOCGRAB _IOW('E', 0x90, int)
/* Grab/Release device */
/*
* Event types
*/
...
...
@@ -471,6 +473,11 @@ struct input_absinfo {
#define KEY_TEEN 0x19e
#define KEY_TWEN 0x19f
#define KEY_DEL_EOL 0x1c0
#define KEY_DEL_EOS 0x1c1
#define KEY_INS_LINE 0x1c2
#define KEY_DEL_LINE 0x1c3
#define KEY_MAX 0x1ff
/*
...
...
@@ -798,6 +805,8 @@ struct input_dev {
int
(
*
upload_effect
)(
struct
input_dev
*
dev
,
struct
ff_effect
*
effect
);
int
(
*
erase_effect
)(
struct
input_dev
*
dev
,
int
effect_id
);
struct
input_handle
*
grab
;
struct
list_head
h_list
;
struct
list_head
node
;
};
...
...
@@ -888,6 +897,9 @@ void input_unregister_device(struct input_dev *);
void
input_register_handler
(
struct
input_handler
*
);
void
input_unregister_handler
(
struct
input_handler
*
);
int
input_grab_device
(
struct
input_handle
*
);
void
input_release_device
(
struct
input_handle
*
);
int
input_open_device
(
struct
input_handle
*
);
void
input_close_device
(
struct
input_handle
*
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment