diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-11-09 10:55:05 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-11-09 10:55:05 +0100 |
commit | 227426f16163d3721fee82650980aae0eef01375 (patch) | |
tree | a64101906c15b814ec942468e88875ce8160e45d /drivers/base/driver.c | |
parent | c024f90f5dd5604d3f82dbbc055fd88a69d59187 (diff) | |
parent | ac7324a0ed12a67fc836b383388f2562d32e55ed (diff) | |
download | barebox-227426f16163d3721fee82650980aae0eef01375.tar.gz barebox-227426f16163d3721fee82650980aae0eef01375.tar.xz |
Merge branch 'for-next/net-switch-mv88e6xxx'
Diffstat (limited to 'drivers/base/driver.c')
-rw-r--r-- | drivers/base/driver.c | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/drivers/base/driver.c b/drivers/base/driver.c index 3b39c28494..4acc4cfa1e 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c @@ -183,6 +183,11 @@ int register_device(struct device_d *new_device) } } + if (new_device->id != DEVICE_ID_SINGLE) + new_device->unique_name = basprintf(FORMAT_DRIVER_NAME_ID, + new_device->name, + new_device->id); + debug ("register_device: %s\n", dev_name(new_device)); list_add_tail(&new_device->list, &device_list); @@ -443,17 +448,39 @@ int dummy_probe(struct device_d *dev) } EXPORT_SYMBOL(dummy_probe); -const char *dev_id(const struct device_d *dev) +/** + * dev_set_name - set a device name + * @dev: device + * @fmt: format string for the device's name + * + * NOTE: This function expects dev->name to be free()-able, so extra + * precautions needs to be taken when mixing its usage with manual + * assignement of device_d.name. + */ +int dev_set_name(struct device_d *dev, const char *fmt, ...) { - static char buf[MAX_DRIVER_NAME + 16]; - - if (dev->id != DEVICE_ID_SINGLE) - snprintf(buf, sizeof(buf), FORMAT_DRIVER_NAME_ID, dev->name, dev->id); - else - snprintf(buf, sizeof(buf), "%s", dev->name); - - return buf; + va_list vargs; + int err; + /* + * Save old pointer in case we are overriding already set name + */ + char *oldname = dev->name; + + va_start(vargs, fmt); + err = vasprintf(&dev->name, fmt, vargs); + va_end(vargs); + + /* + * Free old pointer, we do this after vasprintf call in case + * old device name was in one of vargs + */ + free(oldname); + + WARN_ON(err < 0); + + return err; } +EXPORT_SYMBOL_GPL(dev_set_name); static void devices_shutdown(void) { |