NXP

4.5 ipu_request_irq函数详细分析

2019-07-12 13:52发布

ipu_request_irq函数 int ipu_request_irq(struct ipu_soc *ipu, uint32_t irq, irqreturn_t(*handler) (int, void *), uint32_t irq_flags, const char *devname, void *dev_id) { uint32_t reg; unsigned long lock_flags; int ret = 0; BUG_ON(irq >= IPU_IRQ_COUNT); /* 如果要申请的中断号大于 IPU_IRQ_COUNT的话,就会报错。 */ _ipu_get(ipu); spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags); if (ipu->irq_list[irq].handler != NULL) { dev_err(ipu->dev, "handler already installed on irq %d ", irq); ret = -EINVAL; goto out; } /* 如果这个irq中断号对应的数组中已经绑定了ISP的话,也会报错。 */ /* * Check sync interrupt handler only, since we do nothing for * error interrupts but than print out register values in the * error interrupt source handler. */ if (_ipu_is_sync_irq(irq) && (handler == NULL)) { dev_err(ipu->dev, "handler is NULL for sync irq %d ", irq); ret = -EINVAL; goto out; } ipu->irq_list[irq].handler = handler; ipu->irq_list[irq].flags = irq_flags; ipu->irq_list[irq].dev_id = dev_id; ipu->irq_list[irq].name = devname; /* 将函数传入的参数保存咋数组中irq这个下标所对应的元素中。 */ /* clear irq stat for previous use */ ipu_cm_write(ipu, IPUIRQ_2_MASK(irq), IPUIRQ_2_STATREG(ipu->devtype, irq)); /* 清空之前的状态。 */ /* enable the interrupt */ reg = ipu_cm_read(ipu, IPUIRQ_2_CTRLREG(irq)); reg |= IPUIRQ_2_MASK(irq); ipu_cm_write(ipu, reg, IPUIRQ_2_CTRLREG(irq)); /* 使能中断。 */ out: spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags); _ipu_put(ipu); return ret; } EXPORT_SYMBOL(ipu_request_irq);
这个函数被很多函数所调用,以ipu_device.cdo_task函数为例,这个do_task函数首先通过: irq= get_irq(t);来获取到中断号,然后通过: ret= ipu_request_irq(ipu, irq, task_irq_handler, 0, NULL, t);来将task_irq_handler这个中断服务程序InterruptService RoutinesISR)与irq中断号绑定。那么再看查看这个ipu_request_irq中都做了哪些工作 structipu_soc中,有一项structipu_irq_node irq_list[IPU_IRQ_COUNT]; struct ipu_irq_node { irqreturn_t(*handler) (int, void *); /*!< the ISR */ const char *name; /*!< device associated with the interrupt */ void *dev_id; /*!< some unique information for the ISR */ __u32 flags; /*!< not used */ }; 每一个中断号都在这个数组中对应一项,如果这个中断号没有被申请的话,这一项就会为空。通过这个ipu_request_irq函数来申请的时候,就会将数组中这一项根据函数传入的参数都填充进去。