Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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: 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>

authored by

James Hogan and committed by
Mauro Carvalho Chehab
b8c7d915 c3c2077d

+13 -7
+13 -7
drivers/media/rc/rc-main.c
··· 633 633 static void ir_do_keydown(struct rc_dev *dev, int scancode, 634 634 u32 keycode, u8 toggle) 635 635 { 636 + struct rc_scancode_filter *filter; 636 637 bool new_event = !dev->keypressed || 637 638 dev->last_scancode != scancode || 638 639 dev->last_toggle != toggle; 639 640 640 641 if (new_event && dev->keypressed) 641 642 ir_do_keyup(dev, false); 643 + 644 + /* Generic scancode filtering */ 645 + filter = &dev->scancode_filters[RC_FILTER_NORMAL]; 646 + if (filter->mask && ((scancode ^ filter->data) & filter->mask)) 647 + return; 642 648 643 649 input_event(dev->input_dev, EV_MSC, MSC_SCAN, scancode); 644 650 ··· 1025 1019 return -EINVAL; 1026 1020 1027 1021 mutex_lock(&dev->lock); 1028 - if (!dev->s_filter) 1029 - val = 0; 1030 - else if (fattr->mask) 1022 + if (fattr->mask) 1031 1023 val = dev->scancode_filters[fattr->type].mask; 1032 1024 else 1033 1025 val = dev->scancode_filters[fattr->type].data; ··· 1073 1069 return ret; 1074 1070 1075 1071 /* Scancode filter not supported (but still accept 0) */ 1076 - if (!dev->s_filter) 1072 + if (!dev->s_filter && fattr->type != RC_FILTER_NORMAL) 1077 1073 return val ? -EINVAL : count; 1078 1074 1079 1075 mutex_lock(&dev->lock); ··· 1085 1081 local_filter.mask = val; 1086 1082 else 1087 1083 local_filter.data = val; 1088 - ret = dev->s_filter(dev, fattr->type, &local_filter); 1089 - if (ret < 0) 1090 - goto unlock; 1084 + if (dev->s_filter) { 1085 + ret = dev->s_filter(dev, fattr->type, &local_filter); 1086 + if (ret < 0) 1087 + goto unlock; 1088 + } 1091 1089 1092 1090 /* Success, commit the new filter */ 1093 1091 *filter = local_filter;