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

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: bmrequest.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 <acpi.h>
  25. #include "bm.h"
  26. #define _COMPONENT ACPI_BUS
  27. MODULE_NAME ("bmrequest")
  28. /****************************************************************************
  29.  *                            External Functions
  30.  ****************************************************************************/
  31. /****************************************************************************
  32.  *
  33.  * FUNCTION:    bm_generate_request
  34.  *
  35.  * PARAMETERS:
  36.  *
  37.  * RETURN:
  38.  *
  39.  * DESCRIPTION:
  40.  *
  41.  ****************************************************************************/
  42. acpi_status
  43. bm_generate_request (
  44. BM_NODE *node,
  45. BM_REQUEST *request)
  46. {
  47. acpi_status             status = AE_OK;
  48. BM_DEVICE *device = NULL;
  49. FUNCTION_TRACE("bm_generate_request");
  50. if (!node || !request) {
  51. return_ACPI_STATUS(AE_BAD_PARAMETER);
  52. }
  53. device = &(node->device);
  54. if (!BM_IS_DRIVER_CONTROL(device)) {
  55. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "No driver installed for device [%02x].n", device->handle));
  56. return_ACPI_STATUS(AE_NOT_EXIST);
  57. }
  58. status = node->driver.request(request, node->driver.context);
  59. return_ACPI_STATUS(status);
  60. }
  61. /****************************************************************************
  62.  *
  63.  * FUNCTION:    bm_request
  64.  *
  65.  * PARAMETERS:
  66.  *
  67.  * RETURN:
  68.  *
  69.  * DESCRIPTION:
  70.  *
  71.  ****************************************************************************/
  72. acpi_status
  73. bm_request (
  74. BM_REQUEST              *request)
  75. {
  76. acpi_status             status = AE_OK;
  77. BM_NODE *node = NULL;
  78. BM_DEVICE *device = NULL;
  79. FUNCTION_TRACE("bm_request");
  80. /*
  81.  * Must have a valid request structure.
  82.  */
  83. if (!request) {
  84. return_ACPI_STATUS(AE_BAD_PARAMETER);
  85. }
  86. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Received request for device [%02x] command [%02x].n", request->handle, request->command));
  87. /*
  88.  * Resolve the node.
  89.  */
  90. status = bm_get_node(request->handle, 0, &node);
  91. if (ACPI_FAILURE(status)) {
  92. return_ACPI_STATUS(status);
  93. }
  94. device = &(node->device);
  95. /*
  96.  * Device-Specific Request?
  97.  * ------------------------
  98.  * If a device-specific command (>=0x80) forward this request to
  99.  * the appropriate driver.
  100.  */
  101. if (request->command & BM_COMMAND_DEVICE_SPECIFIC) {
  102. status = bm_generate_request(node, request);
  103. return_ACPI_STATUS(status);
  104. }
  105. /*
  106.  * Bus-Specific Requests:
  107.  * ----------------------
  108.  */
  109. switch (request->command) {
  110. case BM_COMMAND_GET_POWER_STATE:
  111. status = bm_get_power_state(node);
  112. if (ACPI_FAILURE(status)) {
  113. break;
  114. }
  115. status = bm_copy_to_buffer(&(request->buffer),
  116. &(device->power.state), sizeof(BM_POWER_STATE));
  117. break;
  118. case BM_COMMAND_SET_POWER_STATE:
  119.  {
  120. BM_POWER_STATE *power_state = NULL;
  121. status = bm_cast_buffer(&(request->buffer),
  122. (void**)&power_state, sizeof(BM_POWER_STATE));
  123. if (ACPI_FAILURE(status)) {
  124. break;
  125. }
  126. status = bm_set_power_state(node, *power_state);
  127. }
  128. break;
  129. default:
  130. status = AE_SUPPORT;
  131. request->status = AE_SUPPORT;
  132. break;
  133. }
  134. return_ACPI_STATUS(status);
  135. }