blob: 7e19596a7719c22039dcbc57f560302ca969e52b [file] [log] [blame]
// Copyright 2021 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 "power_manager/powerd/system/cros_ec_device_event.h"
#include <base/files/file_util.h>
#include "power_manager/powerd/system/cros_ec_ioctl.h"
namespace power_manager {
namespace system {
void EnableCrosEcDeviceEvent(int event) {
const uint32_t event_mask = EC_DEVICE_EVENT_MASK(event);
struct ec_params_device_event p;
struct ec_response_device_event* r;
base::ScopedFD ec_fd =
base::ScopedFD(open(cros_ec_ioctl::kCrosEcDevNodePath, O_RDWR));
if (!ec_fd.is_valid()) {
PLOG(ERROR) << "Failed to open " << cros_ec_ioctl::kCrosEcDevNodePath;
return;
}
cros_ec_ioctl::IoctlCommand<struct ec_params_device_event,
struct ec_response_device_event>
cmd(EC_CMD_DEVICE_EVENT);
p.param = EC_DEVICE_EVENT_PARAM_GET_ENABLED_EVENTS;
cmd.SetReq(p);
if (!cmd.Run(ec_fd.get())) {
LOG(ERROR) << "Failed to get CrOS EC device event mask";
return;
}
r = cmd.Resp();
/* Return if mask is already enabled. */
if (r->event_mask & event_mask)
return;
p.param = EC_DEVICE_EVENT_PARAM_SET_ENABLED_EVENTS;
p.event_mask = r->event_mask | event_mask;
cmd.SetReq(p);
if (!cmd.Run(ec_fd.get())) {
LOG(ERROR) << "Failed to set CrOS EC device event for " << event;
return;
}
r = cmd.Resp();
if (!(r->event_mask & event_mask)) {
LOG(ERROR) << "Failed to enable CrOS EC device event for " << event;
return;
}
LOG(INFO) << "CrOS EC device event is enabled for " << event;
}
} // namespace system
} // namespace power_manager