[media] em28xx: Add IR support for em2884
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / em28xx / em28xx-input.c
index 5d12b14282e3dc19353f62831b3d5df1d7757f6f..2630b265b0e813c5c6f450927367d3899933c013 100644 (file)
@@ -306,7 +306,8 @@ static void em28xx_ir_handle_key(struct em28xx_IR *ir)
                                   poll_result.rc_data[0],
                                   poll_result.toggle_bit);
 
-               if (ir->dev->chip_id == CHIP_ID_EM2874)
+               if (ir->dev->chip_id == CHIP_ID_EM2874 ||
+                   ir->dev->chip_id == CHIP_ID_EM2884)
                        /* The em2874 clears the readcount field every time the
                           register is read.  The em2860/2880 datasheet says that it
                           is supposed to clear the readcount, but it doesn't.  So with
@@ -371,13 +372,15 @@ int em28xx_ir_change_protocol(struct rc_dev *rc_dev, u64 rc_type)
        case CHIP_ID_EM2883:
                ir->get_key = default_polling_getkey;
                break;
+       case CHIP_ID_EM2884:
        case CHIP_ID_EM2874:
        case CHIP_ID_EM28174:
                ir->get_key = em2874_polling_getkey;
                em28xx_write_regs(dev, EM2874_R50_IR_CONFIG, &ir_config, 1);
                break;
        default:
-               printk("Unrecognized em28xx chip id: IR not supported\n");
+               printk("Unrecognized em28xx chip id 0x%02x: IR not supported\n",
+                       dev->chip_id);
                rc = -EINVAL;
        }
 
@@ -463,11 +466,11 @@ int em28xx_ir_fini(struct em28xx *dev)
        if (!ir)
                return 0;
 
-       em28xx_ir_stop(ir->rc);
-       rc_unregister_device(ir->rc);
-       kfree(ir);
+       if (ir->rc)
+               rc_unregister_device(ir->rc);
 
        /* done */
+       kfree(ir);
        dev->ir = NULL;
        return 0;
 }