1. arch/arm/plat-mxc/usb_wakeup.c
<span style="font-size:18px;">243 static struct platform_driver wakeup_d = {
244 .probe = wakeup_dev_probe,
245 .remove = wakeup_dev_exit,
246 .driver = {
247 .name = "usb-wakeup",
248 },
249 };
250
251 static int __init wakeup_dev_init(void)
252 {
253 return platform_driver_register(&wakeup_d);
254 }
</span>
注册了一个叫usb-wakeup的driver, 这个设备是在哪里被add到系统的呢?2. arch/arm/plat-mxc/devices/platform-fsl-usb2-wakeup.c
这个文件中有个函数
<span style="font-size:18px;"> 36 struct platform_device *__init imx_add_fsl_usb2_wakeup(
37 const struct imx_fsl_usb2_wakeup_data *data,
38 const struct fsl_usb2_wakeup_platform_data *pdata)
39 {
40 struct resource res[] = {
41 {
42 .start = data->irq_phy,
43 .end = data->irq_phy,
44 .flags = IORESOURCE_IRQ,
45 }, {
46 .start = data->irq_core,</span>
<span style="font-size:18px;"> 47<span style="white-space:pre"> </span>.end = data->irq_core,
48 .flags = IORESOURCE_IRQ,
49 },
50 };
51 return imx_add_platform_device_dmamask("usb-wakeup", data->id,
52 res, ARRAY_SIZE(res),
53 pdata, sizeof(*pdata), DMA_BIT_MASK(32));
54 }
</span>
在这个函数里面可以看到usb-wakeup这个设备被add了,问题是这个函数又在哪里被调用呢?
3. arch/arm/mach-mx6/devices-imx6q.h
找啊找,找到了这里
97 #define imx6sl_add_fsl_usb2_hs_wakeup(id, pdata) \
98 imx_add_fsl_usb2_wakeup(&imx6sl_fsl_hs_wakeup_data[id - 1], pdata)
99
现在变成了找imx6sl_add_fsl_usb2_hs_wakeup在哪里被调用了。4.arch/arm/mach-mx6/usb_h1.c
<span style="font-size:18px;">static int __init mx6_usb_h1_init(void)
421 {
......
465 if (cpu_is_mx6sl())
466 pdev_wakeup = imx6sl_add_fsl_usb2_hs_wakeup(1, &usbh1_wakeup_config);
467 else
468 pdev_wakeup = imx6q_add_fsl_usb2_hs_wakeup(1, &usbh1_wakeup_config);
469 platform_device_add(pdev);//其实这个pdev的name也是“usb-wakeup”,但是为什么pdev的platform_data是在下面赋值呢?为什么前面</span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">imx_add_platform_device_dmamask已经调用过platform_device_add,这里还要这样调用呢?</span><span style="font-size:18px;">
470 ((struct fsl_usb2_platform_data *)(pdev->dev.platform_data))->wakeup_pdata =
471 (struct fsl_usb2_wakeup_platform_data *)(pdev_wakeup->dev.platform_data);
472 return 0;
473 }
474 module_init(mx6_usb_h1_init);</span>
就这样在开机时被注册了。回到题目: 要找irq是从哪来了
先回到文件 arch/arm/plat-mxc/usb_wakeup.c看函数
static int wakeup_dev_probe(struct platform_device *pdev){
.....
205 ctrl->wakeup_irq = platform_get_irq(pdev, 1);//这里就是irq的由来
206 ctrl->usb_irq = platform_get_irq(pdev, 1);
207 ctrl->thread_close = false;
208 if (ctrl->wakeup_irq != ctrl->usb_irq)
209 interrupt_flag = IRQF_DISABLED;
210 else
211 interrupt_flag = IRQF_SHARED;
212 status = request_irq(ctrl->wakeup_irq, usb_wakeup_handler, interrupt_flag, "usb_wakeup", (void *)ctrl);
213 if (status)
214 goto error1;
215
....
}
platform_get_irq(pdev, 1);返回的其实是
<pre name="code" class="html">60 int platform_get_irq(struct platform_device *dev, unsigned int num)
61 {
62 struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num);
63
64 return r ? r->start : -ENXIO;
65 }
所以这个irq是在 imx_add_fsl_usb2_wakeup中被赋值的。
这个会从imx_fsl_usb2_wakeup_data里面找,这东西又在哪里被赋值呢?
在 arch/arm/mach-mx6/devices-imx6q.h中需要imx6q_fsl_hs_wakeup_data[id - 1],这个东西
会在arch/arm/mach-mx6/usb_h1.c文件的函数 mx6_usb_h1_init被赋值为struct imx_fsl_usb2_wakeup_data imx6q_fsl_hs_wakeup_data[] = {
imx_fsl_usb2_wakeup_data_entry_single(MX6Q, 1, HS1)};
最终会变成
arch/arm/mach-mx6/usb.h: .irq_phy = soc ## _INT_USB_PHY ## _id, \
arch/arm/plat-mxc/include/mach/mx6.h:#define MX6Q_INT_USB_PHY0 76