mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-08 00:21:46 +00:00
This works similar to SCI/SMI events, but triggers a separate level-sensitive signal to the PCH instead. Signed-off-by: Randall Spangler <rspangler@chromium.org> BUG=chrome-os-partner:8514 TEST=manual From EC console: gpioget PCH_WAKEn --> should be 1 hostevent wake 0x1 close lid switch (with magnet) hostevent -> should show wake mask 0x1, raw events 0x1 gpioget PCH_WAKEn --> should be 0 hostevent clear 0x1 hostevent -> should show raw events 0 gpioget PCH_WAKEn --> should be 1 Change-Id: I29832c1dc30239a98987578f07dfeb25791dde11
145 lines
4.2 KiB
C
145 lines
4.2 KiB
C
/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
/* Host event commands for Chrome EC */
|
|
|
|
#include "console.h"
|
|
#include "host_command.h"
|
|
#include "lpc.h"
|
|
#include "uart.h"
|
|
#include "util.h"
|
|
|
|
/*****************************************************************************/
|
|
/* Console commands */
|
|
|
|
static int command_host_event(int argc, char **argv)
|
|
{
|
|
/* Handle sub-commands */
|
|
if (argc == 3) {
|
|
char *e;
|
|
int i = strtoi(argv[2], &e, 0);
|
|
if (*e) {
|
|
uart_puts("Invalid event mask\n");
|
|
return EC_ERROR_INVAL;
|
|
}
|
|
|
|
if (!strcasecmp(argv[1], "set")) {
|
|
uart_printf("Setting host event mask 0x%08x\n", i);
|
|
lpc_set_host_events(i);
|
|
} else if (!strcasecmp(argv[1], "clear")) {
|
|
uart_printf("Clearing host event mask 0x%08x\n", i);
|
|
lpc_clear_host_events(i);
|
|
} else if (!strcasecmp(argv[1], "smi")) {
|
|
uart_printf("Setting SMI mask to 0x%08x\n", i);
|
|
lpc_set_host_event_mask(LPC_HOST_EVENT_SMI, i);
|
|
} else if (!strcasecmp(argv[1], "sci")) {
|
|
uart_printf("Setting SCI mask to 0x%08x\n", i);
|
|
lpc_set_host_event_mask(LPC_HOST_EVENT_SCI, i);
|
|
} else if (!strcasecmp(argv[1], "wake")) {
|
|
uart_printf("Setting wake mask to 0x%08x\n", i);
|
|
lpc_set_host_event_mask(LPC_HOST_EVENT_WAKE, i);
|
|
} else {
|
|
uart_puts("Unknown sub-command\n");
|
|
return EC_ERROR_INVAL;
|
|
}
|
|
}
|
|
|
|
/* Print current SMI/SCI status */
|
|
uart_printf("Raw host events: 0x%08x\n", lpc_get_host_events());
|
|
uart_printf("SMI mask: 0x%08x\n",
|
|
lpc_get_host_event_mask(LPC_HOST_EVENT_SMI));
|
|
uart_printf("SCI mask: 0x%08x\n",
|
|
lpc_get_host_event_mask(LPC_HOST_EVENT_SCI));
|
|
uart_printf("Wake mask: 0x%08x\n",
|
|
lpc_get_host_event_mask(LPC_HOST_EVENT_WAKE));
|
|
return EC_SUCCESS;
|
|
}
|
|
DECLARE_CONSOLE_COMMAND(hostevent, command_host_event);
|
|
|
|
/*****************************************************************************/
|
|
/* Host commands */
|
|
|
|
static enum lpc_status host_event_get_smi_mask(uint8_t *data)
|
|
{
|
|
struct lpc_response_host_event_mask *r =
|
|
(struct lpc_response_host_event_mask *)data;
|
|
|
|
r->mask = lpc_get_host_event_mask(LPC_HOST_EVENT_SMI);
|
|
return EC_LPC_RESULT_SUCCESS;
|
|
}
|
|
DECLARE_HOST_COMMAND(EC_LPC_COMMAND_HOST_EVENT_GET_SMI_MASK,
|
|
host_event_get_smi_mask);
|
|
|
|
|
|
static enum lpc_status host_event_get_sci_mask(uint8_t *data)
|
|
{
|
|
struct lpc_response_host_event_mask *r =
|
|
(struct lpc_response_host_event_mask *)data;
|
|
|
|
r->mask = lpc_get_host_event_mask(LPC_HOST_EVENT_SCI);
|
|
return EC_LPC_RESULT_SUCCESS;
|
|
}
|
|
DECLARE_HOST_COMMAND(EC_LPC_COMMAND_HOST_EVENT_GET_SCI_MASK,
|
|
host_event_get_sci_mask);
|
|
|
|
|
|
static enum lpc_status host_event_get_wake_mask(uint8_t *data)
|
|
{
|
|
struct lpc_response_host_event_mask *r =
|
|
(struct lpc_response_host_event_mask *)data;
|
|
|
|
r->mask = lpc_get_host_event_mask(LPC_HOST_EVENT_WAKE);
|
|
return EC_LPC_RESULT_SUCCESS;
|
|
}
|
|
DECLARE_HOST_COMMAND(EC_LPC_COMMAND_HOST_EVENT_GET_WAKE_MASK,
|
|
host_event_get_wake_mask);
|
|
|
|
|
|
static enum lpc_status host_event_set_smi_mask(uint8_t *data)
|
|
{
|
|
const struct lpc_params_host_event_mask *p =
|
|
(const struct lpc_params_host_event_mask *)data;
|
|
|
|
lpc_set_host_event_mask(LPC_HOST_EVENT_SMI, p->mask);
|
|
return EC_LPC_RESULT_SUCCESS;
|
|
}
|
|
DECLARE_HOST_COMMAND(EC_LPC_COMMAND_HOST_EVENT_SET_SMI_MASK,
|
|
host_event_set_smi_mask);
|
|
|
|
|
|
static enum lpc_status host_event_set_sci_mask(uint8_t *data)
|
|
{
|
|
const struct lpc_params_host_event_mask *p =
|
|
(const struct lpc_params_host_event_mask *)data;
|
|
|
|
lpc_set_host_event_mask(LPC_HOST_EVENT_SCI, p->mask);
|
|
return EC_LPC_RESULT_SUCCESS;
|
|
}
|
|
DECLARE_HOST_COMMAND(EC_LPC_COMMAND_HOST_EVENT_SET_SCI_MASK,
|
|
host_event_set_sci_mask);
|
|
|
|
|
|
static enum lpc_status host_event_set_wake_mask(uint8_t *data)
|
|
{
|
|
const struct lpc_params_host_event_mask *p =
|
|
(const struct lpc_params_host_event_mask *)data;
|
|
|
|
lpc_set_host_event_mask(LPC_HOST_EVENT_WAKE, p->mask);
|
|
return EC_LPC_RESULT_SUCCESS;
|
|
}
|
|
DECLARE_HOST_COMMAND(EC_LPC_COMMAND_HOST_EVENT_SET_WAKE_MASK,
|
|
host_event_set_wake_mask);
|
|
|
|
|
|
static enum lpc_status host_event_clear(uint8_t *data)
|
|
{
|
|
const struct lpc_params_host_event_mask *p =
|
|
(const struct lpc_params_host_event_mask *)data;
|
|
|
|
lpc_clear_host_events(p->mask);
|
|
return EC_LPC_RESULT_SUCCESS;
|
|
}
|
|
DECLARE_HOST_COMMAND(EC_LPC_COMMAND_HOST_EVENT_CLEAR, host_event_clear);
|