下面以按键中断为例看看基于设备数的中断的用法:
设备树:
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");