Finding the interrupt vector of a given IRQ
anish kumar
anish198519851985 at gmail.com
Sat Oct 20 00:08:55 EDT 2012
On Fri, 2012-10-19 at 10:34 +0530, Arun KS wrote:
> Hi Anish,
>
> On Mon, May 28, 2012 at 9:16 AM, anish singh
> <anish198519851985 at gmail.com> wrote:
> On Mon, May 28, 2012 at 2:57 AM, richard -rw- weinberger
> <richard.weinberger at gmail.com> wrote:
> > On Sun, May 27, 2012 at 2:02 AM, Mark Farnell
> <mark.farnell at gmail.com> wrote:
> >> In the kernel, how can I find out the interrupt vector
> number of a
> >> given IRQ (for example, IRQ7)?
> >>
> >> Within the kernel module, I would like to manually set the
> IRQ using
> >> the assembly code:
> >>
> >> asm("int $<irq vector>");
> >>
> >> and let the IRQ handler installed by a different module
> catch that interrupt.
> >>
> >> Is this possible?
> >
> > No really because not all IRQ have an interrupt line to the
> CPU.
> > Linux can multiplex and emulate them. Think of GPIO drivers
> with
> > interrupt support.
>
> Can you please describe this in detail?It would really help a
> lot of
> people like me.Does multiplex mean that all numbers starting
> from
> 0,1,2,3,...... TOTAL-interrupt will have interrupt lines
> associated with it
> eventhough all interrupt numbers are not linear?
>
> GPIOs are grouped as banks. Let’s say 32 gpios are in a bank.
> There will be only single interrupt line to interrupt controller for a
> bank.
>
>
> Consider that you have configured gpio1 and gpio16 as interrupts.
> Even if interrupt happens on gpio 1 or gpio 16, the same interrupt
> line will be triggered to
>
> Interrupt controller.
>
>
> Now the gpio driver has to figure out reading the Interrupt status
>
> Register of GPIO to find which interrupt (gpio1 or gpio16) has really
> fired.
And this is done by this way:
Suppose we have a chip(mfd-multi-funcion-driver) driver which is
connected to processor using a gpio - this gpio line acts as interrupt
line from the processor
++++++++++++ ++++++++++
+ Processor+ + Chip +---->USB interrupt handler
+ +gpio--------->+ MFD +---->dock interrupt handler
++++++++++++ + +---->UART interrupt handler
++++++++++---->Factory cable interrupt handler
So the code will be as follows:
handler_function()
{
/* find out which interrupt is triggered */
/* it can be usb,dock,uart or factory cable */
ret_irq = read_mfd_register();
/*
* ok we found out the interrupt line, get a corresponding
* software linux irq number by calling
* irq_domain_add_linear
* irq_create_mapping
* you would have made this calls in the probe probably
*/
handle_nested_irq(ret_irq);
}
handle_nested_irq inturn will call all the irq_handlers in the system
for your UART,usb and dock driver.
mfd_driver()
{
request_irq(gpio_to_irq(gpio), handler_function);
}
Hope I have not missed anything.
>
> So in this case a single interrupt line is multiplex for 32 gpio
> interrupts.
>
>
> HTH.
>
> Thanks,
> Arun
>
> > Anyway, why to you think you need to trigger the raw IRQ
> manually?
> > This sounds really odd...
> >
> >
> > --
> > Thanks,
> > //richard
> >
> > _______________________________________________
> > Kernelnewbies mailing list
> > Kernelnewbies at kernelnewbies.org
> >
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>
>
More information about the Kernelnewbies
mailing list