diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/video/ir-kbd-i2c.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c index fba30a40e9c6..1457b1602221 100644 --- a/drivers/media/video/ir-kbd-i2c.c +++ b/drivers/media/video/ir-kbd-i2c.c | |||
@@ -64,23 +64,32 @@ MODULE_PARM_DESC(hauppauge, "Specify Hauppauge remote: 0=black, 1=grey (defaults | |||
64 | static int get_key_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | 64 | static int get_key_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) |
65 | { | 65 | { |
66 | unsigned char buf[3]; | 66 | unsigned char buf[3]; |
67 | int start, toggle, dev, code; | 67 | int start, range, toggle, dev, code; |
68 | 68 | ||
69 | /* poll IR chip */ | 69 | /* poll IR chip */ |
70 | if (3 != i2c_master_recv(&ir->c,buf,3)) | 70 | if (3 != i2c_master_recv(&ir->c,buf,3)) |
71 | return -EIO; | 71 | return -EIO; |
72 | 72 | ||
73 | /* split rc5 data block ... */ | 73 | /* split rc5 data block ... */ |
74 | start = (buf[0] >> 6) & 3; | 74 | start = (buf[0] >> 7) & 1; |
75 | range = (buf[0] >> 6) & 1; | ||
75 | toggle = (buf[0] >> 5) & 1; | 76 | toggle = (buf[0] >> 5) & 1; |
76 | dev = buf[0] & 0x1f; | 77 | dev = buf[0] & 0x1f; |
77 | code = (buf[1] >> 2) & 0x3f; | 78 | code = (buf[1] >> 2) & 0x3f; |
78 | 79 | ||
79 | if (3 != start) | 80 | /* rc5 has two start bits |
81 | * the first bit must be one | ||
82 | * the second bit defines the command range (1 = 0-63, 0 = 64 - 127) | ||
83 | */ | ||
84 | if (!start) | ||
80 | /* no key pressed */ | 85 | /* no key pressed */ |
81 | return 0; | 86 | return 0; |
82 | dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n", | 87 | |
83 | start, toggle, dev, code); | 88 | if (!range) |
89 | code += 64; | ||
90 | |||
91 | dprintk(1,"ir hauppauge (rc5): s%d r%d t%d dev=%d code=%d\n", | ||
92 | start, range, toggle, dev, code); | ||
84 | 93 | ||
85 | /* return key */ | 94 | /* return key */ |
86 | *ir_key = code; | 95 | *ir_key = code; |