--- /dev/null
+diff --git a/drivers/media/usb/em28xx/em28xx-input.c b/drivers/media/usb/em28xx/em28xx-input.c
+index 5aa15a7..a27a621 100644
+--- a/drivers/media/usb/em28xx/em28xx-input.c
++++ b/drivers/media/usb/em28xx/em28xx-input.c
+@@ -63,8 +63,10 @@ struct em28xx_IR {
+
+ /* poll decoder */
+ int polling;
++ int keypressed;
+ struct delayed_work work;
+ unsigned int full_code:1;
++ unsigned int last_toggle_bit;
+ unsigned int last_readcount;
+ u64 rc_proto;
+
+@@ -331,8 +333,34 @@ static void em28xx_ir_handle_key(struct em28xx_IR *ir)
+ dprintk("ir->get_key() failed: %d\n", result);
+ return;
+ }
+-
+- if (unlikely(poll_result.read_count != ir->last_readcount)) {
++ if (ir->dev->model == EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595) {
++ if (likely(poll_result.toggle_bit == ir->last_toggle_bit &&
++ poll_result.read_count == ir->last_readcount))
++ return;
++ dprintk("%s: toggle: %d, count: %d, key 0x%04x\n", __func__,
++ poll_result.toggle_bit, poll_result.read_count,
++ poll_result.scancode);
++ ir->rc->input_dev->evbit[0] &= ~BIT_MASK(EV_REP);
++ if( poll_result.read_count & 1 ) {
++ if (!ir->keypressed) {
++ ir->keypressed = true;
++ if( poll_result.toggle_bit == ir->last_toggle_bit )
++ return;
++ ir->rc->keypressed = false;
++ rc_keydown_notimeout(ir->rc,
++ poll_result.protocol,
++ poll_result.scancode,
++ poll_result.toggle_bit);
++ ir->rc->keypressed = false;
++ }
++ }
++ else if (ir->keypressed) {
++ ir->keypressed = false;
++ ir->rc->keypressed = true;
++ rc_keyup(ir->rc);
++ }
++ }
++ else if (unlikely(poll_result.read_count != ir->last_readcount)) {
+ dprintk("%s: toggle: %d, count: %d, key 0x%04x\n", __func__,
+ poll_result.toggle_bit, poll_result.read_count,
+ poll_result.scancode);
+@@ -357,10 +385,11 @@ static void em28xx_ir_handle_key(struct em28xx_IR *ir)
+ * non-zero read count as opposed to a readcount
+ * that is incrementing
+ */
+- ir->last_readcount = 0;
+- else
+- ir->last_readcount = poll_result.read_count;
++ poll_result.read_count = 0;
+ }
++
++ ir->last_toggle_bit = poll_result.toggle_bit;
++ ir->last_readcount = poll_result.read_count;
+ }
+
+ static void em28xx_ir_work(struct work_struct *work)