diff options
Diffstat (limited to 'drivers/media/video/ir-kbd-i2c.c')
-rw-r--r-- | drivers/media/video/ir-kbd-i2c.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c index c87b6bc4555..a221ad68b33 100644 --- a/drivers/media/video/ir-kbd-i2c.c +++ b/drivers/media/video/ir-kbd-i2c.c | |||
@@ -128,6 +128,19 @@ static int get_key_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | |||
128 | 128 | ||
129 | static int get_key_haup_xvr(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | 129 | static int get_key_haup_xvr(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) |
130 | { | 130 | { |
131 | int ret; | ||
132 | unsigned char buf[1] = { 0 }; | ||
133 | |||
134 | /* | ||
135 | * This is the same apparent "are you ready?" poll command observed | ||
136 | * watching Windows driver traffic and implemented in lirc_zilog. With | ||
137 | * this added, we get far saner remote behavior with z8 chips on usb | ||
138 | * connected devices, even with the default polling interval of 100ms. | ||
139 | */ | ||
140 | ret = i2c_master_send(ir->c, buf, 1); | ||
141 | if (ret != 1) | ||
142 | return (ret < 0) ? ret : -EINVAL; | ||
143 | |||
131 | return get_key_haup_common (ir, ir_key, ir_raw, 6, 3); | 144 | return get_key_haup_common (ir, ir_key, ir_raw, 6, 3); |
132 | } | 145 | } |
133 | 146 | ||
@@ -244,15 +257,17 @@ static void ir_key_poll(struct IR_i2c *ir) | |||
244 | static u32 ir_key, ir_raw; | 257 | static u32 ir_key, ir_raw; |
245 | int rc; | 258 | int rc; |
246 | 259 | ||
247 | dprintk(2,"ir_poll_key\n"); | 260 | dprintk(3, "%s\n", __func__); |
248 | rc = ir->get_key(ir, &ir_key, &ir_raw); | 261 | rc = ir->get_key(ir, &ir_key, &ir_raw); |
249 | if (rc < 0) { | 262 | if (rc < 0) { |
250 | dprintk(2,"error\n"); | 263 | dprintk(2,"error\n"); |
251 | return; | 264 | return; |
252 | } | 265 | } |
253 | 266 | ||
254 | if (rc) | 267 | if (rc) { |
268 | dprintk(1, "%s: keycode = 0x%04x\n", __func__, ir_key); | ||
255 | rc_keydown(ir->rc, ir_key, 0); | 269 | rc_keydown(ir->rc, ir_key, 0); |
270 | } | ||
256 | } | 271 | } |
257 | 272 | ||
258 | static void ir_work(struct work_struct *work) | 273 | static void ir_work(struct work_struct *work) |
@@ -321,6 +336,12 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
321 | rc_type = RC_TYPE_OTHER; | 336 | rc_type = RC_TYPE_OTHER; |
322 | ir_codes = RC_MAP_AVERMEDIA_CARDBUS; | 337 | ir_codes = RC_MAP_AVERMEDIA_CARDBUS; |
323 | break; | 338 | break; |
339 | case 0x71: | ||
340 | name = "Hauppauge/Zilog Z8"; | ||
341 | ir->get_key = get_key_haup_xvr; | ||
342 | rc_type = RC_TYPE_RC5; | ||
343 | ir_codes = hauppauge ? RC_MAP_HAUPPAUGE_NEW : RC_MAP_RC5_TV; | ||
344 | break; | ||
324 | } | 345 | } |
325 | 346 | ||
326 | /* Let the caller override settings */ | 347 | /* Let the caller override settings */ |