Commit d92b7a3b authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

modpost: deduplicate MODULE_ALIAS() for all drivers



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: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent f4fdb17c
Loading
Loading
Loading
Loading
+15 −33
Original line number Diff line number Diff line
@@ -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,47 +695,21 @@ 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);

			/* fix broken pnp bus lowercasing */
				for (k = 0; k < sizeof(acpi_id); k++)
			for (int k = 0; k < sizeof(acpi_id); k++)
				acpi_id[k] = toupper(id[k]);
			module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
		}
	}
}
}

/* Looks like: pcmcia:mNcNfNfnNpfnNvaNvbNvcNvdN. */
static int do_pcmcia_entry(const char *filename,