2 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of version 2 of the GNU General Public License as
6 * published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 #include <linux/module.h>
14 #include <linux/device.h>
15 #include <linux/slab.h>
19 static void namespace_io_release(struct device *dev)
21 struct nd_namespace_io *nsio = to_nd_namespace_io(dev);
26 static struct device_type namespace_io_device_type = {
27 .name = "nd_namespace_io",
28 .release = namespace_io_release,
31 static ssize_t nstype_show(struct device *dev,
32 struct device_attribute *attr, char *buf)
34 struct nd_region *nd_region = to_nd_region(dev->parent);
36 return sprintf(buf, "%d\n", nd_region_to_nstype(nd_region));
38 static DEVICE_ATTR_RO(nstype);
40 static struct attribute *nd_namespace_attributes[] = {
41 &dev_attr_nstype.attr,
45 static struct attribute_group nd_namespace_attribute_group = {
46 .attrs = nd_namespace_attributes,
49 static const struct attribute_group *nd_namespace_attribute_groups[] = {
50 &nd_device_attribute_group,
51 &nd_namespace_attribute_group,
55 static struct device **create_namespace_io(struct nd_region *nd_region)
57 struct nd_namespace_io *nsio;
58 struct device *dev, **devs;
61 nsio = kzalloc(sizeof(*nsio), GFP_KERNEL);
65 devs = kcalloc(2, sizeof(struct device *), GFP_KERNEL);
72 dev->type = &namespace_io_device_type;
73 dev->parent = &nd_region->dev;
75 res->name = dev_name(&nd_region->dev);
76 res->flags = IORESOURCE_MEM;
77 res->start = nd_region->ndr_start;
78 res->end = res->start + nd_region->ndr_size - 1;
84 int nd_region_register_namespaces(struct nd_region *nd_region, int *err)
86 struct device **devs = NULL;
90 switch (nd_region_to_nstype(nd_region)) {
91 case ND_DEVICE_NAMESPACE_IO:
92 devs = create_namespace_io(nd_region);
101 for (i = 0; devs[i]; i++) {
102 struct device *dev = devs[i];
104 dev_set_name(dev, "namespace%d.%d", nd_region->id, i);
105 dev->groups = nd_namespace_attribute_groups;
106 nd_device_register(dev);