Lines 85-90
Link Here
|
85 |
static DECLARE_WAIT_QUEUE_HEAD(serio_wait); |
85 |
static DECLARE_WAIT_QUEUE_HEAD(serio_wait); |
86 |
static DECLARE_COMPLETION(serio_exited); |
86 |
static DECLARE_COMPLETION(serio_exited); |
87 |
|
87 |
|
|
|
88 |
static int is_known_serio(struct serio *serio) |
89 |
{ |
90 |
struct serio *s; |
91 |
|
92 |
list_for_each_entry(s, &serio_list, node) |
93 |
if (s == serio) |
94 |
return 1; |
95 |
return 0; |
96 |
} |
97 |
|
88 |
void serio_handle_events(void) |
98 |
void serio_handle_events(void) |
89 |
{ |
99 |
{ |
90 |
struct list_head *node, *next; |
100 |
struct list_head *node, *next; |
Lines 93-109
Link Here
|
93 |
list_for_each_safe(node, next, &serio_event_list) { |
103 |
list_for_each_safe(node, next, &serio_event_list) { |
94 |
event = container_of(node, struct serio_event, node); |
104 |
event = container_of(node, struct serio_event, node); |
95 |
|
105 |
|
|
|
106 |
down(&serio_sem); |
107 |
if (!is_known_serio(event->serio)) |
108 |
goto event_done; |
109 |
|
96 |
switch (event->type) { |
110 |
switch (event->type) { |
97 |
case SERIO_RESCAN : |
111 |
case SERIO_RESCAN : |
98 |
down(&serio_sem); |
|
|
99 |
if (event->serio->dev && event->serio->dev->disconnect) |
112 |
if (event->serio->dev && event->serio->dev->disconnect) |
100 |
event->serio->dev->disconnect(event->serio); |
113 |
event->serio->dev->disconnect(event->serio); |
101 |
serio_find_dev(event->serio); |
114 |
serio_find_dev(event->serio); |
102 |
up(&serio_sem); |
|
|
103 |
break; |
115 |
break; |
104 |
default: |
116 |
default: |
105 |
break; |
117 |
break; |
106 |
} |
118 |
} |
|
|
119 |
event_done: |
120 |
up(&serio_sem); |
107 |
list_del_init(node); |
121 |
list_del_init(node); |
108 |
kfree(event); |
122 |
kfree(event); |
109 |
} |
123 |
} |
110 |
|
|
|