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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  *
  3.  * Module Name: ecgpe.c
  4.  *   $Revision: 28 $
  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 ("ecgpe")
  28. /****************************************************************************
  29.  *
  30.  * FUNCTION:    ec_query_handler
  31.  *
  32.  * PARAMETERS:
  33.  *
  34.  * RETURN:
  35.  *
  36.  * DESCRIPTION:
  37.  *
  38.  ****************************************************************************/
  39. void
  40. ec_query_handler (
  41. void                    *context)
  42. {
  43. EC_CONTEXT *ec = (EC_CONTEXT*)context;
  44. static char object_name[5] = {'_','Q','0','0',''};
  45. const char hex[] = {'0','1','2','3','4','5','6','7','8',
  46. '9','A','B','C','D','E','F'};
  47. FUNCTION_TRACE("ec_query_handler");
  48. if (!ec) {
  49. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid (NULL) context.n"));
  50. return_VOID;
  51. }
  52. /*
  53.  * Evaluate _Qxx:
  54.  * --------------
  55.  * Evaluate corresponding _Qxx method.  Note that a zero query value
  56.  * indicates a spurious EC_SCI (no such thing as _Q00).
  57.  */
  58. object_name[2] = hex[((ec->query_data >> 4) & 0x0F)];
  59. object_name[3] = hex[(ec->query_data & 0x0F)];
  60. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Evaluating [%s] for ec [%02x].n", object_name, ec->device_handle));
  61. bm_evaluate_object(ec->acpi_handle, object_name, NULL, NULL);
  62. return_VOID;
  63. }
  64. /****************************************************************************
  65.  *
  66.  * FUNCTION:    ec_gpe_handler
  67.  *
  68.  * PARAMETERS:
  69.  *
  70.  * RETURN:
  71.  *
  72.  * DESCRIPTION:
  73.  *
  74.  ****************************************************************************/
  75. void
  76. ec_gpe_handler (
  77. void                    *context)
  78. {
  79. acpi_status             status = AE_OK;
  80. EC_CONTEXT              *ec = (EC_CONTEXT*)context;
  81. EC_STATUS               ec_status = 0;
  82. FUNCTION_TRACE("ec_gpe_handler");
  83. if (!ec) {
  84. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid (NULL) context.n"));
  85. return_VOID;
  86. }
  87. /* TBD: synchronize w/ transaction (ectransx). */
  88. /*
  89.  * EC_SCI?
  90.  * -------
  91.  * Check the EC_SCI bit to see if this is an EC_SCI event.  If not (e.g.
  92.  * OBF/IBE) just return, as we already poll to detect these events.
  93.  */
  94. acpi_os_read_port(ec->status_port, &ec_status, 8);
  95. if (!(ec_status & EC_FLAG_SCI)) {
  96. return_VOID;
  97. }
  98. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "EC_SCI event detected on ec [%02x] - running query.n", ec->device_handle));
  99. /*
  100.  * Run Query:
  101.  * ----------
  102.  * Query the EC to find out which _Qxx method we need to evaluate.
  103.  * Note that successful completion of the query causes the EC_SCI
  104.  * bit to be cleared (and thus clearing the interrupt source).
  105.  */
  106. status = ec_io_write(ec, ec->command_port, EC_COMMAND_QUERY,
  107. EC_EVENT_OUTPUT_BUFFER_FULL);
  108. if (ACPI_FAILURE(status)) {
  109. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to send 'query command' to EC.n"));
  110. return_VOID;
  111. }
  112. status = ec_io_read(ec, ec->data_port, &(ec->query_data),
  113. EC_EVENT_NONE);
  114. if (ACPI_FAILURE(status)) {
  115. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Error reading query data.n"));
  116. return_VOID;
  117. }
  118. /* TBD: un-synchronize w/ transaction (ectransx). */
  119. /*
  120.  * Spurious EC_SCI?
  121.  * ----------------
  122.  */
  123. if (!ec->query_data) {
  124. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Spurious EC SCI detected.n"));
  125. return_VOID;
  126. }
  127. /*
  128.  * Defer _Qxx Execution:
  129.  * ---------------------
  130.  * Can't evaluate this method now 'cause we're at interrupt-level.
  131.  */
  132. status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE,
  133. ec_query_handler, ec);
  134. if (ACPI_FAILURE(status)) {
  135. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to defer _Qxx method evaluation.n"));
  136. return_VOID;
  137. }
  138. return_VOID;
  139. }
  140. /****************************************************************************
  141.  *
  142.  * FUNCTION:    ec_install_gpe_handler
  143.  *
  144.  * PARAMETERS:
  145.  *
  146.  * RETURN:
  147.  *
  148.  * DESCRIPTION:
  149.  *
  150.  ****************************************************************************/
  151. acpi_status
  152. ec_install_gpe_handler (
  153. EC_CONTEXT              *ec)
  154. {
  155. acpi_status             status = AE_OK;
  156. FUNCTION_TRACE("ec_install_gpe_handler");
  157. if (!ec) {
  158. return_ACPI_STATUS(AE_BAD_PARAMETER);
  159. }
  160. /*
  161.  * Evaluate _GPE:
  162.  * --------------
  163.  * Evaluate the "_GPE" object (required) to find out which GPE bit
  164.  * is used by this EC to signal events (SCIs).
  165.  */
  166. status = bm_evaluate_simple_integer(ec->acpi_handle,
  167. "_GPE", &(ec->gpe_bit));
  168. if (ACPI_FAILURE(status)) {
  169. return_ACPI_STATUS(status);
  170. }
  171. /*
  172.  * Install GPE Handler:
  173.  * --------------------
  174.  * Install a handler for this EC's GPE bit.
  175.  */
  176. status = acpi_install_gpe_handler(ec->gpe_bit, ACPI_EVENT_EDGE_TRIGGERED,
  177. &ec_gpe_handler, ec);
  178. if (ACPI_FAILURE(status)) {
  179. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "acpi_install_gpe_handler() failed for GPE bit [%02x] with status [%08x].n", ec->gpe_bit, status));
  180. ec->gpe_bit = EC_GPE_UNKNOWN;
  181. return_ACPI_STATUS(status);
  182. }
  183. return_ACPI_STATUS(status);
  184. }
  185. /****************************************************************************
  186.  *
  187.  * FUNCTION:    ec_remove_gpe_handler
  188.  *
  189.  * PARAMETERS:
  190.  *
  191.  * RETURN:
  192.  *
  193.  * DESCRIPTION:
  194.  *
  195.  ****************************************************************************/
  196. acpi_status
  197. ec_remove_gpe_handler (
  198. EC_CONTEXT              *ec)
  199. {
  200. acpi_status             status = AE_OK;
  201. FUNCTION_TRACE("ec_remove_gpe_handler");
  202. if (!ec) {
  203. return_ACPI_STATUS(AE_BAD_PARAMETER);
  204. }
  205. status = acpi_remove_gpe_handler(ec->gpe_bit, &ec_gpe_handler);
  206. return_ACPI_STATUS(status);
  207. }