]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
modpost: deduplicate MODULE_ALIAS() for all drivers
authorMasahiro Yamada <masahiroy@kernel.org>
Tue, 19 Nov 2024 23:56:42 +0000 (08:56 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Wed, 27 Nov 2024 23:45:59 +0000 (08:45 +0900)
MODULE_DEVICE_TABLE(pnp_card, ...) may have duplicated IDs. For
instance, snd_ad1816a_pnpids[] in sound/isa/ad1816a/ad1816a.c includes
multiple occurrences of the "ADS7180" string within its .devs fields.

Currently, do_pnp_card_entries() handles deduplication on its own, but
this logic should be moved to a common helper function, as drivers in
other subsystems might also have similar duplication issues.

For example, drivers/media/i2c/s5c73m3/s5c73m3.mod.c contains duplicated
MODULE_ALIAS() entries because both s5c73m3-core.c and s5c73m3-spi.c
define the same compatible string.

This commit eliminates redundant MODULE_ALIAS() entries across all
drivers.

[Before]

  $ grep MODULE_ALIAS drivers/media/i2c/s5c73m3/s5c73m3.mod.c
  MODULE_ALIAS("i2c:S5C73M3");
  MODULE_ALIAS("of:N*T*Csamsung,s5c73m3");
  MODULE_ALIAS("of:N*T*Csamsung,s5c73m3C*");
  MODULE_ALIAS("of:N*T*Csamsung,s5c73m3");
  MODULE_ALIAS("of:N*T*Csamsung,s5c73m3C*");

[After]

  $ grep MODULE_ALIAS drivers/media/i2c/s5c73m3/s5c73m3.mod.c
  MODULE_ALIAS("i2c:S5C73M3");
  MODULE_ALIAS("of:N*T*Csamsung,s5c73m3");
  MODULE_ALIAS("of:N*T*Csamsung,s5c73m3C*");

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
scripts/mod/file2alias.c

index d6c8d5e0882148c039251709ea89eea1f8ac6ce5..71dd5272013b42d95ca395d66a516da5260ec3ba 100644 (file)
@@ -48,7 +48,7 @@ static void __attribute__((format (printf, 3, 4)))
 module_alias_printf(struct module *mod, bool append_wildcard,
                    const char *fmt, ...)
 {
-       struct module_alias *new;
+       struct module_alias *new, *als;
        size_t len;
        int n;
        va_list ap;
@@ -86,6 +86,14 @@ module_alias_printf(struct module *mod, bool append_wildcard,
                new->str[n + 1] = '\0';
        }
 
+       /* avoid duplication */
+       list_for_each_entry(als, &mod->aliases, node) {
+               if (!strcmp(als->str, new->str)) {
+                       free(new);
+                       return;
+               }
+       }
+
        list_add_tail(&new->node, &mod->aliases);
 }
 
@@ -687,44 +695,18 @@ static void do_pnp_card_entries(void *symval, unsigned long size,
 
                for (j = 0; j < PNP_MAX_DEVICES; j++) {
                        const char *id = (char *)(*devs)[j].id;
-                       int i2, j2;
-                       int dup = 0;
+                       char acpi_id[PNP_ID_LEN];
 
                        if (!id[0])
                                break;
 
-                       /* find duplicate, already added value */
-                       for (i2 = 0; i2 < i && !dup; i2++) {
-                               DEF_FIELD_ADDR_VAR(symval + i2 * id_size,
-                                                  pnp_card_device_id,
-                                                  devs, devs_dup);
-
-                               for (j2 = 0; j2 < PNP_MAX_DEVICES; j2++) {
-                                       const char *id2 =
-                                               (char *)(*devs_dup)[j2].id;
-
-                                       if (!id2[0])
-                                               break;
-
-                                       if (!strcmp(id, id2)) {
-                                               dup = 1;
-                                               break;
-                                       }
-                               }
-                       }
-
                        /* add an individual alias for every device entry */
-                       if (!dup) {
-                               char acpi_id[PNP_ID_LEN];
-                               int k;
+                       module_alias_printf(mod, false, "pnp:d%s*", id);
 
-                               module_alias_printf(mod, false, "pnp:d%s*", id);
-
-                               /* fix broken pnp bus lowercasing */
-                               for (k = 0; k < sizeof(acpi_id); k++)
-                                       acpi_id[k] = toupper(id[k]);
-                               module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
-                       }
+                       /* fix broken pnp bus lowercasing */
+                       for (int k = 0; k < sizeof(acpi_id); k++)
+                               acpi_id[k] = toupper(id[k]);
+                       module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
                }
        }
 }