Commit 40d7ee5d authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: (60 commits)
  uio: make uio_info's name and version const
  UIO: Documentation for UIO ioport info handling
  UIO: Pass information about ioports to userspace (V2)
  UIO: uio_pdrv_genirq: allow custom irq_flags
  UIO: use pci_ioremap_bar() in drivers/uio
  arm: struct device - replace bus_id with dev_name(), dev_set_name()
  libata: struct device - replace bus_id with dev_name(), dev_set_name()
  avr: struct device - replace bus_id with dev_name(), dev_set_name()
  block: struct device - replace bus_id with dev_name(), dev_set_name()
  chris: struct device - replace bus_id with dev_name(), dev_set_name()
  dmi: struct device - replace bus_id with dev_name(), dev_set_name()
  gadget: struct device - replace bus_id with dev_name(), dev_set_name()
  gpio: struct device - replace bus_id with dev_name(), dev_set_name()
  gpu: struct device - replace bus_id with dev_name(), dev_set_name()
  hwmon: struct device - replace bus_id with dev_name(), dev_set_name()
  i2o: struct device - replace bus_id with dev_name(), dev_set_name()
  IA64: struct device - replace bus_id with dev_name(), dev_set_name()
  i7300_idle: struct device - replace bus_id with dev_name(), dev_set_name()
  infiniband: struct device - replace bus_id with dev_name(), dev_set_name()
  ISDN: struct device - replace bus_id with dev_name(), dev_set_name()
  ...
parents 5fec8bdb b8ac9fc0
Loading
Loading
Loading
Loading
+99 −2
Original line number Diff line number Diff line
@@ -41,6 +41,12 @@ GPL version 2.
</abstract>

<revhistory>
	<revision>
	<revnumber>0.6</revnumber>
	<date>2008-12-05</date>
	<authorinitials>hjk</authorinitials>
	<revremark>Added description of portio sysfs attributes.</revremark>
	</revision>
	<revision>
	<revnumber>0.5</revnumber>
	<date>2008-05-22</date>
@@ -318,6 +324,54 @@ interested in translating it, please email me
offset = N * getpagesize();
</programlisting>

<para>
	Sometimes there is hardware with memory-like regions that can not be
	mapped with the technique described here, but there are still ways to
	access them from userspace. The most common example are x86 ioports.
	On x86 systems, userspace can access these ioports using
	<function>ioperm()</function>, <function>iopl()</function>,
	<function>inb()</function>, <function>outb()</function>, and similar
	functions.
</para>
<para>
	Since these ioport regions can not be mapped, they will not appear under
	<filename>/sys/class/uio/uioX/maps/</filename> like the normal memory
	described above. Without information about the port regions a hardware
	has to offer, it becomes difficult for the userspace part of the
	driver to find out which ports belong to which UIO device.
</para>
<para>
	To address this situation, the new directory
	<filename>/sys/class/uio/uioX/portio/</filename> was added. It only
	exists if the driver wants to pass information about one or more port
	regions to userspace. If that is the case, subdirectories named
	<filename>port0</filename>, <filename>port1</filename>, and so on,
	will appear underneath
	<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:
</para>
<itemizedlist>
<listitem>
	<para>
	<filename>start</filename>: The first port of this region.
	</para>
</listitem>
<listitem>
	<para>
	<filename>size</filename>: The number of ports in this region.
	</para>
</listitem>
<listitem>
	<para>
	<filename>porttype</filename>: A string describing the type of port.
	</para>
</listitem>
</itemizedlist>


</sect1>
</chapter>

@@ -339,12 +393,12 @@ offset = N * getpagesize();

<itemizedlist>
<listitem><para>
<varname>char *name</varname>: Required. The name of your driver as
<varname>const char *name</varname>: Required. The name of your driver as
it will appear in sysfs. I recommend using the name of your module for this.
</para></listitem>

<listitem><para>
<varname>char *version</varname>: Required. This string appears in
<varname>const char *version</varname>: Required. This string appears in
<filename>/sys/class/uio/uioX/version</filename>.
</para></listitem>

@@ -355,6 +409,13 @@ mapping you need to fill one of the <varname>uio_mem</varname> structures.
See the description below for details.
</para></listitem>

<listitem><para>
<varname>struct uio_port port[ MAX_UIO_PORTS_REGIONS ]</varname>: Required
if you want to pass information about ioports to userspace. For each port
region you need to fill one of the <varname>uio_port</varname> structures.
See the description below for details.
</para></listitem>

<listitem><para>
<varname>long irq</varname>: Required. If your hardware generates an
interrupt, it's your modules task to determine the irq number during
@@ -448,6 +509,42 @@ Please do not touch the <varname>kobj</varname> element of
<varname>struct uio_mem</varname>! It is used by the UIO framework
to set up sysfs files for this mapping. Simply leave it alone.
</para>

<para>
Sometimes, your device can have one or more port regions which can not be
mapped to userspace. But if there are other possibilities for userspace to
access these ports, it makes sense to make information about the ports
available in sysfs. For each region, you have to set up a
<varname>struct uio_port</varname> in the <varname>port[]</varname> array.
Here's a description of the fields of <varname>struct uio_port</varname>:
</para>

<itemizedlist>
<listitem><para>
<varname>char *porttype</varname>: Required. Set this to one of the predefined
constants. Use <varname>UIO_PORT_X86</varname> for the ioports found in x86
architectures.
</para></listitem>

<listitem><para>
<varname>unsigned long start</varname>: Required if the port region is used.
Fill in the number of the first port of this region.
</para></listitem>

<listitem><para>
<varname>unsigned long size</varname>: Fill in the number of ports in this
region. If <varname>size</varname> is zero, the region is considered unused.
Note that you <emphasis>must</emphasis> initialize <varname>size</varname>
with zero for all unused regions.
</para></listitem>
</itemizedlist>

<para>
Please do not touch the <varname>portio</varname> element of
<varname>struct uio_port</varname>! It is used internally by the UIO
framework to set up sysfs files for this region. Simply leave it alone.
</para>

</sect1>

<sect1 id="adding_irq_handler">
+2 −2
Original line number Diff line number Diff line
@@ -118,8 +118,8 @@ the name of the kobject, call kobject_rename():

    int kobject_rename(struct kobject *kobj, const char *new_name);

Note kobject_rename does perform any locking or have a solid notion of
what names are valid so the provide must provide their own sanity checking
kobject_rename does not perform any locking or have a solid notion of
what names are valid so the caller must provide their own sanity checking
and serialization.

There is a function called kobject_set_name() but that is legacy cruft and
+1 −1
Original line number Diff line number Diff line
@@ -817,7 +817,7 @@ static struct expansion_card *__init ecard_alloc_card(int type, int slot)
	ec->dma = NO_DMA;
	ec->ops = &ecard_default_ops;

	snprintf(ec->dev.bus_id, sizeof(ec->dev.bus_id), "ecard%d", slot);
	dev_set_name(&ec->dev, "ecard%d", slot);
	ec->dev.parent = NULL;
	ec->dev.bus = &ecard_bus_type;
	ec->dev.dma_mask = &ec->dma_mask;
+1 −1
Original line number Diff line number Diff line
@@ -212,7 +212,7 @@ static struct clcd_board clcd_plat_data = {

static struct amba_device clcd_device = {
	.dev		= {
		.bus_id			= "mb:16",
		.init_name		= "mb:16",
		.coherent_dma_mask	= ~0,
		.platform_data		= &clcd_plat_data,
	},
+3 −3
Original line number Diff line number Diff line
@@ -409,7 +409,7 @@ static struct amba_pl010_data ep93xx_uart_data = {

static struct amba_device uart1_device = {
	.dev		= {
		.bus_id		= "apb:uart1",
		.init_name	= "apb:uart1",
		.platform_data	= &ep93xx_uart_data,
	},
	.res		= {
@@ -423,7 +423,7 @@ static struct amba_device uart1_device = {

static struct amba_device uart2_device = {
	.dev		= {
		.bus_id		= "apb:uart2",
		.init_name	= "apb:uart2",
		.platform_data	= &ep93xx_uart_data,
	},
	.res		= {
@@ -437,7 +437,7 @@ static struct amba_device uart2_device = {

static struct amba_device uart3_device = {
	.dev		= {
		.bus_id		= "apb:uart3",
		.init_name	= "apb:uart3",
		.platform_data	= &ep93xx_uart_data,
	},
	.res		= {
Loading