4.5 ipu_request_irq函数详细分析

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\n", 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\n", 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函数来申请的时候,就会将数组中这一项根据函数传入的参数都填充进去。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值