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
9657d75c
Commit
9657d75c
authored
Jun 14, 2007
by
Dmitry Torokhov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Input: convert from class devices to standard devices
Signed-off-by:
Dmitry Torokhov
<
dtor@mail.ru
>
parent
d63219a1
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
345 additions
and
309 deletions
+345
-309
drivers/input/evdev.c
drivers/input/evdev.c
+42
-42
drivers/input/input.c
drivers/input/input.c
+74
-62
drivers/input/joydev.c
drivers/input/joydev.c
+43
-41
drivers/input/mousedev.c
drivers/input/mousedev.c
+132
-110
drivers/input/tsdev.c
drivers/input/tsdev.c
+44
-44
include/linux/input.h
include/linux/input.h
+10
-10
No files found.
drivers/input/evdev.c
View file @
9657d75c
...
...
@@ -30,6 +30,7 @@ struct evdev {
wait_queue_head_t
wait
;
struct
evdev_client
*
grab
;
struct
list_head
client_list
;
struct
device
dev
;
};
struct
evdev_client
{
...
...
@@ -94,8 +95,10 @@ static int evdev_flush(struct file *file, fl_owner_t id)
return
input_flush_device
(
&
evdev
->
handle
,
file
);
}
static
void
evdev_free
(
struct
evdev
*
ev
dev
)
static
void
evdev_free
(
struct
device
*
dev
)
{
struct
evdev
*
evdev
=
container_of
(
dev
,
struct
evdev
,
dev
);
evdev_table
[
evdev
->
minor
]
=
NULL
;
kfree
(
evdev
);
}
...
...
@@ -114,12 +117,10 @@ static int evdev_release(struct inode *inode, struct file *file)
list_del
(
&
client
->
node
);
kfree
(
client
);
if
(
!--
evdev
->
open
)
{
if
(
evdev
->
exist
)
input_close_device
(
&
evdev
->
handle
);
else
evdev_free
(
evdev
);
}
if
(
!--
evdev
->
open
&&
evdev
->
exist
)
input_close_device
(
&
evdev
->
handle
);
put_device
(
&
evdev
->
dev
);
return
0
;
}
...
...
@@ -139,24 +140,32 @@ static int evdev_open(struct inode *inode, struct file *file)
if
(
!
evdev
||
!
evdev
->
exist
)
return
-
ENODEV
;
get_device
(
&
evdev
->
dev
);
client
=
kzalloc
(
sizeof
(
struct
evdev_client
),
GFP_KERNEL
);
if
(
!
client
)
return
-
ENOMEM
;
if
(
!
client
)
{
error
=
-
ENOMEM
;
goto
err_put_evdev
;
}
client
->
evdev
=
evdev
;
list_add_tail
(
&
client
->
node
,
&
evdev
->
client_list
);
if
(
!
evdev
->
open
++
&&
evdev
->
exist
)
{
error
=
input_open_device
(
&
evdev
->
handle
);
if
(
error
)
{
list_del
(
&
client
->
node
);
kfree
(
client
);
return
error
;
}
if
(
error
)
goto
err_free_client
;
}
file
->
private_data
=
client
;
return
0
;
err_free_client:
list_del
(
&
client
->
node
);
kfree
(
client
);
err_put_evdev:
put_device
(
&
evdev
->
dev
);
return
error
;
}
#ifdef CONFIG_COMPAT
...
...
@@ -625,8 +634,6 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
const
struct
input_device_id
*
id
)
{
struct
evdev
*
evdev
;
struct
class_device
*
cdev
;
dev_t
devt
;
int
minor
;
int
error
;
...
...
@@ -649,38 +656,32 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
evdev
->
handle
.
name
=
evdev
->
name
;
evdev
->
handle
.
handler
=
handler
;
evdev
->
handle
.
private
=
evdev
;
sprintf
(
evdev
->
name
,
"event%d"
,
minor
);
evdev_table
[
minor
]
=
evdev
;
snprintf
(
evdev
->
name
,
sizeof
(
evdev
->
name
),
"event%d"
,
minor
);
devt
=
MKDEV
(
INPUT_MAJOR
,
EVDEV_MINOR_BASE
+
minor
),
snprintf
(
evdev
->
dev
.
bus_id
,
sizeof
(
evdev
->
dev
.
bus_id
),
"event%d"
,
minor
);
evdev
->
dev
.
class
=
&
input_class
;
evdev
->
dev
.
parent
=
&
dev
->
dev
;
evdev
->
dev
.
devt
=
MKDEV
(
INPUT_MAJOR
,
EVDEV_MINOR_BASE
+
minor
);
evdev
->
dev
.
release
=
evdev_free
;
device_initialize
(
&
evdev
->
dev
);
cdev
=
class_device_create
(
&
input_class
,
&
dev
->
cdev
,
devt
,
dev
->
cdev
.
dev
,
evdev
->
name
);
if
(
IS_ERR
(
cdev
))
{
error
=
PTR_ERR
(
cdev
);
goto
err_free_evdev
;
}
evdev_table
[
minor
]
=
evdev
;
/* temporary symlink to keep userspace happy */
error
=
sysfs_create_link
(
&
input_class
.
subsys
.
kobj
,
&
cdev
->
kobj
,
evdev
->
name
);
error
=
device_add
(
&
evdev
->
dev
);
if
(
error
)
goto
err_
cdev_destroy
;
goto
err_
free_evdev
;
error
=
input_register_handle
(
&
evdev
->
handle
);
if
(
error
)
goto
err_
remove_link
;
goto
err_
delete_evdev
;
return
0
;
err_remove_link:
sysfs_remove_link
(
&
input_class
.
subsys
.
kobj
,
evdev
->
name
);
err_cdev_destroy:
class_device_destroy
(
&
input_class
,
devt
);
err_delete_evdev:
device_del
(
&
evdev
->
dev
);
err_free_evdev:
kfree
(
evdev
);
evdev_table
[
minor
]
=
NULL
;
put_device
(
&
evdev
->
dev
);
return
error
;
}
...
...
@@ -690,10 +691,8 @@ static void evdev_disconnect(struct input_handle *handle)
struct
evdev_client
*
client
;
input_unregister_handle
(
handle
);
device_del
(
&
evdev
->
dev
);
sysfs_remove_link
(
&
input_class
.
subsys
.
kobj
,
evdev
->
name
);
class_device_destroy
(
&
input_class
,
MKDEV
(
INPUT_MAJOR
,
EVDEV_MINOR_BASE
+
evdev
->
minor
));
evdev
->
exist
=
0
;
if
(
evdev
->
open
)
{
...
...
@@ -702,8 +701,9 @@ static void evdev_disconnect(struct input_handle *handle)
list_for_each_entry
(
client
,
&
evdev
->
client_list
,
node
)
kill_fasync
(
&
client
->
fasync
,
SIGIO
,
POLL_HUP
);
wake_up_interruptible
(
&
evdev
->
wait
);
}
else
evdev_free
(
evdev
);
}
put_device
(
&
evdev
->
dev
);
}
static
const
struct
input_device_id
evdev_ids
[]
=
{
...
...
drivers/input/input.c
View file @
9657d75c
...
...
@@ -442,7 +442,7 @@ static int input_attach_handler(struct input_dev *dev, struct input_handler *han
printk
(
KERN_ERR
"input: failed to attach handler %s to device %s, "
"error: %d
\n
"
,
handler
->
name
,
kobject_name
(
&
dev
->
c
dev
.
kobj
),
error
);
handler
->
name
,
kobject_name
(
&
dev
->
dev
.
kobj
),
error
);
return
error
;
}
...
...
@@ -527,7 +527,7 @@ static void input_seq_print_bitmap(struct seq_file *seq, const char *name,
static
int
input_devices_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
input_dev
*
dev
=
container_of
(
v
,
struct
input_dev
,
node
);
const
char
*
path
=
kobject_get_path
(
&
dev
->
c
dev
.
kobj
,
GFP_KERNEL
);
const
char
*
path
=
kobject_get_path
(
&
dev
->
dev
.
kobj
,
GFP_KERNEL
);
struct
input_handle
*
handle
;
seq_printf
(
seq
,
"I: Bus=%04x Vendor=%04x Product=%04x Version=%04x
\n
"
,
...
...
@@ -682,15 +682,17 @@ static inline int input_proc_init(void) { return 0; }
static
inline
void
input_proc_exit
(
void
)
{
}
#endif
#define INPUT_DEV_STRING_ATTR_SHOW(name) \
static ssize_t input_dev_show_##name(struct class_device *dev, char *buf) \
{ \
struct input_dev *input_dev = to_input_dev(dev); \
\
return scnprintf(buf, PAGE_SIZE, "%s\n", \
input_dev->name ? input_dev->name : ""); \
} \
static CLASS_DEVICE_ATTR(name, S_IRUGO, input_dev_show_##name, NULL);
#define INPUT_DEV_STRING_ATTR_SHOW(name) \
static ssize_t input_dev_show_##name(struct device *dev, \
struct device_attribute *attr, \
char *buf) \
{ \
struct input_dev *input_dev = to_input_dev(dev); \
\
return scnprintf(buf, PAGE_SIZE, "%s\n", \
input_dev->name ? input_dev->name : ""); \
} \
static DEVICE_ATTR(name, S_IRUGO, input_dev_show_##name, NULL)
INPUT_DEV_STRING_ATTR_SHOW
(
name
);
INPUT_DEV_STRING_ATTR_SHOW
(
phys
);
...
...
@@ -744,7 +746,9 @@ static int input_print_modalias(char *buf, int size, struct input_dev *id,
return
len
;
}
static
ssize_t
input_dev_show_modalias
(
struct
class_device
*
dev
,
char
*
buf
)
static
ssize_t
input_dev_show_modalias
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
struct
input_dev
*
id
=
to_input_dev
(
dev
);
ssize_t
len
;
...
...
@@ -753,13 +757,13 @@ static ssize_t input_dev_show_modalias(struct class_device *dev, char *buf)
return
min_t
(
int
,
len
,
PAGE_SIZE
);
}
static
CLASS_
DEVICE_ATTR
(
modalias
,
S_IRUGO
,
input_dev_show_modalias
,
NULL
);
static
DEVICE_ATTR
(
modalias
,
S_IRUGO
,
input_dev_show_modalias
,
NULL
);
static
struct
attribute
*
input_dev_attrs
[]
=
{
&
class_device
_attr_name
.
attr
,
&
class_device
_attr_phys
.
attr
,
&
class_device
_attr_uniq
.
attr
,
&
class_device
_attr_modalias
.
attr
,
&
dev
_attr_name
.
attr
,
&
dev
_attr_phys
.
attr
,
&
dev
_attr_uniq
.
attr
,
&
dev
_attr_modalias
.
attr
,
NULL
};
...
...
@@ -767,13 +771,15 @@ static struct attribute_group input_dev_attr_group = {
.
attrs
=
input_dev_attrs
,
};
#define INPUT_DEV_ID_ATTR(name) \
static ssize_t input_dev_show_id_##name(struct class_device *dev, char *buf) \
{ \
struct input_dev *input_dev = to_input_dev(dev); \
return scnprintf(buf, PAGE_SIZE, "%04x\n", input_dev->id.name); \
} \
static CLASS_DEVICE_ATTR(name, S_IRUGO, input_dev_show_id_##name, NULL);
#define INPUT_DEV_ID_ATTR(name) \
static ssize_t input_dev_show_id_##name(struct device *dev, \
struct device_attribute *attr, \
char *buf) \
{ \
struct input_dev *input_dev = to_input_dev(dev); \
return scnprintf(buf, PAGE_SIZE, "%04x\n", input_dev->id.name); \
} \
static DEVICE_ATTR(name, S_IRUGO, input_dev_show_id_##name, NULL)
INPUT_DEV_ID_ATTR
(
bustype
);
INPUT_DEV_ID_ATTR
(
vendor
);
...
...
@@ -781,10 +787,10 @@ INPUT_DEV_ID_ATTR(product);
INPUT_DEV_ID_ATTR
(
version
);
static
struct
attribute
*
input_dev_id_attrs
[]
=
{
&
class_device
_attr_bustype
.
attr
,
&
class_device
_attr_vendor
.
attr
,
&
class_device
_attr_product
.
attr
,
&
class_device
_attr_version
.
attr
,
&
dev
_attr_bustype
.
attr
,
&
dev
_attr_vendor
.
attr
,
&
dev
_attr_product
.
attr
,
&
dev
_attr_version
.
attr
,
NULL
};
...
...
@@ -813,15 +819,17 @@ static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap,
return
len
;
}
#define INPUT_DEV_CAP_ATTR(ev, bm) \
static ssize_t input_dev_show_cap_##bm(struct class_device *dev, char *buf) \
{ \
struct input_dev *input_dev = to_input_dev(dev); \
int len = input_print_bitmap(buf, PAGE_SIZE, \
input_dev->bm##bit, ev##_MAX, 1); \
return min_t(int, len, PAGE_SIZE); \
} \
static CLASS_DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL);
#define INPUT_DEV_CAP_ATTR(ev, bm) \
static ssize_t input_dev_show_cap_##bm(struct device *dev, \
struct device_attribute *attr, \
char *buf) \
{ \
struct input_dev *input_dev = to_input_dev(dev); \
int len = input_print_bitmap(buf, PAGE_SIZE, \
input_dev->bm##bit, ev##_MAX, 1); \
return min_t(int, len, PAGE_SIZE); \
} \
static DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL)
INPUT_DEV_CAP_ATTR
(
EV
,
ev
);
INPUT_DEV_CAP_ATTR
(
KEY
,
key
);
...
...
@@ -834,15 +842,15 @@ INPUT_DEV_CAP_ATTR(FF, ff);
INPUT_DEV_CAP_ATTR
(
SW
,
sw
);
static
struct
attribute
*
input_dev_caps_attrs
[]
=
{
&
class_device
_attr_ev
.
attr
,
&
class_device
_attr_key
.
attr
,
&
class_device
_attr_rel
.
attr
,
&
class_device
_attr_abs
.
attr
,
&
class_device
_attr_msc
.
attr
,
&
class_device
_attr_led
.
attr
,
&
class_device
_attr_snd
.
attr
,
&
class_device
_attr_ff
.
attr
,
&
class_device
_attr_sw
.
attr
,
&
dev
_attr_ev
.
attr
,
&
dev
_attr_key
.
attr
,
&
dev
_attr_rel
.
attr
,
&
dev
_attr_abs
.
attr
,
&
dev
_attr_msc
.
attr
,
&
dev
_attr_led
.
attr
,
&
dev
_attr_snd
.
attr
,
&
dev
_attr_ff
.
attr
,
&
dev
_attr_sw
.
attr
,
NULL
};
...
...
@@ -858,9 +866,9 @@ static struct attribute_group *input_dev_attr_groups[] = {
NULL
};
static
void
input_dev_release
(
struct
class_device
*
class_dev
)
static
void
input_dev_release
(
struct
device
*
device
)
{
struct
input_dev
*
dev
=
to_input_dev
(
class_dev
);
struct
input_dev
*
dev
=
to_input_dev
(
device
);
input_ff_destroy
(
dev
);
kfree
(
dev
);
...
...
@@ -947,10 +955,10 @@ static int input_add_uevent_modalias_var(char **envp, int num_envp, int *cur_ind
return err; \
} while (0)
static
int
input_dev_uevent
(
struct
class_device
*
cdev
,
char
**
envp
,
static
int
input_dev_uevent
(
struct
device
*
device
,
char
**
envp
,
int
num_envp
,
char
*
buffer
,
int
buffer_size
)
{
struct
input_dev
*
dev
=
to_input_dev
(
cdev
);
struct
input_dev
*
dev
=
to_input_dev
(
device
);
int
i
=
0
;
int
len
=
0
;
...
...
@@ -988,10 +996,14 @@ static int input_dev_uevent(struct class_device *cdev, char **envp,
return
0
;
}
static
struct
device_type
input_dev_type
=
{
.
groups
=
input_dev_attr_groups
,
.
release
=
input_dev_release
,
.
uevent
=
input_dev_uevent
,
};
struct
class
input_class
=
{
.
name
=
"input"
,
.
release
=
input_dev_release
,
.
uevent
=
input_dev_uevent
,
.
name
=
"input"
,
};
EXPORT_SYMBOL_GPL
(
input_class
);
...
...
@@ -1010,9 +1022,9 @@ struct input_dev *input_allocate_device(void)
dev
=
kzalloc
(
sizeof
(
struct
input_dev
),
GFP_KERNEL
);
if
(
dev
)
{
dev
->
cdev
.
class
=
&
input_class
;
dev
->
cdev
.
groups
=
input_dev_attr_group
s
;
class_device_initialize
(
&
dev
->
c
dev
);
dev
->
dev
.
type
=
&
input_dev_type
;
dev
->
dev
.
class
=
&
input_clas
s
;
device_initialize
(
&
dev
->
dev
);
mutex_init
(
&
dev
->
mutex
);
INIT_LIST_HEAD
(
&
dev
->
h_list
);
INIT_LIST_HEAD
(
&
dev
->
node
);
...
...
@@ -1131,17 +1143,17 @@ int input_register_device(struct input_dev *dev)
list_add_tail
(
&
dev
->
node
,
&
input_dev_list
);
snprintf
(
dev
->
cdev
.
class_id
,
sizeof
(
dev
->
cdev
.
clas
s_id
),
snprintf
(
dev
->
dev
.
bus_id
,
sizeof
(
dev
->
dev
.
bu
s_id
),
"input%ld"
,
(
unsigned
long
)
atomic_inc_return
(
&
input_no
)
-
1
);
if
(
!
dev
->
cdev
.
dev
)
dev
->
cdev
.
dev
=
dev
->
dev
.
parent
;
if
(
dev
->
cdev
.
dev
)
dev
->
dev
.
parent
=
dev
->
cdev
.
dev
;
error
=
class_device_add
(
&
dev
->
c
dev
);
error
=
device_add
(
&
dev
->
dev
);
if
(
error
)
return
error
;
path
=
kobject_get_path
(
&
dev
->
c
dev
.
kobj
,
GFP_KERNEL
);
path
=
kobject_get_path
(
&
dev
->
dev
.
kobj
,
GFP_KERNEL
);
printk
(
KERN_INFO
"input: %s as %s
\n
"
,
dev
->
name
?
dev
->
name
:
"Unspecified device"
,
path
?
path
:
"N/A"
);
kfree
(
path
);
...
...
@@ -1173,7 +1185,7 @@ void input_unregister_device(struct input_dev *dev)
list_del_init
(
&
dev
->
node
);
class_device_unregister
(
&
dev
->
c
dev
);
device_unregister
(
&
dev
->
dev
);
input_wakeup_procfs_readers
();
}
...
...
drivers/input/joydev.c
View file @
9657d75c
...
...
@@ -43,6 +43,8 @@ struct joydev {
struct
input_handle
handle
;
wait_queue_head_t
wait
;
struct
list_head
client_list
;
struct
device
dev
;
struct
js_corr
corr
[
ABS_MAX
+
1
];
struct
JS_DATA_SAVE_TYPE
glue
;
int
nabs
;
...
...
@@ -138,8 +140,10 @@ static int joydev_fasync(int fd, struct file *file, int on)
return
retval
<
0
?
retval
:
0
;
}
static
void
joydev_free
(
struct
joydev
*
joy
dev
)
static
void
joydev_free
(
struct
device
*
dev
)
{
struct
joydev
*
joydev
=
container_of
(
dev
,
struct
joydev
,
dev
);
joydev_table
[
joydev
->
minor
]
=
NULL
;
kfree
(
joydev
);
}
...
...
@@ -154,12 +158,10 @@ static int joydev_release(struct inode *inode, struct file *file)
list_del
(
&
client
->
node
);
kfree
(
client
);
if
(
!--
joydev
->
open
)
{
if
(
joydev
->
exist
)
input_close_device
(
&
joydev
->
handle
);
else
joydev_free
(
joydev
);
}
if
(
!--
joydev
->
open
&&
joydev
->
exist
)
input_close_device
(
&
joydev
->
handle
);
put_device
(
&
joydev
->
dev
);
return
0
;
}
...
...
@@ -178,24 +180,32 @@ static int joydev_open(struct inode *inode, struct file *file)
if
(
!
joydev
||
!
joydev
->
exist
)
return
-
ENODEV
;
get_device
(
&
joydev
->
dev
);
client
=
kzalloc
(
sizeof
(
struct
joydev_client
),
GFP_KERNEL
);
if
(
!
client
)
return
-
ENOMEM
;
if
(
!
client
)
{
error
=
-
ENOMEM
;
goto
err_put_joydev
;
}
client
->
joydev
=
joydev
;
list_add_tail
(
&
client
->
node
,
&
joydev
->
client_list
);
if
(
!
joydev
->
open
++
&&
joydev
->
exist
)
{
error
=
input_open_device
(
&
joydev
->
handle
);
if
(
error
)
{
list_del
(
&
client
->
node
);
kfree
(
client
);
return
error
;
}
if
(
error
)
goto
err_free_client
;
}
file
->
private_data
=
client
;
return
0
;
err_free_client:
list_del
(
&
client
->
node
);
kfree
(
client
);
err_put_joydev:
put_device
(
&
joydev
->
dev
);
return
error
;
}
static
ssize_t
joydev_write
(
struct
file
*
file
,
const
char
__user
*
buffer
,
size_t
count
,
loff_t
*
ppos
)
...
...
@@ -481,8 +491,6 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
const
struct
input_device_id
*
id
)
{
struct
joydev
*
joydev
;
struct
class_device
*
cdev
;
dev_t
devt
;
int
i
,
j
,
t
,
minor
;
int
error
;
...
...
@@ -505,7 +513,7 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
joydev
->
handle
.
name
=
joydev
->
name
;
joydev
->
handle
.
handler
=
handler
;
joydev
->
handle
.
private
=
joydev
;
s
printf
(
joydev
->
name
,
"js%d"
,
minor
);
s
nprintf
(
joydev
->
name
,
sizeof
(
joydev
->
name
)
,
"js%d"
,
minor
);
for
(
i
=
0
;
i
<
ABS_MAX
+
1
;
i
++
)
if
(
test_bit
(
i
,
dev
->
absbit
))
{
...
...
@@ -547,36 +555,30 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
joydev
->
abs
[
i
]
=
joydev_correct
(
dev
->
abs
[
j
],
joydev
->
corr
+
i
);
}
joydev_table
[
minor
]
=
joydev
;
devt
=
MKDEV
(
INPUT_MAJOR
,
JOYDEV_MINOR_BASE
+
minor
),
snprintf
(
joydev
->
dev
.
bus_id
,
sizeof
(
joydev
->
dev
.
bus_id
),
"js%d"
,
minor
);
joydev
->
dev
.
class
=
&
input_class
;
joydev
->
dev
.
parent
=
&
dev
->
dev
;
joydev
->
dev
.
devt
=
MKDEV
(
INPUT_MAJOR
,
JOYDEV_MINOR_BASE
+
minor
);
joydev
->
dev
.
release
=
joydev_free
;
device_initialize
(
&
joydev
->
dev
);
cdev
=
class_device_create
(
&
input_class
,
&
dev
->
cdev
,
devt
,
dev
->
cdev
.
dev
,
joydev
->
name
);
if
(
IS_ERR
(
cdev
))
{
error
=
PTR_ERR
(
cdev
);
goto
err_free_joydev
;
}
joydev_table
[
minor
]
=
joydev
;
/* temporary symlink to keep userspace happy */
error
=
sysfs_create_link
(
&
input_class
.
subsys
.
kobj
,
&
cdev
->
kobj
,
joydev
->
name
);
error
=
device_add
(
&
joydev
->
dev
);
if
(
error
)
goto
err_
cdev_destroy
;
goto
err_
free_joydev
;
error
=
input_register_handle
(
&
joydev
->
handle
);
if
(
error
)
goto
err_
remove_link
;
goto
err_
delete_joydev
;
return
0
;
err_remove_link:
sysfs_remove_link
(
&
input_class
.
subsys
.
kobj
,
joydev
->
name
);
err_cdev_destroy:
class_device_destroy
(
&
input_class
,
devt
);
err_delete_joydev:
device_del
(
&
joydev
->
dev
);
err_free_joydev:
joydev_table
[
minor
]
=
NULL
;
kfree
(
joydev
);
put_device
(
&
joydev
->
dev
);
return
error
;
}
...
...
@@ -587,9 +589,8 @@ static void joydev_disconnect(struct input_handle *handle)
struct
joydev_client
*
client
;
input_unregister_handle
(
handle
);
device_del
(
&
joydev
->
dev
);
sysfs_remove_link
(
&
input_class
.
subsys
.
kobj
,
joydev
->
name
);
class_device_destroy
(
&
input_class
,
MKDEV
(
INPUT_MAJOR
,
JOYDEV_MINOR_BASE
+
joydev
->
minor
));
joydev
->
exist
=
0
;
if
(
joydev
->
open
)
{
...
...
@@ -597,8 +598,9 @@ static void joydev_disconnect(struct input_handle *handle)
list_for_each_entry
(
client
,
&
joydev
->
client_list
,
node
)
kill_fasync
(
&
client
->
fasync
,
SIGIO
,
POLL_HUP
);
wake_up_interruptible
(
&
joydev
->
wait
);
}
else
joydev_free
(
joydev
);
}
put_device
(
&
joydev
->
dev
);
}
static
const
struct
input_device_id
joydev_blacklist
[]
=
{
...
...
drivers/input/mousedev.c
View file @
9657d75c
This diff is collapsed.
Click to expand it.
drivers/input/tsdev.c
View file @
9657d75c
...
...
@@ -109,9 +109,11 @@ struct tsdev {
int
open
;
int
minor
;
char
name
[
8
];
struct
input_handle
handle
;
wait_queue_head_t
wait
;
struct
list_head
client_list
;
struct
input_handle
handle
;
struct
device
dev
;
int
x
,
y
,
pressure
;
struct
ts_calibration
cal
;
};
...
...
@@ -163,9 +165,13 @@ static int tsdev_open(struct inode *inode, struct file *file)
if
(
!
tsdev
||
!
tsdev
->
exist
)
return
-
ENODEV
;
get_device
(
&
tsdev
->
dev
);
client
=
kzalloc
(
sizeof
(
struct
tsdev_client
),
GFP_KERNEL
);
if
(
!
client
)
return
-
ENOMEM
;
if
(
!
client
)
{
error
=
-
ENOMEM
;
goto
err_put_tsdev
;
}
client
->
tsdev
=
tsdev
;
client
->
raw
=
(
i
>=
TSDEV_MINORS
/
2
)
?
1
:
0
;
...
...
@@ -173,19 +179,25 @@ static int tsdev_open(struct inode *inode, struct file *file)
if
(
!
tsdev
->
open
++
&&
tsdev
->
exist
)
{
error
=
input_open_device
(
&
tsdev
->
handle
);
if
(
error
)
{
list_del
(
&
client
->
node
);
kfree
(
client
);
return
error
;
}
if
(
error
)
goto
err_free_client
;
}
file
->
private_data
=
client
;
return
0
;
err_free_client:
list_del
(
&
client
->
node
);
kfree
(
client
);
err_put_tsdev:
put_device
(
&
tsdev
->
dev
);
return
error
;
}
static
void
tsdev_free
(
struct
tsdev
*
ts
dev
)
static
void
tsdev_free
(
struct
device
*
dev
)
{
struct
tsdev
*
tsdev
=
container_of
(
dev
,
struct
tsdev
,
dev
);
tsdev_table
[
tsdev
->
minor
]
=
NULL
;
kfree
(
tsdev
);
}
...
...
@@ -200,12 +212,10 @@ static int tsdev_release(struct inode *inode, struct file *file)
list_del
(
&
client
->
node
);
kfree
(
client
);
if
(
!--
tsdev
->
open
)
{
if
(
tsdev
->
exist
)
input_close_device
(
&
tsdev
->
handle
);
else
tsdev_free
(
tsdev
);
}
if
(
!--
tsdev
->
open
&&
tsdev
->
exist
)
input_close_device
(
&
tsdev
->
handle
);
put_device
(
&
tsdev
->
dev
);
return
0
;
}
...
...
@@ -388,8 +398,6 @@ static int tsdev_connect(struct input_handler *handler, struct input_dev *dev,
const
struct
input_device_id
*
id
)
{
struct
tsdev
*
tsdev
;
struct
class_device
*
cdev
;
dev_t
devt
;
int
minor
,
delta
;
int
error
;
...
...
@@ -407,14 +415,13 @@ static int tsdev_connect(struct input_handler *handler, struct input_dev *dev,
INIT_LIST_HEAD
(
&
tsdev
->
client_list
);
init_waitqueue_head
(
&
tsdev
->
wait
);
sprintf
(
tsdev
->
name
,
"ts%d"
,
minor
);
tsdev
->
exist
=
1
;
tsdev
->
minor
=
minor
;
tsdev
->
handle
.
dev
=
dev
;
tsdev
->
handle
.
name
=
tsdev
->
name
;
tsdev
->
handle
.
handler
=
handler
;
tsdev
->
handle
.
private
=
tsdev
;
snprintf
(
tsdev
->
name
,
sizeof
(
tsdev
->
name
),
"ts%d"
,
minor
);
/* Precompute the rough calibration matrix */
delta
=
dev
->
absmax
[
ABS_X
]
-
dev
->
absmin
[
ABS_X
]
+
1
;
...
...
@@ -429,36 +436,30 @@ static int tsdev_connect(struct input_handler *handler, struct input_dev *dev,
tsdev
->
cal
.
yscale
=
(
yres
<<
8
)
/
delta
;
tsdev
->
cal
.
ytrans
=
-
((
dev
->
absmin
[
ABS_Y
]
*
tsdev
->
cal
.
yscale
)
>>
8
);
tsdev_table
[
minor
]
=
tsdev
;
devt
=
MKDEV
(
INPUT_MAJOR
,
TSDEV_MINOR_BASE
+
minor
),
snprintf
(
tsdev
->
dev
.
bus_id
,
sizeof
(
tsdev
->
dev
.
bus_id
),
"ts%d"
,
minor
);
tsdev
->
dev
.
class
=
&
input_class
;
tsdev
->
dev
.
parent
=
&
dev
->
dev
;
tsdev
->
dev
.
devt
=
MKDEV
(
INPUT_MAJOR
,
TSDEV_MINOR_BASE
+
minor
);
tsdev
->
dev
.
release
=
tsdev_free
;
device_initialize
(
&
tsdev
->
dev
);
cdev
=
class_device_create
(
&
input_class
,
&
dev
->
cdev
,
devt
,
dev
->
cdev
.
dev
,
tsdev
->
name
);
if
(
IS_ERR
(
cdev
))
{
error
=
PTR_ERR
(
cdev
);
goto
err_free_tsdev
;
}
tsdev_table
[
minor
]
=
tsdev
;
/* temporary symlink to keep userspace happy */
error
=
sysfs_create_link
(
&
input_class
.
subsys
.
kobj
,
&
cdev
->
kobj
,
tsdev
->
name
);
error
=
device_add
(
&
tsdev
->
dev
);
if
(
error
)
goto
err_
cdev_destroy
;
goto
err_
free_tsdev
;
error
=
input_register_handle
(
&
tsdev
->
handle
);
if
(
error
)
goto
err_
remove_link
;
goto
err_
delete_tsdev
;
return
0
;
err_remove_link:
sysfs_remove_link
(
&
input_class
.
subsys
.
kobj
,
tsdev
->
name
);
err_cdev_destroy:
class_device_destroy
(
&
input_class
,
devt
);
err_delete_tsdev:
device_del
(
&
tsdev
->
dev
);
err_free_tsdev:
tsdev_table
[
minor
]
=
NULL
;
kfree
(
tsdev
);
put_device
(
&
tsdev
->
dev
);
return
error
;
}
...
...
@@ -468,10 +469,8 @@ static void tsdev_disconnect(struct input_handle *handle)
struct
tsdev_client
*
client
;
input_unregister_handle
(
handle
);
device_del
(
&
tsdev
->
dev
);
sysfs_remove_link
(
&
input_class
.
subsys
.
kobj
,
tsdev
->
name
);
class_device_destroy
(
&
input_class
,
MKDEV
(
INPUT_MAJOR
,
TSDEV_MINOR_BASE
+
tsdev
->
minor
));
tsdev
->
exist
=
0
;
if
(
tsdev
->
open
)
{
...
...
@@ -479,8 +478,9 @@ static void tsdev_disconnect(struct input_handle *handle)
list_for_each_entry
(
client
,
&
tsdev
->
client_list
,
node
)
kill_fasync
(
&
client
->
fasync
,
SIGIO
,
POLL_HUP
);
wake_up_interruptible
(
&
tsdev
->
wait
);
}
else
tsdev_free
(
tsdev
);
}
put_device
(
&
tsdev
->
dev
);
}
static
const
struct
input_device_id
tsdev_ids
[]
=
{
...
...
include/linux/input.h
View file @
9657d75c
...
...
@@ -981,15 +981,15 @@ struct input_dev {
struct
mutex
mutex
;
/* serializes open and close operations */
unsigned
int
users
;
struct
class_device
c
dev
;
struct
device
dev
;
union
{
/* temporarily so while we switching to struct device */
struct
device
*
parent
;
}
dev
;
struct
device
*
dev
;
}
c
dev
;
struct
list_head
h_list
;
struct
list_head
node
;
};
#define to_input_dev(d) container_of(d, struct input_dev,
c
dev)
#define to_input_dev(d) container_of(d, struct input_dev, dev)
/*
* Verify that we are in sync with input_device_id mod_devicetable.h #defines
...
...
@@ -1096,22 +1096,22 @@ struct input_handle {
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)
#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)
struct
input_dev
*
input_allocate_device
(
void
);
void
input_free_device
(
struct
input_dev
*
dev
);
static
inline
struct
input_dev
*
input_get_device
(
struct
input_dev
*
dev
)
{
return
to_input_dev
(
class_device_get
(
&
dev
->
c
dev
));
return
to_input_dev
(
get_device
(
&
dev
->
dev
));
}
static
inline
void
input_put_device
(
struct
input_dev
*
dev
)
{
class_device_put
(
&
dev
->
c
dev
);
put_device
(
&
dev
->
dev
);
}
static
inline
void
*
input_get_drvdata
(
struct
input_dev
*
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