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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  *
  3.  * Module Name: ac_osl.c
  4.  *   $Revision: 10 $
  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 "ac.h"
  31. MODULE_AUTHOR("Andrew Grover");
  32. MODULE_DESCRIPTION("ACPI Component Architecture (CA) - AC Adapter Driver");
  33. MODULE_LICENSE("GPL");
  34. #define AC_PROC_ROOT "ac_adapter"
  35. #define AC_PROC_STATUS "status"
  36. #define AC_ON_LINE "on-line"
  37. #define AC_OFF_LINE "off-line"
  38. extern struct proc_dir_entry *bm_proc_root;
  39. static struct proc_dir_entry *ac_proc_root = NULL;
  40. /****************************************************************************
  41.  *
  42.  * FUNCTION: ac_osl_proc_read_status
  43.  *
  44.  ****************************************************************************/
  45. static int
  46. ac_osl_proc_read_status (
  47. char *page,
  48. char **start,
  49. off_t off,
  50. int  count,
  51. int  *eof,
  52. void *context)
  53. {
  54. acpi_status  status = AE_OK;
  55. AC_CONTEXT *ac_adapter = NULL;
  56. char *p = page;
  57. int len;
  58. if (!context) {
  59. goto end;
  60. }
  61. ac_adapter = (AC_CONTEXT*)context;
  62. /* don't get status more than once for a single proc read */
  63. if (off != 0) {
  64. goto end;
  65. }
  66. status = bm_evaluate_simple_integer(ac_adapter->acpi_handle,
  67. "_PSR", &(ac_adapter->is_online));
  68. if (ACPI_FAILURE(status)) {
  69. p += sprintf(p, "Error reading AC Adapter statusn");
  70. goto end;
  71. }
  72. if (ac_adapter->is_online) {
  73. p += sprintf(p, "Status:                  %sn",
  74. AC_ON_LINE);
  75. }
  76. else {
  77. p += sprintf(p, "Status:                  %sn",
  78. AC_OFF_LINE);
  79. }
  80. end:
  81. len = (p - page);
  82. if (len <= off+count) *eof = 1;
  83. *start = page + off;
  84. len -= off;
  85. if (len>count) len = count;
  86. if (len<0) len = 0;
  87. return(len);
  88. }
  89. /****************************************************************************
  90.  *
  91.  * FUNCTION: ac_osl_add_device
  92.  *
  93.  ****************************************************************************/
  94. acpi_status
  95. ac_osl_add_device(
  96. AC_CONTEXT *ac_adapter)
  97. {
  98. struct proc_dir_entry *proc_entry = NULL;
  99. if (!ac_adapter) {
  100. return(AE_BAD_PARAMETER);
  101. }
  102. printk(KERN_INFO "ACPI: AC Adapter foundn");
  103. proc_entry = proc_mkdir(ac_adapter->uid, ac_proc_root);
  104. if (!proc_entry) {
  105. return(AE_ERROR);
  106. }
  107. create_proc_read_entry(AC_PROC_STATUS, S_IFREG | S_IRUGO,
  108. proc_entry, ac_osl_proc_read_status, (void*)ac_adapter);
  109. return(AE_OK);
  110. }
  111. /****************************************************************************
  112.  *
  113.  * FUNCTION: ac_osl_remove_device
  114.  *
  115.  ****************************************************************************/
  116. acpi_status
  117. ac_osl_remove_device (
  118. AC_CONTEXT *ac_adapter)
  119. {
  120. char proc_entry[64];
  121. if (!ac_adapter) {
  122. return(AE_BAD_PARAMETER);
  123. }
  124. sprintf(proc_entry, "%s/%s", ac_adapter->uid, AC_PROC_STATUS);
  125. remove_proc_entry(proc_entry, ac_proc_root);
  126. sprintf(proc_entry, "%s", ac_adapter->uid);
  127. remove_proc_entry(proc_entry, ac_proc_root);
  128. return(AE_OK);
  129. }
  130. /****************************************************************************
  131.  *
  132.  * FUNCTION: ac_osl_generate_event
  133.  *
  134.  ****************************************************************************/
  135. acpi_status
  136. ac_osl_generate_event (
  137. u32 event,
  138. AC_CONTEXT *ac_adapter)
  139. {
  140. acpi_status status = AE_OK;
  141. if (!ac_adapter) {
  142. return(AE_BAD_PARAMETER);
  143. }
  144. switch (event) {
  145. case AC_NOTIFY_STATUS_CHANGE:
  146. status = bm_osl_generate_event(ac_adapter->device_handle,
  147. AC_PROC_ROOT, ac_adapter->uid, event, 0);
  148. break;
  149. default:
  150. return(AE_BAD_PARAMETER);
  151. break;
  152. }
  153. return(status);
  154. }
  155. /****************************************************************************
  156.  *
  157.  * FUNCTION: ac_osl_init
  158.  *
  159.  * PARAMETERS: <none>
  160.  *
  161.  * RETURN: 0: Success
  162.  *
  163.  * DESCRIPTION: Module initialization.
  164.  *
  165.  ****************************************************************************/
  166. static int __init
  167. ac_osl_init (void)
  168. {
  169. acpi_status status = AE_OK;
  170. ac_proc_root = proc_mkdir(AC_PROC_ROOT, bm_proc_root);
  171. if (!ac_proc_root) {
  172. status = AE_ERROR;
  173. }
  174. else {
  175. status = ac_initialize();
  176. if (ACPI_FAILURE(status)) {
  177. remove_proc_entry(AC_PROC_ROOT, bm_proc_root);
  178. }
  179. }
  180. return (ACPI_SUCCESS(status)) ? 0 : -ENODEV;
  181. }
  182. /****************************************************************************
  183.  *
  184.  * FUNCTION: ac_osl_cleanup
  185.  *
  186.  * PARAMETERS: <none>
  187.  *
  188.  * RETURN: <none>
  189.  *
  190.  * DESCRIPTION: Module cleanup.
  191.  *
  192.  ****************************************************************************/
  193. static void __exit
  194. ac_osl_cleanup (void)
  195. {
  196. ac_terminate();
  197. if (ac_proc_root) {
  198. remove_proc_entry(AC_PROC_ROOT, bm_proc_root);
  199. }
  200. return;
  201. }
  202. module_init(ac_osl_init);
  203. module_exit(ac_osl_cleanup);