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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  *
  3.  * Module Name: ecspace.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 "ec.h"
  26. #define _COMPONENT ACPI_EC
  27. MODULE_NAME ("ecspace")
  28. /****************************************************************************
  29.  *
  30.  * FUNCTION:    ec_space_setup
  31.  *
  32.  * PARAMETERS:
  33.  *
  34.  * RETURN:
  35.  *
  36.  * DESCRIPTION:
  37.  *
  38.  ****************************************************************************/
  39. acpi_status
  40. ec_space_setup (
  41. acpi_handle region_handle,
  42. u32 function,
  43. void *handler_context,
  44. void **return_context)
  45. {
  46. /*
  47.  * The EC object is in the handler context and is needed
  48.  * when calling the ec_space_handler.
  49.  */
  50. *return_context = handler_context;
  51. return AE_OK;
  52. }
  53. /****************************************************************************
  54.  *
  55.  * FUNCTION:    ec_space_handler
  56.  *
  57.  * PARAMETERS:  function            - Read or Write operation
  58.  *              address             - Where in the space to read or write
  59.  *              bit_width           - Field width in bits (should be 8)
  60.  *              value               - Pointer to in or out value
  61.  *              context             - context pointer
  62.  *
  63.  * RETURN:
  64.  *
  65.  * DESCRIPTION: Handler for the Embedded Controller (EC) address space
  66.  *              (Op Region)
  67.  *
  68.  ****************************************************************************/
  69. acpi_status
  70. ec_space_handler (
  71. u32                     function,
  72. ACPI_PHYSICAL_ADDRESS   address,
  73. u32                     bit_width,
  74. u32                     *value,
  75. void                    *handler_context,
  76. void                    *region_context)
  77. {
  78. acpi_status             status = AE_OK;
  79. EC_CONTEXT              *ec = NULL;
  80. EC_REQUEST              ec_request;
  81. FUNCTION_TRACE("ec_space_handler");
  82. if (address > 0xFF || bit_width != 8 || !value || !handler_context) {
  83. return_ACPI_STATUS(AE_BAD_PARAMETER);
  84. }
  85. ec = (EC_CONTEXT*)handler_context;
  86. switch (function) {
  87. case ACPI_READ_ADR_SPACE:
  88. ec_request.command = EC_COMMAND_READ;
  89. ec_request.address = address;
  90. ec_request.data = 0;
  91. break;
  92. case ACPI_WRITE_ADR_SPACE:
  93. ec_request.command = EC_COMMAND_WRITE;
  94. ec_request.address = address;
  95. ec_request.data = (u8)(*value);
  96. break;
  97. default:
  98. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Received request with invalid function [%X].n", function));
  99. return_ACPI_STATUS(AE_BAD_PARAMETER);
  100. break;
  101. }
  102. /*
  103.  * Perform the Transaction.
  104.  */
  105. status = ec_transaction(ec, &ec_request);
  106. if (ACPI_SUCCESS(status)) {
  107. (*value) = (u32)ec_request.data;
  108. }
  109. return_ACPI_STATUS(status);
  110. }
  111. /****************************************************************************
  112.  *
  113.  * FUNCTION:    ec_install_space_handler
  114.  *
  115.  * PARAMETERS:
  116.  *
  117.  * RETURN:
  118.  *
  119.  * DESCRIPTION:
  120.  *
  121.  ****************************************************************************/
  122. acpi_status
  123. ec_install_space_handler (
  124. EC_CONTEXT              *ec)
  125. {
  126. acpi_status             status = AE_OK;
  127. FUNCTION_TRACE("ec_install_space_handler");
  128. if (!ec) {
  129. return_ACPI_STATUS(AE_BAD_PARAMETER);
  130. }
  131. status = acpi_install_address_space_handler (ec->acpi_handle,
  132. ACPI_ADR_SPACE_EC, &ec_space_handler, &ec_space_setup, ec);
  133. return_ACPI_STATUS(status);
  134. }
  135. /****************************************************************************
  136.  *
  137.  * FUNCTION:    ec_remove_space_handler
  138.  *
  139.  * PARAMETERS:
  140.  *
  141.  * RETURN:
  142.  *
  143.  * DESCRIPTION:
  144.  *
  145.  ****************************************************************************/
  146. acpi_status
  147. ec_remove_space_handler (
  148. EC_CONTEXT              *ec)
  149. {
  150. acpi_status             status = AE_OK;
  151. FUNCTION_TRACE("ec_remove_space_handler");
  152. if (!ec) {
  153. return_ACPI_STATUS(AE_BAD_PARAMETER);
  154. }
  155. status = acpi_remove_address_space_handler(ec->acpi_handle,
  156. ACPI_ADR_SPACE_EC, &ec_space_handler);
  157. return_ACPI_STATUS(status);
  158. }