media: rc: if kernel is built without an IR codec, don't advertise it
authorSean Young <sean@mess.org>
Tue, 31 Mar 2020 12:39:52 +0000 (14:39 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 21 Apr 2020 10:54:42 +0000 (12:54 +0200)
If the kernel is built without e.g. the imon IR decoder, the protocols
sysfs file still show the protocol as available. If user-space tries to
enable this decoder, the kernel will report an error:

$ echo +imon > /sys/class/rc/rc0/protocols
[   57.693033] rc_core: Loaded IR protocol module ir-imon-decoder, but protocol imon still not available

Ensuring that unavailable protocols are not advertised, ensures that
users space knows it is not available, and a BPF based IR decoder can be
loaded instead.

This supports the case when no kernel-based codec needs to be compiled in,
and every IR decoder can be BPF based.

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
include/media/rc-map.h

index 0ce896f102025d6096c070e18aeded6b202f7ceb..7dbb91c601a776146097ee514aea95f093b03f71 100644 (file)
 #define RC_PROTO_BIT_RCMM32            BIT_ULL(RC_PROTO_RCMM32)
 #define RC_PROTO_BIT_XBOX_DVD          BIT_ULL(RC_PROTO_XBOX_DVD)
 
-/* All rc protocols for which we have decoders */
+#if IS_ENABLED(CONFIG_IR_RC5_DECODER)
+#define __RC_PROTO_RC5_CODEC \
+       (RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 |  RC_PROTO_BIT_RC5_SZ)
+#else
+#define __RC_PROTO_RC5_CODEC 0
+#endif
+
+#if IS_ENABLED(CONFIG_IR_JVC_DECODER)
+#define __RC_PROTO_JVC_CODEC RC_PROTO_BIT_JVC
+#else
+#define __RC_PROTO_JVC_CODEC 0
+#endif
+#if IS_ENABLED(CONFIG_IR_SONY_DECODER)
+#define __RC_PROTO_SONY_CODEC \
+       (RC_PROTO_BIT_SONY12 | RC_PROTO_BIT_SONY15 |  RC_PROTO_BIT_SONY20)
+#else
+#define __RC_PROTO_SONY_CODEC 0
+#endif
+#if IS_ENABLED(CONFIG_IR_NEC_DECODER)
+#define __RC_PROTO_NEC_CODEC \
+       (RC_PROTO_BIT_NEC | RC_PROTO_BIT_NECX | RC_PROTO_BIT_NEC32)
+#else
+#define __RC_PROTO_NEC_CODEC 0
+#endif
+#if IS_ENABLED(CONFIG_IR_SANYO_DECODER)
+#define __RC_PROTO_SANYO_CODEC RC_PROTO_BIT_SANYO
+#else
+#define __RC_PROTO_SANYO_CODEC 0
+#endif
+#if IS_ENABLED(CONFIG_IR_MCE_KBD_DECODER)
+#define __RC_PROTO_MCE_KBD_CODEC \
+       (RC_PROTO_BIT_MCIR2_KBD |  RC_PROTO_BIT_MCIR2_MSE)
+#else
+#define __RC_PROTO_MCE_KBD_CODEC 0
+#endif
+#if IS_ENABLED(CONFIG_IR_RC6_DECODER)
+#define __RC_PROTO_RC6_CODEC \
+       (RC_PROTO_BIT_RC6_0 | RC_PROTO_BIT_RC6_6A_20 | \
+        RC_PROTO_BIT_RC6_6A_24 |  RC_PROTO_BIT_RC6_6A_32 | \
+        RC_PROTO_BIT_RC6_MCE)
+#else
+#define __RC_PROTO_RC6_CODEC 0
+#endif
+#if IS_ENABLED(CONFIG_IR_SHARP_DECODER)
+#define __RC_PROTO_SHARP_CODEC RC_PROTO_BIT_SHARP
+#else
+#define __RC_PROTO_SHARP_CODEC 0
+#endif
+#if IS_ENABLED(CONFIG_IR_XMP_DECODER)
+#define __RC_PROTO_XMP_CODEC RC_PROTO_BIT_XMP
+#else
+#define __RC_PROTO_XMP_CODEC 0
+#endif
+#if IS_ENABLED(CONFIG_IR_IMON_DECODER)
+#define __RC_PROTO_IMON_CODEC RC_PROTO_BIT_IMON
+#else
+#define __RC_PROTO_IMON_CODEC 0
+#endif
+#if IS_ENABLED(CONFIG_IR_RCMM_DECODER)
+#define __RC_PROTO_RCMM_CODEC \
+       (RC_PROTO_BIT_RCMM12 | RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32)
+#else
+#define __RC_PROTO_RCMM_CODEC 0
+#endif
+
+/* All kernel-based codecs have encoders and decoders */
 #define RC_PROTO_BIT_ALL_IR_DECODER \
-                       (RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \
-                        RC_PROTO_BIT_RC5_SZ | RC_PROTO_BIT_JVC | \
-                        RC_PROTO_BIT_SONY12 | RC_PROTO_BIT_SONY15 | \
-                        RC_PROTO_BIT_SONY20 | RC_PROTO_BIT_NEC | \
-                        RC_PROTO_BIT_NECX | RC_PROTO_BIT_NEC32 | \
-                        RC_PROTO_BIT_SANYO | RC_PROTO_BIT_MCIR2_KBD | \
-                        RC_PROTO_BIT_MCIR2_MSE | \
-                        RC_PROTO_BIT_RC6_0 | RC_PROTO_BIT_RC6_6A_20 | \
-                        RC_PROTO_BIT_RC6_6A_24 |  RC_PROTO_BIT_RC6_6A_32 | \
-                        RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \
-                        RC_PROTO_BIT_XMP | RC_PROTO_BIT_IMON | \
-                        RC_PROTO_BIT_RCMM12 | RC_PROTO_BIT_RCMM24 | \
-                        RC_PROTO_BIT_RCMM32)
+       (__RC_PROTO_RC5_CODEC | __RC_PROTO_JVC_CODEC | __RC_PROTO_SONY_CODEC | \
+        __RC_PROTO_NEC_CODEC | __RC_PROTO_SANYO_CODEC | \
+        __RC_PROTO_MCE_KBD_CODEC | __RC_PROTO_RC6_CODEC | \
+        __RC_PROTO_SHARP_CODEC | __RC_PROTO_XMP_CODEC | \
+        __RC_PROTO_IMON_CODEC | __RC_PROTO_RCMM_CODEC)
 
 #define RC_PROTO_BIT_ALL_IR_ENCODER \
-                       (RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \
-                        RC_PROTO_BIT_RC5_SZ | RC_PROTO_BIT_JVC | \
-                        RC_PROTO_BIT_SONY12 | RC_PROTO_BIT_SONY15 | \
-                        RC_PROTO_BIT_SONY20 |  RC_PROTO_BIT_NEC | \
-                        RC_PROTO_BIT_NECX | RC_PROTO_BIT_NEC32 | \
-                        RC_PROTO_BIT_SANYO | RC_PROTO_BIT_MCIR2_KBD | \
-                        RC_PROTO_BIT_MCIR2_MSE | \
-                        RC_PROTO_BIT_RC6_0 | RC_PROTO_BIT_RC6_6A_20 | \
-                        RC_PROTO_BIT_RC6_6A_24 | \
-                        RC_PROTO_BIT_RC6_6A_32 | RC_PROTO_BIT_RC6_MCE | \
-                        RC_PROTO_BIT_SHARP | RC_PROTO_BIT_IMON | \
-                        RC_PROTO_BIT_RCMM12 | RC_PROTO_BIT_RCMM24 | \
-                        RC_PROTO_BIT_RCMM32)
+       (__RC_PROTO_RC5_CODEC | __RC_PROTO_JVC_CODEC | __RC_PROTO_SONY_CODEC | \
+        __RC_PROTO_NEC_CODEC | __RC_PROTO_SANYO_CODEC | \
+        __RC_PROTO_MCE_KBD_CODEC | __RC_PROTO_RC6_CODEC | \
+        __RC_PROTO_SHARP_CODEC | __RC_PROTO_XMP_CODEC | \
+        __RC_PROTO_IMON_CODEC | __RC_PROTO_RCMM_CODEC)
 
 #define RC_SCANCODE_UNKNOWN(x)                 (x)
 #define RC_SCANCODE_OTHER(x)                   (x)