diff options
author | James Hogan <james@albanarts.com> | 2015-03-31 19:48:10 +0200 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2017-01-30 16:55:45 +0100 |
commit | f423ccc1a32f8111ddfec9ef7efbccc8b73f3ea5 (patch) | |
tree | 1103efd9c2e7d18be447330aa7433a9ce31de975 /drivers/media/rc/rc-main.c | |
parent | [media] rc: ir-sony-decoder: Add encode capability (diff) | |
download | linux-f423ccc1a32f8111ddfec9ef7efbccc8b73f3ea5.tar.xz linux-f423ccc1a32f8111ddfec9ef7efbccc8b73f3ea5.zip |
[media] rc: rc-core: Add support for encode_wakeup drivers
Add support in rc-core for drivers which implement the wakeup scancode
filter by encoding the scancode using the raw IR encoders. This is by
way of rc_dev::encode_wakeup which should be set to true and
rc_dev::allowed_wakeup_protocols should be set to the raw IR encoders.
We also do not permit the mask to be set as we cannot generate IR
which would match that.
Signed-off-by: James Hogan <james@albanarts.com>
Signed-off-by: Antti Seppälä <a.seppala@gmail.com>
Signed-off-by: Sean Young <sean@mess.org>
Cc: David Härdeman <david@hardeman.nu>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/rc/rc-main.c')
-rw-r--r-- | drivers/media/rc/rc-main.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index 21a385074ec1..d7a1d8cbdf04 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c @@ -727,11 +727,11 @@ EXPORT_SYMBOL_GPL(rc_keydown_notimeout); /** * rc_validate_filter() - checks that the scancode and mask are valid and * provides sensible defaults - * @protocol: the protocol for the filter + * @dev: the struct rc_dev descriptor of the device * @filter: the scancode and mask * @return: 0 or -EINVAL if the filter is not valid */ -static int rc_validate_filter(enum rc_type protocol, +static int rc_validate_filter(struct rc_dev *dev, struct rc_scancode_filter *filter) { static u32 masks[] = { @@ -754,6 +754,7 @@ static int rc_validate_filter(enum rc_type protocol, [RC_TYPE_SHARP] = 0x1fff, }; u32 s = filter->data; + enum rc_type protocol = dev->wakeup_protocol; switch (protocol) { case RC_TYPE_NECX: @@ -779,6 +780,13 @@ static int rc_validate_filter(enum rc_type protocol, filter->data &= masks[protocol]; filter->mask &= masks[protocol]; + /* + * If we have to raw encode the IR for wakeup, we cannot have a mask + */ + if (dev->encode_wakeup && + filter->mask != 0 && filter->mask != masks[protocol]) + return -EINVAL; + return 0; } @@ -1044,7 +1052,6 @@ static int parse_protocol_change(u64 *protocols, const char *buf) } static void ir_raw_load_modules(u64 *protocols) - { u64 available; int i, ret; @@ -1292,8 +1299,7 @@ static ssize_t store_filter(struct device *device, * and the filter is valid for that protocol */ if (dev->wakeup_protocol != RC_TYPE_UNKNOWN) - ret = rc_validate_filter(dev->wakeup_protocol, - &new_filter); + ret = rc_validate_filter(dev, &new_filter); else ret = -EINVAL; @@ -1461,6 +1467,16 @@ static ssize_t store_wakeup_protocols(struct device *device, rc = -EINVAL; goto out; } + + if (dev->encode_wakeup) { + u64 mask = 1ULL << protocol; + + ir_raw_load_modules(&mask); + if (!mask) { + rc = -EINVAL; + goto out; + } + } } if (dev->wakeup_protocol != protocol) { |