Skip to content

Commit

Permalink
[media] rc-main: add generic scancode filtering
Browse files Browse the repository at this point in the history
Add generic scancode filtering of RC input events, and fall back to
permitting any RC_FILTER_NORMAL scancode filter to be set if no s_filter
callback exists. This allows raw IR decoder events to be filtered, and
potentially allows hardware decoders to set looser filters and rely on
generic code to filter out the corner cases.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Reviewed-by: Antti Seppälä <a.seppala@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
  • Loading branch information
James Hogan authored and Mauro Carvalho Chehab committed Mar 11, 2014
1 parent c3c2077 commit b8c7d91
Showing 1 changed file with 13 additions and 7 deletions.
20 changes: 13 additions & 7 deletions drivers/media/rc/rc-main.c
Original file line number Diff line number Diff line change
Expand Up @@ -633,13 +633,19 @@ EXPORT_SYMBOL_GPL(rc_repeat);
static void ir_do_keydown(struct rc_dev *dev, int scancode,
u32 keycode, u8 toggle)
{
struct rc_scancode_filter *filter;
bool new_event = !dev->keypressed ||
dev->last_scancode != scancode ||
dev->last_toggle != toggle;

if (new_event && dev->keypressed)
ir_do_keyup(dev, false);

/* Generic scancode filtering */
filter = &dev->scancode_filters[RC_FILTER_NORMAL];
if (filter->mask && ((scancode ^ filter->data) & filter->mask))
return;

input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode);

if (new_event && keycode != KEY_RESERVED) {
Expand Down Expand Up @@ -1019,9 +1025,7 @@ static ssize_t show_filter(struct device *device,
return -EINVAL;

mutex_lock(&dev->lock);
if (!dev->s_filter)
val = 0;
else if (fattr->mask)
if (fattr->mask)
val = dev->scancode_filters[fattr->type].mask;
else
val = dev->scancode_filters[fattr->type].data;
Expand Down Expand Up @@ -1069,7 +1073,7 @@ static ssize_t store_filter(struct device *device,
return ret;

/* Scancode filter not supported (but still accept 0) */
if (!dev->s_filter)
if (!dev->s_filter && fattr->type != RC_FILTER_NORMAL)
return val ? -EINVAL : count;

mutex_lock(&dev->lock);
Expand All @@ -1081,9 +1085,11 @@ static ssize_t store_filter(struct device *device,
local_filter.mask = val;
else
local_filter.data = val;
ret = dev->s_filter(dev, fattr->type, &local_filter);
if (ret < 0)
goto unlock;
if (dev->s_filter) {
ret = dev->s_filter(dev, fattr->type, &local_filter);
if (ret < 0)
goto unlock;
}

/* Success, commit the new filter */
*filter = local_filter;
Expand Down

0 comments on commit b8c7d91

Please sign in to comment.