提交 fb120da6 编写于 作者: S Stephen Rothwell 提交者: Paul Mackerras

[PATCH] Make MODULE_DEVICE_TABLE work for vio devices

Make MODULE_DEVICE_TABLE work for vio devices.
Signed-off-by: NStephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: NPaul Mackerras <paulus@samba.org>
上级 71d276d7
...@@ -111,7 +111,7 @@ EXPORT_SYMBOL(vio_unregister_driver); ...@@ -111,7 +111,7 @@ EXPORT_SYMBOL(vio_unregister_driver);
static const struct vio_device_id *vio_match_device( static const struct vio_device_id *vio_match_device(
const struct vio_device_id *ids, const struct vio_dev *dev) const struct vio_device_id *ids, const struct vio_dev *dev)
{ {
while (ids->type) { while (ids->type[0] != '\0') {
if (vio_bus_ops.match(ids, dev)) if (vio_bus_ops.match(ids, dev))
return ids; return ids;
ids++; ids++;
......
...@@ -776,7 +776,7 @@ static int viodasd_remove(struct vio_dev *vdev) ...@@ -776,7 +776,7 @@ static int viodasd_remove(struct vio_dev *vdev)
*/ */
static struct vio_device_id viodasd_device_table[] __devinitdata = { static struct vio_device_id viodasd_device_table[] __devinitdata = {
{ "viodasd", "" }, { "viodasd", "" },
{ 0, } { "", "" }
}; };
MODULE_DEVICE_TABLE(vio, viodasd_device_table); MODULE_DEVICE_TABLE(vio, viodasd_device_table);
......
...@@ -734,7 +734,7 @@ static int viocd_remove(struct vio_dev *vdev) ...@@ -734,7 +734,7 @@ static int viocd_remove(struct vio_dev *vdev)
*/ */
static struct vio_device_id viocd_device_table[] __devinitdata = { static struct vio_device_id viocd_device_table[] __devinitdata = {
{ "viocd", "" }, { "viocd", "" },
{ 0, } { "", "" }
}; };
MODULE_DEVICE_TABLE(vio, viocd_device_table); MODULE_DEVICE_TABLE(vio, viocd_device_table);
......
...@@ -39,7 +39,7 @@ char hvc_driver_name[] = "hvc_console"; ...@@ -39,7 +39,7 @@ char hvc_driver_name[] = "hvc_console";
static struct vio_device_id hvc_driver_table[] __devinitdata = { static struct vio_device_id hvc_driver_table[] __devinitdata = {
{"serial", "hvterm1"}, {"serial", "hvterm1"},
{ NULL, } { "", "" }
}; };
MODULE_DEVICE_TABLE(vio, hvc_driver_table); MODULE_DEVICE_TABLE(vio, hvc_driver_table);
......
...@@ -527,7 +527,7 @@ static int khvcsd(void *unused) ...@@ -527,7 +527,7 @@ static int khvcsd(void *unused)
static struct vio_device_id hvcs_driver_table[] __devinitdata= { static struct vio_device_id hvcs_driver_table[] __devinitdata= {
{"serial-server", "hvterm2"}, {"serial-server", "hvterm2"},
{ NULL, } { "", "" }
}; };
MODULE_DEVICE_TABLE(vio, hvcs_driver_table); MODULE_DEVICE_TABLE(vio, hvcs_driver_table);
......
...@@ -991,7 +991,7 @@ static int viotape_remove(struct vio_dev *vdev) ...@@ -991,7 +991,7 @@ static int viotape_remove(struct vio_dev *vdev)
*/ */
static struct vio_device_id viotape_device_table[] __devinitdata = { static struct vio_device_id viotape_device_table[] __devinitdata = {
{ "viotape", "" }, { "viotape", "" },
{ 0, } { "", "" }
}; };
MODULE_DEVICE_TABLE(vio, viotape_device_table); MODULE_DEVICE_TABLE(vio, viotape_device_table);
......
...@@ -1144,7 +1144,7 @@ static void ibmveth_proc_unregister_driver(void) ...@@ -1144,7 +1144,7 @@ static void ibmveth_proc_unregister_driver(void)
static struct vio_device_id ibmveth_device_table[] __devinitdata= { static struct vio_device_id ibmveth_device_table[] __devinitdata= {
{ "network", "IBM,l-lan"}, { "network", "IBM,l-lan"},
{ 0,} { "", "" }
}; };
MODULE_DEVICE_TABLE(vio, ibmveth_device_table); MODULE_DEVICE_TABLE(vio, ibmveth_device_table);
......
...@@ -1370,7 +1370,7 @@ static int veth_probe(struct vio_dev *vdev, const struct vio_device_id *id) ...@@ -1370,7 +1370,7 @@ static int veth_probe(struct vio_dev *vdev, const struct vio_device_id *id)
*/ */
static struct vio_device_id veth_device_table[] __devinitdata = { static struct vio_device_id veth_device_table[] __devinitdata = {
{ "vlan", "" }, { "vlan", "" },
{ NULL, NULL } { "", "" }
}; };
MODULE_DEVICE_TABLE(vio, veth_device_table); MODULE_DEVICE_TABLE(vio, veth_device_table);
......
...@@ -1442,7 +1442,7 @@ static int ibmvscsi_remove(struct vio_dev *vdev) ...@@ -1442,7 +1442,7 @@ static int ibmvscsi_remove(struct vio_dev *vdev)
*/ */
static struct vio_device_id ibmvscsi_device_table[] __devinitdata = { static struct vio_device_id ibmvscsi_device_table[] __devinitdata = {
{"vscsi", "IBM,v-scsi"}, {"vscsi", "IBM,v-scsi"},
{0,} { "", "" }
}; };
MODULE_DEVICE_TABLE(vio, ibmvscsi_device_table); MODULE_DEVICE_TABLE(vio, ibmvscsi_device_table);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/mod_devicetable.h>
#include <asm/hvcall.h> #include <asm/hvcall.h>
#include <asm/scatterlist.h> #include <asm/scatterlist.h>
...@@ -52,11 +53,6 @@ struct vio_dev { ...@@ -52,11 +53,6 @@ struct vio_dev {
struct device dev; struct device dev;
}; };
struct vio_device_id {
char *type;
char *compat;
};
struct vio_driver { struct vio_driver {
struct list_head node; struct list_head node;
char *name; char *name;
......
/* /*
* Device tables which are exported to userspace via * Device tables which are exported to userspace via
* scripts/table2alias.c. You must keep that file in sync with this * scripts/mod/file2alias.c. You must keep that file in sync with this
* header. * header.
*/ */
...@@ -190,6 +190,11 @@ struct of_device_id ...@@ -190,6 +190,11 @@ struct of_device_id
#endif #endif
}; };
/* VIO */
struct vio_device_id {
char type[32];
char compat[32];
};
/* PCMCIA */ /* PCMCIA */
......
...@@ -341,6 +341,22 @@ static int do_of_entry (const char *filename, struct of_device_id *of, char *ali ...@@ -341,6 +341,22 @@ static int do_of_entry (const char *filename, struct of_device_id *of, char *ali
return 1; return 1;
} }
static int do_vio_entry(const char *filename, struct vio_device_id *vio,
char *alias)
{
char *tmp;
sprintf(alias, "vio:T%sS%s", vio->type[0] ? vio->type : "*",
vio->compat[0] ? vio->compat : "*");
/* Replace all whitespace with underscores */
for (tmp = alias; tmp && *tmp; tmp++)
if (isspace (*tmp))
*tmp = '_';
return 1;
}
/* Ignore any prefix, eg. v850 prepends _ */ /* Ignore any prefix, eg. v850 prepends _ */
static inline int sym_is(const char *symbol, const char *name) static inline int sym_is(const char *symbol, const char *name)
{ {
...@@ -422,6 +438,9 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, ...@@ -422,6 +438,9 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
else if (sym_is(symname, "__mod_of_device_table")) else if (sym_is(symname, "__mod_of_device_table"))
do_table(symval, sym->st_size, sizeof(struct of_device_id), do_table(symval, sym->st_size, sizeof(struct of_device_id),
do_of_entry, mod); do_of_entry, mod);
else if (sym_is(symname, "__mod_vio_device_table"))
do_table(symval, sym->st_size, sizeof(struct vio_device_id),
do_vio_entry, mod);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册