diff options
Diffstat (limited to 'scripts/mod')
| -rw-r--r-- | scripts/mod/file2alias.c | 91 | ||||
| -rw-r--r-- | scripts/mod/modpost.c | 6 | 
2 files changed, 90 insertions, 7 deletions
| diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 4fa1f3ad251..d4dc222a74f 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -206,6 +206,20 @@ static void do_usb_table(void *symval, unsigned long size,  		do_usb_entry_multi(symval + i, mod);  } +/* Looks like: hid:bNvNpN */ +static int do_hid_entry(const char *filename, +			     struct hid_device_id *id, char *alias) +{ +	id->vendor = TO_NATIVE(id->vendor); +	id->product = TO_NATIVE(id->product); + +	sprintf(alias, "hid:b%04X", id->bus); +	ADD(alias, "v", id->vendor != HID_ANY_ID, id->vendor); +	ADD(alias, "p", id->product != HID_ANY_ID, id->product); + +	return 1; +} +  /* Looks like: ieee1394:venNmoNspNverN */  static int do_ieee1394_entry(const char *filename,  			     struct ieee1394_device_id *id, char *alias) @@ -344,14 +358,20 @@ static void do_pnp_device_entry(void *symval, unsigned long size,  				struct module *mod)  {  	const unsigned long id_size = sizeof(struct pnp_device_id); -	const struct pnp_device_id *id = symval; +	const unsigned int count = (size / id_size)-1; +	const struct pnp_device_id *devs = symval; +	unsigned int i;  	device_id_check(mod->name, "pnp", size, id_size, symval); -	buf_printf(&mod->dev_table_buf, -		   "MODULE_ALIAS(\"pnp:d%s*\");\n", id->id); -	buf_printf(&mod->dev_table_buf, -		   "MODULE_ALIAS(\"acpi*:%s:*\");\n", id->id); +	for (i = 0; i < count; i++) { +		const char *id = (char *)devs[i].id; + +		buf_printf(&mod->dev_table_buf, +			   "MODULE_ALIAS(\"pnp:d%s*\");\n", id); +		buf_printf(&mod->dev_table_buf, +			   "MODULE_ALIAS(\"acpi*:%s:*\");\n", id); +	}  }  /* looks like: "pnp:dD" for every device of the card */ @@ -623,6 +643,59 @@ static int do_i2c_entry(const char *filename, struct i2c_device_id *id,  	return 1;  } +static const struct dmifield { +	const char *prefix; +	int field; +} dmi_fields[] = { +	{ "bvn", DMI_BIOS_VENDOR }, +	{ "bvr", DMI_BIOS_VERSION }, +	{ "bd",  DMI_BIOS_DATE }, +	{ "svn", DMI_SYS_VENDOR }, +	{ "pn",  DMI_PRODUCT_NAME }, +	{ "pvr", DMI_PRODUCT_VERSION }, +	{ "rvn", DMI_BOARD_VENDOR }, +	{ "rn",  DMI_BOARD_NAME }, +	{ "rvr", DMI_BOARD_VERSION }, +	{ "cvn", DMI_CHASSIS_VENDOR }, +	{ "ct",  DMI_CHASSIS_TYPE }, +	{ "cvr", DMI_CHASSIS_VERSION }, +	{ NULL,  DMI_NONE } +}; + +static void dmi_ascii_filter(char *d, const char *s) +{ +	/* Filter out characters we don't want to see in the modalias string */ +	for (; *s; s++) +		if (*s > ' ' && *s < 127 && *s != ':') +			*(d++) = *s; + +	*d = 0; +} + + +static int do_dmi_entry(const char *filename, struct dmi_system_id *id, +			char *alias) +{ +	int i, j; + +	sprintf(alias, "dmi*"); + +	for (i = 0; i < ARRAY_SIZE(dmi_fields); i++) { +		for (j = 0; j < 4; j++) { +			if (id->matches[j].slot && +			    id->matches[j].slot == dmi_fields[i].field) { +				sprintf(alias + strlen(alias), ":%s*", +					dmi_fields[i].prefix); +				dmi_ascii_filter(alias + strlen(alias), +						 id->matches[j].substr); +				strcat(alias, "*"); +			} +		} +	} + +	strcat(alias, ":"); +	return 1; +}  /* Ignore any prefix, eg. some architectures prepend _ */  static inline int sym_is(const char *symbol, const char *name)  { @@ -686,6 +759,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,  	else if (sym_is(symname, "__mod_usb_device_table"))  		/* special case to handle bcdDevice ranges */  		do_usb_table(symval, sym->st_size, mod); +	else if (sym_is(symname, "__mod_hid_device_table")) +		do_table(symval, sym->st_size, +			 sizeof(struct hid_device_id), "hid", +			 do_hid_entry, mod);  	else if (sym_is(symname, "__mod_ieee1394_device_table"))  		do_table(symval, sym->st_size,  			 sizeof(struct ieee1394_device_id), "ieee1394", @@ -754,6 +831,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,  		do_table(symval, sym->st_size,  			 sizeof(struct i2c_device_id), "i2c",  			 do_i2c_entry, mod); +	else if (sym_is(symname, "__mod_dmi_device_table")) +		do_table(symval, sym->st_size, +			 sizeof(struct dmi_system_id), "dmi", +			 do_dmi_entry, mod);  	free(zeros);  } diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 418cd7dbbc9..8e0de6a5e18 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -1986,11 +1986,13 @@ static void read_markers(const char *fname)  		mod = find_module(modname);  		if (!mod) { -			if (is_vmlinux(modname)) -				have_vmlinux = 1;  			mod = new_module(NOFAIL(strdup(modname)));  			mod->skip = 1;  		} +		if (is_vmlinux(modname)) { +			have_vmlinux = 1; +			mod->skip = 0; +		}  		if (!mod->skip)  			add_marker(mod, marker, fmt); | 
