Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+21 −5
Original line number Original line Diff line number Diff line
@@ -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,
		[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,
	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)
}
}


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,
		 * 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,
			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) {
+3 −0
Original line number Original line Diff line number Diff line
@@ -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 {
	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;
+9 −0
Original line number Original line Diff line number Diff line
@@ -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)