int vio_register_driver(struct vio_driver *viodrv)
 {
        printk(KERN_DEBUG "%s: driver %s registering\n", __FUNCTION__,
-               viodrv->name);
+               viodrv->driver.name);
 
        /* fill in 'struct driver' fields */
-       viodrv->driver.name = viodrv->name;
        viodrv->driver.bus = &vio_bus_type;
        viodrv->driver.probe = vio_bus_probe;
        viodrv->driver.remove = vio_bus_remove;
 
 
 MODULE_DEVICE_TABLE(vio, viodasd_device_table);
 static struct vio_driver viodasd_driver = {
-       .name = "viodasd",
        .id_table = viodasd_device_table,
        .probe = viodasd_probe,
-       .remove = viodasd_remove
+       .remove = viodasd_remove,
+       .driver = {
+               .name = "viodasd",
+       }
 };
 
 /*
 
 
 MODULE_DEVICE_TABLE(vio, viocd_device_table);
 static struct vio_driver viocd_driver = {
-       .name = "viocd",
        .id_table = viocd_device_table,
        .probe = viocd_probe,
-       .remove = viocd_remove
+       .remove = viocd_remove,
+       .driver = {
+               .name = "viocd",
+       }
 };
 
 static int __init viocd_init(void)
 
 }
 
 static struct vio_driver hvc_vio_driver = {
-       .name           = hvc_driver_name,
        .id_table       = hvc_driver_table,
        .probe          = hvc_vio_probe,
        .remove         = hvc_vio_remove,
        .driver         = {
+               .name   = hvc_driver_name,
                .owner  = THIS_MODULE,
        }
 };
 
 };
 
 static struct vio_driver hvcs_vio_driver = {
-       .name           = hvcs_driver_name,
        .id_table       = hvcs_driver_table,
        .probe          = hvcs_probe,
        .remove         = hvcs_remove,
+       .driver         = {
+               .name   = hvcs_driver_name,
+       }
 };
 
 /* Only called from hvcs_get_pi please */
 
 
 MODULE_DEVICE_TABLE(vio, viotape_device_table);
 static struct vio_driver viotape_driver = {
-       .name = "viotape",
        .id_table = viotape_device_table,
        .probe = viotape_probe,
-       .remove = viotape_remove
+       .remove = viotape_remove,
+       .driver = {
+               .name = "viotape",
+       }
 };
 
 
 
 MODULE_DEVICE_TABLE(vio, ibmveth_device_table);
 
 static struct vio_driver ibmveth_driver = {
-       .name        = (char *)ibmveth_driver_name,
-       .id_table    = ibmveth_device_table,
-       .probe       = ibmveth_probe,
-       .remove      = ibmveth_remove
+       .id_table       = ibmveth_device_table,
+       .probe          = ibmveth_probe,
+       .remove         = ibmveth_remove,
+       .driver         = {
+               .name   = ibmveth_driver_name,
+       }
 };
 
 static int __init ibmveth_module_init(void)
 
 MODULE_DEVICE_TABLE(vio, veth_device_table);
 
 static struct vio_driver veth_driver = {
-       .name = DRV_NAME,
        .id_table = veth_device_table,
        .probe = veth_probe,
-       .remove = veth_remove
+       .remove = veth_remove,
+       .driver = {
+               .name = DRV_NAME,
+       }
 };
 
 /*
 
 
 MODULE_DEVICE_TABLE(vio, ibmvscsi_device_table);
 static struct vio_driver ibmvscsi_driver = {
-       .name = "ibmvscsi",
        .id_table = ibmvscsi_device_table,
        .probe = ibmvscsi_probe,
-       .remove = ibmvscsi_remove
+       .remove = ibmvscsi_remove,
+       .driver = {
+               .name = "ibmvscsi",
+       }
 };
 
 int __init ibmvscsi_module_init(void)
 
 
 struct vio_driver {
        struct list_head node;
-       char *name;
        const struct vio_device_id *id_table;
        int (*probe)(struct vio_dev *dev, const struct vio_device_id *id);
        int (*remove)(struct vio_dev *dev);