request_irq not working.. what else should I do?
Chan Kim
ckim at etri.re.kr
Tue Apr 5 01:01:19 EDT 2022
I found request_irq(32+176, axpu_irq_handler, IRQF_SHARED, "axpu_irq",
&axpu_cdev); returned -22. (EINVALID).
And this is the sanity-check code of request_thread_irq function where
-EINVAL is returned.
Because I'm running my app/driver on ubuntu-20.04 (kernel 5.4.0-77) on a
virtual machine, I cannot debug the kernel code right now.
I suspect one of the "if (!desc)" case or "if
(!irq_settings_can_request(desc))" will be returning it -EINVAL.
Do I have to do something before I call request_irq? Can I use request_irq
in kernel module driver? (I think so).
/*
* Sanity-check: shared interrupts must pass in a real dev-ID,
* otherwise we'll have trouble later trying to figure out
* which interrupt is which (messes up the interrupt freeing
* logic etc).
*
* Also IRQF_COND_SUSPEND only makes sense for shared interrupts and
* it cannot be set along with IRQF_NO_SUSPEND.
*/
if (((irqflags & IRQF_SHARED) && !dev_id) ||
(!(irqflags & IRQF_SHARED) && (irqflags & IRQF_COND_SUSPEND)) ||
((irqflags & IRQF_NO_SUSPEND) && (irqflags & IRQF_COND_SUSPEND)))
return -EINVAL;
desc = irq_to_desc(irq);
if (!desc)
return -EINVAL;
if (!irq_settings_can_request(desc) ||
WARN_ON(irq_settings_is_per_cpu_devid(desc)))
return -EINVAL;
if (!handler) {
if (!thread_fn)
return -EINVAL;
handler = irq_default_primary_handler;
}
Thanks for reading.
Chan Kim
> -----Original Message-----
> From: Chan Kim <ckim at etri.re.kr>
> Sent: Monday, April 4, 2022 11:16 PM
> To: kernelnewbies at kernelnewbies.org
> Subject: request_irq not working.. what else should I do?
>
> Hello,
>
> When I register interrupt handler in arm64 machine, I use request_irq( )
> function defined below.
> (on ubuntu 20.04 on qemu arm64 virtual machine)
>
> static inline int __must_check
> request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
> const char *name, void *dev)
> {
> return request_threaded_irq(irq, handler, NULL, flags, name, dev); }
>
> I found even though I registered the handler for arm64 SPI (shared
> peripheral interrupt) 176, it is not generating interrupt in the qemu
> virtual machine. The OS should set the priority and enable it in the
> interrupt controller but it doesn't work. That's what OS is for, isn't it?
> But when I follow the qemu code, in the distributor stage, it says there
> is no pending interrupt.
> How can I set the interrupt priority using request_irq function above?
>
> Thank you!
> Chan Kim
More information about the Kernelnewbies
mailing list