</abstract>
 
 <revhistory>
+       <revision>
+       <revnumber>0.8</revnumber>
+       <date>2008-12-24</date>
+       <authorinitials>hjk</authorinitials>
+       <revremark>Added name attributes in mem and portio sysfs directories.
+               </revremark>
+       </revision>
        <revision>
        <revnumber>0.7</revnumber>
        <date>2008-12-23</date>
        appear if the size of the mapping is not 0.
 </para>
 <para>
-       Each <filename>mapX/</filename> directory contains two read-only files
-       that show start address and size of the memory:
+       Each <filename>mapX/</filename> directory contains four read-only files
+       that show attributes of the memory:
 </para>
 <itemizedlist>
+<listitem>
+       <para>
+       <filename>name</filename>: A string identifier for this mapping. This
+       is optional, the string can be empty. Drivers can set this to make it
+       easier for userspace to find the correct mapping.
+       </para>
+</listitem>
 <listitem>
        <para>
        <filename>addr</filename>: The address of memory that can be mapped.
        <filename>/sys/class/uio/uioX/portio/</filename>.
 </para>
 <para>
-       Each <filename>portX/</filename> directory contains three read-only
-       files that show start, size, and type of the port region:
+       Each <filename>portX/</filename> directory contains four read-only
+       files that show name, start, size, and type of the port region:
 </para>
 <itemizedlist>
+<listitem>
+       <para>
+       <filename>name</filename>: A string identifier for this port region.
+       The string is optional and can be empty. Drivers can set it to make it
+       easier for userspace to find a certain port region.
+       </para>
+</listitem>
 <listitem>
        <para>
        <filename>start</filename>: The first port of this region.
 
 };
 #define to_map(map) container_of(map, struct uio_map, kobj)
 
+static ssize_t map_name_show(struct uio_mem *mem, char *buf)
+{
+       if (unlikely(!mem->name))
+               mem->name = "";
+
+       return sprintf(buf, "%s\n", mem->name);
+}
+
 static ssize_t map_addr_show(struct uio_mem *mem, char *buf)
 {
        return sprintf(buf, "0x%lx\n", mem->addr);
        ssize_t (*store)(struct uio_mem *, const char *, size_t);
 };
 
+static struct map_sysfs_entry name_attribute =
+       __ATTR(name, S_IRUGO, map_name_show, NULL);
 static struct map_sysfs_entry addr_attribute =
        __ATTR(addr, S_IRUGO, map_addr_show, NULL);
 static struct map_sysfs_entry size_attribute =
        __ATTR(offset, S_IRUGO, map_offset_show, NULL);
 
 static struct attribute *attrs[] = {
+       &name_attribute.attr,
        &addr_attribute.attr,
        &size_attribute.attr,
        &offset_attribute.attr,
 };
 #define to_portio(portio) container_of(portio, struct uio_portio, kobj)
 
+static ssize_t portio_name_show(struct uio_port *port, char *buf)
+{
+       if (unlikely(!port->name))
+               port->name = "";
+
+       return sprintf(buf, "%s\n", port->name);
+}
+
 static ssize_t portio_start_show(struct uio_port *port, char *buf)
 {
        return sprintf(buf, "0x%lx\n", port->start);
        ssize_t (*store)(struct uio_port *, const char *, size_t);
 };
 
+static struct portio_sysfs_entry portio_name_attribute =
+       __ATTR(name, S_IRUGO, portio_name_show, NULL);
 static struct portio_sysfs_entry portio_start_attribute =
        __ATTR(start, S_IRUGO, portio_start_show, NULL);
 static struct portio_sysfs_entry portio_size_attribute =
        __ATTR(porttype, S_IRUGO, portio_porttype_show, NULL);
 
 static struct attribute *portio_attrs[] = {
+       &portio_name_attribute.attr,
        &portio_start_attribute.attr,
        &portio_size_attribute.attr,
        &portio_porttype_attribute.attr,
 
 
 /**
  * struct uio_mem - description of a UIO memory region
+ * @name:              name of the memory region for identification
  * @addr:              address of the device's memory
  * @size:              size of IO
  * @memtype:           type of memory addr points to
  * @map:               for use by the UIO core only.
  */
 struct uio_mem {
+       const char              *name;
        unsigned long           addr;
        unsigned long           size;
        int                     memtype;
 
 /**
  * struct uio_port - description of a UIO port region
+ * @name:              name of the port region for identification
  * @start:             start of port region
  * @size:              size of port region
  * @porttype:          type of port (see UIO_PORT_* below)
  * @portio:            for use by the UIO core only.
  */
 struct uio_port {
+       const char              *name;
        unsigned long           start;
        unsigned long           size;
        int                     porttype;