下面以按键中断为例看看基于设备数的中断的用法:

设备树:

    tq2440_key {
        compatible = "tq2440,key";
        interrupt-parent = <&gpf>;
        interrupts = <0 IRQ_TYPE_EDGE_FALLING>, <1 IRQ_TYPE_EDGE_FALLING>;
        key_3 = <&gpf 2 GPIO_ACTIVE_HIGH>;
        key_4 = <&gpf 4 GPIO_ACTIVE_HIGH>;
        key_8 = <&gpg 0 GPIO_ACTIVE_HIGH>;
    };

驱动:

 1 #include <linux/init.h>
 2 #include <linux/module.h>
 3 #include <linux/platform_device.h>
 4 #include <linux/gpio.h>
 5 #include <linux/of.h>
 6 #include <linux/of_gpio.h>
 7 #include <linux/interrupt.h>
 8 
 9 static irqreturn_t tq2440_key_isr(int irq, void *dev_id)
10 {
11     printk("%s enter, irq: %d, %s\n", __func__, irq, (char *)dev_id);
12     return IRQ_HANDLED;
13 }
14 
15 static int tq2440_key_probe(struct platform_device *pdev) {
16     struct device *dev = &pdev->dev;
17     int irq_gpio = -1;
18     int irq = -1;
19 
20     printk("%s enter.\n", __func__);
21 
22     if (!dev->of_node) {
23         dev_err(dev, "no platform data.\n");
24         return -EINVAL;
25     }
26 
27     irq = platform_get_irq(pdev, 0);
28     printk("%s: get irq %d\n", __func__, irq);
29     devm_request_any_context_irq(dev, irq,
30         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-1", "key-1");
31 
32     irq = platform_get_irq(pdev, 1);
33     printk("%s: get irq %d\n", __func__, irq);
34     devm_request_any_context_irq(dev, irq,
35         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-2", "key-2");
36 
37     irq_gpio = of_get_named_gpio(dev->of_node, "key_3", 0);
38     irq = gpio_to_irq(irq_gpio);
39     printk("%s: gpio: %d ---> irq (%d)\n", __func__, irq_gpio, irq);
40     devm_request_any_context_irq(dev, irq,
41         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-3", "key-3");
42 
43     irq_gpio = of_get_named_gpio(dev->of_node, "key_4", 0);
44     irq = gpio_to_irq(irq_gpio);
45     printk("%s: gpio: %d ---> irq (%d)\n", __func__, irq_gpio, irq);
46     devm_request_any_context_irq(dev, irq,
47         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-4", "key-4");
48 
49     irq_gpio = of_get_named_gpio(dev->of_node, "key_8", 0);
50     irq = gpio_to_irq(irq_gpio);
51     printk("%s: gpio: %d ---> irq (%d)\n", __func__, irq_gpio, irq);
52     devm_request_any_context_irq(dev, irq,
53         tq2440_key_isr, IRQF_TRIGGER_FALLING, "key-8", "key-8");
54 
55     return 0;
56 }
57 
58 static int tq2440_key_remove(struct platform_device *pdev) {
59 
60     printk("%s enter.\n", __func__);
61 
62     return 0;
63 }
64 
65 static const struct of_device_id tq2440_key_dt_ids[] = {
66     { .compatible = "tq2440,key", },
67     {},
68 };
69 
70 MODULE_DEVICE_TABLE(of, tq2440_key_dt_ids);
71 
72 static struct platform_driver tq2440_key_driver = {
73     .driver        = {
74         .name    = "tq2440_key",
75         .of_match_table    = of_match_ptr(tq2440_key_dt_ids),
76     },
77     .probe        = tq2440_key_probe,
78     .remove        = tq2440_key_remove,
79 };
80 
81 static int __init tq2440_key_init(void)
82 {
83     int ret;
84 
85     ret = platform_driver_register(&tq2440_key_driver);
86     if (ret)
87         printk(KERN_ERR "tq2440_key: probe failed: %d\n", ret);
88 
89     return ret;
90 }
91 module_init(tq2440_key_init);
92 
93 static void __exit tq2440_key_exit(void)
94 {
95     platform_driver_unregister(&tq2440_key_driver);
96 }
97 module_exit(tq2440_key_exit);
98 
99 MODULE_LICENSE("GPL");
View Code

相关文章: