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
Kirill Smelkov
linux
Commits
471c2ba6
Commit
471c2ba6
authored
Aug 27, 2002
by
Vojtech Pavlik
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://ldm.bkbits.net/linux-2.5-input
into suse.cz:/home/vojtech/bk/pat
parents
47bfc88a
34151589
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
95 additions
and
112 deletions
+95
-112
drivers/char/keyboard.c
drivers/char/keyboard.c
+31
-15
drivers/input/input.c
drivers/input/input.c
+45
-85
drivers/input/mousedev.c
drivers/input/mousedev.c
+6
-6
include/linux/input.h
include/linux/input.h
+13
-6
No files found.
drivers/char/keyboard.c
View file @
471c2ba6
...
...
@@ -161,11 +161,16 @@ static int sysrq_alt;
*/
int
getkeycode
(
unsigned
int
scancode
)
{
struct
input_handle
*
handl
e
;
struct
list_head
*
nod
e
;
struct
input_dev
*
dev
=
NULL
;
for
(
handle
=
kbd_handler
.
handle
;
handle
;
handle
=
handle
->
hnext
)
if
(
handle
->
dev
->
keycodesize
)
{
dev
=
handle
->
dev
;
break
;
}
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
if
(
handle
->
dev
->
keycodesize
)
{
dev
=
handle
->
dev
;
break
;
}
}
if
(
!
dev
)
return
-
ENODEV
;
...
...
@@ -178,12 +183,17 @@ int getkeycode(unsigned int scancode)
int
setkeycode
(
unsigned
int
scancode
,
unsigned
int
keycode
)
{
struct
input_handle
*
handl
e
;
struct
list_head
*
nod
e
;
struct
input_dev
*
dev
=
NULL
;
int
i
,
oldkey
;
for
(
handle
=
kbd_handler
.
handle
;
handle
;
handle
=
handle
->
hnext
)
if
(
handle
->
dev
->
keycodesize
)
{
dev
=
handle
->
dev
;
break
;
}
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
if
(
handle
->
dev
->
keycodesize
)
{
dev
=
handle
->
dev
;
break
;
}
}
if
(
!
dev
)
return
-
ENODEV
;
...
...
@@ -209,27 +219,30 @@ int setkeycode(unsigned int scancode, unsigned int keycode)
*/
static
void
kd_nosound
(
unsigned
long
ignored
)
{
struct
input_handle
*
handl
e
;
struct
list_head
*
nod
e
;
for
(
handle
=
kbd_handler
.
handle
;
handle
;
handle
=
handle
->
hnext
)
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
if
(
test_bit
(
EV_SND
,
handle
->
dev
->
evbit
))
{
if
(
test_bit
(
SND_TONE
,
handle
->
dev
->
sndbit
))
input_event
(
handle
->
dev
,
EV_SND
,
SND_TONE
,
0
);
if
(
test_bit
(
SND_BELL
,
handle
->
dev
->
sndbit
))
input_event
(
handle
->
dev
,
EV_SND
,
SND_BELL
,
0
);
}
}
}
static
struct
timer_list
kd_mksound_timer
=
{
function
:
kd_nosound
};
void
kd_mksound
(
unsigned
int
hz
,
unsigned
int
ticks
)
{
struct
input_handle
*
handl
e
;
struct
list_head
*
nod
e
;
del_timer
(
&
kd_mksound_timer
);
if
(
hz
)
{
for
(
handle
=
kbd_handler
.
handle
;
handle
;
handle
=
handle
->
hnext
)
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
if
(
test_bit
(
EV_SND
,
handle
->
dev
->
evbit
))
{
if
(
test_bit
(
SND_TONE
,
handle
->
dev
->
sndbit
))
{
input_event
(
handle
->
dev
,
EV_SND
,
SND_TONE
,
hz
);
...
...
@@ -240,6 +253,7 @@ void kd_mksound(unsigned int hz, unsigned int ticks)
break
;
}
}
}
if
(
ticks
)
mod_timer
(
&
kd_mksound_timer
,
jiffies
+
ticks
);
}
else
...
...
@@ -251,12 +265,13 @@ void kd_mksound(unsigned int hz, unsigned int ticks)
*/
int
kbd_rate
(
struct
kbd_repeat
*
rep
)
{
struct
input_handle
*
handl
e
;
struct
list_head
*
nod
e
;
if
(
rep
->
rate
<
0
||
rep
->
delay
<
0
)
return
-
EINVAL
;
for
(
handle
=
kbd_handler
.
handle
;
handle
;
handle
=
handle
->
hnext
)
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
if
(
test_bit
(
EV_REP
,
handle
->
dev
->
evbit
))
{
if
(
rep
->
rate
>
HZ
)
rep
->
rate
=
HZ
;
handle
->
dev
->
rep
[
REP_PERIOD
]
=
rep
->
rate
?
(
HZ
/
rep
->
rate
)
:
0
;
...
...
@@ -264,7 +279,7 @@ int kbd_rate(struct kbd_repeat *rep)
if
(
handle
->
dev
->
rep
[
REP_DELAY
]
<
handle
->
dev
->
rep
[
REP_PERIOD
])
handle
->
dev
->
rep
[
REP_DELAY
]
=
handle
->
dev
->
rep
[
REP_PERIOD
];
}
}
return
0
;
}
...
...
@@ -874,11 +889,12 @@ static inline unsigned char getleds(void)
static
void
kbd_bh
(
unsigned
long
dummy
)
{
struct
input_handle
*
handle
;
struct
list_head
*
node
;
unsigned
char
leds
=
getleds
();
if
(
leds
!=
ledstate
)
{
for
(
handle
=
kbd_handler
.
handle
;
handle
;
handle
=
handle
->
hnext
)
{
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
input_event
(
handle
->
dev
,
EV_LED
,
LED_SCROLLL
,
!!
(
leds
&
0x01
));
input_event
(
handle
->
dev
,
EV_LED
,
LED_NUML
,
!!
(
leds
&
0x02
));
input_event
(
handle
->
dev
,
EV_LED
,
LED_CAPSL
,
!!
(
leds
&
0x04
));
...
...
drivers/input/input.c
View file @
471c2ba6
...
...
@@ -58,8 +58,9 @@ EXPORT_SYMBOL(input_event);
#define INPUT_MAJOR 13
#define INPUT_DEVICES 256
static
struct
input_dev
*
input_dev
;
static
struct
input_handler
*
input_handler
;
static
LIST_HEAD
(
input_dev_list
);
static
LIST_HEAD
(
input_handler_list
);
static
struct
input_handler
*
input_table
[
8
];
static
devfs_handle_t
input_devfs_handle
;
...
...
@@ -69,9 +70,10 @@ DECLARE_WAIT_QUEUE_HEAD(input_devices_poll_wait);
static
int
input_devices_state
;
#endif
void
input_event
(
struct
input_dev
*
dev
,
unsigned
int
type
,
unsigned
int
code
,
int
value
)
{
struct
input_handle
*
handle
=
dev
->
handl
e
;
struct
list_head
*
nod
e
;
if
(
dev
->
pm_dev
)
pm_access
(
dev
->
pm_dev
);
...
...
@@ -190,10 +192,10 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in
if
(
type
!=
EV_SYN
)
dev
->
sync
=
0
;
while
(
handle
)
{
list_for_each
(
node
,
&
dev
->
h_list
)
{
struct
input_handle
*
handle
=
to_handle
(
node
);
if
(
handle
->
open
)
handle
->
handler
->
event
(
handle
,
type
,
code
,
value
);
handle
=
handle
->
dnext
;
}
}
...
...
@@ -247,41 +249,8 @@ void input_close_device(struct input_handle *handle)
static
void
input_link_handle
(
struct
input_handle
*
handle
)
{
handle
->
dnext
=
handle
->
dev
->
handle
;
handle
->
hnext
=
handle
->
handler
->
handle
;
handle
->
dev
->
handle
=
handle
;
handle
->
handler
->
handle
=
handle
;
}
/**
* input_find_and_remove - Find and remove node
*
* @type: data type
* @initval: initial value
* @targ: node to find
* @next: next node in the list
*
* Searches the linked list for the target node @targ. If the node
* is found, it is removed from the list.
*
* If the node is not found, the end of the list will be hit,
* indicating that it wasn't in the list to begin with.
*
* Returns nothing.
*/
#define input_find_and_remove(type, initval, targ, next) \
do { \
type **ptr; \
for (ptr = &initval; *ptr; ptr = &((*ptr)->next)) \
if (*ptr == targ) break; \
if (*ptr) *ptr = (*ptr)->next; \
} while (0)
static
void
input_unlink_handle
(
struct
input_handle
*
handle
)
{
input_find_and_remove
(
struct
input_handle
,
handle
->
dev
->
handle
,
handle
,
dnext
);
input_find_and_remove
(
struct
input_handle
,
handle
->
handler
->
handle
,
handle
,
hnext
);
list_add_tail
(
&
handle
->
d_node
,
&
handle
->
dev
->
h_list
);
list_add_tail
(
&
handle
->
h_node
,
&
handle
->
handler
->
h_list
);
}
#define MATCH_BIT(bit, max) \
...
...
@@ -442,7 +411,7 @@ static void input_call_hotplug(char *verb, struct input_dev *dev)
void
input_register_device
(
struct
input_dev
*
dev
)
{
struct
input_handler
*
handler
=
input_handler
;
struct
list_head
*
node
;
struct
input_handle
*
handle
;
struct
input_device_id
*
id
;
...
...
@@ -465,19 +434,17 @@ void input_register_device(struct input_dev *dev)
/*
* Add the device.
*/
dev
->
next
=
input_dev
;
input_dev
=
dev
;
INIT_LIST_HEAD
(
&
dev
->
h_list
);
list_add_tail
(
&
dev
->
node
,
&
input_dev_list
);
/*
* Notify handlers.
*/
while
(
handler
)
{
list_for_each
(
node
,
&
input_handler_list
)
{
struct
input_handler
*
handler
=
to_handler
(
node
);
if
((
id
=
input_match_device
(
handler
->
id_table
,
dev
)))
if
((
handle
=
handler
->
connect
(
handler
,
dev
,
id
)))
input_link_handle
(
handle
);
handler
=
handler
->
next
;
}
/*
...
...
@@ -500,8 +467,7 @@ void input_register_device(struct input_dev *dev)
void
input_unregister_device
(
struct
input_dev
*
dev
)
{
struct
input_handle
*
handle
=
dev
->
handle
;
struct
input_handle
*
dnext
;
struct
list_head
*
node
,
*
next
;
if
(
!
dev
)
return
;
...
...
@@ -521,11 +487,11 @@ void input_unregister_device(struct input_dev *dev)
* Notify handlers.
*/
while
(
handle
)
{
dnext
=
handle
->
dnext
;
input_unlink_handle
(
handle
);
list_for_each_safe
(
node
,
next
,
&
dev
->
h_list
)
{
struct
input_handle
*
handle
=
to_handle
(
node
);
list_del_init
(
&
handle
->
d_node
);
list_del_init
(
&
handle
->
h_node
);
handle
->
handler
->
disconnect
(
handle
);
handle
=
dnext
;
}
/*
...
...
@@ -539,7 +505,7 @@ void input_unregister_device(struct input_dev *dev)
/*
* Remove the device.
*/
input_find_and_remove
(
struct
input_dev
,
input_dev
,
dev
,
next
);
list_del_init
(
&
dev
->
node
);
/*
* Notify /proc.
...
...
@@ -553,12 +519,13 @@ void input_unregister_device(struct input_dev *dev)
void
input_register_handler
(
struct
input_handler
*
handler
)
{
struct
input_dev
*
dev
=
input_dev
;
struct
list_head
*
node
;
struct
input_handle
*
handle
;
struct
input_device_id
*
id
;
if
(
!
handler
)
return
;
INIT_LIST_HEAD
(
&
handler
->
h_list
);
/*
* Add minors if needed.
*/
...
...
@@ -569,19 +536,17 @@ void input_register_handler(struct input_handler *handler)
/*
* Add the handler.
*/
handler
->
next
=
input_handler
;
input_handler
=
handler
;
list_add_tail
(
&
handler
->
node
,
&
input_handler_list
);
/*
* Notify it about all existing devices.
*/
while
(
dev
)
{
list_for_each
(
node
,
&
input_dev_list
)
{
struct
input_dev
*
dev
=
to_dev
(
node
);
if
((
id
=
input_match_device
(
handler
->
id_table
,
dev
)))
if
((
handle
=
handler
->
connect
(
handler
,
dev
,
id
)))
input_link_handle
(
handle
);
dev
=
dev
->
next
;
}
/*
...
...
@@ -596,25 +561,23 @@ void input_register_handler(struct input_handler *handler)
void
input_unregister_handler
(
struct
input_handler
*
handler
)
{
struct
input_handle
*
handle
=
handler
->
handle
;
struct
input_handle
*
hnext
;
struct
list_head
*
node
,
*
next
;
/*
* Tell the handler to disconnect from all devices it keeps open.
*/
while
(
handle
)
{
hnext
=
handle
->
hnext
;
input_unlink_handle
(
handl
e
);
list_for_each_safe
(
node
,
next
,
&
handler
->
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
list_del_init
(
&
handle
->
h_node
)
;
list_del_init
(
&
handle
->
d_nod
e
);
handler
->
disconnect
(
handle
);
handle
=
hnext
;
}
/*
* Remove it.
*/
input_find_and_remove
(
struct
input_handler
,
input_handler
,
handler
,
next
);
list_del_init
(
&
handler
->
node
);
/*
* Remove minors.
...
...
@@ -715,13 +678,14 @@ static unsigned int input_devices_poll(struct file *file, poll_table *wait)
static
int
input_devices_read
(
char
*
buf
,
char
**
start
,
off_t
pos
,
int
count
,
int
*
eof
,
void
*
data
)
{
struct
input_dev
*
dev
=
input_dev
;
struct
input_handle
*
handle
;
struct
list_head
*
node
;
off_t
at
=
0
;
int
i
,
len
,
cnt
=
0
;
while
(
dev
)
{
list_for_each
(
node
,
&
input_dev_list
)
{
struct
input_dev
*
dev
=
to_dev
(
node
);
struct
list_head
*
hnode
;
len
=
sprintf
(
buf
,
"I: Bus=%04x Vendor=%04x Product=%04x Version=%04x
\n
"
,
dev
->
id
.
bustype
,
dev
->
id
.
vendor
,
dev
->
id
.
product
,
dev
->
id
.
version
);
...
...
@@ -730,11 +694,9 @@ static int input_devices_read(char *buf, char **start, off_t pos, int count, int
len
+=
sprintf
(
buf
+
len
,
"P: Phys=%s
\n
"
,
dev
->
phys
?
dev
->
phys
:
""
);
len
+=
sprintf
(
buf
+
len
,
"D: Drivers="
);
handle
=
dev
->
handle
;
while
(
handle
)
{
list_for_each
(
hnode
,
&
dev
->
h_list
)
{
struct
input_handle
*
handle
=
to_handle
(
hnode
);
len
+=
sprintf
(
buf
+
len
,
"%s "
,
handle
->
name
);
handle
=
handle
->
dnext
;
}
len
+=
sprintf
(
buf
+
len
,
"
\n
"
);
...
...
@@ -761,24 +723,24 @@ static int input_devices_read(char *buf, char **start, off_t pos, int count, int
if
(
cnt
>=
count
)
break
;
}
dev
=
dev
->
next
;
}
if
(
!
dev
)
*
eof
=
1
;
if
(
node
==
&
input_dev_list
)
*
eof
=
1
;
return
(
count
>
cnt
)
?
cnt
:
count
;
}
static
int
input_handlers_read
(
char
*
buf
,
char
**
start
,
off_t
pos
,
int
count
,
int
*
eof
,
void
*
data
)
{
struct
input_handler
*
handler
=
input_handler
;
struct
list_head
*
node
;
off_t
at
=
0
;
int
len
=
0
,
cnt
=
0
;
int
i
=
0
;
while
(
handler
)
{
list_for_each
(
node
,
&
input_handler_list
)
{
struct
input_handler
*
handler
=
to_handler
(
node
);
if
(
handler
->
fops
)
len
=
sprintf
(
buf
,
"N: Number=%d Name=%s Minor=%d
\n
"
,
...
...
@@ -798,11 +760,9 @@ static int input_handlers_read(char *buf, char **start, off_t pos, int count, in
if
(
cnt
>=
count
)
break
;
}
handler
=
handler
->
next
;
}
if
(
!
handler
)
*
eof
=
1
;
if
(
node
==
&
input_handler_list
)
*
eof
=
1
;
return
(
count
>
cnt
)
?
cnt
:
count
;
}
...
...
drivers/input/mousedev.c
View file @
471c2ba6
...
...
@@ -200,8 +200,9 @@ static int mousedev_release(struct inode * inode, struct file * file)
if
(
!--
list
->
mousedev
->
open
)
{
if
(
list
->
mousedev
->
minor
==
MOUSEDEV_MIX
)
{
struct
input_handle
*
handle
=
mousedev_handler
.
handle
;
while
(
handle
)
{
struct
list_head
*
node
;
list_for_each
(
node
,
&
mousedev_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
struct
mousedev
*
mousedev
=
handle
->
private
;
if
(
!
mousedev
->
open
)
{
if
(
mousedev
->
exist
)
{
...
...
@@ -212,7 +213,6 @@ static int mousedev_release(struct inode * inode, struct file * file)
kfree
(
mousedev
);
}
}
handle
=
handle
->
hnext
;
}
}
else
{
if
(
!
mousedev_mix
.
open
)
{
...
...
@@ -258,13 +258,13 @@ static int mousedev_open(struct inode * inode, struct file * file)
if
(
!
list
->
mousedev
->
open
++
)
{
if
(
list
->
mousedev
->
minor
==
MOUSEDEV_MIX
)
{
struct
input_handle
*
handle
=
mousedev_handler
.
handle
;
while
(
handle
)
{
struct
list_head
*
node
;
list_for_each
(
node
,
&
mousedev_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
struct
mousedev
*
mousedev
=
handle
->
private
;
if
(
!
mousedev
->
open
)
if
(
mousedev
->
exist
)
input_open_device
(
handle
);
handle
=
handle
->
hnext
;
}
}
else
{
if
(
!
mousedev_mix
.
open
)
...
...
include/linux/input.h
View file @
471c2ba6
...
...
@@ -811,8 +811,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
*
handle
;
struct
input_dev
*
next
;
struct
list_head
h_list
;
struct
list_head
node
;
};
/*
...
...
@@ -856,6 +856,8 @@ struct input_device_id {
unsigned
long
driver_info
;
};
struct
input_handle
;
struct
input_handler
{
void
*
private
;
...
...
@@ -870,8 +872,8 @@ struct input_handler {
struct
input_device_id
*
id_table
;
struct
input_handle
*
handle
;
struct
input_handler
*
next
;
struct
list_head
h_list
;
struct
list_head
node
;
};
struct
input_handle
{
...
...
@@ -884,10 +886,15 @@ struct input_handle {
struct
input_dev
*
dev
;
struct
input_handler
*
handler
;
struct
input_handle
*
dnext
;
struct
input_handle
*
hnext
;
struct
list_head
d_node
;
struct
list_head
h_node
;
};
#define to_dev(n) container_of(n,struct input_dev,node)
#define to_handler(n) container_of(n,struct input_handler,node);
#define to_handle(n) container_of(n,struct input_handle,d_node)
#define to_handle_h(n) container_of(n,struct input_handle,h_node)
void
input_register_device
(
struct
input_dev
*
);
void
input_unregister_device
(
struct
input_dev
*
);
...
...
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