mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-30 12:49:36 +00:00
V4L-DVB: ir-core: remove the ancillary buffer
Now that the decoders are state machine, there's no need to create an ancillary buffer while decoding the protocol. Just call the decoders code directly, event by event. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
26d5683d36
commit
587835a4b0
4 changed files with 13 additions and 70 deletions
|
@ -125,14 +125,14 @@ static struct attribute_group decoder_attribute_group = {
|
|||
|
||||
|
||||
/**
|
||||
* handle_event() - Decode one NEC pulse or space
|
||||
* ir_nec_decode() - Decode one NEC pulse or space
|
||||
* @input_dev: the struct input_dev descriptor of the device
|
||||
* @ev: event array with type/duration of pulse/space
|
||||
*
|
||||
* This function returns -EINVAL if the pulse violates the state machine
|
||||
*/
|
||||
static int handle_event(struct input_dev *input_dev,
|
||||
struct ir_raw_event *ev)
|
||||
static int ir_nec_decode(struct input_dev *input_dev,
|
||||
struct ir_raw_event *ev)
|
||||
{
|
||||
struct decoder_data *data;
|
||||
struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
|
||||
|
@ -289,32 +289,6 @@ static int handle_event(struct input_dev *input_dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* ir_nec_decode() - Decodes all NEC pulsecodes on a given array
|
||||
* @input_dev: the struct input_dev descriptor of the device
|
||||
* @evs: event array with type/duration of pulse/space
|
||||
* @len: length of the array
|
||||
* This function returns the number of decoded pulses
|
||||
*/
|
||||
static int ir_nec_decode(struct input_dev *input_dev,
|
||||
struct ir_raw_event *evs,
|
||||
int len)
|
||||
{
|
||||
struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
|
||||
struct decoder_data *data;
|
||||
int pos = 0;
|
||||
int rc = 0;
|
||||
|
||||
data = get_decoder_data(ir_dev);
|
||||
if (!data || !data->enabled)
|
||||
return 0;
|
||||
|
||||
for (pos = 0; pos < len; pos++)
|
||||
handle_event(input_dev, &evs[pos]);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ir_nec_register(struct input_dev *input_dev)
|
||||
{
|
||||
struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
|
||||
|
|
|
@ -138,37 +138,33 @@ int ir_raw_event_handle(struct input_dev *input_dev)
|
|||
{
|
||||
struct ir_input_dev *ir = input_get_drvdata(input_dev);
|
||||
int rc;
|
||||
struct ir_raw_event *evs;
|
||||
struct ir_raw_event ev;
|
||||
int len, i;
|
||||
|
||||
/*
|
||||
* Store the events into a temporary buffer. This allows calling more than
|
||||
* one decoder to deal with the received data
|
||||
*/
|
||||
len = kfifo_len(&ir->raw->kfifo) / sizeof(*evs);
|
||||
len = kfifo_len(&ir->raw->kfifo) / sizeof(ev);
|
||||
if (!len)
|
||||
return 0;
|
||||
evs = kmalloc(len * sizeof(*evs), GFP_ATOMIC);
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
rc = kfifo_out(&ir->raw->kfifo, &evs[i], sizeof(*evs));
|
||||
if (rc != sizeof(*evs)) {
|
||||
rc = kfifo_out(&ir->raw->kfifo, &ev, sizeof(ev));
|
||||
if (rc != sizeof(ev)) {
|
||||
IR_dprintk(1, "overflow error: received %d instead of %zd\n",
|
||||
rc, sizeof(*evs));
|
||||
rc, sizeof(ev));
|
||||
return -EINVAL;
|
||||
}
|
||||
IR_dprintk(2, "event type %d, time before event: %07luus\n",
|
||||
evs[i].type, (evs[i].delta.tv_nsec + 500) / 1000);
|
||||
ev.type, (ev.delta.tv_nsec + 500) / 1000);
|
||||
rc = RUN_DECODER(decode, input_dev, &ev);
|
||||
}
|
||||
|
||||
/*
|
||||
* Call all ir decoders. This allows decoding the same event with
|
||||
* more than one protocol handler. It returns the number of keystrokes
|
||||
* sent to the event interface
|
||||
* more than one protocol handler.
|
||||
*/
|
||||
rc = RUN_DECODER(decode, input_dev, evs, len);
|
||||
|
||||
kfree(evs);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -142,7 +142,7 @@ static struct attribute_group decoder_attribute_group = {
|
|||
*
|
||||
* This function returns -EINVAL if the pulse violates the state machine
|
||||
*/
|
||||
static int handle_event(struct input_dev *input_dev,
|
||||
static int ir_rc5_decode(struct input_dev *input_dev,
|
||||
struct ir_raw_event *ev)
|
||||
{
|
||||
struct decoder_data *data;
|
||||
|
@ -273,32 +273,6 @@ printk("%d halves, %d bits\n", n_half, bit);
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* ir_rc5_decode() - Decodes all RC-5 pulsecodes on a given array
|
||||
* @input_dev: the struct input_dev descriptor of the device
|
||||
* @evs: event array with type/duration of pulse/space
|
||||
* @len: length of the array
|
||||
* This function returns the number of decoded pulses
|
||||
*/
|
||||
static int ir_rc5_decode(struct input_dev *input_dev,
|
||||
struct ir_raw_event *evs,
|
||||
int len)
|
||||
{
|
||||
struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
|
||||
struct decoder_data *data;
|
||||
int pos = 0;
|
||||
int rc = 0;
|
||||
|
||||
data = get_decoder_data(ir_dev);
|
||||
if (!data || !data->enabled)
|
||||
return 0;
|
||||
|
||||
for (pos = 0; pos < len; pos++)
|
||||
handle_event(input_dev, &evs[pos]);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ir_rc5_register(struct input_dev *input_dev)
|
||||
{
|
||||
struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
|
||||
|
|
|
@ -101,8 +101,7 @@ struct ir_raw_handler {
|
|||
struct list_head list;
|
||||
|
||||
int (*decode)(struct input_dev *input_dev,
|
||||
struct ir_raw_event *evs,
|
||||
int len);
|
||||
struct ir_raw_event *ev);
|
||||
int (*raw_register)(struct input_dev *input_dev);
|
||||
int (*raw_unregister)(struct input_dev *input_dev);
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue