diff options
Diffstat (limited to 'drivers/staging/lirc/lirc_parallel.c')
-rw-r--r-- | drivers/staging/lirc/lirc_parallel.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/staging/lirc/lirc_parallel.c b/drivers/staging/lirc/lirc_parallel.c index dfd2c447e67..3a9c09881b2 100644 --- a/drivers/staging/lirc/lirc_parallel.c +++ b/drivers/staging/lirc/lirc_parallel.c | |||
@@ -376,6 +376,7 @@ static ssize_t lirc_write(struct file *filep, const char *buf, size_t n, | |||
376 | unsigned long flags; | 376 | unsigned long flags; |
377 | int counttimer; | 377 | int counttimer; |
378 | int *wbuf; | 378 | int *wbuf; |
379 | ssize_t ret; | ||
379 | 380 | ||
380 | if (!is_claimed) | 381 | if (!is_claimed) |
381 | return -EBUSY; | 382 | return -EBUSY; |
@@ -393,8 +394,10 @@ static ssize_t lirc_write(struct file *filep, const char *buf, size_t n, | |||
393 | if (timer == 0) { | 394 | if (timer == 0) { |
394 | /* try again if device is ready */ | 395 | /* try again if device is ready */ |
395 | timer = init_lirc_timer(); | 396 | timer = init_lirc_timer(); |
396 | if (timer == 0) | 397 | if (timer == 0) { |
397 | return -EIO; | 398 | ret = -EIO; |
399 | goto out; | ||
400 | } | ||
398 | } | 401 | } |
399 | 402 | ||
400 | /* adjust values from usecs */ | 403 | /* adjust values from usecs */ |
@@ -420,7 +423,8 @@ static ssize_t lirc_write(struct file *filep, const char *buf, size_t n, | |||
420 | if (check_pselecd && (in(1) & LP_PSELECD)) { | 423 | if (check_pselecd && (in(1) & LP_PSELECD)) { |
421 | lirc_off(); | 424 | lirc_off(); |
422 | local_irq_restore(flags); | 425 | local_irq_restore(flags); |
423 | return -EIO; | 426 | ret = -EIO; |
427 | goto out; | ||
424 | } | 428 | } |
425 | } while (counttimer < wbuf[i]); | 429 | } while (counttimer < wbuf[i]); |
426 | i++; | 430 | i++; |
@@ -436,7 +440,8 @@ static ssize_t lirc_write(struct file *filep, const char *buf, size_t n, | |||
436 | level = newlevel; | 440 | level = newlevel; |
437 | if (check_pselecd && (in(1) & LP_PSELECD)) { | 441 | if (check_pselecd && (in(1) & LP_PSELECD)) { |
438 | local_irq_restore(flags); | 442 | local_irq_restore(flags); |
439 | return -EIO; | 443 | ret = -EIO; |
444 | goto out; | ||
440 | } | 445 | } |
441 | } while (counttimer < wbuf[i]); | 446 | } while (counttimer < wbuf[i]); |
442 | i++; | 447 | i++; |
@@ -445,7 +450,11 @@ static ssize_t lirc_write(struct file *filep, const char *buf, size_t n, | |||
445 | #else | 450 | #else |
446 | /* place code that handles write without external timer here */ | 451 | /* place code that handles write without external timer here */ |
447 | #endif | 452 | #endif |
448 | return n; | 453 | ret = n; |
454 | out: | ||
455 | kfree(wbuf); | ||
456 | |||
457 | return ret; | ||
449 | } | 458 | } |
450 | 459 | ||
451 | static unsigned int lirc_poll(struct file *file, poll_table *wait) | 460 | static unsigned int lirc_poll(struct file *file, poll_table *wait) |