Skip to content

Commit

Permalink
mfd: cros-ec: Increase maximum mkbp event size
Browse files Browse the repository at this point in the history
Having a 16 byte mkbp event size makes it possible to send CEC
messages from the EC to the AP directly inside the mkbp event
instead of first doing a notification and then a read.

Signed-off-by: Stefan Adolfsson <[email protected]>
Signed-off-by: Neil Armstrong <[email protected]>
Tested-by: Enric Balletbo i Serra <[email protected]>
Acked-by: Hans Verkuil <[email protected]>
Signed-off-by: Lee Jones <[email protected]>
  • Loading branch information
superna9999 authored and Lee Jones committed Jul 13, 2018
1 parent 9c22912 commit 57e94c8
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 10 deletions.
40 changes: 31 additions & 9 deletions drivers/platform/chrome/cros_ec_proto.c
Original file line number Diff line number Diff line change
Expand Up @@ -506,29 +506,51 @@ int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev,
}
EXPORT_SYMBOL(cros_ec_cmd_xfer_status);

static int get_next_event_xfer(struct cros_ec_device *ec_dev,
struct cros_ec_command *msg,
int version, uint32_t size)
{
int ret;

msg->version = version;
msg->command = EC_CMD_GET_NEXT_EVENT;
msg->insize = size;
msg->outsize = 0;

ret = cros_ec_cmd_xfer(ec_dev, msg);
if (ret > 0) {
ec_dev->event_size = ret - 1;
memcpy(&ec_dev->event_data, msg->data, ec_dev->event_size);
}

return ret;
}

static int get_next_event(struct cros_ec_device *ec_dev)
{
u8 buffer[sizeof(struct cros_ec_command) + sizeof(ec_dev->event_data)];
struct cros_ec_command *msg = (struct cros_ec_command *)&buffer;
static int cmd_version = 1;
int ret;

if (ec_dev->suspended) {
dev_dbg(ec_dev->dev, "Device suspended.\n");
return -EHOSTDOWN;
}

msg->version = 0;
msg->command = EC_CMD_GET_NEXT_EVENT;
msg->insize = sizeof(ec_dev->event_data);
msg->outsize = 0;
if (cmd_version == 1) {
ret = get_next_event_xfer(ec_dev, msg, cmd_version,
sizeof(struct ec_response_get_next_event_v1));
if (ret < 0 || msg->result != EC_RES_INVALID_VERSION)
return ret;

ret = cros_ec_cmd_xfer(ec_dev, msg);
if (ret > 0) {
ec_dev->event_size = ret - 1;
memcpy(&ec_dev->event_data, msg->data,
sizeof(ec_dev->event_data));
/* Fallback to version 0 for future send attempts */
cmd_version = 0;
}

ret = get_next_event_xfer(ec_dev, msg, cmd_version,
sizeof(struct ec_response_get_next_event));

return ret;
}

Expand Down
2 changes: 1 addition & 1 deletion include/linux/mfd/cros_ec.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ struct cros_ec_device {
bool mkbp_event_supported;
struct blocking_notifier_head event_notifier;

struct ec_response_get_next_event event_data;
struct ec_response_get_next_event_v1 event_data;
int event_size;
u32 host_event_wake_mask;
};
Expand Down
16 changes: 16 additions & 0 deletions include/linux/mfd/cros_ec_commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -2093,12 +2093,28 @@ union ec_response_get_next_data {
uint32_t sysrq;
} __packed;

union ec_response_get_next_data_v1 {
uint8_t key_matrix[16];
uint32_t host_event;
uint32_t buttons;
uint32_t switches;
uint32_t sysrq;
uint32_t cec_events;
uint8_t cec_message[16];
} __packed;

struct ec_response_get_next_event {
uint8_t event_type;
/* Followed by event data if any */
union ec_response_get_next_data data;
} __packed;

struct ec_response_get_next_event_v1 {
uint8_t event_type;
/* Followed by event data if any */
union ec_response_get_next_data_v1 data;
} __packed;

/* Bit indices for buttons and switches.*/
/* Buttons */
#define EC_MKBP_POWER_BUTTON 0
Expand Down

0 comments on commit 57e94c8

Please sign in to comment.