bn_osl.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:7k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: bn_osl.c
  4.  *   $Revision: 16 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 Andrew Grover
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include <linux/kernel.h>
  25. #include <linux/module.h>
  26. #include <linux/init.h>
  27. #include <linux/types.h>
  28. #include <linux/proc_fs.h>
  29. #include <acpi.h>
  30. #include "bn.h"
  31. MODULE_AUTHOR("Andrew Grover");
  32. MODULE_DESCRIPTION("ACPI Component Architecture (CA) - Button Driver");
  33. MODULE_LICENSE("GPL");
  34. #define BN_PROC_ROOT "button"
  35. #define BN_PROC_POWER_BUTTON "power"
  36. #define BN_PROC_SLEEP_BUTTON "sleep"
  37. #define BN_PROC_LID_SWITCH "lid"
  38. extern struct proc_dir_entry *bm_proc_root;
  39. static struct proc_dir_entry *bn_proc_root = NULL;
  40. #define BN_TYPE_UNKNOWN 0
  41. #define BN_TYPE_FIXED 1
  42. #define BN_TYPE_GENERIC 2
  43. static int bn_power_button = BN_TYPE_UNKNOWN;
  44. static int bn_sleep_button = BN_TYPE_UNKNOWN;
  45. static int bn_lid_switch = BN_TYPE_UNKNOWN;
  46. /****************************************************************************
  47.  *
  48.  * FUNCTION: bn_osl_add_device
  49.  *
  50.  ****************************************************************************/
  51. acpi_status
  52. bn_osl_add_device(
  53. BN_CONTEXT *button)
  54. {
  55. acpi_status status = AE_OK;
  56. if (!button) {
  57. return(AE_BAD_PARAMETER);
  58. }
  59. switch (button->type) {
  60. case BN_TYPE_POWER_BUTTON_FIXED:
  61. bn_power_button = BN_TYPE_FIXED;
  62. printk(KERN_INFO "ACPI: Power Button (FF) foundn");
  63. if (!proc_mkdir(BN_PROC_POWER_BUTTON, bn_proc_root)) {
  64. status = AE_ERROR;
  65. }
  66. break;
  67. case BN_TYPE_POWER_BUTTON:
  68. /* 
  69.  * Avoid creating multiple /proc entries when (buggy) ACPI
  70.  * BIOS tables erroneously list both fixed- and generic-
  71.  * feature buttons.  Note that fixed-feature buttons are 
  72.  * always enumerated first (and there can only be one) so
  73.  * we only need to check here.
  74.  */
  75. switch (bn_power_button) {
  76. case BN_TYPE_GENERIC:
  77. printk(KERN_WARNING "ACPI: Multiple generic-space power buttons detected, using firstn");
  78. break;
  79. case BN_TYPE_FIXED:
  80. printk(KERN_WARNING "ACPI: Multiple power buttons detected, ignoring fixed-featuren");
  81. default:
  82. printk(KERN_INFO "ACPI: Power Button (CM) foundn");
  83. bn_power_button = BN_TYPE_GENERIC;
  84. if (!proc_mkdir(BN_PROC_POWER_BUTTON, bn_proc_root)) {
  85. status = AE_ERROR;
  86. }
  87. break;
  88. }
  89. break;
  90. case BN_TYPE_SLEEP_BUTTON_FIXED:
  91. bn_sleep_button = BN_TYPE_FIXED;
  92. printk(KERN_INFO "ACPI: Sleep Button (FF) foundn");
  93. if (!proc_mkdir(BN_PROC_SLEEP_BUTTON, bn_proc_root)) {
  94. status = AE_ERROR;
  95. }
  96. break;
  97. case BN_TYPE_SLEEP_BUTTON:
  98. /* 
  99.  * Avoid creating multiple /proc entries when (buggy) ACPI
  100.  * BIOS tables erroneously list both fixed- and generic-
  101.  * feature buttons.  Note that fixed-feature buttons are 
  102.  * always enumerated first (and there can only be one) so
  103.  * we only need to check here.
  104.  */
  105. switch (bn_sleep_button) {
  106. case BN_TYPE_GENERIC:
  107. printk(KERN_WARNING "ACPI: Multiple generic-space sleep buttons detected, using firstn");
  108. break;
  109. case BN_TYPE_FIXED:
  110. printk(KERN_WARNING "ACPI: Multiple sleep buttons detected, ignoring fixed-featuren");
  111. default:
  112. bn_sleep_button = BN_TYPE_GENERIC;
  113. printk(KERN_INFO "ACPI: Sleep Button (CM) foundn");
  114. if (!proc_mkdir(BN_PROC_SLEEP_BUTTON, bn_proc_root)) {
  115. status = AE_ERROR;
  116. }
  117. break;
  118. }
  119. break;
  120. case BN_TYPE_LID_SWITCH:
  121. if (bn_lid_switch) {
  122. printk(KERN_WARNING "ACPI: Multiple generic-space lid switches detected, using firstn");
  123. break;
  124. }
  125. bn_lid_switch = BN_TYPE_GENERIC;
  126. printk(KERN_INFO "ACPI: Lid Switch (CM) foundn");
  127. if (!proc_mkdir(BN_PROC_LID_SWITCH, bn_proc_root)) {
  128. status = AE_ERROR;
  129. }
  130. break;
  131. }
  132. return(status);
  133. }
  134. /****************************************************************************
  135.  *
  136.  * FUNCTION: bn_osl_remove_device
  137.  *
  138.  ****************************************************************************/
  139. acpi_status
  140. bn_osl_remove_device (
  141. BN_CONTEXT *button)
  142. {
  143. if (!button) {
  144. return(AE_BAD_PARAMETER);
  145. }
  146. switch (button->type) {
  147. case BN_TYPE_POWER_BUTTON:
  148. case BN_TYPE_POWER_BUTTON_FIXED:
  149. remove_proc_entry(BN_PROC_POWER_BUTTON, bn_proc_root);
  150. break;
  151. case BN_TYPE_SLEEP_BUTTON:
  152. case BN_TYPE_SLEEP_BUTTON_FIXED:
  153. remove_proc_entry(BN_PROC_SLEEP_BUTTON, bn_proc_root);
  154. break;
  155. case BN_TYPE_LID_SWITCH:
  156. remove_proc_entry(BN_PROC_LID_SWITCH, bn_proc_root);
  157. break;
  158. }
  159. return(AE_OK);
  160. }
  161. /****************************************************************************
  162.  *
  163.  * FUNCTION: bn_osl_generate_event
  164.  *
  165.  ****************************************************************************/
  166. acpi_status
  167. bn_osl_generate_event (
  168. u32 event,
  169. BN_CONTEXT *button)
  170. {
  171. acpi_status status = AE_OK;
  172. if (!button) {
  173. return(AE_BAD_PARAMETER);
  174. }
  175. switch (event) {
  176. case BN_NOTIFY_STATUS_CHANGE:
  177. switch(button->type) {
  178. case BN_TYPE_POWER_BUTTON:
  179. case BN_TYPE_POWER_BUTTON_FIXED:
  180. status = bm_osl_generate_event(button->device_handle,
  181. BN_PROC_ROOT, BN_PROC_POWER_BUTTON, event, 0);
  182. break;
  183. case BN_TYPE_SLEEP_BUTTON:
  184. case BN_TYPE_SLEEP_BUTTON_FIXED:
  185. status = bm_osl_generate_event(button->device_handle,
  186. BN_PROC_ROOT, BN_PROC_SLEEP_BUTTON, event, 0);
  187. break;
  188. case BN_TYPE_LID_SWITCH:
  189. status = bm_osl_generate_event(button->device_handle,
  190. BN_PROC_ROOT, BN_PROC_LID_SWITCH, event, 0);
  191. break;
  192. default:
  193. status = AE_SUPPORT;
  194. break;
  195. }
  196. break;
  197. default:
  198. return(AE_BAD_PARAMETER);
  199. break;
  200. }
  201. return(status);
  202. }
  203. /****************************************************************************
  204.  *
  205.  * FUNCTION:    bn_osl_init
  206.  *
  207.  * PARAMETERS: <none>
  208.  *
  209.  * RETURN: 0: Success
  210.  *
  211.  * DESCRIPTION: Module initialization.
  212.  *
  213.  ****************************************************************************/
  214. static int __init
  215. bn_osl_init (void)
  216. {
  217. acpi_status status = AE_OK;
  218. /* abort if no busmgr */
  219. if (!bm_proc_root)
  220. return -ENODEV;
  221. bn_proc_root = proc_mkdir(BN_PROC_ROOT, bm_proc_root);
  222. if (!bn_proc_root) {
  223. status = AE_ERROR;
  224. }
  225. else {
  226. status = bn_initialize();
  227. if (ACPI_FAILURE(status)) {
  228. remove_proc_entry(BN_PROC_ROOT, bm_proc_root);
  229. }
  230. }
  231. return (ACPI_SUCCESS(status)) ? 0 : -ENODEV;
  232. }
  233. /****************************************************************************
  234.  *
  235.  * FUNCTION:    bn_osl_cleanup
  236.  *
  237.  * PARAMETERS: <none>
  238.  *
  239.  * RETURN: <none>
  240.  *
  241.  * DESCRIPTION: Module cleanup.
  242.  *
  243.  ****************************************************************************/
  244. static void __exit
  245. bn_osl_cleanup (void)
  246. {
  247. bn_terminate();
  248. if (bn_proc_root) {
  249. remove_proc_entry(BN_PROC_ROOT, bm_proc_root);
  250. }
  251. return;
  252. }
  253. module_init(bn_osl_init);
  254. module_exit(bn_osl_cleanup);