sm.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  *
  3.  * Module Name: sm.c
  4.  *   $Revision: 20 $
  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 "sm.h"
  26. #define _COMPONENT ACPI_SYSTEM
  27. MODULE_NAME  ("sm")
  28. /****************************************************************************
  29.  *                            Internal Functions
  30.  ****************************************************************************/
  31. /****************************************************************************
  32.  *
  33.  * FUNCTION: sm_print
  34.  *
  35.  * PARAMETERS:
  36.  *
  37.  * RETURN:
  38.  *
  39.  * DESCRIPTION: Prints out information on a specific system.
  40.  *
  41.  ****************************************************************************/
  42. void
  43. sm_print (
  44. SM_CONTEXT *system)
  45. {
  46. #ifdef ACPI_DEBUG
  47. acpi_buffer buffer;
  48. PROC_NAME("sm_print");
  49. buffer.length = 256;
  50. buffer.pointer = acpi_os_callocate(buffer.length);
  51. if (!buffer.pointer) {
  52. return;
  53. }
  54. /*
  55.  * Get the full pathname for this ACPI object.
  56.  */
  57. acpi_get_name(system->acpi_handle, ACPI_FULL_PATHNAME, &buffer);
  58. /*
  59.  * Print out basic system information.
  60.  */
  61. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------n"));
  62. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| System[%02x]:[%p] %sn", system->device_handle, system->acpi_handle, (char*)buffer.pointer));
  63. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "|   states: %cS0 %cS1 %cS2 %cS3 %cS4 %cS5n", (system->states[0]?'+':'-'), (system->states[1]?'+':'-'), (system->states[2]?'+':'-'), (system->states[3]?'+':'-'), (system->states[4]?'+':'-'), (system->states[5]?'+':'-')));
  64. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------n"));
  65. acpi_os_free(buffer.pointer);
  66. #endif /*ACPI_DEBUG*/
  67. return;
  68. }
  69. /****************************************************************************
  70.  *
  71.  * FUNCTION: sm_add_device
  72.  *
  73.  * PARAMETERS:
  74.  *
  75.  * RETURN:
  76.  *
  77.  * DESCRIPTION:
  78.  *
  79.  ****************************************************************************/
  80. acpi_status
  81. sm_add_device(
  82. BM_HANDLE device_handle,
  83. void **context)
  84. {
  85. acpi_status  status = AE_OK;
  86. BM_DEVICE *device = NULL;
  87. SM_CONTEXT *system = NULL;
  88. u8 i, type_a, type_b;
  89. FUNCTION_TRACE("sm_add_device");
  90. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Adding system device [%02x].n", device_handle));
  91. if (!context || *context) {
  92. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid (NULL) context."));
  93. return_ACPI_STATUS(AE_BAD_PARAMETER);
  94. }
  95. /*
  96.  * Allocate a new SM_CONTEXT structure.
  97.  */
  98. system = acpi_os_callocate(sizeof(SM_CONTEXT));
  99. if (!system) {
  100. return_ACPI_STATUS(AE_NO_MEMORY);
  101. }
  102. /*
  103.  * Get information on this device.
  104.  */
  105. status = bm_get_device_info(device_handle, &device);
  106. if (ACPI_FAILURE(status)) {
  107. goto end;
  108. }
  109. system->device_handle = device->handle;
  110. system->acpi_handle = device->acpi_handle;
  111. /*
  112.  * Sx States:
  113.  * ----------
  114.  * Figure out which Sx states are supported.
  115.  */
  116. for (i=0; i<SM_MAX_SYSTEM_STATES; i++) {
  117. if (ACPI_SUCCESS(acpi_hw_obtain_sleep_type_register_data(
  118. i,
  119. &type_a,
  120. &type_b))) {
  121. system->states[i] = TRUE;
  122. }
  123. }
  124. status = sm_osl_add_device(system);
  125. if (ACPI_FAILURE(status)) {
  126. goto end;
  127. }
  128. *context = system;
  129. sm_print(system);
  130. end:
  131. if (ACPI_FAILURE(status)) {
  132. acpi_os_free(system);
  133. }
  134. return_ACPI_STATUS(status);
  135. }
  136. /****************************************************************************
  137.  *
  138.  * FUNCTION: sm_remove_device
  139.  *
  140.  * PARAMETERS:
  141.  *
  142.  * RETURN:
  143.  *
  144.  * DESCRIPTION:
  145.  *
  146.  ****************************************************************************/
  147. acpi_status
  148. sm_remove_device (
  149. void **context)
  150. {
  151. acpi_status  status = AE_OK;
  152. SM_CONTEXT *system = NULL;
  153. FUNCTION_TRACE("sm_remove_device");
  154. if (!context || !*context) {
  155. return_ACPI_STATUS(AE_BAD_PARAMETER);
  156. }
  157. system = (SM_CONTEXT*)*context;
  158. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing system device [%02x].n", system->device_handle));
  159. status = sm_osl_remove_device(system);
  160. acpi_os_free(system);
  161. *context = NULL;
  162. return_ACPI_STATUS(status);
  163. }
  164. /****************************************************************************
  165.  *                             External Functions
  166.  ****************************************************************************/
  167. /****************************************************************************
  168.  *
  169.  * FUNCTION: sm_initialize
  170.  *
  171.  * PARAMETERS: <none>
  172.  *
  173.  * RETURN:
  174.  *
  175.  * DESCRIPTION:
  176.  *
  177.  ****************************************************************************/
  178. acpi_status
  179. sm_initialize (void)
  180. {
  181. acpi_status status = AE_OK;
  182. BM_DEVICE_ID criteria;
  183. BM_DRIVER driver;
  184. FUNCTION_TRACE("sm_initialize");
  185. MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID));
  186. MEMSET(&driver, 0, sizeof(BM_DRIVER));
  187. /*
  188.  * Register driver for the System device.
  189.  */
  190. criteria.type = BM_TYPE_SYSTEM;
  191. driver.notify = &sm_notify;
  192. driver.request = &sm_request;
  193. status = bm_register_driver(&criteria, &driver);
  194. return_ACPI_STATUS(status);
  195. }
  196. /****************************************************************************
  197.  *
  198.  * FUNCTION: sm_terminate
  199.  *
  200.  * PARAMETERS: <none>
  201.  *
  202.  * RETURN:
  203.  *
  204.  * DESCRIPTION:
  205.  *
  206.  ****************************************************************************/
  207. acpi_status
  208. sm_terminate (void)
  209. {
  210. acpi_status  status = AE_OK;
  211. BM_DEVICE_ID criteria;
  212. BM_DRIVER driver;
  213. FUNCTION_TRACE("sm_terminate");
  214. MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID));
  215. MEMSET(&driver, 0, sizeof(BM_DRIVER));
  216. /*
  217.  * Unregister driver for System devices.
  218.  */
  219. criteria.type = BM_TYPE_SYSTEM;
  220. driver.notify = &sm_notify;
  221. driver.request = &sm_request;
  222. status = bm_unregister_driver(&criteria, &driver);
  223. return_ACPI_STATUS(status);
  224. }
  225. /*****************************************************************************
  226.  *
  227.  * FUNCTION: sm_notify
  228.  *
  229.  * PARAMETERS: <none>
  230.  *
  231.  * RETURN:
  232.  *
  233.  * DESCRIPTION:
  234.  *
  235.  ****************************************************************************/
  236. acpi_status
  237. sm_notify (
  238. BM_NOTIFY notify_type,
  239. BM_HANDLE device_handle,
  240. void **context)
  241. {
  242. acpi_status  status = AE_OK;
  243. FUNCTION_TRACE("sm_notify");
  244. if (!context) {
  245. return_ACPI_STATUS(AE_BAD_PARAMETER);
  246. }
  247. switch (notify_type) {
  248. case BM_NOTIFY_DEVICE_ADDED:
  249. status = sm_add_device(device_handle, context);
  250. break;
  251. case BM_NOTIFY_DEVICE_REMOVED:
  252. status = sm_remove_device(context);
  253. break;
  254. default:
  255. status = AE_SUPPORT;
  256. break;
  257. }
  258. return_ACPI_STATUS(status);
  259. }
  260. /****************************************************************************
  261.  *
  262.  * FUNCTION: sm_request
  263.  *
  264.  * PARAMETERS:
  265.  *
  266.  * RETURN:
  267.  *
  268.  * DESCRIPTION:
  269.  *
  270.  ****************************************************************************/
  271. acpi_status
  272. sm_request (
  273. BM_REQUEST *request,
  274. void *context)
  275. {
  276. acpi_status  status = AE_OK;
  277. FUNCTION_TRACE("sm_request");
  278. /*
  279.  * Must have a valid request structure and context.
  280.  */
  281. if (!request || !context) {
  282. return_ACPI_STATUS(AE_BAD_PARAMETER);
  283. }
  284. /*
  285.  * Handle Request:
  286.  * ---------------
  287.  */
  288. switch (request->command) {
  289. default:
  290. status = AE_SUPPORT;
  291. break;
  292. }
  293. request->status = status;
  294. return_ACPI_STATUS(status);
  295. }