diff options
Diffstat (limited to 'drivers/media/IR/ir-rc6-decoder.c')
| -rw-r--r-- | drivers/media/IR/ir-rc6-decoder.c | 153 | 
1 files changed, 7 insertions, 146 deletions
diff --git a/drivers/media/IR/ir-rc6-decoder.c b/drivers/media/IR/ir-rc6-decoder.c index 2bf479f4f1b..f1624b8279b 100644 --- a/drivers/media/IR/ir-rc6-decoder.c +++ b/drivers/media/IR/ir-rc6-decoder.c @@ -36,10 +36,6 @@  #define RC6_STARTBIT_MASK	0x08	/* for the header bits */  #define RC6_6A_MCE_TOGGLE_MASK	0x8000	/* for the body bits */ -/* Used to register rc6_decoder clients */ -static LIST_HEAD(decoder_list); -static DEFINE_SPINLOCK(decoder_lock); -  enum rc6_mode {  	RC6_MODE_0,  	RC6_MODE_6A, @@ -58,89 +54,8 @@ enum rc6_state {  	STATE_FINISHED,  }; -struct decoder_data { -	struct list_head	list; -	struct ir_input_dev	*ir_dev; -	int			enabled:1; - -	/* State machine control */ -	enum rc6_state		state; -	u8			header; -	u32			body; -	struct ir_raw_event	prev_ev; -	bool			toggle; -	unsigned		count; -	unsigned		wanted_bits; -}; - - -/** - * 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) +static enum rc6_mode rc6_mode(struct rc6_dec *data)  { -	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	= "rc6_decoder", -	.attrs	= decoder_attributes, -}; - -static enum rc6_mode rc6_mode(struct decoder_data *data) {  	switch (data->header & RC6_MODE_MASK) {  	case 0:  		return RC6_MODE_0; @@ -162,16 +77,12 @@ static enum rc6_mode rc6_mode(struct decoder_data *data) {   */  static int ir_rc6_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 rc6_dec *data = &ir_dev->raw->rc6;  	u32 scancode;  	u8 toggle; -	data = get_decoder_data(ir_dev); -	if (!data) -		return -EINVAL; - -	if (!data->enabled) +	if (!(ir_dev->raw->enabled_protocols & IR_TYPE_RC6))  		return 0;  	if (IS_RESET(ev)) { @@ -223,12 +134,11 @@ again:  		if (ev.pulse)  			data->header |= 1;  		data->count++; -		data->prev_ev = ev;  		data->state = STATE_HEADER_BIT_END;  		return 0;  	case STATE_HEADER_BIT_END: -		if (!is_transition(&ev, &data->prev_ev)) +		if (!is_transition(&ev, &ir_dev->raw->prev_ev))  			break;  		if (data->count == RC6_HEADER_NBITS) @@ -244,12 +154,11 @@ again:  			break;  		data->toggle = ev.pulse; -		data->prev_ev = ev;  		data->state = STATE_TOGGLE_END;  		return 0;  	case STATE_TOGGLE_END: -		if (!is_transition(&ev, &data->prev_ev) || +		if (!is_transition(&ev, &ir_dev->raw->prev_ev) ||  		    !geq_margin(ev.duration, RC6_TOGGLE_END, RC6_UNIT / 2))  			break; @@ -259,7 +168,6 @@ again:  		}  		data->state = STATE_BODY_BIT_START; -		data->prev_ev = ev;  		decrease_duration(&ev, RC6_TOGGLE_END);  		data->count = 0; @@ -291,13 +199,11 @@ again:  		if (ev.pulse)  			data->body |= 1;  		data->count++; -		data->prev_ev = ev; -  		data->state = STATE_BODY_BIT_END;  		return 0;  	case STATE_BODY_BIT_END: -		if (!is_transition(&ev, &data->prev_ev)) +		if (!is_transition(&ev, &ir_dev->raw->prev_ev))  			break;  		if (data->count == data->wanted_bits) @@ -348,54 +254,9 @@ out:  	return -EINVAL;  } -static int ir_rc6_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_rc6_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 rc6_handler = { +	.protocols	= IR_TYPE_RC6,  	.decode		= ir_rc6_decode, -	.raw_register	= ir_rc6_register, -	.raw_unregister	= ir_rc6_unregister,  };  static int __init ir_rc6_decode_init(void)  |