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.c中do_task函数为例,这个do_task函数首先通过:
irq= get_irq(t);来获取到中断号,然后通过:
ret=
ipu_request_irq(ipu, irq, task_irq_handler, 0, NULL, t);来将task_irq_handler这个中断服务程序(InterruptService
Routines,ISR)与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函数来申请的时候,就会将数组中这一项根据函数传入的参数都填充进去。