diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2008-09-01 15:11:26 (GMT) |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2008-09-01 23:28:18 (GMT) |
commit | 628ffd73bcff0c9f3bc5a8eeb2c7455fe9d28a51 (patch) | |
tree | b7fed06affccfa97aae1344c6f4f5026440513fb | |
parent | e99e9575bbeba1b7c48e046547cae065ec0071de (diff) | |
download | u-boot-628ffd73bcff0c9f3bc5a8eeb2c7455fe9d28a51.tar.xz |
device: make device_register() clone the device
This is expected by the callers, but this fact was hidden well within
the old list implementation.
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
-rw-r--r-- | common/devices.c | 24 | ||||
-rw-r--r-- | include/devices.h | 1 |
2 files changed, 24 insertions, 1 deletions
diff --git a/common/devices.c b/common/devices.c index 2977436..8beebe2 100644 --- a/common/devices.c +++ b/common/devices.c @@ -130,10 +130,32 @@ device_t* device_get_by_name(char* name) return NULL; } +device_t* device_clone(device_t *dev) +{ + device_t *_dev; + + if(!dev) + return NULL; + + _dev = calloc(1, sizeof(device_t)); + + if(!_dev) + return NULL; + + memcpy(_dev, dev, sizeof(device_t)); + strncpy(_dev->name, dev->name, 16); + + return _dev; +} int device_register (device_t * dev) { - list_add(&(dev->list), &(devs.list)); + device_t *_dev; + + _dev = device_clone(dev); + if(!_dev) + return -1; + list_add(&(_dev->list), &(devs.list)); return 0; } diff --git a/include/devices.h b/include/devices.h index 490016b..6b78d58 100644 --- a/include/devices.h +++ b/include/devices.h @@ -94,6 +94,7 @@ int devices_init (void); int device_deregister(char *devname); struct list_head* device_get_list(void); device_t* device_get_by_name(char* name); +device_t* device_clone(device_t *dev); #ifdef CONFIG_LCD int drv_lcd_init (void); |