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

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable
  4.  *              $Revision: 38 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  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 "achware.h"
  26. #include "acnamesp.h"
  27. #include "acevents.h"
  28. #include "amlcode.h"
  29. #include "acinterp.h"
  30. #define _COMPONENT          ACPI_EVENTS
  31.  MODULE_NAME         ("evxfevnt")
  32. /*******************************************************************************
  33.  *
  34.  * FUNCTION:    Acpi_enable
  35.  *
  36.  * PARAMETERS:  None
  37.  *
  38.  * RETURN:      Status
  39.  *
  40.  * DESCRIPTION: Transfers the system into ACPI mode.
  41.  *
  42.  ******************************************************************************/
  43. acpi_status
  44. acpi_enable (void)
  45. {
  46. acpi_status             status;
  47. FUNCTION_TRACE ("Acpi_enable");
  48. /* Make sure we've got ACPI tables */
  49. if (!acpi_gbl_DSDT) {
  50. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "No ACPI tables present!n"));
  51. return_ACPI_STATUS (AE_NO_ACPI_TABLES);
  52. }
  53. /* Make sure the BIOS supports ACPI mode */
  54. if (SYS_MODE_LEGACY == acpi_hw_get_mode_capabilities()) {
  55. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Only legacy mode supported!n"));
  56. return_ACPI_STATUS (AE_ERROR);
  57. }
  58. /* Transition to ACPI mode */
  59. status = acpi_hw_set_mode (SYS_MODE_ACPI);
  60. if (ACPI_FAILURE (status)) {
  61. ACPI_DEBUG_PRINT ((ACPI_DB_FATAL, "Could not transition to ACPI mode.n"));
  62. return_ACPI_STATUS (status);
  63. }
  64. ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Transition to ACPI mode successfuln"));
  65. return_ACPI_STATUS (status);
  66. }
  67. /*******************************************************************************
  68.  *
  69.  * FUNCTION:    Acpi_disable
  70.  *
  71.  * PARAMETERS:  None
  72.  *
  73.  * RETURN:      Status
  74.  *
  75.  * DESCRIPTION: Returns the system to original ACPI/legacy mode, and
  76.  *              uninstalls the SCI interrupt handler.
  77.  *
  78.  ******************************************************************************/
  79. acpi_status
  80. acpi_disable (void)
  81. {
  82. acpi_status             status;
  83. FUNCTION_TRACE ("Acpi_disable");
  84. /* Restore original mode  */
  85. status = acpi_hw_set_mode (acpi_gbl_original_mode);
  86. if (ACPI_FAILURE (status)) {
  87. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unable to transition to original mode"));
  88. return_ACPI_STATUS (status);
  89. }
  90. /* Unload the SCI interrupt handler  */
  91. acpi_ev_remove_sci_handler ();
  92. acpi_ev_restore_acpi_state ();
  93. return_ACPI_STATUS (status);
  94. }
  95. /*******************************************************************************
  96.  *
  97.  * FUNCTION:    Acpi_enable_event
  98.  *
  99.  * PARAMETERS:  Event           - The fixed event or GPE to be enabled
  100.  *              Type            - The type of event
  101.  *              Flags           - Just enable, or also wake enable?
  102.  *
  103.  * RETURN:      Status
  104.  *
  105.  * DESCRIPTION: Enable an ACPI event (fixed and general purpose)
  106.  *
  107.  ******************************************************************************/
  108. acpi_status
  109. acpi_enable_event (
  110. u32                     event,
  111. u32                     type,
  112. u32                     flags)
  113. {
  114. acpi_status             status = AE_OK;
  115. u32                     register_id;
  116. FUNCTION_TRACE ("Acpi_enable_event");
  117. /* The Type must be either Fixed Acpi_event or GPE */
  118. switch (type) {
  119. case ACPI_EVENT_FIXED:
  120. /* Decode the Fixed Acpi_event */
  121. switch (event) {
  122. case ACPI_EVENT_PMTIMER:
  123. register_id = TMR_EN;
  124. break;
  125. case ACPI_EVENT_GLOBAL:
  126. register_id = GBL_EN;
  127. break;
  128. case ACPI_EVENT_POWER_BUTTON:
  129. register_id = PWRBTN_EN;
  130. break;
  131. case ACPI_EVENT_SLEEP_BUTTON:
  132. register_id = SLPBTN_EN;
  133. break;
  134. case ACPI_EVENT_RTC:
  135. register_id = RTC_EN;
  136. break;
  137. default:
  138. return_ACPI_STATUS (AE_BAD_PARAMETER);
  139. break;
  140. }
  141. /*
  142.  * Enable the requested fixed event (by writing a one to the
  143.  * enable register bit)
  144.  */
  145. acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, register_id, 1);
  146. if (1 != acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_LOCK, register_id)) {
  147. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  148. "Fixed event bit clear when it should be setn"));
  149. return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
  150. }
  151. break;
  152. case ACPI_EVENT_GPE:
  153. /* Ensure that we have a valid GPE number */
  154. if ((event > ACPI_GPE_MAX) ||
  155. (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) {
  156. return_ACPI_STATUS (AE_BAD_PARAMETER);
  157. }
  158. /* Enable the requested GPE number */
  159. if (flags & ACPI_EVENT_ENABLE) {
  160. acpi_hw_enable_gpe (event);
  161. }
  162. if (flags & ACPI_EVENT_WAKE_ENABLE) {
  163. acpi_hw_enable_gpe_for_wakeup (event);
  164. }
  165. break;
  166. default:
  167. status = AE_BAD_PARAMETER;
  168. }
  169. return_ACPI_STATUS (status);
  170. }
  171. /*******************************************************************************
  172.  *
  173.  * FUNCTION:    Acpi_disable_event
  174.  *
  175.  * PARAMETERS:  Event           - The fixed event or GPE to be enabled
  176.  *              Type            - The type of event, fixed or general purpose
  177.  *              Flags           - Wake disable vs. non-wake disable
  178.  *
  179.  * RETURN:      Status
  180.  *
  181.  * DESCRIPTION: Disable an ACPI event (fixed and general purpose)
  182.  *
  183.  ******************************************************************************/
  184. acpi_status
  185. acpi_disable_event (
  186. u32                     event,
  187. u32                     type,
  188. u32                     flags)
  189. {
  190. acpi_status             status = AE_OK;
  191. u32                     register_id;
  192. FUNCTION_TRACE ("Acpi_disable_event");
  193. /* The Type must be either Fixed Acpi_event or GPE */
  194. switch (type) {
  195. case ACPI_EVENT_FIXED:
  196. /* Decode the Fixed Acpi_event */
  197. switch (event) {
  198. case ACPI_EVENT_PMTIMER:
  199. register_id = TMR_EN;
  200. break;
  201. case ACPI_EVENT_GLOBAL:
  202. register_id = GBL_EN;
  203. break;
  204. case ACPI_EVENT_POWER_BUTTON:
  205. register_id = PWRBTN_EN;
  206. break;
  207. case ACPI_EVENT_SLEEP_BUTTON:
  208. register_id = SLPBTN_EN;
  209. break;
  210. case ACPI_EVENT_RTC:
  211. register_id = RTC_EN;
  212. break;
  213. default:
  214. return_ACPI_STATUS (AE_BAD_PARAMETER);
  215. break;
  216. }
  217. /*
  218.  * Disable the requested fixed event (by writing a zero to the
  219.  * enable register bit)
  220.  */
  221. acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, register_id, 0);
  222. if (0 != acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_LOCK, register_id)) {
  223. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  224. "Fixed event bit set when it should be clear,n"));
  225. return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
  226. }
  227. break;
  228. case ACPI_EVENT_GPE:
  229. /* Ensure that we have a valid GPE number */
  230. if ((event > ACPI_GPE_MAX) ||
  231. (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) {
  232. return_ACPI_STATUS (AE_BAD_PARAMETER);
  233. }
  234. /* Disable the requested GPE number */
  235. if (flags & ACPI_EVENT_DISABLE) {
  236. acpi_hw_disable_gpe (event);
  237. }
  238. if (flags & ACPI_EVENT_WAKE_DISABLE) {
  239. acpi_hw_disable_gpe_for_wakeup (event);
  240. }
  241. break;
  242. default:
  243. status = AE_BAD_PARAMETER;
  244. }
  245. return_ACPI_STATUS (status);
  246. }
  247. /*******************************************************************************
  248.  *
  249.  * FUNCTION:    Acpi_clear_event
  250.  *
  251.  * PARAMETERS:  Event           - The fixed event or GPE to be cleared
  252.  *              Type            - The type of event
  253.  *
  254.  * RETURN:      Status
  255.  *
  256.  * DESCRIPTION: Clear an ACPI event (fixed and general purpose)
  257.  *
  258.  ******************************************************************************/
  259. acpi_status
  260. acpi_clear_event (
  261. u32                     event,
  262. u32                     type)
  263. {
  264. acpi_status             status = AE_OK;
  265. u32                     register_id;
  266. FUNCTION_TRACE ("Acpi_clear_event");
  267. /* The Type must be either Fixed Acpi_event or GPE */
  268. switch (type) {
  269. case ACPI_EVENT_FIXED:
  270. /* Decode the Fixed Acpi_event */
  271. switch (event) {
  272. case ACPI_EVENT_PMTIMER:
  273. register_id = TMR_STS;
  274. break;
  275. case ACPI_EVENT_GLOBAL:
  276. register_id = GBL_STS;
  277. break;
  278. case ACPI_EVENT_POWER_BUTTON:
  279. register_id = PWRBTN_STS;
  280. break;
  281. case ACPI_EVENT_SLEEP_BUTTON:
  282. register_id = SLPBTN_STS;
  283. break;
  284. case ACPI_EVENT_RTC:
  285. register_id = RTC_STS;
  286. break;
  287. default:
  288. return_ACPI_STATUS (AE_BAD_PARAMETER);
  289. break;
  290. }
  291. /*
  292.  * Clear the requested fixed event (By writing a one to the
  293.  * status register bit)
  294.  */
  295. acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, register_id, 1);
  296. break;
  297. case ACPI_EVENT_GPE:
  298. /* Ensure that we have a valid GPE number */
  299. if ((event > ACPI_GPE_MAX) ||
  300. (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) {
  301. return_ACPI_STATUS (AE_BAD_PARAMETER);
  302. }
  303. acpi_hw_clear_gpe (event);
  304. break;
  305. default:
  306. status = AE_BAD_PARAMETER;
  307. }
  308. return_ACPI_STATUS (status);
  309. }
  310. /*******************************************************************************
  311.  *
  312.  * FUNCTION:    Acpi_get_event_status
  313.  *
  314.  * PARAMETERS:  Event           - The fixed event or GPE
  315.  *              Type            - The type of event
  316.  *              Status          - Where the current status of the event will
  317.  *                                be returned
  318.  *
  319.  * RETURN:      Status
  320.  *
  321.  * DESCRIPTION: Obtains and returns the current status of the event
  322.  *
  323.  ******************************************************************************/
  324. acpi_status
  325. acpi_get_event_status (
  326. u32                     event,
  327. u32                     type,
  328. acpi_event_status       *event_status)
  329. {
  330. acpi_status             status = AE_OK;
  331. u32                     register_id;
  332. FUNCTION_TRACE ("Acpi_get_event_status");
  333. if (!event_status) {
  334. return_ACPI_STATUS (AE_BAD_PARAMETER);
  335. }
  336. /* The Type must be either Fixed Acpi_event or GPE */
  337. switch (type) {
  338. case ACPI_EVENT_FIXED:
  339. /* Decode the Fixed Acpi_event */
  340. switch (event) {
  341. case ACPI_EVENT_PMTIMER:
  342. register_id = TMR_STS;
  343. break;
  344. case ACPI_EVENT_GLOBAL:
  345. register_id = GBL_STS;
  346. break;
  347. case ACPI_EVENT_POWER_BUTTON:
  348. register_id = PWRBTN_STS;
  349. break;
  350. case ACPI_EVENT_SLEEP_BUTTON:
  351. register_id = SLPBTN_STS;
  352. break;
  353. case ACPI_EVENT_RTC:
  354. register_id = RTC_STS;
  355. break;
  356. default:
  357. return_ACPI_STATUS (AE_BAD_PARAMETER);
  358. break;
  359. }
  360. /* Get the status of the requested fixed event */
  361. *event_status = acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_LOCK, register_id);
  362. break;
  363. case ACPI_EVENT_GPE:
  364. /* Ensure that we have a valid GPE number */
  365. if ((event > ACPI_GPE_MAX) ||
  366. (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) {
  367. return_ACPI_STATUS (AE_BAD_PARAMETER);
  368. }
  369. /* Obtain status on the requested GPE number */
  370. acpi_hw_get_gpe_status (event, event_status);
  371. break;
  372. default:
  373. status = AE_BAD_PARAMETER;
  374. }
  375. return_ACPI_STATUS (status);
  376. }