request_irq中的dev_id参数是什么?

5
在函数声明中。
int request_irq(unsigned int irq,
                irqreturn_t (*handler)(int, void *, struct pt_regs *),
                unsigned long irqflags,
                const char *devname,
                void *dev_id);
< p >“dev_id”是“输入参数”还是“输出参数”?我们从哪里获得这个数字?< /p >

我更新了我的答案,请查看详情。 - brokenfoot
1个回答

4

Dev_id是一个输入参数,必须全局唯一。通常情况下,设备数据结构的地址被用作Dev_id
如果中断线不共享,则其值为NULL。它仅在中断线被共享时才具有相关性。当它被共享时,此参数唯一标识共享 IRQ 上的interrupt handler

但是最近为了更快地处理中断,Linux 内核已经转向使用 request_threaded_irq

例如,在 Linux 内核中,i2c 驱动器用于 wm8903 音频编解码器,以下方式使用此 API - 使用 request_threaded_irq(),但使用 dev_id 是相同的。

设备结构如下:

117 struct wm8903_priv {
118         struct wm8903_platform_data *pdata;
119         struct device *dev;
120         struct snd_soc_codec *codec;
121         struct regmap *regmap;
122 
123         int sysclk;
124         int irq;
125 
126         int fs;
127         int deemph;
128 
129         int dcs_pending;
130         int dcs_cache[4];
131 
132         /* Reference count */
133         int class_w_users;
134 
135         struct snd_soc_jack *mic_jack;
136         int mic_det;
137         int mic_short;
138         int mic_last_report;
139         int mic_delay;
140 
141 #ifdef CONFIG_GPIOLIB
142         struct gpio_chip gpio_chip;
143 #endif
144 };

处理程序定义了一个指向该结构体的指针:
2029         struct wm8903_priv *wm8903; //this is the dev_id parameter

然后调用request_threaded_irq()函数,

 ret = request_threaded_irq(i2c->irq, NULL, wm8903_irq,
2156                                            trigger | IRQF_ONESHOT,
2157                                            "wm8903", wm8903);

lxr 代码



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接