linux驱动Interrupt子系统

irq_domain_add_linear为什么要加载gpio_key_drv.ko才会分配irq_desc;此外内核启动就会解析设备树,虚拟中断控制中的virtual_intc_domain在加载virtual_int_controller.ko才注册,解析设备树的时候virtual_intc_domain的xlate函数自然就没机会调用是吗?irq_domain_add_legacy最终会调用irq_domain_associate再调用virtual_intc_domain_ops的map函数;irq_domain_add_linear看源码没找到irq_domain_associate的调用,是不是irq_desc再linear下是request_irq的时候才分配的?是我看request_irq源码没找到调用过程

第1个问题:对于linear方式,irq_desc是用到再分配

1 Like

是的,在一个系统里,我可以通过设备树表示:我有A设备、B设备,
但是如果没有对应的驱动的话,你怎么使用A设备、B设备呢?
你的问题存在逻辑错误:

  1. 你知道没有加载驱动,还知道virtual_intc_domain的xlate函数,在这个ko文件里
  2. 然后你提问:没有加载ko之前,xlate函数没机会调用? 当然没机会调用了
1 Like
  1. irq_domain_associate函数的第1个参数就是domain,irq_domain_associate被调用时domain就已经被创建了
  2. domain何时被创建呢?在virtual_intc_probe里被创建了
  3. irq_domain_associate是在这个domain里记录virq、hwirq的关系,对于linear的中断,在platform_get_irq函数里得到virq,所以:在platform_get_irq里调用irq_domain_associate
1 Like

谢谢韦老师,我看了platform_get_irq的函数调用过程,困扰我半个月的问题解决了。