diff options
Diffstat (limited to 'drivers/media/rc/ir-rc6-decoder.c')
-rw-r--r-- | drivers/media/rc/ir-rc6-decoder.c | 37 |
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 | } |