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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: evsci - System Control Interrupt configuration and
  4.  *                      legacy to ACPI mode state transition functions
  5.  *              $Revision: 74 $
  6.  *
  7.  ******************************************************************************/
  8. /*
  9.  *  Copyright (C) 2000, 2001 R. Byron Moore
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  24.  */
  25. #include "acpi.h"
  26. #include "acnamesp.h"
  27. #include "achware.h"
  28. #include "acevents.h"
  29. #define _COMPONENT          ACPI_EVENTS
  30.  MODULE_NAME         ("evsci")
  31. /*
  32.  * Elements correspond to counts for TMR, NOT_USED, GBL, PWR_BTN, SLP_BTN, RTC,
  33.  * and GENERAL respectively.  These counts are modified by the ACPI interrupt
  34.  * handler.
  35.  *
  36.  * TBD: [Investigate] Note that GENERAL should probably be split out into
  37.  * one element for each bit in the GPE registers
  38.  */
  39. /*******************************************************************************
  40.  *
  41.  * FUNCTION:    Acpi_ev_sci_handler
  42.  *
  43.  * PARAMETERS:  Context   - Calling Context
  44.  *
  45.  * RETURN:      Status code indicates whether interrupt was handled.
  46.  *
  47.  * DESCRIPTION: Interrupt handler that will figure out what function or
  48.  *              control method to call to deal with a SCI.  Installed
  49.  *              using BU interrupt support.
  50.  *
  51.  ******************************************************************************/
  52. static u32
  53. acpi_ev_sci_handler (void *context)
  54. {
  55. u32                     interrupt_handled = INTERRUPT_NOT_HANDLED;
  56. FUNCTION_TRACE("Ev_sci_handler");
  57. /*
  58.  * Make sure that ACPI is enabled by checking SCI_EN.  Note that we are
  59.  * required to treat the SCI interrupt as sharable, level, active low.
  60.  */
  61. if (!acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_DO_NOT_LOCK, SCI_EN)) {
  62. /* ACPI is not enabled;  this interrupt cannot be for us */
  63. return_VALUE (INTERRUPT_NOT_HANDLED);
  64. }
  65. /*
  66.  * Fixed Acpi_events:
  67.  * -------------
  68.  * Check for and dispatch any Fixed Acpi_events that have occurred
  69.  */
  70. interrupt_handled |= acpi_ev_fixed_event_detect ();
  71. /*
  72.  * GPEs:
  73.  * -----
  74.  * Check for and dispatch any GPEs that have occurred
  75.  */
  76. interrupt_handled |= acpi_ev_gpe_detect ();
  77. return_VALUE (interrupt_handled);
  78. }
  79. /******************************************************************************
  80.  *
  81.  * FUNCTION:    Acpi_ev_install_sci_handler
  82.  *
  83.  * PARAMETERS:  none
  84.  *
  85.  * RETURN:      Status
  86.  *
  87.  * DESCRIPTION: Installs SCI handler.
  88.  *
  89.  ******************************************************************************/
  90. u32
  91. acpi_ev_install_sci_handler (void)
  92. {
  93. u32                     status = AE_OK;
  94. FUNCTION_TRACE ("Ev_install_sci_handler");
  95. status = acpi_os_install_interrupt_handler ((u32) acpi_gbl_FADT->sci_int,
  96.    acpi_ev_sci_handler, NULL);
  97. return_ACPI_STATUS (status);
  98. }
  99. /******************************************************************************
  100.  *
  101.  * FUNCTION:    Acpi_ev_remove_sci_handler
  102.  *
  103.  * PARAMETERS:  none
  104.  *
  105.  * RETURN:      E_OK if handler uninstalled OK, E_ERROR if handler was not
  106.  *              installed to begin with
  107.  *
  108.  * DESCRIPTION: Restores original status of all fixed event enable bits and
  109.  *              removes SCI handler.
  110.  *
  111.  ******************************************************************************/
  112. acpi_status
  113. acpi_ev_remove_sci_handler (void)
  114. {
  115. FUNCTION_TRACE ("Ev_remove_sci_handler");
  116. #if 0
  117. /* TBD:[Investigate] Figure this out!!  Disable all events first ???  */
  118. if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (TMR_FIXED_EVENT)) {
  119. acpi_event_disable_event (TMR_FIXED_EVENT);
  120. }
  121. if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (GBL_FIXED_EVENT)) {
  122. acpi_event_disable_event (GBL_FIXED_EVENT);
  123. }
  124. if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (PWR_BTN_FIXED_EVENT)) {
  125. acpi_event_disable_event (PWR_BTN_FIXED_EVENT);
  126. }
  127. if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (SLP_BTN_FIXED_EVENT)) {
  128. acpi_event_disable_event (SLP_BTN_FIXED_EVENT);
  129. }
  130. if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (RTC_FIXED_EVENT)) {
  131. acpi_event_disable_event (RTC_FIXED_EVENT);
  132. }
  133. original_fixed_enable_bit_status = 0;
  134. #endif
  135. acpi_os_remove_interrupt_handler ((u32) acpi_gbl_FADT->sci_int,
  136.    acpi_ev_sci_handler);
  137. return_ACPI_STATUS (AE_OK);
  138. }
  139. /*******************************************************************************
  140.  *
  141.  * FUNCTION:    Acpi_ev_restore_acpi_state
  142.  *
  143.  * PARAMETERS:  none
  144.  *
  145.  * RETURN:      none
  146.  *
  147.  * DESCRIPTION: Restore the original ACPI state of the machine
  148.  *
  149.  ******************************************************************************/
  150. void
  151. acpi_ev_restore_acpi_state (void)
  152. {
  153. u32                     index;
  154. FUNCTION_TRACE ("Ev_restore_acpi_state");
  155. /* Restore the state of the chipset enable bits. */
  156. if (acpi_gbl_restore_acpi_chipset == TRUE) {
  157. /* Restore the fixed events */
  158. if (acpi_hw_register_read (ACPI_MTX_LOCK, PM1_EN) !=
  159. acpi_gbl_pm1_enable_register_save) {
  160. acpi_hw_register_write (ACPI_MTX_LOCK, PM1_EN,
  161. acpi_gbl_pm1_enable_register_save);
  162. }
  163. /* Ensure that all status bits are clear */
  164. acpi_hw_clear_acpi_status ();
  165. /* Now restore the GPEs */
  166. for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe0blk_len); index++) {
  167. if (acpi_hw_register_read (ACPI_MTX_LOCK, GPE0_EN_BLOCK | index) !=
  168. acpi_gbl_gpe0enable_register_save[index]) {
  169. acpi_hw_register_write (ACPI_MTX_LOCK, GPE0_EN_BLOCK | index,
  170. acpi_gbl_gpe0enable_register_save[index]);
  171. }
  172. }
  173. /* GPE 1 present? */
  174. if (acpi_gbl_FADT->gpe1_blk_len) {
  175. for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe1_blk_len); index++) {
  176. if (acpi_hw_register_read (ACPI_MTX_LOCK, GPE1_EN_BLOCK | index) !=
  177. acpi_gbl_gpe1_enable_register_save[index]) {
  178. acpi_hw_register_write (ACPI_MTX_LOCK, GPE1_EN_BLOCK | index,
  179. acpi_gbl_gpe1_enable_register_save[index]);
  180. }
  181. }
  182. }
  183. if (acpi_hw_get_mode() != acpi_gbl_original_mode) {
  184. acpi_hw_set_mode (acpi_gbl_original_mode);
  185. }
  186. }
  187. return_VOID;
  188. }
  189. /******************************************************************************
  190.  *
  191.  * FUNCTION:    Acpi_ev_terminate
  192.  *
  193.  * PARAMETERS:  none
  194.  *
  195.  * RETURN:      none
  196.  *
  197.  * DESCRIPTION: free memory allocated for table storage.
  198.  *
  199.  ******************************************************************************/
  200. void
  201. acpi_ev_terminate (void)
  202. {
  203. FUNCTION_TRACE ("Ev_terminate");
  204. /*
  205.  * Free global tables, etc.
  206.  */
  207. if (acpi_gbl_gpe_registers) {
  208. ACPI_MEM_FREE (acpi_gbl_gpe_registers);
  209. }
  210. if (acpi_gbl_gpe_info) {
  211. ACPI_MEM_FREE (acpi_gbl_gpe_info);
  212. }
  213. return_VOID;
  214. }