中断API之irq_set_irq_wake

本文详细解析了Linux内核中的irq_set_irq_wake函数,该函数用于控制中断是否可以唤醒睡眠状态的设备。文章深入分析了函数的实现原理,并通过具体的代码示例展示了函数的使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int irq_set_irq_wake(unsigned int irq, unsigned int on) 使中断能够冲睡眠状态唤醒,并改变当前的
的状态使其处于唤醒状态.
其使用的例程如下:
static int cw1200_sdio_pm(struct hwbus_priv *self, bool suspend)
{
	int ret = 0;

	if (self->pdata->irq)
		ret = irq_set_irq_wake(self->pdata->irq, suspend);
	return ret;
}
其源码分析如下:
int irq_set_irq_wake(unsigned int irq, unsigned int on)
{
	unsigned long flags;
	struct irq_desc *desc = irq_get_desc_buslock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
	int ret = 0;
	#中断描述符为null的话,直接退出
	if (!desc)
		return -EINVAL;

	/* wakeup-capable irqs can be shared between drivers that
	 * don't need to have the same sleep mode behaviors.
	 */
	 #假定这里的形参on为1
	if (on) {
		if (desc->wake_depth++ == 0) {
		#如果当前的中断深度为0.说明当前已经没有enable_irq和disable_irq的嵌套了。
		#这里调用chip函数来设置wake
			ret = set_irq_wake_real(irq, on);
			if (ret)
				desc->wake_depth = 0;
			else
			#在flag上或上IRQD_WAKEUP_STATE
				irqd_set(&desc->irq_data, IRQD_WAKEUP_STATE);
		}
	} else {
		if (desc->wake_depth == 0) {
			WARN(1, "Unbalanced IRQ %d wake disable\n", irq);
		} else if (--desc->wake_depth == 0) {
			ret = set_irq_wake_real(irq, on);
			if (ret)
				desc->wake_depth = 1;
			else
				irqd_clear(&desc->irq_data, IRQD_WAKEUP_STATE);
		}
	}
	irq_put_desc_busunlock(desc, flags);
	return ret;
}

static int set_irq_wake_real(unsigned int irq, unsigned int on)
{
	struct irq_desc *desc = irq_to_desc(irq);
	int ret = -ENXIO;
	#flag中如果包含IRQCHIP_SKIP_SET_WAKE,则说明要忽略wakeup,则直接退出
	if (irq_desc_get_chip(desc)->flags &  IRQCHIP_SKIP_SET_WAKE)
		return 0;
	#如果chip的irq_set_wake 不为null的话,则调用chip的irq_set_wake来设置wakeup
	if (desc->irq_data.chip->irq_set_wake)
		ret = desc->irq_data.chip->irq_set_wake(&desc->irq_data, on);

	return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值