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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  *
  3.  * Module Name: ac.c
  4.  *   $Revision: 23 $
  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 <acpi.h>
  25. #include "ac.h"
  26. #define _COMPONENT ACPI_AC_ADAPTER
  27. MODULE_NAME  ("ac")
  28. /****************************************************************************
  29.  *                            Internal Functions
  30.  ****************************************************************************/
  31. /****************************************************************************
  32.  *
  33.  * FUNCTION: ac_print
  34.  *
  35.  * PARAMETERS:
  36.  *
  37.  * RETURN:
  38.  *
  39.  * DESCRIPTION: Prints out information on a specific ac_adapter.
  40.  *
  41.  ****************************************************************************/
  42. void
  43. ac_print (
  44. AC_CONTEXT *ac_adapter)
  45. {
  46. #ifdef ACPI_DEBUG
  47. acpi_buffer buffer;
  48. PROC_NAME("ac_print");
  49. if (!ac_adapter) {
  50. return;
  51. }
  52. buffer.length = 256;
  53. buffer.pointer = acpi_os_callocate(buffer.length);
  54. if (!buffer.pointer) {
  55. return;
  56. }
  57. /*
  58.  * Get the full pathname for this ACPI object.
  59.  */
  60. acpi_get_name(ac_adapter->acpi_handle, ACPI_FULL_PATHNAME, &buffer);
  61. /*
  62.  * Print out basic adapter information.
  63.  */
  64. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------n"));
  65. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| AC Adapter[%02x]:[%p] %sn", ac_adapter->device_handle, ac_adapter->acpi_handle, (char*)buffer.pointer));
  66. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------n"));
  67. acpi_os_free(buffer.pointer);
  68. #endif /*ACPI_DEBUG*/
  69. return;
  70. }
  71. /****************************************************************************
  72.  *
  73.  * FUNCTION: ac_add_device
  74.  *
  75.  * PARAMETERS:
  76.  *
  77.  * RETURN:
  78.  *
  79.  * DESCRIPTION:
  80.  *
  81.  ****************************************************************************/
  82. acpi_status
  83. ac_add_device(
  84. BM_HANDLE device_handle,
  85. void **context)
  86. {
  87. acpi_status  status = AE_OK;
  88. BM_DEVICE *device = NULL;
  89. AC_CONTEXT *ac_adapter = NULL;
  90. acpi_device_info info;
  91. FUNCTION_TRACE("ac_add_device");
  92. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Adding ac_adapter device [%02x].n", device_handle));
  93. if (!context || *context) {
  94. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid (NULL) context."));
  95. return_ACPI_STATUS(AE_BAD_PARAMETER);
  96. }
  97. /*
  98.  * Get information on this device.
  99.  */
  100. status = bm_get_device_info(device_handle, &device);
  101. if (ACPI_FAILURE(status)) {
  102. return_ACPI_STATUS(status);
  103. }
  104. /*
  105.  * Allocate a new AC_CONTEXT structure.
  106.  */
  107. ac_adapter = acpi_os_callocate(sizeof(AC_CONTEXT));
  108. if (!ac_adapter) {
  109. return_ACPI_STATUS(AE_NO_MEMORY);
  110. }
  111. ac_adapter->device_handle = device->handle;
  112. ac_adapter->acpi_handle = device->acpi_handle;
  113. /*
  114.  * Get information on this object.
  115.  */
  116. status = acpi_get_object_info(ac_adapter->acpi_handle, &info);
  117. if (ACPI_FAILURE(status)) {
  118. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unable to get object info for ac_adapter device."));
  119. goto end;
  120. }
  121. /*
  122.  * _UID?
  123.  * -----
  124.  */
  125. if (info.valid & ACPI_VALID_UID) {
  126. strncpy(ac_adapter->uid, info.unique_id, sizeof(info.unique_id));
  127. }
  128. else {
  129. strncpy(ac_adapter->uid, "0", sizeof("0"));
  130. }
  131. /*
  132.  * _STA?
  133.  * -----
  134.  */
  135. if (!(info.valid & ACPI_VALID_STA)) {
  136. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Must have valid _STA.n"));
  137. status = AE_ERROR;
  138. goto end;
  139. }
  140. status = ac_osl_add_device(ac_adapter);
  141. if (ACPI_FAILURE(status)) {
  142. goto end;
  143. }
  144. *context = ac_adapter;
  145. ac_print(ac_adapter);
  146. end:
  147. if (ACPI_FAILURE(status)) {
  148. acpi_os_free(ac_adapter);
  149. }
  150. return_ACPI_STATUS(status);
  151. }
  152. /****************************************************************************
  153.  *
  154.  * FUNCTION: ac_remove_device
  155.  *
  156.  * PARAMETERS:
  157.  *
  158.  * RETURN:
  159.  *
  160.  * DESCRIPTION:
  161.  *
  162.  ****************************************************************************/
  163. acpi_status
  164. ac_remove_device (
  165. void **context)
  166. {
  167. acpi_status  status = AE_OK;
  168. AC_CONTEXT *ac_adapter = NULL;
  169. FUNCTION_TRACE("ac_remove_device");
  170. if (!context || !*context) {
  171. return_ACPI_STATUS(AE_BAD_PARAMETER);
  172. }
  173. ac_adapter = (AC_CONTEXT*)*context;
  174. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing ac_adapter device [%02x].n", ac_adapter->device_handle));
  175. ac_osl_remove_device(ac_adapter);
  176. acpi_os_free(ac_adapter);
  177. *context = NULL;
  178. return_ACPI_STATUS(status);
  179. }
  180. /****************************************************************************
  181.  *                             External Functions
  182.  ****************************************************************************/
  183. /****************************************************************************
  184.  *
  185.  * FUNCTION: ac_initialize
  186.  *
  187.  * PARAMETERS: <none>
  188.  *
  189.  * RETURN:
  190.  *
  191.  * DESCRIPTION:
  192.  *
  193.  ****************************************************************************/
  194. acpi_status
  195. ac_initialize (void)
  196. {
  197. acpi_status status = AE_OK;
  198. BM_DEVICE_ID criteria;
  199. BM_DRIVER driver;
  200. FUNCTION_TRACE("ac_initialize");
  201. MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID));
  202. MEMSET(&driver, 0, sizeof(BM_DRIVER));
  203. driver.notify = &ac_notify;
  204. driver.request = &ac_request;
  205. /*
  206.  * Register driver for AC Adapter devices.
  207.  */
  208. MEMCPY(criteria.hid, AC_HID_AC_ADAPTER, sizeof(AC_HID_AC_ADAPTER));
  209. status = bm_register_driver(&criteria, &driver);
  210. return_ACPI_STATUS(status);
  211. }
  212. /****************************************************************************
  213.  *
  214.  * FUNCTION: ac_terminate
  215.  *
  216.  * PARAMETERS: <none>
  217.  *
  218.  * RETURN:
  219.  *
  220.  * DESCRIPTION:
  221.  *
  222.  ****************************************************************************/
  223. acpi_status
  224. ac_terminate (void)
  225. {
  226. acpi_status  status = AE_OK;
  227. BM_DEVICE_ID criteria;
  228. BM_DRIVER driver;
  229. FUNCTION_TRACE("ac_terminate");
  230. MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID));
  231. MEMSET(&driver, 0, sizeof(BM_DRIVER));
  232. /*
  233.  * Unregister driver for AC Adapter devices.
  234.  */
  235. MEMCPY(criteria.hid, AC_HID_AC_ADAPTER, sizeof(AC_HID_AC_ADAPTER));
  236. driver.notify = &ac_notify;
  237. driver.request = &ac_request;
  238. status = bm_unregister_driver(&criteria, &driver);
  239. return_ACPI_STATUS(status);
  240. }
  241. /*****************************************************************************
  242.  *
  243.  * FUNCTION: ac_notify
  244.  *
  245.  * PARAMETERS: <none>
  246.  *
  247.  * RETURN:
  248.  *
  249.  * DESCRIPTION:
  250.  *
  251.  ****************************************************************************/
  252. acpi_status
  253. ac_notify (
  254. BM_NOTIFY notify_type,
  255. BM_HANDLE device_handle,
  256. void **context)
  257. {
  258. acpi_status  status = AE_OK;
  259. FUNCTION_TRACE("ac_notify");
  260. if (!context) {
  261. return_ACPI_STATUS(AE_BAD_PARAMETER);
  262. }
  263. switch (notify_type) {
  264. case BM_NOTIFY_DEVICE_ADDED:
  265. status = ac_add_device(device_handle, context);
  266. break;
  267. case BM_NOTIFY_DEVICE_REMOVED:
  268. status = ac_remove_device(context);
  269. break;
  270. case AC_NOTIFY_STATUS_CHANGE:
  271. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Status change event detected.n"));
  272. status = ac_osl_generate_event(notify_type,
  273. ((AC_CONTEXT*)*context));
  274. break;
  275. default:
  276. status = AE_SUPPORT;
  277. break;
  278. }
  279. return_ACPI_STATUS(status);
  280. }
  281. /****************************************************************************
  282.  *
  283.  * FUNCTION: ac_request
  284.  *
  285.  * PARAMETERS:
  286.  *
  287.  * RETURN:
  288.  *
  289.  * DESCRIPTION:
  290.  *
  291.  ****************************************************************************/
  292. acpi_status
  293. ac_request (
  294. BM_REQUEST *request,
  295. void *context)
  296. {
  297. acpi_status  status = AE_OK;
  298. FUNCTION_TRACE("ac_request");
  299. /*
  300.  * Must have a valid request structure and context.
  301.  */
  302. if (!request || !context) {
  303. return_ACPI_STATUS(AE_BAD_PARAMETER);
  304. }
  305. /*
  306.  * Handle Request:
  307.  * ---------------
  308.  */
  309. switch (request->command) {
  310. default:
  311. status = AE_SUPPORT;
  312. break;
  313. }
  314. request->status = status;
  315. return_ACPI_STATUS(status);
  316. }