static void ir_handle_key(struct bttv *btv) { struct bttv_ir *ir = btv->remote; u32 gpio,data; /* read gpio value */ gpio = bttv_gpio_read(&btv->c); if (ir->polling) { if (ir->last_gpio == gpio) return; ir->last_gpio = gpio; } /* extract data */ data = ir_extract_bits(gpio, ir->mask_keycode); dprintk(KERN_INFO DEVNAME ": irq gpio=0x%x code=%d | %s%s%s\n", gpio, data, ir->polling ? "poll" : "irq", (gpio & ir->mask_keydown) ? " down" : "", (gpio & ir->mask_keyup) ? " up" : ""); if ((ir->mask_keydown && (gpio & ir->mask_keydown)) || (ir->mask_keyup && !(gpio & ir->mask_keyup))) { rc_keydown_notimeout(ir->dev, data, 0); } else { /* HACK: Probably, ir->mask_keydown is missing for this board */ if (btv->c.type == BTTV_BOARD_WINFAST2000) rc_keydown_notimeout(ir->dev, data, 0); rc_keyup(ir->dev); } }
static void ir_enltv_handle_key(struct bttv *btv) { struct bttv_ir *ir = btv->remote; u32 gpio, data, keyup; /* read gpio value */ gpio = bttv_gpio_read(&btv->c); /* extract data */ data = ir_extract_bits(gpio, ir->mask_keycode); /* Check if it is keyup */ keyup = (gpio & ir->mask_keyup) ? 1 << 31 : 0; if ((ir->last_gpio & 0x7f) != data) { dprintk("gpio=0x%x code=%d | %s\n", gpio, data, (gpio & ir->mask_keyup) ? " up" : "up/down"); rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data, 0); if (keyup) rc_keyup(ir->dev); } else { if ((ir->last_gpio & 1 << 31) == keyup) return; dprintk("(cnt) gpio=0x%x code=%d | %s\n", gpio, data, (gpio & ir->mask_keyup) ? " up" : "down"); if (keyup) rc_keyup(ir->dev); else rc_keydown_notimeout(ir->dev, RC_PROTO_UNKNOWN, data, 0); } ir->last_gpio = data | keyup; }