提交 b8c7d915 编写于 作者: J James Hogan 提交者: Mauro Carvalho Chehab

[media] rc-main: add generic scancode filtering

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: NJames Hogan <james.hogan@imgtec.com>
Reviewed-by: NAntti Seppälä <a.seppala@gmail.com>
Signed-off-by: NMauro Carvalho Chehab <m.chehab@samsung.com>
上级 c3c2077d
...@@ -633,6 +633,7 @@ EXPORT_SYMBOL_GPL(rc_repeat); ...@@ -633,6 +633,7 @@ EXPORT_SYMBOL_GPL(rc_repeat);
static void ir_do_keydown(struct rc_dev *dev, int scancode, static void ir_do_keydown(struct rc_dev *dev, int scancode,
u32 keycode, u8 toggle) u32 keycode, u8 toggle)
{ {
struct rc_scancode_filter *filter;
bool new_event = !dev->keypressed || bool new_event = !dev->keypressed ||
dev->last_scancode != scancode || dev->last_scancode != scancode ||
dev->last_toggle != toggle; dev->last_toggle != toggle;
...@@ -640,6 +641,11 @@ static void ir_do_keydown(struct rc_dev *dev, int scancode, ...@@ -640,6 +641,11 @@ static void ir_do_keydown(struct rc_dev *dev, int scancode,
if (new_event && dev->keypressed) if (new_event && dev->keypressed)
ir_do_keyup(dev, false); 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); input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode);
if (new_event && keycode != KEY_RESERVED) { if (new_event && keycode != KEY_RESERVED) {
...@@ -1019,9 +1025,7 @@ static ssize_t show_filter(struct device *device, ...@@ -1019,9 +1025,7 @@ static ssize_t show_filter(struct device *device,
return -EINVAL; return -EINVAL;
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
if (!dev->s_filter) if (fattr->mask)
val = 0;
else if (fattr->mask)
val = dev->scancode_filters[fattr->type].mask; val = dev->scancode_filters[fattr->type].mask;
else else
val = dev->scancode_filters[fattr->type].data; val = dev->scancode_filters[fattr->type].data;
...@@ -1069,7 +1073,7 @@ static ssize_t store_filter(struct device *device, ...@@ -1069,7 +1073,7 @@ static ssize_t store_filter(struct device *device,
return ret; return ret;
/* Scancode filter not supported (but still accept 0) */ /* 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; return val ? -EINVAL : count;
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
...@@ -1081,9 +1085,11 @@ static ssize_t store_filter(struct device *device, ...@@ -1081,9 +1085,11 @@ static ssize_t store_filter(struct device *device,
local_filter.mask = val; local_filter.mask = val;
else else
local_filter.data = val; local_filter.data = val;
ret = dev->s_filter(dev, fattr->type, &local_filter); if (dev->s_filter) {
if (ret < 0) ret = dev->s_filter(dev, fattr->type, &local_filter);
goto unlock; if (ret < 0)
goto unlock;
}
/* Success, commit the new filter */ /* Success, commit the new filter */
*filter = local_filter; *filter = local_filter;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册