Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 57e94c8b authored by Neil Armstrong's avatar Neil Armstrong Committed by Lee Jones
Browse files

mfd: cros-ec: Increase maximum mkbp event size



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: default avatarStefan Adolfsson <sadolfsson@chromium.org>
Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Tested-by: default avatarEnric Balletbo i Serra <enric.balletbo@collabora.com>
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 9c229127
Loading
Loading
Loading
Loading
+31 −9
Original line number Diff line number Diff line
@@ -506,10 +506,31 @@ 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) {
@@ -517,18 +538,19 @@ static int get_next_event(struct cros_ec_device *ec_dev)
		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;
}

+1 −1
Original line number Diff line number Diff line
@@ -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;
};
+16 −0
Original line number Diff line number Diff line
@@ -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