diff options
author | Hans J. Koch <hjk@linutronix.de> | 2009-01-06 18:15:39 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-03-24 19:38:24 -0400 |
commit | 8205779114e8f612549d191f8e151526a74ab9f2 (patch) | |
tree | fd26913320500193bd4078da0c164f9407aed47b /drivers/uio | |
parent | 57fee4a58fe802272742caae248872c392a60670 (diff) |
UIO: Add name attributes for mappings and port regions
If a UIO device has several memory mappings, it can be difficult for userspace
to find the right one. The situation becomes even worse if the UIO driver can
handle different versions of a card that have different numbers of mappings.
Benedikt Spranger has such cards and pointed this out to me. Thanks, Bene!
To address this problem, this patch adds "name" sysfs attributes for each
mapping. Userspace can use these to clearly identify each mapping. The name
string is optional. If a driver doesn't set it, an empty string will be
returned, so this patch won't break existing drivers.
The same problem exists for port region information, so a "name" attribute is
added there, too.
Signed-off-by: Hans J. Koch <hjk@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/uio')
-rw-r--r-- | drivers/uio/uio.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index 4ca85a113aa2..68a496557788 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c | |||
@@ -61,6 +61,14 @@ struct uio_map { | |||
61 | }; | 61 | }; |
62 | #define to_map(map) container_of(map, struct uio_map, kobj) | 62 | #define to_map(map) container_of(map, struct uio_map, kobj) |
63 | 63 | ||
64 | static ssize_t map_name_show(struct uio_mem *mem, char *buf) | ||
65 | { | ||
66 | if (unlikely(!mem->name)) | ||
67 | mem->name = ""; | ||
68 | |||
69 | return sprintf(buf, "%s\n", mem->name); | ||
70 | } | ||
71 | |||
64 | static ssize_t map_addr_show(struct uio_mem *mem, char *buf) | 72 | static ssize_t map_addr_show(struct uio_mem *mem, char *buf) |
65 | { | 73 | { |
66 | return sprintf(buf, "0x%lx\n", mem->addr); | 74 | return sprintf(buf, "0x%lx\n", mem->addr); |
@@ -82,6 +90,8 @@ struct map_sysfs_entry { | |||
82 | ssize_t (*store)(struct uio_mem *, const char *, size_t); | 90 | ssize_t (*store)(struct uio_mem *, const char *, size_t); |
83 | }; | 91 | }; |
84 | 92 | ||
93 | static struct map_sysfs_entry name_attribute = | ||
94 | __ATTR(name, S_IRUGO, map_name_show, NULL); | ||
85 | static struct map_sysfs_entry addr_attribute = | 95 | static struct map_sysfs_entry addr_attribute = |
86 | __ATTR(addr, S_IRUGO, map_addr_show, NULL); | 96 | __ATTR(addr, S_IRUGO, map_addr_show, NULL); |
87 | static struct map_sysfs_entry size_attribute = | 97 | static struct map_sysfs_entry size_attribute = |
@@ -90,6 +100,7 @@ static struct map_sysfs_entry offset_attribute = | |||
90 | __ATTR(offset, S_IRUGO, map_offset_show, NULL); | 100 | __ATTR(offset, S_IRUGO, map_offset_show, NULL); |
91 | 101 | ||
92 | static struct attribute *attrs[] = { | 102 | static struct attribute *attrs[] = { |
103 | &name_attribute.attr, | ||
93 | &addr_attribute.attr, | 104 | &addr_attribute.attr, |
94 | &size_attribute.attr, | 105 | &size_attribute.attr, |
95 | &offset_attribute.attr, | 106 | &offset_attribute.attr, |
@@ -133,6 +144,14 @@ struct uio_portio { | |||
133 | }; | 144 | }; |
134 | #define to_portio(portio) container_of(portio, struct uio_portio, kobj) | 145 | #define to_portio(portio) container_of(portio, struct uio_portio, kobj) |
135 | 146 | ||
147 | static ssize_t portio_name_show(struct uio_port *port, char *buf) | ||
148 | { | ||
149 | if (unlikely(!port->name)) | ||
150 | port->name = ""; | ||
151 | |||
152 | return sprintf(buf, "%s\n", port->name); | ||
153 | } | ||
154 | |||
136 | static ssize_t portio_start_show(struct uio_port *port, char *buf) | 155 | static ssize_t portio_start_show(struct uio_port *port, char *buf) |
137 | { | 156 | { |
138 | return sprintf(buf, "0x%lx\n", port->start); | 157 | return sprintf(buf, "0x%lx\n", port->start); |
@@ -159,6 +178,8 @@ struct portio_sysfs_entry { | |||
159 | ssize_t (*store)(struct uio_port *, const char *, size_t); | 178 | ssize_t (*store)(struct uio_port *, const char *, size_t); |
160 | }; | 179 | }; |
161 | 180 | ||
181 | static struct portio_sysfs_entry portio_name_attribute = | ||
182 | __ATTR(name, S_IRUGO, portio_name_show, NULL); | ||
162 | static struct portio_sysfs_entry portio_start_attribute = | 183 | static struct portio_sysfs_entry portio_start_attribute = |
163 | __ATTR(start, S_IRUGO, portio_start_show, NULL); | 184 | __ATTR(start, S_IRUGO, portio_start_show, NULL); |
164 | static struct portio_sysfs_entry portio_size_attribute = | 185 | static struct portio_sysfs_entry portio_size_attribute = |
@@ -167,6 +188,7 @@ static struct portio_sysfs_entry portio_porttype_attribute = | |||
167 | __ATTR(porttype, S_IRUGO, portio_porttype_show, NULL); | 188 | __ATTR(porttype, S_IRUGO, portio_porttype_show, NULL); |
168 | 189 | ||
169 | static struct attribute *portio_attrs[] = { | 190 | static struct attribute *portio_attrs[] = { |
191 | &portio_name_attribute.attr, | ||
170 | &portio_start_attribute.attr, | 192 | &portio_start_attribute.attr, |
171 | &portio_size_attribute.attr, | 193 | &portio_size_attribute.attr, |
172 | &portio_porttype_attribute.attr, | 194 | &portio_porttype_attribute.attr, |