diff options
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/bus.c | 2 | ||||
-rw-r--r-- | drivers/base/driver.c | 98 | ||||
-rw-r--r-- | drivers/base/resource.c | 2 |
3 files changed, 53 insertions, 49 deletions
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index b889a48662..1038d20a12 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -32,7 +32,7 @@ int bus_register(struct bus_type *bus) return -EEXIST; bus->dev = xzalloc(sizeof(*bus->dev)); - strcpy(bus->dev->name, bus->name); + dev_set_name(bus->dev, bus->name); bus->dev->id = DEVICE_ID_SINGLE; ret = register_device(bus->dev); diff --git a/drivers/base/driver.c b/drivers/base/driver.c index c43a4bde2a..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); @@ -368,18 +373,6 @@ struct resource *dev_get_resource_by_name(struct device_d *dev, return ERR_PTR(-ENOENT); } -void *dev_get_mem_region_by_name(struct device_d *dev, const char *name) -{ - struct resource *res; - - res = dev_get_resource_by_name(dev, IORESOURCE_MEM, name); - if (IS_ERR(res)) - return ERR_CAST(res); - - return (void __force *)res->start; -} -EXPORT_SYMBOL(dev_get_mem_region_by_name); - void __iomem *dev_request_mem_region_by_name(struct device_d *dev, const char *name) { struct resource *res; @@ -396,32 +389,28 @@ void __iomem *dev_request_mem_region_by_name(struct device_d *dev, const char *n } EXPORT_SYMBOL(dev_request_mem_region_by_name); -void __iomem *dev_request_mem_region_err_null(struct device_d *dev, int num) +struct resource *dev_request_mem_resource(struct device_d *dev, int num) { struct resource *res; res = dev_get_resource(dev, IORESOURCE_MEM, num); if (IS_ERR(res)) - return NULL; - - res = request_iomem_region(dev_name(dev), res->start, res->end); - if (IS_ERR(res)) - return NULL; + return ERR_CAST(res); - return IOMEM(res->start); + return request_iomem_region(dev_name(dev), res->start, res->end); } -EXPORT_SYMBOL(dev_request_mem_region_err_null); -struct resource *dev_request_mem_resource(struct device_d *dev, int num) +void __iomem *dev_request_mem_region_err_null(struct device_d *dev, int num) { struct resource *res; - res = dev_get_resource(dev, IORESOURCE_MEM, num); + res = dev_request_mem_resource(dev, num); if (IS_ERR(res)) - return ERR_CAST(res); + return NULL; - return request_iomem_region(dev_name(dev), res->start, res->end); + return IOMEM(res->start); } +EXPORT_SYMBOL(dev_request_mem_region_err_null); void __iomem *dev_request_mem_region(struct device_d *dev, int num) { @@ -435,29 +424,22 @@ void __iomem *dev_request_mem_region(struct device_d *dev, int num) } EXPORT_SYMBOL(dev_request_mem_region); -int generic_memmap_ro(struct cdev *cdev, void **map, int flags) +int generic_memmap_rw(struct cdev *cdev, void **map, int flags) { if (!cdev->dev) return -EINVAL; - if (flags & PROT_WRITE) - return -EACCES; *map = dev_get_mem_region(cdev->dev, 0); - if (IS_ERR(*map)) - return PTR_ERR(*map); - return 0; + + return PTR_ERR_OR_ZERO(*map); } -int generic_memmap_rw(struct cdev *cdev, void **map, int flags) +int generic_memmap_ro(struct cdev *cdev, void **map, int flags) { - if (!cdev->dev) - return -EINVAL; - - *map = dev_get_mem_region(cdev->dev, 0); - if (IS_ERR(*map)) - return PTR_ERR(*map); + if (flags & PROT_WRITE) + return -EACCES; - return 0; + return generic_memmap_rw(cdev, map, flags); } int dummy_probe(struct device_d *dev) @@ -466,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) { diff --git a/drivers/base/resource.c b/drivers/base/resource.c index 6c2d7fed46..cb7105bf8d 100644 --- a/drivers/base/resource.c +++ b/drivers/base/resource.c @@ -27,7 +27,7 @@ struct device_d *device_alloc(const char *devname, int id) struct device_d *dev; dev = xzalloc(sizeof(*dev)); - strcpy(dev->name, devname); + dev_set_name(dev, devname); dev->id = id; return dev; |