Thread (11 messages) flat view 11 messages, 7 authors, 2009-02-12

Re: request_irq return errno 38

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2009-02-12 06:02:10

On Wed, 2009-02-11 at 14:35 -0800, Brad Boyer wrote:
On Wed, Feb 11, 2009 at 03:43:26PM +0530, Vijay Nikam wrote:
quoted
I read in LDD book, they give directly irq no. they have given
parallel port example, here they have set or said irq no. defaults to
7 and they have not done any irq_mapping so what is the difference ? ?
? I mean how I should know when to use irq_mapping and when not ? ? ?

Also is it some difference between writng drivers on embedded Linux
level and Linux PC (i386) ? ? ?
The basic request_irq() function is generic, but the value of the
arguments (especially the number for the IRQ line) is architecture
specific in many ways. This is one difference between the i386 code
and the powerpc code inside Linux. Most i386 hardware is standard
PC hardware with very clearly defined interrupt sources. 
In fact, not even clearly anymore :-) IE, there are still some legacy
interrupts at fixed numbers but most things are remapped on x86 too
nowadays when using IO_APICs, the kernel obtains numbers from ACPI,
remaps them etc...

What saves x86 is that anything other than legacy ISA uses PCI nowadays
and thus that remapping is invisible to PCI drivers (as it is on
powerpc). The problem only bites with other bus types more common on
embedded hardware, as you mention further down.
Because of
this, the mapping from the numeric IRQ value to a real hardware
interrupt source is defined pretty clearly. The powerpc architecture
code has to support almost arbitrarily complex hardware, and the
embedded world is the source of most of the complexity. Because of
this, the powerpc code has to dynamically allocate those numeric
IRQ sources and tie them to a specific hardware interrupt. There
is functionality to take the information from your device tree and
convert it to a virtual IRQ. That happens automatically for some types
of devices like PCI cards, but your driver may have to do that mapping
itself in other cases. I believe the appropriate API for this is the
function irq_of_parse_and_map(). It takes a device node and index into
the interrupt list for that device and gives a virtual IRQ number.
Cheers,
Ben.
	Brad Boyer
	flar@allandria.com

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help