aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans J. Koch <hjk@linutronix.de>2009-01-06 18:15:39 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2009-03-24 19:38:24 -0400
commit8205779114e8f612549d191f8e151526a74ab9f2 (patch)
treefd26913320500193bd4078da0c164f9407aed47b
parent57fee4a58fe802272742caae248872c392a60670 (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>
-rw-r--r--Documentation/DocBook/uio-howto.tmpl29
-rw-r--r--drivers/uio/uio.c22
-rw-r--r--include/linux/uio_driver.h4
3 files changed, 51 insertions, 4 deletions
diff --git a/Documentation/DocBook/uio-howto.tmpl b/Documentation/DocBook/uio-howto.tmpl
index 52e1b79ce0e6..8f6e3b2403c7 100644
--- a/Documentation/DocBook/uio-howto.tmpl
+++ b/Documentation/DocBook/uio-howto.tmpl
@@ -42,6 +42,13 @@ GPL version 2.
42 42
43<revhistory> 43<revhistory>
44 <revision> 44 <revision>
45 <revnumber>0.8</revnumber>
46 <date>2008-12-24</date>
47 <authorinitials>hjk</authorinitials>
48 <revremark>Added name attributes in mem and portio sysfs directories.
49 </revremark>
50 </revision>
51 <revision>
45 <revnumber>0.7</revnumber> 52 <revnumber>0.7</revnumber>
46 <date>2008-12-23</date> 53 <date>2008-12-23</date>
47 <authorinitials>hjk</authorinitials> 54 <authorinitials>hjk</authorinitials>
@@ -303,12 +310,19 @@ interested in translating it, please email me
303 appear if the size of the mapping is not 0. 310 appear if the size of the mapping is not 0.
304</para> 311</para>
305<para> 312<para>
306 Each <filename>mapX/</filename> directory contains two read-only files 313 Each <filename>mapX/</filename> directory contains four read-only files
307 that show start address and size of the memory: 314 that show attributes of the memory:
308</para> 315</para>
309<itemizedlist> 316<itemizedlist>
310<listitem> 317<listitem>
311 <para> 318 <para>
319 <filename>name</filename>: A string identifier for this mapping. This
320 is optional, the string can be empty. Drivers can set this to make it
321 easier for userspace to find the correct mapping.
322 </para>
323</listitem>
324<listitem>
325 <para>
312 <filename>addr</filename>: The address of memory that can be mapped. 326 <filename>addr</filename>: The address of memory that can be mapped.
313 </para> 327 </para>
314</listitem> 328</listitem>
@@ -366,12 +380,19 @@ offset = N * getpagesize();
366 <filename>/sys/class/uio/uioX/portio/</filename>. 380 <filename>/sys/class/uio/uioX/portio/</filename>.
367</para> 381</para>
368<para> 382<para>
369 Each <filename>portX/</filename> directory contains three read-only 383 Each <filename>portX/</filename> directory contains four read-only
370 files that show start, size, and type of the port region: 384 files that show name, start, size, and type of the port region:
371</para> 385</para>
372<itemizedlist> 386<itemizedlist>
373<listitem> 387<listitem>
374 <para> 388 <para>
389 <filename>name</filename>: A string identifier for this port region.
390 The string is optional and can be empty. Drivers can set it to make it
391 easier for userspace to find a certain port region.
392 </para>
393</listitem>
394<listitem>
395 <para>
375 <filename>start</filename>: The first port of this region. 396 <filename>start</filename>: The first port of this region.
376 </para> 397 </para>
377</listitem> 398</listitem>
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
64static 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
64static ssize_t map_addr_show(struct uio_mem *mem, char *buf) 72static 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
93static struct map_sysfs_entry name_attribute =
94 __ATTR(name, S_IRUGO, map_name_show, NULL);
85static struct map_sysfs_entry addr_attribute = 95static struct map_sysfs_entry addr_attribute =
86 __ATTR(addr, S_IRUGO, map_addr_show, NULL); 96 __ATTR(addr, S_IRUGO, map_addr_show, NULL);
87static struct map_sysfs_entry size_attribute = 97static 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
92static struct attribute *attrs[] = { 102static 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
147static 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
136static ssize_t portio_start_show(struct uio_port *port, char *buf) 155static 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
181static struct portio_sysfs_entry portio_name_attribute =
182 __ATTR(name, S_IRUGO, portio_name_show, NULL);
162static struct portio_sysfs_entry portio_start_attribute = 183static 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);
164static struct portio_sysfs_entry portio_size_attribute = 185static 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
169static struct attribute *portio_attrs[] = { 190static 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,
diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h
index a0bb6bd2e5c1..5dcc9ff72f69 100644
--- a/include/linux/uio_driver.h
+++ b/include/linux/uio_driver.h
@@ -22,6 +22,7 @@ struct uio_map;
22 22
23/** 23/**
24 * struct uio_mem - description of a UIO memory region 24 * struct uio_mem - description of a UIO memory region
25 * @name: name of the memory region for identification
25 * @addr: address of the device's memory 26 * @addr: address of the device's memory
26 * @size: size of IO 27 * @size: size of IO
27 * @memtype: type of memory addr points to 28 * @memtype: type of memory addr points to
@@ -29,6 +30,7 @@ struct uio_map;
29 * @map: for use by the UIO core only. 30 * @map: for use by the UIO core only.
30 */ 31 */
31struct uio_mem { 32struct uio_mem {
33 const char *name;
32 unsigned long addr; 34 unsigned long addr;
33 unsigned long size; 35 unsigned long size;
34 int memtype; 36 int memtype;
@@ -42,12 +44,14 @@ struct uio_portio;
42 44
43/** 45/**
44 * struct uio_port - description of a UIO port region 46 * struct uio_port - description of a UIO port region
47 * @name: name of the port region for identification
45 * @start: start of port region 48 * @start: start of port region
46 * @size: size of port region 49 * @size: size of port region
47 * @porttype: type of port (see UIO_PORT_* below) 50 * @porttype: type of port (see UIO_PORT_* below)
48 * @portio: for use by the UIO core only. 51 * @portio: for use by the UIO core only.
49 */ 52 */
50struct uio_port { 53struct uio_port {
54 const char *name;
51 unsigned long start; 55 unsigned long start;
52 unsigned long size; 56 unsigned long size;
53 int porttype; 57 int porttype;