Quoting Stephen Boyd (2022-05-12 11:58:02) > Quoting Dmitry Torokhov (2022-05-12 03:22:30) > > > > Have we solved module loading in the presence of multiple compatibles? > > IIRC we only ever try to load module on the first compatible, so you'd > > be breaking autoloading cros-ec-keyb on these older kernels. I think the > > cure that is being proposed is worse than the disease. > > > > The first compatible is still cros-ec-keyb in the driver though? Or you > mean the first compatible in the node? I'm not aware of this problem at > all but I can certainly test out a fake node and module and see if it > gets autoloaded. I can't get this test module to fail to load no matter what I do. I commented out the second match table entry, and kept it there and removed 'vendor,switch-compat' from the DTS. Module still autoloads. ----8<---- diff --git a/arch/arm64/boot/dts/qcom/sc7180.dtsi b/arch/arm64/boot/dts/qcom/sc7180.dtsi index 42a87fa4976e..a6173b79ba67 100644 --- a/arch/arm64/boot/dts/qcom/sc7180.dtsi +++ b/arch/arm64/boot/dts/qcom/sc7180.dtsi @@ -54,6 +54,10 @@ aliases { spi11 = &spi11; }; + mynode { + compatible = "vendor,switch-compat", "vendor,keyb-compat"; + }; + clocks { xo_board: xo-board { compatible = "fixed-clock"; diff --git a/lib/Makefile b/lib/Makefile index a841be5244ac..0a784011feb5 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -74,6 +74,7 @@ UBSAN_SANITIZE_test_ubsan.o := y obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o obj-$(CONFIG_TEST_LIST_SORT) += test_list_sort.o obj-$(CONFIG_TEST_MIN_HEAP) += test_min_heap.o +obj-m += dtmod.o obj-$(CONFIG_TEST_LKM) += test_module.o obj-$(CONFIG_TEST_VMALLOC) += test_vmalloc.o obj-$(CONFIG_TEST_OVERFLOW) += test_overflow.o diff --git a/lib/dtmod.c b/lib/dtmod.c new file mode 100644 index 000000000000..c34ae37b8ff0 --- /dev/null +++ b/lib/dtmod.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include <linux/init.h> +#include <linux/module.h> +#include <linux/mod_devicetable.h> +#include <linux/platform_device.h> +#include <linux/printk.h> + +static int test_probe(struct platform_device *pdev) +{ + dev_info(&pdev->dev, "I got probed\n"); + + return 0; +} + +static int test_remove(struct platform_device *pdev) +{ + dev_info(&pdev->dev, "I got removed\n"); + + return 0; +} + +static const struct of_device_id test_of_match[] = { + { .compatible = "vendor,keyb-compat" }, + { .compatible = "vendor,switch-compat" }, // comment out + {} +}; +MODULE_DEVICE_TABLE(of, test_of_match); + +static struct platform_driver test_keyb_driver = { + .probe = test_probe, + .remove = test_remove, + .driver = { + .name = "test-ec-keyb", + .of_match_table = test_of_match, + }, +}; + +module_platform_driver(test_keyb_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:test-ec-keyb");