aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/rc
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2014-04-03 19:31:30 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-07-23 20:50:48 -0400
commit120703f9eb32033f0e39bdc552c0273c8ab45f33 (patch)
tree427e55aad9dcfcb91e99b98d508e6fb407e8f600 /drivers/media/rc
parentaf3a4a9bbeb00df3e42e77240b4cdac5479812f9 (diff)
[media] rc-core: document the protocol type
Right now the protocol information is not preserved, rc-core gets handed a scancode but has no idea which protocol it corresponds to. This patch (which required reading through the source/keymap for all drivers, not fun) makes the protocol information explicit which is important documentation and makes it easier to e.g. support multiple protocols with one decoder (think rc5 and rc-streamzap). The information isn't used yet so there should be no functional changes. [m.chehab@samsung.com: rebased, added cxusb and removed bad whitespacing] Signed-off-by: David Härdeman <david@hardeman.nu> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/rc')
-rw-r--r--drivers/media/rc/ati_remote.c4
-rw-r--r--drivers/media/rc/img-ir/img-ir-hw.c10
-rw-r--r--drivers/media/rc/img-ir/img-ir-hw.h3
-rw-r--r--drivers/media/rc/img-ir/img-ir-jvc.c4
-rw-r--r--drivers/media/rc/img-ir/img-ir-nec.c4
-rw-r--r--drivers/media/rc/img-ir/img-ir-sanyo.c4
-rw-r--r--drivers/media/rc/img-ir/img-ir-sharp.c4
-rw-r--r--drivers/media/rc/img-ir/img-ir-sony.c12
-rw-r--r--drivers/media/rc/imon.c5
-rw-r--r--drivers/media/rc/ir-jvc-decoder.c2
-rw-r--r--drivers/media/rc/ir-nec-decoder.c2
-rw-r--r--drivers/media/rc/ir-rc5-decoder.c5
-rw-r--r--drivers/media/rc/ir-rc5-sz-decoder.c2
-rw-r--r--drivers/media/rc/ir-rc6-decoder.c37
-rw-r--r--drivers/media/rc/ir-sanyo-decoder.c2
-rw-r--r--drivers/media/rc/ir-sharp-decoder.c2
-rw-r--r--drivers/media/rc/ir-sony-decoder.c6
-rw-r--r--drivers/media/rc/rc-main.c30
18 files changed, 94 insertions, 44 deletions
diff --git a/drivers/media/rc/ati_remote.c b/drivers/media/rc/ati_remote.c
index 2df7c5516013..8730b32a067c 100644
--- a/drivers/media/rc/ati_remote.c
+++ b/drivers/media/rc/ati_remote.c
@@ -622,8 +622,8 @@ static void ati_remote_input_report(struct urb *urb)
622 * it would cause ghost repeats which would be a 622 * it would cause ghost repeats which would be a
623 * regression for this driver. 623 * regression for this driver.
624 */ 624 */
625 rc_keydown_notimeout(ati_remote->rdev, scancode, 625 rc_keydown_notimeout(ati_remote->rdev, RC_TYPE_OTHER,
626 data[2]); 626 scancode, data[2]);
627 rc_keyup(ati_remote->rdev); 627 rc_keyup(ati_remote->rdev);
628 } 628 }
629 return; 629 return;
diff --git a/drivers/media/rc/img-ir/img-ir-hw.c b/drivers/media/rc/img-ir/img-ir-hw.c
index 153c0840bf4c..b0ec55f52228 100644
--- a/drivers/media/rc/img-ir/img-ir-hw.c
+++ b/drivers/media/rc/img-ir/img-ir-hw.c
@@ -512,7 +512,7 @@ unlock:
512static int img_ir_set_normal_filter(struct rc_dev *dev, 512static int img_ir_set_normal_filter(struct rc_dev *dev,
513 struct rc_scancode_filter *sc_filter) 513 struct rc_scancode_filter *sc_filter)
514{ 514{
515 return img_ir_set_filter(dev, RC_FILTER_NORMAL, sc_filter); 515 return img_ir_set_filter(dev, RC_FILTER_NORMAL, sc_filter);
516} 516}
517 517
518static int img_ir_set_wakeup_filter(struct rc_dev *dev, 518static int img_ir_set_wakeup_filter(struct rc_dev *dev,
@@ -795,9 +795,11 @@ static void img_ir_handle_data(struct img_ir_priv *priv, u32 len, u64 raw)
795 struct img_ir_priv_hw *hw = &priv->hw; 795 struct img_ir_priv_hw *hw = &priv->hw;
796 const struct img_ir_decoder *dec = hw->decoder; 796 const struct img_ir_decoder *dec = hw->decoder;
797 int ret = IMG_IR_SCANCODE; 797 int ret = IMG_IR_SCANCODE;
798 int scancode; 798 u32 scancode;
799 enum rc_type protocol = RC_TYPE_UNKNOWN;
800
799 if (dec->scancode) 801 if (dec->scancode)
800 ret = dec->scancode(len, raw, &scancode, hw->enabled_protocols); 802 ret = dec->scancode(len, raw, &protocol, &scancode, hw->enabled_protocols);
801 else if (len >= 32) 803 else if (len >= 32)
802 scancode = (u32)raw; 804 scancode = (u32)raw;
803 else if (len < 32) 805 else if (len < 32)
@@ -806,7 +808,7 @@ static void img_ir_handle_data(struct img_ir_priv *priv, u32 len, u64 raw)
806 len, (unsigned long long)raw); 808 len, (unsigned long long)raw);
807 if (ret == IMG_IR_SCANCODE) { 809 if (ret == IMG_IR_SCANCODE) {
808 dev_dbg(priv->dev, "decoded scan code %#x\n", scancode); 810 dev_dbg(priv->dev, "decoded scan code %#x\n", scancode);
809 rc_keydown(hw->rdev, scancode, 0); 811 rc_keydown(hw->rdev, protocol, scancode, 0);
810 img_ir_end_repeat(priv); 812 img_ir_end_repeat(priv);
811 } else if (ret == IMG_IR_REPEATCODE) { 813 } else if (ret == IMG_IR_REPEATCODE) {
812 if (hw->mode == IMG_IR_M_REPEATING) { 814 if (hw->mode == IMG_IR_M_REPEATING) {
diff --git a/drivers/media/rc/img-ir/img-ir-hw.h b/drivers/media/rc/img-ir/img-ir-hw.h
index 450f17dfb66a..3e40ce87b898 100644
--- a/drivers/media/rc/img-ir/img-ir-hw.h
+++ b/drivers/media/rc/img-ir/img-ir-hw.h
@@ -162,7 +162,8 @@ struct img_ir_decoder {
162 struct img_ir_control control; 162 struct img_ir_control control;
163 163
164 /* scancode logic */ 164 /* scancode logic */
165 int (*scancode)(int len, u64 raw, int *scancode, u64 protocols); 165 int (*scancode)(int len, u64 raw, enum rc_type *protocol,
166 u32 *scancode, u64 enabled_protocols);
166 int (*filter)(const struct rc_scancode_filter *in, 167 int (*filter)(const struct rc_scancode_filter *in,
167 struct img_ir_filter *out, u64 protocols); 168 struct img_ir_filter *out, u64 protocols);
168}; 169};
diff --git a/drivers/media/rc/img-ir/img-ir-jvc.c b/drivers/media/rc/img-ir/img-ir-jvc.c
index 85ee90f53242..a60dda8bf706 100644
--- a/drivers/media/rc/img-ir/img-ir-jvc.c
+++ b/drivers/media/rc/img-ir/img-ir-jvc.c
@@ -12,7 +12,8 @@
12#include "img-ir-hw.h" 12#include "img-ir-hw.h"
13 13
14/* Convert JVC data to a scancode */ 14/* Convert JVC data to a scancode */
15static int img_ir_jvc_scancode(int len, u64 raw, int *scancode, u64 protocols) 15static int img_ir_jvc_scancode(int len, u64 raw, enum rc_type *protocol,
16 u32 *scancode, u64 enabled_protocols)
16{ 17{
17 unsigned int cust, data; 18 unsigned int cust, data;
18 19
@@ -22,6 +23,7 @@ static int img_ir_jvc_scancode(int len, u64 raw, int *scancode, u64 protocols)
22 cust = (raw >> 0) & 0xff; 23 cust = (raw >> 0) & 0xff;
23 data = (raw >> 8) & 0xff; 24 data = (raw >> 8) & 0xff;
24 25
26 *protocol = RC_TYPE_JVC;
25 *scancode = cust << 8 | data; 27 *scancode = cust << 8 | data;
26 return IMG_IR_SCANCODE; 28 return IMG_IR_SCANCODE;
27} 29}
diff --git a/drivers/media/rc/img-ir/img-ir-nec.c b/drivers/media/rc/img-ir/img-ir-nec.c
index f7520e25fbdb..739897549b5b 100644
--- a/drivers/media/rc/img-ir/img-ir-nec.c
+++ b/drivers/media/rc/img-ir/img-ir-nec.c
@@ -13,7 +13,8 @@
13#include <linux/bitrev.h> 13#include <linux/bitrev.h>
14 14
15/* Convert NEC data to a scancode */ 15/* Convert NEC data to a scancode */
16static int img_ir_nec_scancode(int len, u64 raw, int *scancode, u64 protocols) 16static int img_ir_nec_scancode(int len, u64 raw, enum rc_type *protocol,
17 u32 *scancode, u64 enabled_protocols)
17{ 18{
18 unsigned int addr, addr_inv, data, data_inv; 19 unsigned int addr, addr_inv, data, data_inv;
19 /* a repeat code has no data */ 20 /* a repeat code has no data */
@@ -45,6 +46,7 @@ static int img_ir_nec_scancode(int len, u64 raw, int *scancode, u64 protocols)
45 *scancode = addr << 8 | 46 *scancode = addr << 8 |
46 data; 47 data;
47 } 48 }
49 *protocol = RC_TYPE_NEC;
48 return IMG_IR_SCANCODE; 50 return IMG_IR_SCANCODE;
49} 51}
50 52
diff --git a/drivers/media/rc/img-ir/img-ir-sanyo.c b/drivers/media/rc/img-ir/img-ir-sanyo.c
index 6755c945bce8..6b0653ecdf5a 100644
--- a/drivers/media/rc/img-ir/img-ir-sanyo.c
+++ b/drivers/media/rc/img-ir/img-ir-sanyo.c
@@ -23,7 +23,8 @@
23#include "img-ir-hw.h" 23#include "img-ir-hw.h"
24 24
25/* Convert Sanyo data to a scancode */ 25/* Convert Sanyo data to a scancode */
26static int img_ir_sanyo_scancode(int len, u64 raw, int *scancode, u64 protocols) 26static int img_ir_sanyo_scancode(int len, u64 raw, enum rc_type *protocol,
27 u32 *scancode, u64 enabled_protocols)
27{ 28{
28 unsigned int addr, addr_inv, data, data_inv; 29 unsigned int addr, addr_inv, data, data_inv;
29 /* a repeat code has no data */ 30 /* a repeat code has no data */
@@ -43,6 +44,7 @@ static int img_ir_sanyo_scancode(int len, u64 raw, int *scancode, u64 protocols)
43 return -EINVAL; 44 return -EINVAL;
44 45
45 /* Normal Sanyo */ 46 /* Normal Sanyo */
47 *protocol = RC_TYPE_SANYO;
46 *scancode = addr << 8 | data; 48 *scancode = addr << 8 | data;
47 return IMG_IR_SCANCODE; 49 return IMG_IR_SCANCODE;
48} 50}
diff --git a/drivers/media/rc/img-ir/img-ir-sharp.c b/drivers/media/rc/img-ir/img-ir-sharp.c
index 5867be088cce..3300a38802ac 100644
--- a/drivers/media/rc/img-ir/img-ir-sharp.c
+++ b/drivers/media/rc/img-ir/img-ir-sharp.c
@@ -12,7 +12,8 @@
12#include "img-ir-hw.h" 12#include "img-ir-hw.h"
13 13
14/* Convert Sharp data to a scancode */ 14/* Convert Sharp data to a scancode */
15static int img_ir_sharp_scancode(int len, u64 raw, int *scancode, u64 protocols) 15static int img_ir_sharp_scancode(int len, u64 raw, enum rc_type *protocol,
16 u32 *scancode, u64 enabled_protocols)
16{ 17{
17 unsigned int addr, cmd, exp, chk; 18 unsigned int addr, cmd, exp, chk;
18 19
@@ -31,6 +32,7 @@ static int img_ir_sharp_scancode(int len, u64 raw, int *scancode, u64 protocols)
31 /* probably the second half of the message */ 32 /* probably the second half of the message */
32 return -EINVAL; 33 return -EINVAL;
33 34
35 *protocol = RC_TYPE_SHARP;
34 *scancode = addr << 8 | cmd; 36 *scancode = addr << 8 | cmd;
35 return IMG_IR_SCANCODE; 37 return IMG_IR_SCANCODE;
36} 38}
diff --git a/drivers/media/rc/img-ir/img-ir-sony.c b/drivers/media/rc/img-ir/img-ir-sony.c
index b9029aecceac..3a0f17b0752c 100644
--- a/drivers/media/rc/img-ir/img-ir-sony.c
+++ b/drivers/media/rc/img-ir/img-ir-sony.c
@@ -12,35 +12,39 @@
12#include "img-ir-hw.h" 12#include "img-ir-hw.h"
13 13
14/* Convert Sony data to a scancode */ 14/* Convert Sony data to a scancode */
15static int img_ir_sony_scancode(int len, u64 raw, int *scancode, u64 protocols) 15static int img_ir_sony_scancode(int len, u64 raw, enum rc_type *protocol,
16 u32 *scancode, u64 enabled_protocols)
16{ 17{
17 unsigned int dev, subdev, func; 18 unsigned int dev, subdev, func;
18 19
19 switch (len) { 20 switch (len) {
20 case 12: 21 case 12:
21 if (!(protocols & RC_BIT_SONY12)) 22 if (!(enabled_protocols & RC_BIT_SONY12))
22 return -EINVAL; 23 return -EINVAL;
23 func = raw & 0x7f; /* first 7 bits */ 24 func = raw & 0x7f; /* first 7 bits */
24 raw >>= 7; 25 raw >>= 7;
25 dev = raw & 0x1f; /* next 5 bits */ 26 dev = raw & 0x1f; /* next 5 bits */
26 subdev = 0; 27 subdev = 0;
28 *protocol = RC_TYPE_SONY12;
27 break; 29 break;
28 case 15: 30 case 15:
29 if (!(protocols & RC_BIT_SONY15)) 31 if (!(enabled_protocols & RC_BIT_SONY15))
30 return -EINVAL; 32 return -EINVAL;
31 func = raw & 0x7f; /* first 7 bits */ 33 func = raw & 0x7f; /* first 7 bits */
32 raw >>= 7; 34 raw >>= 7;
33 dev = raw & 0xff; /* next 8 bits */ 35 dev = raw & 0xff; /* next 8 bits */
34 subdev = 0; 36 subdev = 0;
37 *protocol = RC_TYPE_SONY15;
35 break; 38 break;
36 case 20: 39 case 20:
37 if (!(protocols & RC_BIT_SONY20)) 40 if (!(enabled_protocols & RC_BIT_SONY20))
38 return -EINVAL; 41 return -EINVAL;
39 func = raw & 0x7f; /* first 7 bits */ 42 func = raw & 0x7f; /* first 7 bits */
40 raw >>= 7; 43 raw >>= 7;
41 dev = raw & 0x1f; /* next 5 bits */ 44 dev = raw & 0x1f; /* next 5 bits */
42 raw >>= 5; 45 raw >>= 5;
43 subdev = raw & 0xff; /* next 8 bits */ 46 subdev = raw & 0xff; /* next 8 bits */
47 *protocol = RC_TYPE_SONY20;
44 break; 48 break;
45 default: 49 default:
46 return -EINVAL; 50 return -EINVAL;
diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c
index 6f24e77b1488..eb37f2622364 100644
--- a/drivers/media/rc/imon.c
+++ b/drivers/media/rc/imon.c
@@ -1579,7 +1579,10 @@ static void imon_incoming_packet(struct imon_context *ictx,
1579 if (press_type == 0) 1579 if (press_type == 0)
1580 rc_keyup(ictx->rdev); 1580 rc_keyup(ictx->rdev);
1581 else { 1581 else {
1582 rc_keydown(ictx->rdev, ictx->rc_scancode, ictx->rc_toggle); 1582 if (ictx->rc_type == RC_BIT_RC6_MCE)
1583 rc_keydown(ictx->rdev,
1584 ictx->rc_type == RC_BIT_RC6_MCE ? RC_TYPE_RC6_MCE : RC_TYPE_OTHER,
1585 ictx->rc_scancode, ictx->rc_toggle);
1583 spin_lock_irqsave(&ictx->kc_lock, flags); 1586 spin_lock_irqsave(&ictx->kc_lock, flags);
1584 ictx->last_keycode = ictx->kc; 1587 ictx->last_keycode = ictx->kc;
1585 spin_unlock_irqrestore(&ictx->kc_lock, flags); 1588 spin_unlock_irqrestore(&ictx->kc_lock, flags);
diff --git a/drivers/media/rc/ir-jvc-decoder.c b/drivers/media/rc/ir-jvc-decoder.c
index 4ea62a1dcfda..7b79eca83449 100644
--- a/drivers/media/rc/ir-jvc-decoder.c
+++ b/drivers/media/rc/ir-jvc-decoder.c
@@ -140,7 +140,7 @@ again:
140 scancode = (bitrev8((data->bits >> 8) & 0xff) << 8) | 140 scancode = (bitrev8((data->bits >> 8) & 0xff) << 8) |
141 (bitrev8((data->bits >> 0) & 0xff) << 0); 141 (bitrev8((data->bits >> 0) & 0xff) << 0);
142 IR_dprintk(1, "JVC scancode 0x%04x\n", scancode); 142 IR_dprintk(1, "JVC scancode 0x%04x\n", scancode);
143 rc_keydown(dev, scancode, data->toggle); 143 rc_keydown(dev, RC_TYPE_JVC, scancode, data->toggle);
144 data->first = false; 144 data->first = false;
145 data->old_bits = data->bits; 145 data->old_bits = data->bits;
146 } else if (data->bits == data->old_bits) { 146 } else if (data->bits == data->old_bits) {
diff --git a/drivers/media/rc/ir-nec-decoder.c b/drivers/media/rc/ir-nec-decoder.c
index 35c42e5e270b..c4333d5c0046 100644
--- a/drivers/media/rc/ir-nec-decoder.c
+++ b/drivers/media/rc/ir-nec-decoder.c
@@ -189,7 +189,7 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
189 if (data->is_nec_x) 189 if (data->is_nec_x)
190 data->necx_repeat = true; 190 data->necx_repeat = true;
191 191
192 rc_keydown(dev, scancode, 0); 192 rc_keydown(dev, RC_TYPE_NEC, scancode, 0);
193 data->state = STATE_INACTIVE; 193 data->state = STATE_INACTIVE;
194 return 0; 194 return 0;
195 } 195 }
diff --git a/drivers/media/rc/ir-rc5-decoder.c b/drivers/media/rc/ir-rc5-decoder.c
index 4295d9b250c8..3d38cbce5667 100644
--- a/drivers/media/rc/ir-rc5-decoder.c
+++ b/drivers/media/rc/ir-rc5-decoder.c
@@ -51,6 +51,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev)
51 struct rc5_dec *data = &dev->raw->rc5; 51 struct rc5_dec *data = &dev->raw->rc5;
52 u8 toggle; 52 u8 toggle;
53 u32 scancode; 53 u32 scancode;
54 enum rc_type protocol;
54 55
55 if (!rc_protocols_enabled(dev, RC_BIT_RC5 | RC_BIT_RC5X)) 56 if (!rc_protocols_enabled(dev, RC_BIT_RC5 | RC_BIT_RC5X))
56 return 0; 57 return 0;
@@ -138,6 +139,7 @@ again:
138 toggle = (data->bits & 0x20000) ? 1 : 0; 139 toggle = (data->bits & 0x20000) ? 1 : 0;
139 command += (data->bits & 0x01000) ? 0 : 0x40; 140 command += (data->bits & 0x01000) ? 0 : 0x40;
140 scancode = system << 16 | command << 8 | xdata; 141 scancode = system << 16 | command << 8 | xdata;
142 protocol = RC_TYPE_RC5X;
141 143
142 IR_dprintk(1, "RC5X scancode 0x%06x (toggle: %u)\n", 144 IR_dprintk(1, "RC5X scancode 0x%06x (toggle: %u)\n",
143 scancode, toggle); 145 scancode, toggle);
@@ -154,12 +156,13 @@ again:
154 toggle = (data->bits & 0x00800) ? 1 : 0; 156 toggle = (data->bits & 0x00800) ? 1 : 0;
155 command += (data->bits & 0x01000) ? 0 : 0x40; 157 command += (data->bits & 0x01000) ? 0 : 0x40;
156 scancode = system << 8 | command; 158 scancode = system << 8 | command;
159 protocol = RC_TYPE_RC5;
157 160
158 IR_dprintk(1, "RC5 scancode 0x%04x (toggle: %u)\n", 161 IR_dprintk(1, "RC5 scancode 0x%04x (toggle: %u)\n",
159 scancode, toggle); 162 scancode, toggle);
160 } 163 }
161 164
162 rc_keydown(dev, scancode, toggle); 165 rc_keydown(dev, protocol, scancode, toggle);
163 data->state = STATE_INACTIVE; 166 data->state = STATE_INACTIVE;
164 return 0; 167 return 0;
165 } 168 }
diff --git a/drivers/media/rc/ir-rc5-sz-decoder.c b/drivers/media/rc/ir-rc5-sz-decoder.c
index dc18b7434db8..85c771112cf5 100644
--- a/drivers/media/rc/ir-rc5-sz-decoder.c
+++ b/drivers/media/rc/ir-rc5-sz-decoder.c
@@ -115,7 +115,7 @@ again:
115 IR_dprintk(1, "RC5-sz scancode 0x%04x (toggle: %u)\n", 115 IR_dprintk(1, "RC5-sz scancode 0x%04x (toggle: %u)\n",
116 scancode, toggle); 116 scancode, toggle);
117 117
118 rc_keydown(dev, scancode, toggle); 118 rc_keydown(dev, RC_TYPE_RC5_SZ, scancode, toggle);
119 data->state = STATE_INACTIVE; 119 data->state = STATE_INACTIVE;
120 return 0; 120 return 0;
121 } 121 }
diff --git a/drivers/media/rc/ir-rc6-decoder.c b/drivers/media/rc/ir-rc6-decoder.c
index cfbd64e3999c..1dc97a7b92a5 100644
--- a/drivers/media/rc/ir-rc6-decoder.c
+++ b/drivers/media/rc/ir-rc6-decoder.c
@@ -88,6 +88,7 @@ static int ir_rc6_decode(struct rc_dev *dev, struct ir_raw_event ev)
88 struct rc6_dec *data = &dev->raw->rc6; 88 struct rc6_dec *data = &dev->raw->rc6;
89 u32 scancode; 89 u32 scancode;
90 u8 toggle; 90 u8 toggle;
91 enum rc_type protocol;
91 92
92 if (!rc_protocols_enabled(dev, RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | 93 if (!rc_protocols_enabled(dev, RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 |
93 RC_BIT_RC6_6A_24 | RC_BIT_RC6_6A_32 | 94 RC_BIT_RC6_6A_24 | RC_BIT_RC6_6A_32 |
@@ -233,9 +234,11 @@ again:
233 case RC6_MODE_0: 234 case RC6_MODE_0:
234 scancode = data->body; 235 scancode = data->body;
235 toggle = data->toggle; 236 toggle = data->toggle;
237 protocol = RC_TYPE_RC6_0;
236 IR_dprintk(1, "RC6(0) scancode 0x%04x (toggle: %u)\n", 238 IR_dprintk(1, "RC6(0) scancode 0x%04x (toggle: %u)\n",
237 scancode, toggle); 239 scancode, toggle);
238 break; 240 break;
241
239 case RC6_MODE_6A: 242 case RC6_MODE_6A:
240 if (data->count > CHAR_BIT * sizeof data->body) { 243 if (data->count > CHAR_BIT * sizeof data->body) {
241 IR_dprintk(1, "RC6 too many (%u) data bits\n", 244 IR_dprintk(1, "RC6 too many (%u) data bits\n",
@@ -244,23 +247,39 @@ again:
244 } 247 }
245 248
246 scancode = data->body; 249 scancode = data->body;
247 if (data->count == RC6_6A_32_NBITS && 250 switch (data->count) {
248 (scancode & RC6_6A_LCC_MASK) == RC6_6A_MCE_CC) { 251 case 20:
249 /* MCE RC */ 252 protocol = RC_TYPE_RC6_6A_20;
250 toggle = (scancode & RC6_6A_MCE_TOGGLE_MASK) ? 1 : 0; 253 toggle = 0;
251 scancode &= ~RC6_6A_MCE_TOGGLE_MASK; 254 break;
252 } else { 255 case 24:
256 protocol = RC_BIT_RC6_6A_24;
253 toggle = 0; 257 toggle = 0;
258 break;
259 case 32:
260 if ((scancode & RC6_6A_LCC_MASK) == RC6_6A_MCE_CC) {
261 protocol = RC_TYPE_RC6_MCE;
262 scancode &= ~RC6_6A_MCE_TOGGLE_MASK;
263 toggle = !!(scancode & RC6_6A_MCE_TOGGLE_MASK);
264 } else {
265 protocol = RC_BIT_RC6_6A_32;
266 toggle = 0;
267 }
268 break;
269 default:
270 IR_dprintk(1, "RC6(6A) unsupported length\n");
271 goto out;
254 } 272 }
255 IR_dprintk(1, "RC6(6A) scancode 0x%08x (toggle: %u)\n", 273
256 scancode, toggle); 274 IR_dprintk(1, "RC6(6A) proto 0x%04x, scancode 0x%08x (toggle: %u)\n",
275 protocol, scancode, toggle);
257 break; 276 break;
258 default: 277 default:
259 IR_dprintk(1, "RC6 unknown mode\n"); 278 IR_dprintk(1, "RC6 unknown mode\n");
260 goto out; 279 goto out;
261 } 280 }
262 281
263 rc_keydown(dev, scancode, toggle); 282 rc_keydown(dev, protocol, scancode, toggle);
264 data->state = STATE_INACTIVE; 283 data->state = STATE_INACTIVE;
265 return 0; 284 return 0;
266 } 285 }
diff --git a/drivers/media/rc/ir-sanyo-decoder.c b/drivers/media/rc/ir-sanyo-decoder.c
index eb715f04dc27..5f7702261d23 100644
--- a/drivers/media/rc/ir-sanyo-decoder.c
+++ b/drivers/media/rc/ir-sanyo-decoder.c
@@ -167,7 +167,7 @@ static int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev)
167 167
168 scancode = address << 8 | command; 168 scancode = address << 8 | command;
169 IR_dprintk(1, "SANYO scancode: 0x%06x\n", scancode); 169 IR_dprintk(1, "SANYO scancode: 0x%06x\n", scancode);
170 rc_keydown(dev, scancode, 0); 170 rc_keydown(dev, RC_TYPE_SANYO, scancode, 0);
171 data->state = STATE_INACTIVE; 171 data->state = STATE_INACTIVE;
172 return 0; 172 return 0;
173 } 173 }
diff --git a/drivers/media/rc/ir-sharp-decoder.c b/drivers/media/rc/ir-sharp-decoder.c
index 66d20394ceaa..c8f251939143 100644
--- a/drivers/media/rc/ir-sharp-decoder.c
+++ b/drivers/media/rc/ir-sharp-decoder.c
@@ -162,7 +162,7 @@ static int ir_sharp_decode(struct rc_dev *dev, struct ir_raw_event ev)
162 scancode = address << 8 | command; 162 scancode = address << 8 | command;
163 IR_dprintk(1, "Sharp scancode 0x%04x\n", scancode); 163 IR_dprintk(1, "Sharp scancode 0x%04x\n", scancode);
164 164
165 rc_keydown(dev, scancode, 0); 165 rc_keydown(dev, RC_TYPE_SHARP, scancode, 0);
166 data->state = STATE_INACTIVE; 166 data->state = STATE_INACTIVE;
167 return 0; 167 return 0;
168 } 168 }
diff --git a/drivers/media/rc/ir-sony-decoder.c b/drivers/media/rc/ir-sony-decoder.c
index 599c19a73360..f485f9fe1e90 100644
--- a/drivers/media/rc/ir-sony-decoder.c
+++ b/drivers/media/rc/ir-sony-decoder.c
@@ -42,6 +42,7 @@ enum sony_state {
42static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev) 42static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
43{ 43{
44 struct sony_dec *data = &dev->raw->sony; 44 struct sony_dec *data = &dev->raw->sony;
45 enum rc_type protocol;
45 u32 scancode; 46 u32 scancode;
46 u8 device, subdevice, function; 47 u8 device, subdevice, function;
47 48
@@ -131,6 +132,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
131 device = bitrev8((data->bits << 3) & 0xF8); 132 device = bitrev8((data->bits << 3) & 0xF8);
132 subdevice = 0; 133 subdevice = 0;
133 function = bitrev8((data->bits >> 4) & 0xFE); 134 function = bitrev8((data->bits >> 4) & 0xFE);
135 protocol = RC_TYPE_SONY12;
134 break; 136 break;
135 case 15: 137 case 15:
136 if (!rc_protocols_enabled(dev, RC_BIT_SONY15)) { 138 if (!rc_protocols_enabled(dev, RC_BIT_SONY15)) {
@@ -140,6 +142,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
140 device = bitrev8((data->bits >> 0) & 0xFF); 142 device = bitrev8((data->bits >> 0) & 0xFF);
141 subdevice = 0; 143 subdevice = 0;
142 function = bitrev8((data->bits >> 7) & 0xFE); 144 function = bitrev8((data->bits >> 7) & 0xFE);
145 protocol = RC_TYPE_SONY15;
143 break; 146 break;
144 case 20: 147 case 20:
145 if (!rc_protocols_enabled(dev, RC_BIT_SONY20)) { 148 if (!rc_protocols_enabled(dev, RC_BIT_SONY20)) {
@@ -149,6 +152,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
149 device = bitrev8((data->bits >> 5) & 0xF8); 152 device = bitrev8((data->bits >> 5) & 0xF8);
150 subdevice = bitrev8((data->bits >> 0) & 0xFF); 153 subdevice = bitrev8((data->bits >> 0) & 0xFF);
151 function = bitrev8((data->bits >> 12) & 0xFE); 154 function = bitrev8((data->bits >> 12) & 0xFE);
155 protocol = RC_TYPE_SONY20;
152 break; 156 break;
153 default: 157 default:
154 IR_dprintk(1, "Sony invalid bitcount %u\n", data->count); 158 IR_dprintk(1, "Sony invalid bitcount %u\n", data->count);
@@ -157,7 +161,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
157 161
158 scancode = device << 16 | subdevice << 8 | function; 162 scancode = device << 16 | subdevice << 8 | function;
159 IR_dprintk(1, "Sony(%u) scancode 0x%05x\n", data->count, scancode); 163 IR_dprintk(1, "Sony(%u) scancode 0x%05x\n", data->count, scancode);
160 rc_keydown(dev, scancode, 0); 164 rc_keydown(dev, protocol, scancode, 0);
161 data->state = STATE_INACTIVE; 165 data->state = STATE_INACTIVE;
162 return 0; 166 return 0;
163 } 167 }
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
index 970b93d6f399..9abcf77246fa 100644
--- a/drivers/media/rc/rc-main.c
+++ b/drivers/media/rc/rc-main.c
@@ -623,6 +623,7 @@ EXPORT_SYMBOL_GPL(rc_repeat);
623/** 623/**
624 * ir_do_keydown() - internal function to process a keypress 624 * ir_do_keydown() - internal function to process a keypress
625 * @dev: the struct rc_dev descriptor of the device 625 * @dev: the struct rc_dev descriptor of the device
626 * @protocol: the protocol of the keypress
626 * @scancode: the scancode of the keypress 627 * @scancode: the scancode of the keypress
627 * @keycode: the keycode of the keypress 628 * @keycode: the keycode of the keypress
628 * @toggle: the toggle value of the keypress 629 * @toggle: the toggle value of the keypress
@@ -630,12 +631,13 @@ EXPORT_SYMBOL_GPL(rc_repeat);
630 * This function is used internally to register a keypress, it must be 631 * This function is used internally to register a keypress, it must be
631 * called with keylock held. 632 * called with keylock held.
632 */ 633 */
633static void ir_do_keydown(struct rc_dev *dev, int scancode, 634static void ir_do_keydown(struct rc_dev *dev, enum rc_type protocol,
634 u32 keycode, u8 toggle) 635 u32 scancode, u32 keycode, u8 toggle)
635{ 636{
636 bool new_event = (!dev->keypressed || 637 bool new_event = (!dev->keypressed ||
638 dev->last_protocol != protocol ||
637 dev->last_scancode != scancode || 639 dev->last_scancode != scancode ||
638 dev->last_toggle != toggle); 640 dev->last_toggle != toggle);
639 641
640 if (new_event && dev->keypressed) 642 if (new_event && dev->keypressed)
641 ir_do_keyup(dev, false); 643 ir_do_keyup(dev, false);
@@ -645,13 +647,14 @@ static void ir_do_keydown(struct rc_dev *dev, int scancode,
645 if (new_event && keycode != KEY_RESERVED) { 647 if (new_event && keycode != KEY_RESERVED) {
646 /* Register a keypress */ 648 /* Register a keypress */
647 dev->keypressed = true; 649 dev->keypressed = true;
650 dev->last_protocol = protocol;
648 dev->last_scancode = scancode; 651 dev->last_scancode = scancode;
649 dev->last_toggle = toggle; 652 dev->last_toggle = toggle;
650 dev->last_keycode = keycode; 653 dev->last_keycode = keycode;
651 654
652 IR_dprintk(1, "%s: key down event, " 655 IR_dprintk(1, "%s: key down event, "
653 "key 0x%04x, scancode 0x%04x\n", 656 "key 0x%04x, protocol 0x%04x, scancode 0x%08x\n",
654 dev->input_name, keycode, scancode); 657 dev->input_name, keycode, protocol, scancode);
655 input_report_key(dev->input_dev, keycode, 1); 658 input_report_key(dev->input_dev, keycode, 1);
656 659
657 led_trigger_event(led_feedback, LED_FULL); 660 led_trigger_event(led_feedback, LED_FULL);
@@ -663,20 +666,21 @@ static void ir_do_keydown(struct rc_dev *dev, int scancode,
663/** 666/**
664 * rc_keydown() - generates input event for a key press 667 * rc_keydown() - generates input event for a key press
665 * @dev: the struct rc_dev descriptor of the device 668 * @dev: the struct rc_dev descriptor of the device
666 * @scancode: the scancode that we're seeking 669 * @protocol: the protocol for the keypress
670 * @scancode: the scancode for the keypress
667 * @toggle: the toggle value (protocol dependent, if the protocol doesn't 671 * @toggle: the toggle value (protocol dependent, if the protocol doesn't
668 * support toggle values, this should be set to zero) 672 * support toggle values, this should be set to zero)
669 * 673 *
670 * This routine is used to signal that a key has been pressed on the 674 * This routine is used to signal that a key has been pressed on the
671 * remote control. 675 * remote control.
672 */ 676 */
673void rc_keydown(struct rc_dev *dev, int scancode, u8 toggle) 677void rc_keydown(struct rc_dev *dev, enum rc_type protocol, u32 scancode, u8 toggle)
674{ 678{
675 unsigned long flags; 679 unsigned long flags;
676 u32 keycode = rc_g_keycode_from_table(dev, scancode); 680 u32 keycode = rc_g_keycode_from_table(dev, scancode);
677 681
678 spin_lock_irqsave(&dev->keylock, flags); 682 spin_lock_irqsave(&dev->keylock, flags);
679 ir_do_keydown(dev, scancode, keycode, toggle); 683 ir_do_keydown(dev, protocol, scancode, keycode, toggle);
680 684
681 if (dev->keypressed) { 685 if (dev->keypressed) {
682 dev->keyup_jiffies = jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT); 686 dev->keyup_jiffies = jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT);
@@ -690,20 +694,22 @@ EXPORT_SYMBOL_GPL(rc_keydown);
690 * rc_keydown_notimeout() - generates input event for a key press without 694 * rc_keydown_notimeout() - generates input event for a key press without
691 * an automatic keyup event at a later time 695 * an automatic keyup event at a later time
692 * @dev: the struct rc_dev descriptor of the device 696 * @dev: the struct rc_dev descriptor of the device
693 * @scancode: the scancode that we're seeking 697 * @protocol: the protocol for the keypress
698 * @scancode: the scancode for the keypress
694 * @toggle: the toggle value (protocol dependent, if the protocol doesn't 699 * @toggle: the toggle value (protocol dependent, if the protocol doesn't
695 * support toggle values, this should be set to zero) 700 * support toggle values, this should be set to zero)
696 * 701 *
697 * This routine is used to signal that a key has been pressed on the 702 * This routine is used to signal that a key has been pressed on the
698 * remote control. The driver must manually call rc_keyup() at a later stage. 703 * remote control. The driver must manually call rc_keyup() at a later stage.
699 */ 704 */
700void rc_keydown_notimeout(struct rc_dev *dev, int scancode, u8 toggle) 705void rc_keydown_notimeout(struct rc_dev *dev, enum rc_type protocol,
706 u32 scancode, u8 toggle)
701{ 707{
702 unsigned long flags; 708 unsigned long flags;
703 u32 keycode = rc_g_keycode_from_table(dev, scancode); 709 u32 keycode = rc_g_keycode_from_table(dev, scancode);
704 710
705 spin_lock_irqsave(&dev->keylock, flags); 711 spin_lock_irqsave(&dev->keylock, flags);
706 ir_do_keydown(dev, scancode, keycode, toggle); 712 ir_do_keydown(dev, protocol, scancode, keycode, toggle);
707 spin_unlock_irqrestore(&dev->keylock, flags); 713 spin_unlock_irqrestore(&dev->keylock, flags);
708} 714}
709EXPORT_SYMBOL_GPL(rc_keydown_notimeout); 715EXPORT_SYMBOL_GPL(rc_keydown_notimeout);
@@ -1315,7 +1321,7 @@ int rc_register_device(struct rc_dev *dev)
1315 dev->dev.groups = dev->sysfs_groups; 1321 dev->dev.groups = dev->sysfs_groups;
1316 dev->sysfs_groups[attr++] = &rc_dev_protocol_attr_grp; 1322 dev->sysfs_groups[attr++] = &rc_dev_protocol_attr_grp;
1317 if (dev->s_filter) 1323 if (dev->s_filter)
1318 dev->sysfs_groups[attr++] = &rc_dev_filter_attr_grp; 1324 dev->sysfs_groups[attr++] = &rc_dev_filter_attr_grp;
1319 if (dev->s_wakeup_filter) 1325 if (dev->s_wakeup_filter)
1320 dev->sysfs_groups[attr++] = &rc_dev_wakeup_filter_attr_grp; 1326 dev->sysfs_groups[attr++] = &rc_dev_wakeup_filter_attr_grp;
1321 if (dev->change_wakeup_protocol) 1327 if (dev->change_wakeup_protocol)