media: rc: compile rc-cec.c into rc-core
The rc-cec keymap is unusual in that it can't be built as a module,
instead it is registered directly in rc-main.c if CONFIG_MEDIA_CEC_RC
is set. This is because it can be called from drm_dp_cec_set_edid() via
cec_register_adapter() in an asynchronous context, and it is not
allowed to use request_module() to load rc-cec.ko in that case. Trying to
do so results in a 'WARN_ON_ONCE(wait && current_is_async())'.
Since this keymap is only used if CONFIG_MEDIA_CEC_RC is set, we
just compile this keymap into the rc-core module and never as a
separate module.
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Fixes: 2c6d1fffa1
(drm: add support for DisplayPort CEC-Tunneling-over-AUX)
Reported-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
a38fd87484
commit
f09f9f93af
@ -5,6 +5,7 @@ obj-y += keymaps/
|
|||||||
obj-$(CONFIG_RC_CORE) += rc-core.o
|
obj-$(CONFIG_RC_CORE) += rc-core.o
|
||||||
rc-core-y := rc-main.o rc-ir-raw.o
|
rc-core-y := rc-main.o rc-ir-raw.o
|
||||||
rc-core-$(CONFIG_LIRC) += lirc_dev.o
|
rc-core-$(CONFIG_LIRC) += lirc_dev.o
|
||||||
|
rc-core-$(CONFIG_MEDIA_CEC_RC) += keymaps/rc-cec.o
|
||||||
rc-core-$(CONFIG_BPF_LIRC_MODE2) += bpf-lirc.o
|
rc-core-$(CONFIG_BPF_LIRC_MODE2) += bpf-lirc.o
|
||||||
obj-$(CONFIG_IR_NEC_DECODER) += ir-nec-decoder.o
|
obj-$(CONFIG_IR_NEC_DECODER) += ir-nec-decoder.o
|
||||||
obj-$(CONFIG_IR_RC5_DECODER) += ir-rc5-decoder.o
|
obj-$(CONFIG_IR_RC5_DECODER) += ir-rc5-decoder.o
|
||||||
|
@ -21,7 +21,6 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
|
|||||||
rc-behold.o \
|
rc-behold.o \
|
||||||
rc-behold-columbus.o \
|
rc-behold-columbus.o \
|
||||||
rc-budget-ci-old.o \
|
rc-budget-ci-old.o \
|
||||||
rc-cec.o \
|
|
||||||
rc-cinergy-1400.o \
|
rc-cinergy-1400.o \
|
||||||
rc-cinergy.o \
|
rc-cinergy.o \
|
||||||
rc-d680-dmb.o \
|
rc-d680-dmb.o \
|
||||||
|
@ -1,5 +1,15 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
/* Keytable for the CEC remote control
|
/* Keytable for the CEC remote control
|
||||||
|
*
|
||||||
|
* This keymap is unusual in that it can't be built as a module,
|
||||||
|
* instead it is registered directly in rc-main.c if CONFIG_MEDIA_CEC_RC
|
||||||
|
* is set. This is because it can be called from drm_dp_cec_set_edid() via
|
||||||
|
* cec_register_adapter() in an asynchronous context, and it is not
|
||||||
|
* allowed to use request_module() to load rc-cec.ko in that case.
|
||||||
|
*
|
||||||
|
* Since this keymap is only used if CONFIG_MEDIA_CEC_RC is set, we
|
||||||
|
* just compile this keymap into the rc-core module and never as a
|
||||||
|
* separate module.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2015 by Kamil Debski
|
* Copyright (c) 2015 by Kamil Debski
|
||||||
*/
|
*/
|
||||||
@ -152,7 +162,7 @@ static struct rc_map_table cec[] = {
|
|||||||
/* 0x77-0xff: Reserved */
|
/* 0x77-0xff: Reserved */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct rc_map_list cec_map = {
|
struct rc_map_list cec_map = {
|
||||||
.map = {
|
.map = {
|
||||||
.scan = cec,
|
.scan = cec,
|
||||||
.size = ARRAY_SIZE(cec),
|
.size = ARRAY_SIZE(cec),
|
||||||
@ -160,19 +170,3 @@ static struct rc_map_list cec_map = {
|
|||||||
.name = RC_MAP_CEC,
|
.name = RC_MAP_CEC,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init init_rc_map_cec(void)
|
|
||||||
{
|
|
||||||
return rc_map_register(&cec_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __exit exit_rc_map_cec(void)
|
|
||||||
{
|
|
||||||
rc_map_unregister(&cec_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
module_init(init_rc_map_cec);
|
|
||||||
module_exit(exit_rc_map_cec);
|
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
|
||||||
MODULE_AUTHOR("Kamil Debski");
|
|
||||||
|
@ -2069,6 +2069,9 @@ static int __init rc_core_init(void)
|
|||||||
|
|
||||||
led_trigger_register_simple("rc-feedback", &led_feedback);
|
led_trigger_register_simple("rc-feedback", &led_feedback);
|
||||||
rc_map_register(&empty_map);
|
rc_map_register(&empty_map);
|
||||||
|
#ifdef CONFIG_MEDIA_CEC_RC
|
||||||
|
rc_map_register(&cec_map);
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2078,6 +2081,9 @@ static void __exit rc_core_exit(void)
|
|||||||
lirc_dev_exit();
|
lirc_dev_exit();
|
||||||
class_unregister(&rc_class);
|
class_unregister(&rc_class);
|
||||||
led_trigger_unregister_simple(led_feedback);
|
led_trigger_unregister_simple(led_feedback);
|
||||||
|
#ifdef CONFIG_MEDIA_CEC_RC
|
||||||
|
rc_map_unregister(&cec_map);
|
||||||
|
#endif
|
||||||
rc_map_unregister(&empty_map);
|
rc_map_unregister(&empty_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,6 +175,13 @@ struct rc_map_list {
|
|||||||
struct rc_map map;
|
struct rc_map map;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEDIA_CEC_RC
|
||||||
|
/*
|
||||||
|
* rc_map_list from rc-cec.c
|
||||||
|
*/
|
||||||
|
extern struct rc_map_list cec_map;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Routines from rc-map.c */
|
/* Routines from rc-map.c */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user