aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/rc/ir-rc6-decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/rc/ir-rc6-decoder.c')
-rw-r--r--drivers/media/rc/ir-rc6-decoder.c37
1 files changed, 28 insertions, 9 deletions
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 }