Advertisement
danielhilst

0001-Powerfailure-powerfailure-module-implemented.patch

Nov 13th, 2014
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 5.53 KB | None | 0 0
  1. From 862430cade964180c8087717537d87ff0bb9a804 Mon Sep 17 00:00:00 2001
  2. From: Daniel Hilst SellI <danielhilst@gmail.com>
  3. Date: Thu, 6 Nov 2014 15:20:10 -0200
  4. Subject: [PATCH] Powerfailure: powerfailure module implemented.
  5.  
  6. ---
  7. drivers/Kconfig                         |   2 +
  8.  drivers/csi/Makefile                    |   1 +
  9.  drivers/csi/powerfailure/Kconfig        |   8 +++
  10.  drivers/csi/powerfailure/Makefile       |   2 +
  11.  drivers/csi/powerfailure/powerfailure.c | 114 ++++++++++++++++++++++++++++++++
  12.  include/linux/powerfailure.h            |  12 ++++
  13.  6 files changed, 139 insertions(+)
  14.  create mode 100644 drivers/csi/powerfailure/Kconfig
  15.  create mode 100644 drivers/csi/powerfailure/Makefile
  16.  create mode 100644 drivers/csi/powerfailure/powerfailure.c
  17.  create mode 100644 include/linux/powerfailure.h
  18.  
  19. diff --git a/drivers/Kconfig b/drivers/Kconfig
  20. index bdc84f7..2a60123 100644
  21. --- a/drivers/Kconfig
  22. +++ b/drivers/Kconfig
  23. @@ -132,6 +132,8 @@ menu "CSI Drivers"
  24.  
  25.  source "drivers/csi/nrf24/Kconfig"
  26.  
  27. +source "drivers/csi/powerfailure/Kconfig"
  28. +
  29.  endmenu
  30.  
  31.  endmenu
  32. diff --git a/drivers/csi/Makefile b/drivers/csi/Makefile
  33. index 4c47723..22db5cd 100644
  34. --- a/drivers/csi/Makefile
  35. +++ b/drivers/csi/Makefile
  36. @@ -1 +1,2 @@
  37.  obj-y += nrf24/
  38. +obj-y += powerfailure/
  39. diff --git a/drivers/csi/powerfailure/Kconfig b/drivers/csi/powerfailure/Kconfig
  40. new file mode 100644
  41. index 0000000..a609efc
  42. --- /dev/null
  43. +++ b/drivers/csi/powerfailure/Kconfig
  44. @@ -0,0 +1,8 @@
  45. +config POWERFAILURE
  46. +       tristate "Build Power Failure module"
  47. +       depends on m
  48. +       help
  49. +         This builds the Power Failure module, named
  50. +         powerfailure.ko. The Power Failure module is in charge to
  51. +         detect that main power supply is out and brings a clean shutdown.
  52. +        
  53. \ No newline at end of file
  54. diff --git a/drivers/csi/powerfailure/Makefile b/drivers/csi/powerfailure/Makefile
  55. new file mode 100644
  56. index 0000000..58fb0ec
  57. --- /dev/null
  58. +++ b/drivers/csi/powerfailure/Makefile
  59. @@ -0,0 +1,2 @@
  60. +CFLAGS_powerfailure.o += -DDEBUG
  61. +obj-$(CONFIG_POWERFAILURE) += powerfailure.o
  62. diff --git a/drivers/csi/powerfailure/powerfailure.c b/drivers/csi/powerfailure/powerfailure.c
  63. new file mode 100644
  64. index 0000000..b0c0235
  65. --- /dev/null
  66. +++ b/drivers/csi/powerfailure/powerfailure.c
  67. @@ -0,0 +1,114 @@
  68. +#include <linux/module.h>
  69. +#include <linux/interrupt.h>
  70. +#include <linux/platform_device.h>
  71. +#include <linux/powerfailure.h>
  72. +#include <linux/gpio.h>
  73. +#include <linux/reboot.h>
  74. +
  75. +#define MODULE_NAME "powerfailure"
  76. +#define _DEBUG(fmt, msg...)                                             \
  77. +        do {                                                            \
  78. +                pr_debug("%s:%s@%d: "                                   \
  79. +                         fmt, MODULE_NAME, __func__, __LINE__, ##msg);  \
  80. +        } while (0);
  81. +
  82. +static int at_pfail_gpio;
  83. +
  84. +static void pf_power_off(void)
  85. +{
  86. +        printk(KERN_EMERG "powerfailure: POWER OFF");
  87. +        gpio_set_value(at_pfail_gpio, 1);
  88. +}
  89. +
  90. +static irqreturn_t pf_hard_irq(int irq, void *handle)
  91. +{
  92. +        _DEBUG("");
  93. +        return IRQ_WAKE_THREAD;
  94. +}
  95. +
  96. +static irqreturn_t pf_irq(int irq, void *handle)
  97. +{
  98. +        _DEBUG("");
  99. +
  100. +        orderly_poweroff(1);
  101. +        return IRQ_HANDLED;
  102. +}
  103. +
  104. +static int pf_probe(struct platform_device *dev)
  105. +{
  106. +        int error;
  107. +        int irq;
  108. +        struct pf_pdata_s *pdata = dev->dev.platform_data;
  109. +
  110. +        _DEBUG("");
  111. +
  112. +        if (!pdata) {
  113. +                dev_err(&dev->dev, "powerfailure driver probed without platform data, aborting");
  114. +                return -1;
  115. +        }
  116. +
  117. +        error = gpio_request(pdata->gpio_at_pfail, "powerfailure");
  118. +        if (error)
  119. +                return -1;
  120. +        gpio_direction_output(pdata->gpio_at_pfail, 0);
  121. +        at_pfail_gpio = pdata->gpio_at_pfail; /* save globally */
  122. +        
  123. +        irq = gpio_to_irq(pdata->gpio_pfail);
  124. +        error = request_threaded_irq(irq, pf_hard_irq, pf_irq, IRQF_TRIGGER_FALLING, "powerfailure irq", pdata);
  125. +        if (error) {
  126. +                dev_err(&dev->dev, "Can't register powerfailure IRQ");
  127. +                goto free_gpio;
  128. +        }
  129. +
  130. +        pm_power_off = pf_power_off;
  131. +
  132. +        return 0;
  133. +
  134. +free_gpio:
  135. +        gpio_free(pdata->gpio_at_pfail);
  136. +
  137. +        return 0;
  138. +}
  139. +
  140. +static int pf_remove(struct platform_device *dev)
  141. +{
  142. +        int irq;
  143. +        struct pf_pdata_s *pdata = dev->dev.platform_data;
  144. +
  145. +        BUG_ON(!pdata);
  146. +
  147. +        irq = gpio_to_irq(pdata->gpio_pfail);
  148. +        free_irq(irq, pdata);
  149. +        gpio_free(pdata->gpio_at_pfail);
  150. +
  151. +        return 0;
  152. +}
  153. +
  154. +struct platform_driver pf_driver = {
  155. +        .driver = {
  156. +                .name = "powerfailure",
  157. +                .owner = THIS_MODULE,
  158. +        },
  159. +        .probe = pf_probe,
  160. +        .remove = __devexit_p(pf_remove),
  161. +};
  162. +
  163. +static int __init pf_init(void)
  164. +{
  165. +        _DEBUG("");
  166. +        return platform_driver_register(&pf_driver);
  167. +}
  168. +
  169. +
  170. +static void __exit pf_exit(void)
  171. +{
  172. +        _DEBUG("");
  173. +
  174. +        platform_driver_unregister(&pf_driver);
  175. +}
  176. +
  177. +module_init(pf_init);
  178. +module_exit(pf_exit);
  179. +MODULE_AUTHOR("Daniel Hilst Selli <daniel.hilst@csi.ind.br>");
  180. +MODULE_LICENSE("GPL");
  181. +MODULE_DESCRIPTION("Power Failure module");
  182. diff --git a/include/linux/powerfailure.h b/include/linux/powerfailure.h
  183. new file mode 100644
  184. index 0000000..fd62f0b
  185. --- /dev/null
  186. +++ b/include/linux/powerfailure.h
  187. @@ -0,0 +1,12 @@
  188. +#ifndef POWERFAILURE_H
  189. +#define POWERFAILURE_H
  190. +
  191. +#define PWRF_GPIO_PFAIL    IMX_GPIO_NR(5, 17)
  192. +#define PWRF_GPIO_AT_PFAIL IMX_GPIO_NR(5, 12)
  193. +
  194. +struct pf_pdata_s {
  195. +        int gpio_pfail;
  196. +        int gpio_at_pfail;
  197. +};
  198. +
  199. +#endif
  200. --
  201. 2.1.2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement