EXPORT_SYMBOL_GPL(rc_keydown_notimeout);
 
 /**
- * rc_validate_scancode() - checks that a scancode is valid for a protocol
+ * rc_validate_scancode() - checks that a scancode is valid for a protocol.
+ *     For nec, it should do the opposite of ir_nec_bytes_to_scancode()
  * @proto:     protocol
  * @scancode:  scancode
  */
 bool rc_validate_scancode(enum rc_proto proto, u32 scancode)
 {
        switch (proto) {
+       /*
+        * NECX has a 16-bit address; if the lower 8 bits match the upper
+        * 8 bits inverted, then the address would match regular nec.
+        */
        case RC_PROTO_NECX:
                if ((((scancode >> 16) ^ ~(scancode >> 8)) & 0xff) == 0)
                        return false;
                break;
+       /*
+        * NEC32 has a 16 bit address and 16 bit command. If the lower 8 bits
+        * of the command match the upper 8 bits inverted, then it would
+        * be either NEC or NECX.
+        */
        case RC_PROTO_NEC32:
-               if ((((scancode >> 24) ^ ~(scancode >> 16)) & 0xff) == 0)
+               if ((((scancode >> 8) ^ ~scancode) & 0xff) == 0)
                        return false;
                break;
+       /*
+        * If the customer code (top 32-bit) is 0x800f, it is MCE else it
+        * is regular mode-6a 32 bit
+        */
        case RC_PROTO_RC6_MCE:
                if ((scancode & 0xffff0000) != 0x800f0000)
                        return false;