--- linux-2.5.45/include/linux/device.h 2002-10-30 16:43:40.000000000 -0800 +++ linux/include/linux/device.h 2002-11-02 05:20:36.000000000 -0800 @@ -114,6 +114,7 @@ char * name; struct bus_type * bus; struct device_class * devclass; + int drvdata_size; rwlock_t lock; atomic_t refcount; --- linux-2.5.45/drivers/base/bus.c 2002-10-30 16:42:20.000000000 -0800 +++ linux/drivers/base/bus.c 2002-11-02 05:21:37.000000000 -0800 @@ -98,6 +98,17 @@ { int error = -ENODEV; if (dev->bus->match(dev,drv)) { + + if (drv->drvdata_size > 0) { + dev->driver_data = kmalloc(drv->drvdata_size); + if (dev->driver_data) + memset(dev->driver_data, 0, drv->drvdata_size); + else + return -ENOMEM; + } + else + dev->driver_data = NULL; + dev->driver = drv; if (drv->probe) { if (!(error = drv->probe(dev))) @@ -166,6 +177,12 @@ devclass_remove_device(dev); if (drv->remove) drv->remove(dev); + if (drv->drvdata_size) { + if (dev->driver_data) + kfree(dev->driver_data); + else + BUG_ON(drv->drvdata_size != -1); + } dev->driver = NULL; } }