* using IRQ1 in mpc5121ads
@ 2009-03-30 14:33 sylvain louchez
2009-03-30 16:42 ` Grant Likely
2009-03-31 23:10 ` David Gibson
0 siblings, 2 replies; 3+ messages in thread
From: sylvain louchez @ 2009-03-30 14:33 UTC (permalink / raw)
To: linuxppc-dev
[-- Attachment #1: Type: text/plain, Size: 1649 bytes --]
Hello, I'm a newbie looking for where the documentation and implementation
model can be found.
My custom driver is looking for an interrupt notification from the kernel -
and it registers in the /proc/interrupts file as expected when installed,
i.e.
$insmod custom_driver.ko gps_irq=<n>
**Note - this part's OK, I see the instance in /proc/interrupts after I load
it**
On the hardware side the actual signal is a 1 Hz pulse (from GPS) routed to
IRQ1 through the board's CPLD. This is the only interrupt on IRQ_1 so we can
keep the logic simple i.e. on IRQ1 we can just jump to the service routine
in a custom driver.
I understand 2 things have to be done:
1. create an entry in the dts file; I think we've got this understood
through advice already received - for example the new interrupt entry can be
created in the dts file - something like:
gps@0 { // there is no address so just make it 0
compatible = "gps_interrupt";
interrupts = <17 0x8>; // 17 is irq1, 8 is level low, see
include/linux/irq.h for others
interrupt-parent = < &ipic >;
};
2. but now we need to relate the actual interrupt to the virtual interrupt
called in the driver... by invoking the function irq_of_parse_and_map - but
we don't know how to do it - nor have we found how to do it in browsing
through the open source documentation
A secondary question: where to properly add this function call in the file
system?
Are we on the right track here? Is there sample/ tutorial code you could
point us to?
Thanks in advance for any pointers - documentation on these mechanisms,
sample code.
Sylvain Louchez
[-- Attachment #2: Type: text/html, Size: 6213 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: using IRQ1 in mpc5121ads
2009-03-30 14:33 using IRQ1 in mpc5121ads sylvain louchez
@ 2009-03-30 16:42 ` Grant Likely
2009-03-31 23:10 ` David Gibson
1 sibling, 0 replies; 3+ messages in thread
From: Grant Likely @ 2009-03-30 16:42 UTC (permalink / raw)
To: sylvain.louchez; +Cc: linuxppc-dev
On Mon, Mar 30, 2009 at 8:33 AM, sylvain louchez
<sylvain.louchez@gmail.com> wrote:
> Hello, I=92m a newbie looking for where the documentation and implementat=
ion
> model can be found=85
>
> My custom driver is looking for an interrupt notification from the kernel=
-
> and it registers in the /proc/interrupts file as expected when installed,
> i.e.
>
> $insmod custom_driver.ko gps_irq=3D<n>
You don't want to do this with PowerPC. There is no reliable way to
know what the IRQ number is at module load time. Note that the IRQ
numbers listed in /proc/interrupts are *not* the same as the hardware
interrupt number. /proc/interrupts on powerpc shows 'virtual IRQ'
numbers which are assigned dynamically as needed. This is so that the
kernel can handle multiple cascaded IRQ controllers, each with
different hardware IRQ numbering schemes.
> 1. create an entry in the dts file; I think we've got this understood
> through advice already received - for example the new interrupt entry can=
be
> created in the dts file - something like:
>
>
>
> gps@0 {=A0=A0=A0=A0=A0 // there is no address so just make it 0
There is no address so just make it "gps {", unless you have more than
one of them.
>
> =A0=A0=A0 compatible =3D "gps_interrupt";
Change this to: compatible =3D "<vendor>,<name-of-gps-device>";
Note that this node should describe the whole GPS device, not just IRQ
line for the GPS device. Is this device addressable in any way? Does
it have any memory mapped registers? SPI? I2C?
>
> =A0=A0=A0 interrupts =3D <17 0x8>;=A0=A0=A0=A0=A0=A0=A0=A0 // 17 is irq1,=
8 is level low, see
> include/linux/irq.h for others
>
> =A0=A0=A0 interrupt-parent =3D < &ipic >;
This looks correct
> 2. but now we need to relate the actual interrupt to the virtual interrup=
t
> called in the driver... by invoking the function irq_of_parse_and_map - b=
ut
> we don't know how to do it - nor have we found how to do it in browsing
> through the open source documentation
You need to write an of_platform_driver which will bind against the
'compatible' property in your GPS node.
> A secondary question: where to properly add this function call in the fil=
e
> system?
Use of_register_platform_driver() to register your of_platform_driver
in your module's init function.
> Are we on the right track here? Is there sample/ tutorial code you could
> point us to?
Search for of_register_platform_driver() in the kernel source.
g.
--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: using IRQ1 in mpc5121ads
2009-03-30 14:33 using IRQ1 in mpc5121ads sylvain louchez
2009-03-30 16:42 ` Grant Likely
@ 2009-03-31 23:10 ` David Gibson
1 sibling, 0 replies; 3+ messages in thread
From: David Gibson @ 2009-03-31 23:10 UTC (permalink / raw)
To: sylvain.louchez; +Cc: linuxppc-dev
On Mon, Mar 30, 2009 at 10:33:11AM -0400, sylvain louchez wrote:
> Hello, I'm a newbie looking for where the documentation and implementation
> model can be found.
>
>
>
> My custom driver is looking for an interrupt notification from the kernel -
> and it registers in the /proc/interrupts file as expected when installed,
> i.e.
>
> $insmod custom_driver.ko gps_irq=<n>
>
> **Note - this part's OK, I see the instance in /proc/interrupts after I load
> it**
>
>
>
> On the hardware side the actual signal is a 1 Hz pulse (from GPS) routed to
> IRQ1 through the board's CPLD. This is the only interrupt on IRQ_1 so we can
> keep the logic simple i.e. on IRQ1 we can just jump to the service routine
> in a custom driver.
>
>
>
> I understand 2 things have to be done:
>
>
>
> 1. create an entry in the dts file; I think we've got this understood
> through advice already received - for example the new interrupt entry can be
> created in the dts file - something like:
>
>
>
> gps@0 { // there is no address so just make it 0
>
> compatible = "gps_interrupt";
Sorry, this is not relevant to your actual question, but this is not a
good 'compatible' value. You should use the "vendor,model" convention
here.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-03-31 23:20 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-30 14:33 using IRQ1 in mpc5121ads sylvain louchez
2009-03-30 16:42 ` Grant Likely
2009-03-31 23:10 ` David Gibson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).