diff options
Diffstat (limited to 'drivers/uio')
-rw-r--r-- | drivers/uio/uio.c | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index 2a77e9d42c68..e8a01f264540 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c | |||
@@ -57,29 +57,29 @@ struct uio_map { | |||
57 | }; | 57 | }; |
58 | #define to_map(map) container_of(map, struct uio_map, kobj) | 58 | #define to_map(map) container_of(map, struct uio_map, kobj) |
59 | 59 | ||
60 | 60 | static ssize_t map_addr_show(struct uio_mem *mem, char *buf) | |
61 | static ssize_t map_attr_show(struct kobject *kobj, struct kobj_attribute *attr, | ||
62 | char *buf) | ||
63 | { | 61 | { |
64 | struct uio_map *map = to_map(kobj); | 62 | return sprintf(buf, "0x%lx\n", mem->addr); |
65 | struct uio_mem *mem = map->mem; | 63 | } |
66 | |||
67 | if (strncmp(attr->attr.name, "addr", 4) == 0) | ||
68 | return sprintf(buf, "0x%lx\n", mem->addr); | ||
69 | |||
70 | if (strncmp(attr->attr.name, "size", 4) == 0) | ||
71 | return sprintf(buf, "0x%lx\n", mem->size); | ||
72 | 64 | ||
73 | return -ENODEV; | 65 | static ssize_t map_size_show(struct uio_mem *mem, char *buf) |
66 | { | ||
67 | return sprintf(buf, "0x%lx\n", mem->size); | ||
74 | } | 68 | } |
75 | 69 | ||
76 | static struct kobj_attribute attr_attribute = | 70 | struct uio_sysfs_entry { |
77 | __ATTR(addr, S_IRUGO, map_attr_show, NULL); | 71 | struct attribute attr; |
78 | static struct kobj_attribute size_attribute = | 72 | ssize_t (*show)(struct uio_mem *, char *); |
79 | __ATTR(size, S_IRUGO, map_attr_show, NULL); | 73 | ssize_t (*store)(struct uio_mem *, const char *, size_t); |
74 | }; | ||
75 | |||
76 | static struct uio_sysfs_entry addr_attribute = | ||
77 | __ATTR(addr, S_IRUGO, map_addr_show, NULL); | ||
78 | static struct uio_sysfs_entry size_attribute = | ||
79 | __ATTR(size, S_IRUGO, map_size_show, NULL); | ||
80 | 80 | ||
81 | static struct attribute *attrs[] = { | 81 | static struct attribute *attrs[] = { |
82 | &attr_attribute.attr, | 82 | &addr_attribute.attr, |
83 | &size_attribute.attr, | 83 | &size_attribute.attr, |
84 | NULL, /* need to NULL terminate the list of attributes */ | 84 | NULL, /* need to NULL terminate the list of attributes */ |
85 | }; | 85 | }; |
@@ -90,8 +90,28 @@ static void map_release(struct kobject *kobj) | |||
90 | kfree(map); | 90 | kfree(map); |
91 | } | 91 | } |
92 | 92 | ||
93 | static ssize_t map_type_show(struct kobject *kobj, struct attribute *attr, | ||
94 | char *buf) | ||
95 | { | ||
96 | struct uio_map *map = to_map(kobj); | ||
97 | struct uio_mem *mem = map->mem; | ||
98 | struct uio_sysfs_entry *entry; | ||
99 | |||
100 | entry = container_of(attr, struct uio_sysfs_entry, attr); | ||
101 | |||
102 | if (!entry->show) | ||
103 | return -EIO; | ||
104 | |||
105 | return entry->show(mem, buf); | ||
106 | } | ||
107 | |||
108 | static struct sysfs_ops uio_sysfs_ops = { | ||
109 | .show = map_type_show, | ||
110 | }; | ||
111 | |||
93 | static struct kobj_type map_attr_type = { | 112 | static struct kobj_type map_attr_type = { |
94 | .release = map_release, | 113 | .release = map_release, |
114 | .sysfs_ops = &uio_sysfs_ops, | ||
95 | .default_attrs = attrs, | 115 | .default_attrs = attrs, |
96 | }; | 116 | }; |
97 | 117 | ||