1b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab/* ir-sanyo-decoder.c - handle SANYO IR Pulse/Space protocol
2b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *
3b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab * Copyright (C) 2011 by Mauro Carvalho Chehab <mchehab@redhat.com>
4b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *
5b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab * This program is free software; you can redistribute it and/or modify
6b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *  it under the terms of the GNU General Public License as published by
7b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *  the Free Software Foundation version 2 of the License.
8b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *
9b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *  This program is distributed in the hope that it will be useful,
10b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *  GNU General Public License for more details.
13b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *
14b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab * This protocol uses the NEC protocol timings. However, data is formatted as:
15b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *	13 bits Custom Code
16b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *	13 bits NOT(Custom Code)
17b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *	8 bits Key data
18b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *	8 bits NOT(Key data)
19b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *
20b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab * According with LIRC, this protocol is used on Sanyo, Aiwa and Chinon
21b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab * Information for this protocol is available at the Sanyo LC7461 datasheet.
22b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab */
23b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
242e962f4efa944d47bbfacdd7f93fb21a99272357Hans Verkuil#include <linux/module.h>
25b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#include <linux/bitrev.h>
26b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#include "rc-core-priv.h"
27b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
28b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define SANYO_NBITS		(13+13+8+8)
29b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define SANYO_UNIT		562500  /* ns */
30b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define SANYO_HEADER_PULSE	(16  * SANYO_UNIT)
31b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define SANYO_HEADER_SPACE	(8   * SANYO_UNIT)
32b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define SANYO_BIT_PULSE		(1   * SANYO_UNIT)
33b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define SANYO_BIT_0_SPACE	(1   * SANYO_UNIT)
34b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define SANYO_BIT_1_SPACE	(3   * SANYO_UNIT)
35b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define SANYO_REPEAT_SPACE	(150 * SANYO_UNIT)
36b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define	SANYO_TRAILER_PULSE	(1   * SANYO_UNIT)
37b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab#define	SANYO_TRAILER_SPACE	(10  * SANYO_UNIT)	/* in fact, 42 */
38b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
39b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehabenum sanyo_state {
40b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	STATE_INACTIVE,
41b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	STATE_HEADER_SPACE,
42b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	STATE_BIT_PULSE,
43b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	STATE_BIT_SPACE,
44b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	STATE_TRAILER_PULSE,
45b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	STATE_TRAILER_SPACE,
46b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab};
47b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
48b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab/**
49b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab * ir_sanyo_decode() - Decode one SANYO pulse or space
50b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab * @dev:	the struct rc_dev descriptor of the device
51b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab * @duration:	the struct ir_raw_event descriptor of the pulse/space
52b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab *
53b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab * This function returns -EINVAL if the pulse violates the state machine
54b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab */
55b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehabstatic int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev)
56b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab{
57b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	struct sanyo_dec *data = &dev->raw->sanyo;
58b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	u32 scancode;
59b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	u8 address, not_address, command, not_command;
60b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
61b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	if (!(dev->raw->enabled_protocols & RC_TYPE_SANYO))
62b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		return 0;
63b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
64b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	if (!is_timing_event(ev)) {
65b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (ev.reset) {
66b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			IR_dprintk(1, "SANYO event reset received. reset to state 0\n");
67b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			data->state = STATE_INACTIVE;
68b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		}
69b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		return 0;
70b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	}
71b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
72b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	IR_dprintk(2, "SANYO decode started at state %d (%uus %s)\n",
73b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		   data->state, TO_US(ev.duration), TO_STR(ev.pulse));
74b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
75b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	switch (data->state) {
76b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
77b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	case STATE_INACTIVE:
78b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (!ev.pulse)
79b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
80b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
81b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (eq_margin(ev.duration, SANYO_HEADER_PULSE, SANYO_UNIT / 2)) {
82b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			data->count = 0;
83b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			data->state = STATE_HEADER_SPACE;
84b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			return 0;
85b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		}
86b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		break;
87b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
88b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
89b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	case STATE_HEADER_SPACE:
90b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (ev.pulse)
91b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
92b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
93b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (eq_margin(ev.duration, SANYO_HEADER_SPACE, SANYO_UNIT / 2)) {
94b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			data->state = STATE_BIT_PULSE;
95b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			return 0;
96b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		}
97b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
98b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		break;
99b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
100b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	case STATE_BIT_PULSE:
101b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (!ev.pulse)
102b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
103b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
104b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (!eq_margin(ev.duration, SANYO_BIT_PULSE, SANYO_UNIT / 2))
105b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
106b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
107b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		data->state = STATE_BIT_SPACE;
108b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		return 0;
109b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
110b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	case STATE_BIT_SPACE:
111b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (ev.pulse)
112b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
113b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
114b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (!data->count && geq_margin(ev.duration, SANYO_REPEAT_SPACE, SANYO_UNIT / 2)) {
115b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			if (!dev->keypressed) {
116b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab				IR_dprintk(1, "SANYO discarding last key repeat: event after key up\n");
117b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			} else {
118b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab				rc_repeat(dev);
119b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab				IR_dprintk(1, "SANYO repeat last key\n");
120b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab				data->state = STATE_INACTIVE;
121b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			}
122b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			return 0;
123b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		}
124b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
125b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		data->bits <<= 1;
126b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (eq_margin(ev.duration, SANYO_BIT_1_SPACE, SANYO_UNIT / 2))
127b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			data->bits |= 1;
128b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		else if (!eq_margin(ev.duration, SANYO_BIT_0_SPACE, SANYO_UNIT / 2))
129b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
130b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		data->count++;
131b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
132b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (data->count == SANYO_NBITS)
133b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			data->state = STATE_TRAILER_PULSE;
134b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		else
135b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			data->state = STATE_BIT_PULSE;
136b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
137b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		return 0;
138b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
139b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	case STATE_TRAILER_PULSE:
140b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (!ev.pulse)
141b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
142b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
143b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (!eq_margin(ev.duration, SANYO_TRAILER_PULSE, SANYO_UNIT / 2))
144b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
145b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
146b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		data->state = STATE_TRAILER_SPACE;
147b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		return 0;
148b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
149b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	case STATE_TRAILER_SPACE:
150b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (ev.pulse)
151b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
152b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
153b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if (!geq_margin(ev.duration, SANYO_TRAILER_SPACE, SANYO_UNIT / 2))
154b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			break;
155b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
156b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		address     = bitrev16((data->bits >> 29) & 0x1fff) >> 3;
157b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		not_address = bitrev16((data->bits >> 16) & 0x1fff) >> 3;
158b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		command	    = bitrev8((data->bits >>  8) & 0xff);
159b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		not_command = bitrev8((data->bits >>  0) & 0xff);
160b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
161b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		if ((command ^ not_command) != 0xff) {
162b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			IR_dprintk(1, "SANYO checksum error: received 0x%08Lx\n",
163b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab				   data->bits);
164b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			data->state = STATE_INACTIVE;
165b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab			return 0;
166b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		}
167b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
168b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		scancode = address << 8 | command;
169b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		IR_dprintk(1, "SANYO scancode: 0x%06x\n", scancode);
170b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		rc_keydown(dev, scancode, 0);
171b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		data->state = STATE_INACTIVE;
172b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		return 0;
173b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	}
174b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
175b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	IR_dprintk(1, "SANYO decode failed at count %d state %d (%uus %s)\n",
176b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab		   data->count, data->state, TO_US(ev.duration), TO_STR(ev.pulse));
177b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	data->state = STATE_INACTIVE;
178b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	return -EINVAL;
179b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab}
180b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
181b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehabstatic struct ir_raw_handler sanyo_handler = {
182b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	.protocols	= RC_TYPE_SANYO,
183b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	.decode		= ir_sanyo_decode,
184b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab};
185b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
186b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehabstatic int __init ir_sanyo_decode_init(void)
187b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab{
188b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	ir_raw_handler_register(&sanyo_handler);
189b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
190b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	printk(KERN_INFO "IR SANYO protocol handler initialized\n");
191b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	return 0;
192b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab}
193b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
194b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehabstatic void __exit ir_sanyo_decode_exit(void)
195b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab{
196b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab	ir_raw_handler_unregister(&sanyo_handler);
197b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab}
198b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
199b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehabmodule_init(ir_sanyo_decode_init);
200b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehabmodule_exit(ir_sanyo_decode_exit);
201b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho Chehab
202b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho ChehabMODULE_LICENSE("GPL");
203b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho ChehabMODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
204b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho ChehabMODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)");
205b32e724308300a6ecead0f4895f0452a06a4291dMauro Carvalho ChehabMODULE_DESCRIPTION("SANYO IR protocol decoder");
206