diff options
Diffstat (limited to 'drivers/media/IR/ir-nec-decoder.c')
| -rw-r--r-- | drivers/media/IR/ir-nec-decoder.c | 151 | 
1 files changed, 10 insertions, 141 deletions
diff --git a/drivers/media/IR/ir-nec-decoder.c b/drivers/media/IR/ir-nec-decoder.c index ba79233112e..52e0f378ae3 100644 --- a/drivers/media/IR/ir-nec-decoder.c +++ b/drivers/media/IR/ir-nec-decoder.c @@ -27,10 +27,6 @@  #define	NEC_TRAILER_PULSE	(1  * NEC_UNIT)  #define	NEC_TRAILER_SPACE	(10 * NEC_UNIT) /* even longer in reality */ -/* Used to register nec_decoder clients */ -static LIST_HEAD(decoder_list); -static DEFINE_SPINLOCK(decoder_lock); -  enum nec_state {  	STATE_INACTIVE,  	STATE_HEADER_SPACE, @@ -40,84 +36,6 @@ enum nec_state {  	STATE_TRAILER_SPACE,  }; -struct decoder_data { -	struct list_head	list; -	struct ir_input_dev	*ir_dev; -	int			enabled:1; - -	/* State machine control */ -	enum nec_state		state; -	u32			nec_bits; -	unsigned		count; -}; - - -/** - * get_decoder_data()	- gets decoder data - * @input_dev:	input device - * - * Returns the struct decoder_data that corresponds to a device - */ -static struct decoder_data *get_decoder_data(struct  ir_input_dev *ir_dev) -{ -	struct decoder_data *data = NULL; - -	spin_lock(&decoder_lock); -	list_for_each_entry(data, &decoder_list, list) { -		if (data->ir_dev == ir_dev) -			break; -	} -	spin_unlock(&decoder_lock); -	return data; -} - -static ssize_t store_enabled(struct device *d, -			     struct device_attribute *mattr, -			     const char *buf, -			     size_t len) -{ -	unsigned long value; -	struct ir_input_dev *ir_dev = dev_get_drvdata(d); -	struct decoder_data *data = get_decoder_data(ir_dev); - -	if (!data) -		return -EINVAL; - -	if (strict_strtoul(buf, 10, &value) || value > 1) -		return -EINVAL; - -	data->enabled = value; - -	return len; -} - -static ssize_t show_enabled(struct device *d, -			     struct device_attribute *mattr, char *buf) -{ -	struct ir_input_dev *ir_dev = dev_get_drvdata(d); -	struct decoder_data *data = get_decoder_data(ir_dev); - -	if (!data) -		return -EINVAL; - -	if (data->enabled) -		return sprintf(buf, "1\n"); -	else -	return sprintf(buf, "0\n"); -} - -static DEVICE_ATTR(enabled, S_IRUGO | S_IWUSR, show_enabled, store_enabled); - -static struct attribute *decoder_attributes[] = { -	&dev_attr_enabled.attr, -	NULL -}; - -static struct attribute_group decoder_attribute_group = { -	.name	= "nec_decoder", -	.attrs	= decoder_attributes, -}; -  /**   * ir_nec_decode() - Decode one NEC pulse or space   * @input_dev:	the struct input_dev descriptor of the device @@ -127,16 +45,12 @@ static struct attribute_group decoder_attribute_group = {   */  static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev)  { -	struct decoder_data *data;  	struct ir_input_dev *ir_dev = input_get_drvdata(input_dev); +	struct nec_dec *data = &ir_dev->raw->nec;  	u32 scancode;  	u8 address, not_address, command, not_command; -	data = get_decoder_data(ir_dev); -	if (!data) -		return -EINVAL; - -	if (!data->enabled) +	if (!(ir_dev->raw->enabled_protocols & IR_TYPE_NEC))  		return 0;  	if (IS_RESET(ev)) { @@ -191,9 +105,9 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev)  		if (ev.pulse)  			break; -		data->nec_bits <<= 1; +		data->bits <<= 1;  		if (eq_margin(ev.duration, NEC_BIT_1_SPACE, NEC_UNIT / 2)) -			data->nec_bits |= 1; +			data->bits |= 1;  		else if (!eq_margin(ev.duration, NEC_BIT_0_SPACE, NEC_UNIT / 2))  			break;  		data->count++; @@ -222,14 +136,14 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev)  		if (!geq_margin(ev.duration, NEC_TRAILER_SPACE, NEC_UNIT / 2))  			break; -		address     = bitrev8((data->nec_bits >> 24) & 0xff); -		not_address = bitrev8((data->nec_bits >> 16) & 0xff); -		command	    = bitrev8((data->nec_bits >>  8) & 0xff); -		not_command = bitrev8((data->nec_bits >>  0) & 0xff); +		address     = bitrev8((data->bits >> 24) & 0xff); +		not_address = bitrev8((data->bits >> 16) & 0xff); +		command	    = bitrev8((data->bits >>  8) & 0xff); +		not_command = bitrev8((data->bits >>  0) & 0xff);  		if ((command ^ not_command) != 0xff) {  			IR_dprintk(1, "NEC checksum error: received 0x%08x\n", -				   data->nec_bits); +				   data->bits);  			break;  		} @@ -256,54 +170,9 @@ static int ir_nec_decode(struct input_dev *input_dev, struct ir_raw_event ev)  	return -EINVAL;  } -static int ir_nec_register(struct input_dev *input_dev) -{ -	struct ir_input_dev *ir_dev = input_get_drvdata(input_dev); -	struct decoder_data *data; -	int rc; - -	rc = sysfs_create_group(&ir_dev->dev.kobj, &decoder_attribute_group); -	if (rc < 0) -		return rc; - -	data = kzalloc(sizeof(*data), GFP_KERNEL); -	if (!data) { -		sysfs_remove_group(&ir_dev->dev.kobj, &decoder_attribute_group); -		return -ENOMEM; -	} - -	data->ir_dev = ir_dev; -	data->enabled = 1; - -	spin_lock(&decoder_lock); -	list_add_tail(&data->list, &decoder_list); -	spin_unlock(&decoder_lock); - -	return 0; -} - -static int ir_nec_unregister(struct input_dev *input_dev) -{ -	struct ir_input_dev *ir_dev = input_get_drvdata(input_dev); -	static struct decoder_data *data; - -	data = get_decoder_data(ir_dev); -	if (!data) -		return 0; - -	sysfs_remove_group(&ir_dev->dev.kobj, &decoder_attribute_group); - -	spin_lock(&decoder_lock); -	list_del(&data->list); -	spin_unlock(&decoder_lock); - -	return 0; -} -  static struct ir_raw_handler nec_handler = { +	.protocols	= IR_TYPE_NEC,  	.decode		= ir_nec_decode, -	.raw_register	= ir_nec_register, -	.raw_unregister	= ir_nec_unregister,  };  static int __init ir_nec_decode_init(void)  |