1. 程式人生 > >在系統中增加一個可喚醒中斷--同時說明platform_device &platform_driver

在系統中增加一個可喚醒中斷--同時說明platform_device &platform_driver

kernel\arch\arm\mach-exynos\setup-mu609.c

  1. #include <linux/kernel.h>
  2. #include <linux/init.h>
  3. #include <linux/platform_device.h>
  4. #include <linux/delay.h>
  5. #include <linux/err.h>
  6. #include <linux/skbuff.h>
  7. #include <plat/devs.h>
  8. #include <plat/sdhci.h>
  9. #include <plat/gpio-cfg.h>
  10. #include <mach/regs-gpio.h>
  11. #include <mach/gpio.h>
  12. #include <linux/irq.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/module.h>
  15. static irqreturn_t host_wake_isr(int irq, void *dev)  
  16. {  
  17.     /* 
  18.        do something when interrupt happen 
  19.     */
  20.     return IRQ_HANDLED;  
  21. }  
  22. static
    int mu609_probe(struct platform_device *pdev)  
  23. {  
  24.     int irq;  
  25.     int ret;  
  26.     printk("%s: start\n", __FUNCTION__);  
  27.     s3c_gpio_cfgpin(EXYNOS5410_GPX3(1), S3C_GPIO_INPUT); //stone++ for mu609
  28.     s3c_gpio_setpull(EXYNOS5410_GPX3(1), S3C_GPIO_PULL_UP); //stone++ for mu609
  29.     irq = IRQ_EINT(25);  
  30.     ret = request_irq(irq, host_wake_isr, IRQF_TRIGGER_FALLING,  
  31.         "3g mu609_wake", NULL);  
  32.     if (ret) {  
  33.         pr_err("[3G] Request_host wake irq failed.\n");  
  34.         return ret;  
  35.     }  
  36.     ret = irq_set_irq_wake(irq, 1);  
  37.     if (ret) {  
  38.         pr_err("[3G] Set_irq_wake failed.\n");  
  39.         return ret;  
  40.     }  
  41.     return ret;  
  42. }  
  43. staticint mu609_remove(struct platform_device *pdev)  
  44. {  
  45.     return 0;  
  46. }  
  47. staticstruct platform_driver mu609_driver = {  
  48.     .probe = mu609_probe,  
  49.     .remove = mu609_remove,  
  50.     .driver = {  
  51.            .name = "mu609_3g",  
  52.            .owner = THIS_MODULE,  
  53.            },  
  54. };  
  55. staticstruct platform_device mu609_device = {  
  56.     .name   = "mu609_3g",  
  57.     .id     = -1,  
  58. };  
  59. staticint __init mu609_init(void)  
  60. {  
  61.     int ret;  
  62.     ret = platform_driver_register(&mu609_driver);  
  63.     if(!ret){  
  64.         ret =  platform_device_register(&mu609_device);  
  65.         if (ret)  
  66.             platform_driver_unregister(&mu609_driver);  
  67.     }  
  68.     return ret;  
  69. }  
  70. late_initcall(mu609_init);  

kernel\arch\arm\mach-exynos\Makefile

  1. obj-$(CONFIG_EXYNOS_DEV_MU609)  += setup-mu609.o  


kernel\arch\arm\mach-exynos\Kconfig

  1. config EXYNOS_DEV_MU609  
  2.     bool "3G module MU609"  
  3.     default y  
  4.     help  
  5.       HuaWei mu609.