|
@@ -20,9 +20,6 @@
|
|
|
#include <linux/freezer.h>
|
|
|
#include "rc-core-priv.h"
|
|
|
|
|
|
-/* Define the max number of pulse/space transitions to buffer */
|
|
|
-#define MAX_IR_EVENT_SIZE 512
|
|
|
-
|
|
|
/* Used to keep track of IR raw clients, protected by ir_raw_handler_lock */
|
|
|
static LIST_HEAD(ir_raw_client_list);
|
|
|
|
|
@@ -36,14 +33,12 @@ static int ir_raw_event_thread(void *data)
|
|
|
struct ir_raw_event ev;
|
|
|
struct ir_raw_handler *handler;
|
|
|
struct ir_raw_event_ctrl *raw = (struct ir_raw_event_ctrl *)data;
|
|
|
- int retval;
|
|
|
|
|
|
while (!kthread_should_stop()) {
|
|
|
|
|
|
spin_lock_irq(&raw->lock);
|
|
|
- retval = kfifo_len(&raw->kfifo);
|
|
|
|
|
|
- if (retval < sizeof(ev)) {
|
|
|
+ if (!kfifo_len(&raw->kfifo)) {
|
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
|
|
|
|
if (kthread_should_stop())
|
|
@@ -54,7 +49,8 @@ static int ir_raw_event_thread(void *data)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- retval = kfifo_out(&raw->kfifo, &ev, sizeof(ev));
|
|
|
+ if(!kfifo_out(&raw->kfifo, &ev, 1))
|
|
|
+ dev_err(&raw->dev->dev, "IR event FIFO is empty!\n");
|
|
|
spin_unlock_irq(&raw->lock);
|
|
|
|
|
|
mutex_lock(&ir_raw_handler_lock);
|
|
@@ -87,8 +83,10 @@ int ir_raw_event_store(struct rc_dev *dev, struct ir_raw_event *ev)
|
|
|
IR_dprintk(2, "sample: (%05dus %s)\n",
|
|
|
TO_US(ev->duration), TO_STR(ev->pulse));
|
|
|
|
|
|
- if (kfifo_in(&dev->raw->kfifo, ev, sizeof(*ev)) != sizeof(*ev))
|
|
|
- return -ENOMEM;
|
|
|
+ if (!kfifo_put(&dev->raw->kfifo, *ev)) {
|
|
|
+ dev_err(&dev->dev, "IR event FIFO is full!\n");
|
|
|
+ return -ENOSPC;
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -273,11 +271,7 @@ int ir_raw_event_register(struct rc_dev *dev)
|
|
|
|
|
|
dev->raw->dev = dev;
|
|
|
dev->change_protocol = change_protocol;
|
|
|
- rc = kfifo_alloc(&dev->raw->kfifo,
|
|
|
- sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE,
|
|
|
- GFP_KERNEL);
|
|
|
- if (rc < 0)
|
|
|
- goto out;
|
|
|
+ INIT_KFIFO(dev->raw->kfifo);
|
|
|
|
|
|
spin_lock_init(&dev->raw->lock);
|
|
|
dev->raw->thread = kthread_run(ir_raw_event_thread, dev->raw,
|
|
@@ -319,7 +313,6 @@ void ir_raw_event_unregister(struct rc_dev *dev)
|
|
|
handler->raw_unregister(dev);
|
|
|
mutex_unlock(&ir_raw_handler_lock);
|
|
|
|
|
|
- kfifo_free(&dev->raw->kfifo);
|
|
|
kfree(dev->raw);
|
|
|
dev->raw = NULL;
|
|
|
}
|