80 lines
1.9 KiB
C
80 lines
1.9 KiB
C
|
/* Copyright 2019 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.
|
||
|
*/
|
||
|
|
||
|
#include "ec_commands.h"
|
||
|
#include "host_command.h"
|
||
|
#include "power.h"
|
||
|
|
||
|
/* Track last reported sleep event */
|
||
|
static enum host_sleep_event host_sleep_state;
|
||
|
|
||
|
__overridable void power_chipset_handle_host_sleep_event(
|
||
|
enum host_sleep_event state,
|
||
|
struct host_sleep_event_context *ctx)
|
||
|
{
|
||
|
/* Default weak implementation -- no action required. */
|
||
|
}
|
||
|
|
||
|
static enum ec_status
|
||
|
host_command_host_sleep_event(struct host_cmd_handler_args *args)
|
||
|
{
|
||
|
const struct ec_params_host_sleep_event_v1 *p = args->params;
|
||
|
struct ec_response_host_sleep_event_v1 *r = args->response;
|
||
|
struct host_sleep_event_context ctx;
|
||
|
enum host_sleep_event state = p->sleep_event;
|
||
|
|
||
|
host_sleep_state = state;
|
||
|
ctx.sleep_transitions = 0;
|
||
|
switch (state) {
|
||
|
case HOST_SLEEP_EVENT_S0IX_SUSPEND:
|
||
|
case HOST_SLEEP_EVENT_S3_SUSPEND:
|
||
|
case HOST_SLEEP_EVENT_S3_WAKEABLE_SUSPEND:
|
||
|
ctx.sleep_timeout_ms = EC_HOST_SLEEP_TIMEOUT_DEFAULT;
|
||
|
|
||
|
/* The original version contained only state. */
|
||
|
if (args->version >= 1)
|
||
|
ctx.sleep_timeout_ms =
|
||
|
p->suspend_params.sleep_timeout_ms;
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
power_chipset_handle_host_sleep_event(host_sleep_state, &ctx);
|
||
|
switch (state) {
|
||
|
case HOST_SLEEP_EVENT_S0IX_RESUME:
|
||
|
case HOST_SLEEP_EVENT_S3_RESUME:
|
||
|
if (args->version >= 1) {
|
||
|
r->resume_response.sleep_transitions =
|
||
|
ctx.sleep_transitions;
|
||
|
|
||
|
args->response_size = sizeof(*r);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return EC_RES_SUCCESS;
|
||
|
}
|
||
|
DECLARE_HOST_COMMAND(EC_CMD_HOST_SLEEP_EVENT,
|
||
|
host_command_host_sleep_event,
|
||
|
EC_VER_MASK(0) | EC_VER_MASK(1));
|
||
|
|
||
|
enum host_sleep_event power_get_host_sleep_state(void)
|
||
|
{
|
||
|
return host_sleep_state;
|
||
|
}
|
||
|
|
||
|
void power_set_host_sleep_state(enum host_sleep_event state)
|
||
|
{
|
||
|
host_sleep_state = state;
|
||
|
}
|
||
|
|