aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/serio/serio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/serio/serio.c')
-rw-r--r--drivers/input/serio/serio.c31
1 files changed, 11 insertions, 20 deletions
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c
index d89880450f77..7fbf7670ae09 100644
--- a/drivers/input/serio/serio.c
+++ b/drivers/input/serio/serio.c
@@ -230,14 +230,12 @@ static void serio_free_event(struct serio_event *event)
230 230
231static void serio_remove_duplicate_events(struct serio_event *event) 231static void serio_remove_duplicate_events(struct serio_event *event)
232{ 232{
233 struct list_head *node, *next; 233 struct serio_event *e, *next;
234 struct serio_event *e;
235 unsigned long flags; 234 unsigned long flags;
236 235
237 spin_lock_irqsave(&serio_event_lock, flags); 236 spin_lock_irqsave(&serio_event_lock, flags);
238 237
239 list_for_each_safe(node, next, &serio_event_list) { 238 list_for_each_entry_safe(e, next, &serio_event_list, node) {
240 e = list_entry(node, struct serio_event, node);
241 if (event->object == e->object) { 239 if (event->object == e->object) {
242 /* 240 /*
243 * If this event is of different type we should not 241 * If this event is of different type we should not
@@ -247,7 +245,7 @@ static void serio_remove_duplicate_events(struct serio_event *event)
247 if (event->type != e->type) 245 if (event->type != e->type)
248 break; 246 break;
249 247
250 list_del_init(node); 248 list_del_init(&e->node);
251 serio_free_event(e); 249 serio_free_event(e);
252 } 250 }
253 } 251 }
@@ -258,23 +256,18 @@ static void serio_remove_duplicate_events(struct serio_event *event)
258 256
259static struct serio_event *serio_get_event(void) 257static struct serio_event *serio_get_event(void)
260{ 258{
261 struct serio_event *event; 259 struct serio_event *event = NULL;
262 struct list_head *node;
263 unsigned long flags; 260 unsigned long flags;
264 261
265 spin_lock_irqsave(&serio_event_lock, flags); 262 spin_lock_irqsave(&serio_event_lock, flags);
266 263
267 if (list_empty(&serio_event_list)) { 264 if (!list_empty(&serio_event_list)) {
268 spin_unlock_irqrestore(&serio_event_lock, flags); 265 event = list_first_entry(&serio_event_list,
269 return NULL; 266 struct serio_event, node);
267 list_del_init(&event->node);
270 } 268 }
271 269
272 node = serio_event_list.next;
273 event = list_entry(node, struct serio_event, node);
274 list_del_init(node);
275
276 spin_unlock_irqrestore(&serio_event_lock, flags); 270 spin_unlock_irqrestore(&serio_event_lock, flags);
277
278 return event; 271 return event;
279} 272}
280 273
@@ -331,16 +324,14 @@ static void serio_handle_event(void)
331 */ 324 */
332static void serio_remove_pending_events(void *object) 325static void serio_remove_pending_events(void *object)
333{ 326{
334 struct list_head *node, *next; 327 struct serio_event *event, *next;
335 struct serio_event *event;
336 unsigned long flags; 328 unsigned long flags;
337 329
338 spin_lock_irqsave(&serio_event_lock, flags); 330 spin_lock_irqsave(&serio_event_lock, flags);
339 331
340 list_for_each_safe(node, next, &serio_event_list) { 332 list_for_each_entry_safe(event, next, &serio_event_list, node) {
341 event = list_entry(node, struct serio_event, node);
342 if (event->object == object) { 333 if (event->object == object) {
343 list_del_init(node); 334 list_del_init(&event->node);
344 serio_free_event(event); 335 serio_free_event(event);
345 } 336 }
346 } 337 }