[PATCH] Make MODULE_DEVICE_TABLE work for vio devices

Make MODULE_DEVICE_TABLE work for vio devices.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by

Stephen Rothwell and committed by
Paul Mackerras
fb120da6 71d276d7

+35 -15
+1 -1
arch/ppc64/kernel/vio.c
··· 111 111 static const struct vio_device_id *vio_match_device( 112 112 const struct vio_device_id *ids, const struct vio_dev *dev) 113 113 { 114 - while (ids->type) { 114 + while (ids->type[0] != '\0') { 115 115 if (vio_bus_ops.match(ids, dev)) 116 116 return ids; 117 117 ids++;
+1 -1
drivers/block/viodasd.c
··· 776 776 */ 777 777 static struct vio_device_id viodasd_device_table[] __devinitdata = { 778 778 { "viodasd", "" }, 779 - { 0, } 779 + { "", "" } 780 780 }; 781 781 782 782 MODULE_DEVICE_TABLE(vio, viodasd_device_table);
+1 -1
drivers/cdrom/viocd.c
··· 734 734 */ 735 735 static struct vio_device_id viocd_device_table[] __devinitdata = { 736 736 { "viocd", "" }, 737 - { 0, } 737 + { "", "" } 738 738 }; 739 739 740 740 MODULE_DEVICE_TABLE(vio, viocd_device_table);
+1 -1
drivers/char/hvc_vio.c
··· 39 39 40 40 static struct vio_device_id hvc_driver_table[] __devinitdata = { 41 41 {"serial", "hvterm1"}, 42 - { NULL, } 42 + { "", "" } 43 43 }; 44 44 MODULE_DEVICE_TABLE(vio, hvc_driver_table); 45 45
+1 -1
drivers/char/hvcs.c
··· 527 527 528 528 static struct vio_device_id hvcs_driver_table[] __devinitdata= { 529 529 {"serial-server", "hvterm2"}, 530 - { NULL, } 530 + { "", "" } 531 531 }; 532 532 MODULE_DEVICE_TABLE(vio, hvcs_driver_table); 533 533
+1 -1
drivers/char/viotape.c
··· 991 991 */ 992 992 static struct vio_device_id viotape_device_table[] __devinitdata = { 993 993 { "viotape", "" }, 994 - { 0, } 994 + { "", "" } 995 995 }; 996 996 997 997 MODULE_DEVICE_TABLE(vio, viotape_device_table);
+1 -1
drivers/net/ibmveth.c
··· 1144 1144 1145 1145 static struct vio_device_id ibmveth_device_table[] __devinitdata= { 1146 1146 { "network", "IBM,l-lan"}, 1147 - { 0,} 1147 + { "", "" } 1148 1148 }; 1149 1149 1150 1150 MODULE_DEVICE_TABLE(vio, ibmveth_device_table);
+1 -1
drivers/net/iseries_veth.c
··· 1370 1370 */ 1371 1371 static struct vio_device_id veth_device_table[] __devinitdata = { 1372 1372 { "vlan", "" }, 1373 - { NULL, NULL } 1373 + { "", "" } 1374 1374 }; 1375 1375 MODULE_DEVICE_TABLE(vio, veth_device_table); 1376 1376
+1 -1
drivers/scsi/ibmvscsi/ibmvscsi.c
··· 1442 1442 */ 1443 1443 static struct vio_device_id ibmvscsi_device_table[] __devinitdata = { 1444 1444 {"vscsi", "IBM,v-scsi"}, 1445 - {0,} 1445 + { "", "" } 1446 1446 }; 1447 1447 1448 1448 MODULE_DEVICE_TABLE(vio, ibmvscsi_device_table);
+1 -5
include/asm-ppc64/vio.h
··· 19 19 #include <linux/errno.h> 20 20 #include <linux/device.h> 21 21 #include <linux/dma-mapping.h> 22 + #include <linux/mod_devicetable.h> 22 23 23 24 #include <asm/hvcall.h> 24 25 #include <asm/scatterlist.h> ··· 51 50 uint32_t unit_address; 52 51 unsigned int irq; 53 52 struct device dev; 54 - }; 55 - 56 - struct vio_device_id { 57 - char *type; 58 - char *compat; 59 53 }; 60 54 61 55 struct vio_driver {
+6 -1
include/linux/mod_devicetable.h
··· 1 1 /* 2 2 * Device tables which are exported to userspace via 3 - * scripts/table2alias.c. You must keep that file in sync with this 3 + * scripts/mod/file2alias.c. You must keep that file in sync with this 4 4 * header. 5 5 */ 6 6 ··· 190 190 #endif 191 191 }; 192 192 193 + /* VIO */ 194 + struct vio_device_id { 195 + char type[32]; 196 + char compat[32]; 197 + }; 193 198 194 199 /* PCMCIA */ 195 200
+19
scripts/mod/file2alias.c
··· 341 341 return 1; 342 342 } 343 343 344 + static int do_vio_entry(const char *filename, struct vio_device_id *vio, 345 + char *alias) 346 + { 347 + char *tmp; 348 + 349 + sprintf(alias, "vio:T%sS%s", vio->type[0] ? vio->type : "*", 350 + vio->compat[0] ? vio->compat : "*"); 351 + 352 + /* Replace all whitespace with underscores */ 353 + for (tmp = alias; tmp && *tmp; tmp++) 354 + if (isspace (*tmp)) 355 + *tmp = '_'; 356 + 357 + return 1; 358 + } 359 + 344 360 /* Ignore any prefix, eg. v850 prepends _ */ 345 361 static inline int sym_is(const char *symbol, const char *name) 346 362 { ··· 438 422 else if (sym_is(symname, "__mod_of_device_table")) 439 423 do_table(symval, sym->st_size, sizeof(struct of_device_id), 440 424 do_of_entry, mod); 425 + else if (sym_is(symname, "__mod_vio_device_table")) 426 + do_table(symval, sym->st_size, sizeof(struct vio_device_id), 427 + do_vio_entry, mod); 441 428 442 429 } 443 430