of/device: merge of_device_uevent
[cascardo/linux.git] / arch / microblaze / kernel / of_device.c
1 #include <linux/string.h>
2 #include <linux/kernel.h>
3 #include <linux/of.h>
4 #include <linux/init.h>
5 #include <linux/module.h>
6 #include <linux/mod_devicetable.h>
7 #include <linux/slab.h>
8 #include <linux/of_device.h>
9
10 #include <linux/errno.h>
11
12 void of_device_make_bus_id(struct of_device *dev)
13 {
14         static atomic_t bus_no_reg_magic;
15         struct device_node *node = dev->dev.of_node;
16         const u32 *reg;
17         u64 addr;
18         int magic;
19
20         /*
21          * For MMIO, get the physical address
22          */
23         reg = of_get_property(node, "reg", NULL);
24         if (reg) {
25                 addr = of_translate_address(node, reg);
26                 if (addr != OF_BAD_ADDR) {
27                         dev_set_name(&dev->dev, "%llx.%s",
28                                      (unsigned long long)addr, node->name);
29                         return;
30                 }
31         }
32
33         /*
34          * No BusID, use the node name and add a globally incremented
35          * counter (and pray...)
36          */
37         magic = atomic_add_return(1, &bus_no_reg_magic);
38         dev_set_name(&dev->dev, "%s.%d", node->name, magic - 1);
39 }
40 EXPORT_SYMBOL(of_device_make_bus_id);
41
42 struct of_device *of_device_alloc(struct device_node *np,
43                                   const char *bus_id,
44                                   struct device *parent)
45 {
46         struct of_device *dev;
47
48         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
49         if (!dev)
50                 return NULL;
51
52         dev->dev.of_node = of_node_get(np);
53         dev->dev.dma_mask = &dev->archdata.dma_mask;
54         dev->dev.parent = parent;
55         dev->dev.release = of_release_dev;
56
57         if (bus_id)
58                 dev_set_name(&dev->dev, bus_id);
59         else
60                 of_device_make_bus_id(dev);
61
62         return dev;
63 }
64 EXPORT_SYMBOL(of_device_alloc);