[DESCRIPTION]
在调试触摸屏驱动的过程中,发现调用 devm_request_threaded_irq() 函数申请中断返回 -22:
ret = devm_request_threaded_irq(ts->dev, ts->irq_num,
ts_isr_top_half,
ts_isr_bottom_half,
type | IRQF_ONESHOT, "ts", NULL);
if (ret != 0) {
TS_ERR("Failed to request irq, irq = %d, ret = %d\n", ts->irq_num, ret);
}
而错误码 22 代表的意思是:EINVAL(无效的参数)
include/uapi/asm-generic/errno-base.h:
#define EINVAL 22 /* Invalid argument */
[SOLUTION]
(1)调用 devm_request_threaded_irq() 函数传递的 ts->irq_num 参数不是有效的中断号:
ret = devm_request_threaded_irq(ts->dev, ts->irq_num,
ts_isr_top_half,
ts_isr_bottom_half,
type | IRQF_ONESHOT, "ts", NULL);
(2)调用 irq_of_parse_and_map() 获取中断号失败:
node = of_find_matching_node(NULL, touch_of_match);
if (node) {
ts->irq_num = irq_of_parse_and_map(node, 0);
}
(3)项目 dts 文件的 touch 节点没有配置 interrupt;
(4)在项目 dts 文件的 touch 节点添加 interrupt-parent 和 interrupts 属性:
&touch {
... // 省略部分属性
interrupt-parent = <&pio>;
interrupts = <120 IRQ_TYPE_EDGE_FALLING>;
status = "okay";
};
最后调用 devm_request_threaded_irq() 申请中断成功。