diff options
Diffstat (limited to 'drivers/media/rc/rc-loopback.c')
| -rw-r--r-- | drivers/media/rc/rc-loopback.c | 36 | 
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/media/rc/rc-loopback.c b/drivers/media/rc/rc-loopback.c index 63dace8198b0..d8bdf63ce985 100644 --- a/drivers/media/rc/rc-loopback.c +++ b/drivers/media/rc/rc-loopback.c @@ -26,6 +26,7 @@  #include <linux/device.h>  #include <linux/module.h>  #include <linux/sched.h> +#include <linux/slab.h>  #include <media/rc-core.h>  #define DRIVER_NAME	"rc-loopback" @@ -176,6 +177,39 @@ static int loop_set_carrier_report(struct rc_dev *dev, int enable)  	return 0;  } +static int loop_set_wakeup_filter(struct rc_dev *dev, +				  struct rc_scancode_filter *sc_filter) +{ +	static const unsigned int max = 512; +	struct ir_raw_event *raw; +	int ret; +	int i; + +	/* fine to disable filter */ +	if (!sc_filter->mask) +		return 0; + +	/* encode the specified filter and loop it back */ +	raw = kmalloc_array(max, sizeof(*raw), GFP_KERNEL); +	ret = ir_raw_encode_scancode(dev->enabled_wakeup_protocols, sc_filter, +				     raw, max); +	/* still loop back the partial raw IR even if it's incomplete */ +	if (ret == -ENOBUFS) +		ret = max; +	if (ret >= 0) { +		/* do the loopback */ +		for (i = 0; i < ret; ++i) +			ir_raw_event_store(dev, &raw[i]); +		ir_raw_event_handle(dev); + +		ret = 0; +	} + +	kfree(raw); + +	return ret; +} +  static int __init loop_init(void)  {  	struct rc_dev *rc; @@ -195,6 +229,7 @@ static int __init loop_init(void)  	rc->map_name		= RC_MAP_EMPTY;  	rc->priv		= &loopdev;  	rc->driver_type		= RC_DRIVER_IR_RAW; +	rc->encode_wakeup	= true;  	rc->allowed_protocols	= RC_BIT_ALL;  	rc->timeout		= 100 * 1000 * 1000; /* 100 ms */  	rc->min_timeout		= 1; @@ -209,6 +244,7 @@ static int __init loop_init(void)  	rc->s_idle		= loop_set_idle;  	rc->s_learning_mode	= loop_set_learning_mode;  	rc->s_carrier_report	= loop_set_carrier_report; +	rc->s_wakeup_filter	= loop_set_wakeup_filter;  	loopdev.txmask		= RXMASK_REGULAR;  	loopdev.txcarrier	= 36000;  |