request_threaded_irq() is used in the driver why not request_irq()? What are the differences between two?

iSegFault picture iSegFault · Oct 7, 2011 · Viewed 20.2k times · Source

I posted this is the thread which discussed about request_threaded_irq but I did not get any reply. So I am posting it freshly.

I am working on a touchscreen driver for capacitive touchscree. It used request_threaded_irq() call instead of request_irq(). I could not understand the basic difference betweeen two. It says :-

Name

request_threaded_irq — allocate an interrupt line

Synopsis

int request_threaded_irq (unsigned int irq, irq_handler_t handler,irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id);

Arguments

  1. irq - Interrupt line to allocate
  2. handler - Function to be called when the IRQ occurs. Primary handler for threaded interrupts If NULL and thread_fn != NULL the default primary handler is installed
  3. thread_fn - Function called from the irq handler thread If NULL, no irq thread is created
  4. irqflags - Interrupt type flags
  5. devname - An ascii name for the claiming device
  6. dev_id - A cookie passed back to the handler function

the Handler and Thread_fn arguments are the ones which are confusing. Also there is no work function defined in the driver.

Here is the driver which I am refering to.

Can somebody help me in understanding this?

Answer

Alan H picture Alan H · Nov 18, 2011

The request_threaded_irq() function was added to allow developers to split interrupt handling code into two parts. One part that will execute with interrupts blocked, and a second part that can be done by a kernel thread without interrupts blocked. For details of why, you can read this:

http://lwn.net/Articles/302043/

In your case, the driver you linked to does this:

err = request_threaded_irq(client->irq, NULL, cy8ctmg110_irq_thread,
                           IRQF_TRIGGER_RISING, "touch_reset_key", ts);

By passing NULL for the second arg, "handler", the argument to thread_fn, or the function cy8ctmg110_irq_thread() will be called when the interrupt is detected.

For you, choosing which request irq function will depend on what your driver needs to do in interrupt context.