Commit f423ccc1 authored by James Hogan's avatar James Hogan Committed by Mauro Carvalho Chehab

[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: default avatarJames Hogan <james@albanarts.com>
Signed-off-by: default avatarAntti Seppälä <a.seppala@gmail.com>
Signed-off-by: default avatarSean Young <sean@mess.org>
Cc: David Härdeman <david@hardeman.nu>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 103293be
...@@ -727,11 +727,11 @@ EXPORT_SYMBOL_GPL(rc_keydown_notimeout); ...@@ -727,11 +727,11 @@ EXPORT_SYMBOL_GPL(rc_keydown_notimeout);
/** /**
* rc_validate_filter() - checks that the scancode and mask are valid and * rc_validate_filter() - checks that the scancode and mask are valid and
* provides sensible defaults * provides sensible defaults
* @protocol: the protocol for the filter * @dev: the struct rc_dev descriptor of the device
* @filter: the scancode and mask * @filter: the scancode and mask
* @return: 0 or -EINVAL if the filter is not valid * @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) struct rc_scancode_filter *filter)
{ {
static u32 masks[] = { static u32 masks[] = {
...@@ -754,6 +754,7 @@ static int rc_validate_filter(enum rc_type protocol, ...@@ -754,6 +754,7 @@ static int rc_validate_filter(enum rc_type protocol,
[RC_TYPE_SHARP] = 0x1fff, [RC_TYPE_SHARP] = 0x1fff,
}; };
u32 s = filter->data; u32 s = filter->data;
enum rc_type protocol = dev->wakeup_protocol;
switch (protocol) { switch (protocol) {
case RC_TYPE_NECX: case RC_TYPE_NECX:
...@@ -779,6 +780,13 @@ static int rc_validate_filter(enum rc_type protocol, ...@@ -779,6 +780,13 @@ static int rc_validate_filter(enum rc_type protocol,
filter->data &= masks[protocol]; filter->data &= masks[protocol];
filter->mask &= 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; return 0;
} }
...@@ -1044,7 +1052,6 @@ static int parse_protocol_change(u64 *protocols, const char *buf) ...@@ -1044,7 +1052,6 @@ static int parse_protocol_change(u64 *protocols, const char *buf)
} }
static void ir_raw_load_modules(u64 *protocols) static void ir_raw_load_modules(u64 *protocols)
{ {
u64 available; u64 available;
int i, ret; int i, ret;
...@@ -1292,8 +1299,7 @@ static ssize_t store_filter(struct device *device, ...@@ -1292,8 +1299,7 @@ static ssize_t store_filter(struct device *device,
* and the filter is valid for that protocol * and the filter is valid for that protocol
*/ */
if (dev->wakeup_protocol != RC_TYPE_UNKNOWN) if (dev->wakeup_protocol != RC_TYPE_UNKNOWN)
ret = rc_validate_filter(dev->wakeup_protocol, ret = rc_validate_filter(dev, &new_filter);
&new_filter);
else else
ret = -EINVAL; ret = -EINVAL;
...@@ -1461,6 +1467,16 @@ static ssize_t store_wakeup_protocols(struct device *device, ...@@ -1461,6 +1467,16 @@ static ssize_t store_wakeup_protocols(struct device *device,
rc = -EINVAL; rc = -EINVAL;
goto out; 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) { if (dev->wakeup_protocol != protocol) {
......
...@@ -83,6 +83,8 @@ enum rc_filter_type { ...@@ -83,6 +83,8 @@ enum rc_filter_type {
* @input_dev: the input child device used to communicate events to userspace * @input_dev: the input child device used to communicate events to userspace
* @driver_type: specifies if protocol decoding is done in hardware or software * @driver_type: specifies if protocol decoding is done in hardware or software
* @idle: used to keep track of RX state * @idle: used to keep track of RX state
* @encode_wakeup: wakeup filtering uses IR encode API, therefore the allowed
* wakeup protocols is the set of all raw encoders
* @allowed_protocols: bitmask with the supported RC_BIT_* protocols * @allowed_protocols: bitmask with the supported RC_BIT_* protocols
* @enabled_protocols: bitmask with the enabled RC_BIT_* protocols * @enabled_protocols: bitmask with the enabled RC_BIT_* protocols
* @allowed_wakeup_protocols: bitmask with the supported RC_BIT_* wakeup protocols * @allowed_wakeup_protocols: bitmask with the supported RC_BIT_* wakeup protocols
...@@ -147,6 +149,7 @@ struct rc_dev { ...@@ -147,6 +149,7 @@ struct rc_dev {
struct input_dev *input_dev; struct input_dev *input_dev;
enum rc_driver_type driver_type; enum rc_driver_type driver_type;
bool idle; bool idle;
bool encode_wakeup;
u64 allowed_protocols; u64 allowed_protocols;
u64 enabled_protocols; u64 enabled_protocols;
u64 allowed_wakeup_protocols; u64 allowed_wakeup_protocols;
......
...@@ -106,6 +106,15 @@ enum rc_type { ...@@ -106,6 +106,15 @@ enum rc_type {
RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE | RC_BIT_SHARP | \ RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE | RC_BIT_SHARP | \
RC_BIT_XMP) RC_BIT_XMP)
#define RC_BIT_ALL_IR_ENCODER \
(RC_BIT_RC5 | RC_BIT_RC5X_20 | RC_BIT_RC5_SZ | \
RC_BIT_JVC | \
RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20 | \
RC_BIT_NEC | RC_BIT_NECX | RC_BIT_NEC32 | \
RC_BIT_SANYO | \
RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 | \
RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE | \
RC_BIT_SHARP)
#define RC_SCANCODE_UNKNOWN(x) (x) #define RC_SCANCODE_UNKNOWN(x) (x)
#define RC_SCANCODE_OTHER(x) (x) #define RC_SCANCODE_OTHER(x) (x)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment