Commit f09f9f93 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

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: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Fixes: 2c6d1fff (drm: add support for DisplayPort CEC-Tunneling-over-AUX)
Reported-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent a38fd874
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ obj-y += keymaps/
obj-$(CONFIG_RC_CORE) += rc-core.o
rc-core-y := rc-main.o rc-ir-raw.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
obj-$(CONFIG_IR_NEC_DECODER) += ir-nec-decoder.o
obj-$(CONFIG_IR_RC5_DECODER) += ir-rc5-decoder.o
+0 −1
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \
			rc-behold.o \
			rc-behold-columbus.o \
			rc-budget-ci-old.o \
			rc-cec.o \
			rc-cinergy-1400.o \
			rc-cinergy.o \
			rc-d680-dmb.o \
+11 −17
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later
/* 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
 */
@@ -152,7 +162,7 @@ static struct rc_map_table cec[] = {
	/* 0x77-0xff: Reserved */
};

static struct rc_map_list cec_map = {
struct rc_map_list cec_map = {
	.map = {
		.scan		= cec,
		.size		= ARRAY_SIZE(cec),
@@ -160,19 +170,3 @@ static struct rc_map_list cec_map = {
		.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");
+6 −0
Original line number Diff line number Diff line
@@ -2069,6 +2069,9 @@ static int __init rc_core_init(void)

	led_trigger_register_simple("rc-feedback", &led_feedback);
	rc_map_register(&empty_map);
#ifdef CONFIG_MEDIA_CEC_RC
	rc_map_register(&cec_map);
#endif

	return 0;
}
@@ -2078,6 +2081,9 @@ static void __exit rc_core_exit(void)
	lirc_dev_exit();
	class_unregister(&rc_class);
	led_trigger_unregister_simple(led_feedback);
#ifdef CONFIG_MEDIA_CEC_RC
	rc_map_unregister(&cec_map);
#endif
	rc_map_unregister(&empty_map);
}

+7 −0
Original line number Diff line number Diff line
@@ -175,6 +175,13 @@ struct rc_map_list {
	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 */

/**