最近在调试客户定制的PTT对讲耳机, 需要用到GPIO口中断功能识别一个pin来区别普通耳机和定制的耳机。
开机过程中出现死机,抓了一个开机log发现:
。。。。。。
[ 142.830740] mbhc_ptt_det_irq_enable: enter, is_ptt_irq_dsiabled:1
[ 142.830783] BUG: spinlock bad magic on CPU#6, kworker/6:2/1468
[ 142.835820] lock: 0xfffffffbeb47f9a0, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
[ 142.841550] Causing a watchdog bite!
。。。。。。
发现spinlock这里配置不当。
回到代码:
irq enable 函数里:
。。。
spin_lock_irqsave(&mbhc->irq_lock, irqflags);
if(mbhc->is_ptt_irq_dsiabled){
enable_irq(mbhc->ptt_irq);
mbhc->is_ptt_irq_dsiabled = false;
}
spin_unlock_irqrestore(&mbhc->irq_lock, irqflags);
。。。
使能中断之前使用了 spin_lock_irqsave:
#define spin_lock_irqsave(lock, flags) \
do {