critical section 中断唤醒系统流程(5)

电脑杂谈  发布时间:2018-02-14 08:19:48  来源:网络整理

* one, we could have masked the irq.

* Renable it, if it was not disabled in meantime.

*/

if (unlikely(desc->istate & IRQS_PENDING)) {

if (!irqd_irq_disabled(&desc->irq_data) &&

irqd_irq_masked(&desc->irq_data))

unmask_irq(desc);

}

handle_irq_event(desc);

} while ((desc->istate & IRQS_PENDING) &&

!irqd_irq_disabled(&desc->irq_data));

out_unlock:

raw_spin_unlock(&desc->lock);

}

1)irq_may_run()判断irq是否有IRQD_WAKEUP_ARMED标志位,当然这里是有的。随后调用irq_pm_check_wakeup()清楚IRQD_WAKEUP_ARMED flag顺便置位IRQS_SUSPENDED和IRQS_PENDING flag,又irq_disable关闭了中断。

2)irq_may_run()返回false,因此这里直接返回了,所以你注册的中断handle并没有执行。你绝望,也没办法。当然这里也可以知道,唤醒系统的这次中断注册的handle的执行环境不是硬件中断上下文。

2.6. dpm_resume_noirq()

我们来继续分析2.3节resume的后续流程,把图继续搬过来。

技术分享图片

1)继续enable所有的noboot cpu之后,开始dpm_resume_noirq()。critical section这里为什么起名noirq呢?中断已经可以响应了,我猜测是这样的:虽然可以响应中断,但是也是仅限于suspend之前的enable_irq_wake的irq,因为其他irq已经被disable。并且具有唤醒功能的irq也仅仅是进入中断后设置一些flag就立即退出了,没有执行irq handle,因此相当于noirq。

2)dpm_noirq_resume_devices()会调用"noirq" resume callbacks,这个就是struct dev_pm_ops结构体的resume_noirq成员。那么什么的设备驱动需要填充resume_noirq成员呢?我们考虑一个事情,到现在为止唤醒系统的irq的handle还没有执行,如果注册的中断handle是通过spi、i2c等方式通信,那么在即将执行之前,我们是不是应该首先resume spi、i2c等设备呢!所以说,很多设备依赖的设备,尽量填充resume_noirq成员,这样才比较合理。毕竟唤醒的设备是要使用的嘛!而gpio驱动就适合syscore resume,因为这里i2c设备肯定依赖gpio设备。大家可以看看自己平台的i2c、spi等设备驱动是不是都实现resume_noirq成员。当然了,前提是这个设备需要resume操作,如果不需要resume就可以使用,那么完全没有必要resume_noirq。所以,写driver也是要考虑很多问题的,driver应该实现哪些dev_pm_ops的回调函数?

3)resume_device_irqs中会根帮我们把已经enable_irq_wake的设备进行disable_irq_wake,但是前提是driver中通过2.2节中途径1的方式。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-77055-5.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 任冠弛
      任冠弛

      自己活着

    • 隋文帝
      隋文帝

      为什么韩国出专辑一定要把头发弄的五颜六色

    热点图片
    拼命载入中...