Commit 784dd15c authored by Gwendal Grignou's avatar Gwendal Grignou Committed by Lee Jones

mfd: cros_ec: Fix event processing API

Improve API between EC and Host to report events.
Signed-off-by: default avatarGwendal Grignou <gwendal@chromium.org>
Acked-by: default avatarEnric Balletbo i Serra <enric.balletbo@collabora.com>
Acked-by: default avatarBenson Leung <bleung@chromium.org>
Reviewed-by: default avatarFabien Lahoudere <fabien.lahoudere@collabora.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent a517bb4b
...@@ -500,7 +500,8 @@ enum host_event_code { ...@@ -500,7 +500,8 @@ enum host_event_code {
EC_HOST_EVENT_BATTERY_CRITICAL = 7, EC_HOST_EVENT_BATTERY_CRITICAL = 7,
EC_HOST_EVENT_BATTERY = 8, EC_HOST_EVENT_BATTERY = 8,
EC_HOST_EVENT_THERMAL_THRESHOLD = 9, EC_HOST_EVENT_THERMAL_THRESHOLD = 9,
EC_HOST_EVENT_THERMAL_OVERLOAD = 10, /* Event generated by a device attached to the EC */
EC_HOST_EVENT_DEVICE = 10,
EC_HOST_EVENT_THERMAL = 11, EC_HOST_EVENT_THERMAL = 11,
EC_HOST_EVENT_USB_CHARGER = 12, EC_HOST_EVENT_USB_CHARGER = 12,
EC_HOST_EVENT_KEY_PRESSED = 13, EC_HOST_EVENT_KEY_PRESSED = 13,
...@@ -527,15 +528,34 @@ enum host_event_code { ...@@ -527,15 +528,34 @@ enum host_event_code {
EC_HOST_EVENT_HANG_DETECT = 20, EC_HOST_EVENT_HANG_DETECT = 20,
/* Hang detect logic detected a hang and warm rebooted the AP */ /* Hang detect logic detected a hang and warm rebooted the AP */
EC_HOST_EVENT_HANG_REBOOT = 21, EC_HOST_EVENT_HANG_REBOOT = 21,
/* PD MCU triggering host event */ /* PD MCU triggering host event */
EC_HOST_EVENT_PD_MCU = 22, EC_HOST_EVENT_PD_MCU = 22,
/* EC desires to change state of host-controlled USB mux */ /* Battery Status flags have changed */
EC_HOST_EVENT_USB_MUX = 28, EC_HOST_EVENT_BATTERY_STATUS = 23,
/* EC encountered a panic, triggering a reset */
EC_HOST_EVENT_PANIC = 24,
/* Keyboard fastboot combo has been pressed */
EC_HOST_EVENT_KEYBOARD_FASTBOOT = 25,
/* EC RTC event occurred */ /* EC RTC event occurred */
EC_HOST_EVENT_RTC = 26, EC_HOST_EVENT_RTC = 26,
/* Emulate MKBP event */
EC_HOST_EVENT_MKBP = 27,
/* EC desires to change state of host-controlled USB mux */
EC_HOST_EVENT_USB_MUX = 28,
/* TABLET/LAPTOP mode or detachable base attach/detach event */
EC_HOST_EVENT_MODE_CHANGE = 29,
/* Keyboard recovery combo with hardware reinitialization */
EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT = 30,
/* /*
* The high bit of the event mask is not used as a host event code. If * The high bit of the event mask is not used as a host event code. If
* it reads back as set, then the entire event mask should be * it reads back as set, then the entire event mask should be
...@@ -1259,7 +1279,7 @@ enum ec_feature_code { ...@@ -1259,7 +1279,7 @@ enum ec_feature_code {
EC_FEATURE_REFINED_TABLET_MODE_HYSTERESIS = 37, EC_FEATURE_REFINED_TABLET_MODE_HYSTERESIS = 37,
/* EC supports audio codec. */ /* EC supports audio codec. */
EC_FEATURE_AUDIO_CODEC = 38, EC_FEATURE_AUDIO_CODEC = 38,
/* EC Supports SCP. */ /* The MCU is a System Companion Processor (SCP). */
EC_FEATURE_SCP = 39, EC_FEATURE_SCP = 39,
/* The MCU is an Integrated Sensor Hub */ /* The MCU is an Integrated Sensor Hub */
EC_FEATURE_ISH = 40, EC_FEATURE_ISH = 40,
...@@ -3183,12 +3203,23 @@ struct ec_result_keyscan_seq_ctrl { ...@@ -3183,12 +3203,23 @@ struct ec_result_keyscan_seq_ctrl {
} __ec_todo_packed; } __ec_todo_packed;
/* /*
* Command for retrieving the next pending MKBP event from the EC device * Get the next pending MKBP event.
* *
* The device replies with UNAVAILABLE if there aren't any pending events. * Returns EC_RES_UNAVAILABLE if there is no event pending.
*/ */
#define EC_CMD_GET_NEXT_EVENT 0x0067 #define EC_CMD_GET_NEXT_EVENT 0x0067
#define EC_MKBP_HAS_MORE_EVENTS_SHIFT 7
/*
* We use the most significant bit of the event type to indicate to the host
* that the EC has more MKBP events available to provide.
*/
#define EC_MKBP_HAS_MORE_EVENTS BIT(EC_MKBP_HAS_MORE_EVENTS_SHIFT)
/* The mask to apply to get the raw event type */
#define EC_MKBP_EVENT_TYPE_MASK (BIT(EC_MKBP_HAS_MORE_EVENTS_SHIFT) - 1)
enum ec_mkbp_event { enum ec_mkbp_event {
/* Keyboard matrix changed. The event data is the new matrix state. */ /* Keyboard matrix changed. The event data is the new matrix state. */
EC_MKBP_EVENT_KEY_MATRIX = 0, EC_MKBP_EVENT_KEY_MATRIX = 0,
...@@ -3205,9 +3236,21 @@ enum ec_mkbp_event { ...@@ -3205,9 +3236,21 @@ enum ec_mkbp_event {
/* The state of the switches have changed. */ /* The state of the switches have changed. */
EC_MKBP_EVENT_SWITCH = 4, EC_MKBP_EVENT_SWITCH = 4,
/* EC sent a sysrq command */ /* New Fingerprint sensor event, the event data is fp_events bitmap. */
EC_MKBP_EVENT_FINGERPRINT = 5,
/*
* Sysrq event: send emulated sysrq. The event data is sysrq,
* corresponding to the key to be pressed.
*/
EC_MKBP_EVENT_SYSRQ = 6, EC_MKBP_EVENT_SYSRQ = 6,
/*
* New 64-bit host event.
* The event data is 8 bytes of host event flags.
*/
EC_MKBP_EVENT_HOST_EVENT64 = 7,
/* Notify the AP that something happened on CEC */ /* Notify the AP that something happened on CEC */
EC_MKBP_EVENT_CEC_EVENT = 8, EC_MKBP_EVENT_CEC_EVENT = 8,
...@@ -3217,12 +3260,14 @@ enum ec_mkbp_event { ...@@ -3217,12 +3260,14 @@ enum ec_mkbp_event {
/* Number of MKBP events */ /* Number of MKBP events */
EC_MKBP_EVENT_COUNT, EC_MKBP_EVENT_COUNT,
}; };
BUILD_ASSERT(EC_MKBP_EVENT_COUNT <= EC_MKBP_EVENT_TYPE_MASK);
union __ec_align_offset1 ec_response_get_next_data { union __ec_align_offset1 ec_response_get_next_data {
uint8_t key_matrix[13]; uint8_t key_matrix[13];
/* Unaligned */ /* Unaligned */
uint32_t host_event; uint32_t host_event;
uint64_t host_event64;
struct __ec_todo_unpacked { struct __ec_todo_unpacked {
/* For aligning the fifo_info */ /* For aligning the fifo_info */
...@@ -3230,14 +3275,25 @@ union __ec_align_offset1 ec_response_get_next_data { ...@@ -3230,14 +3275,25 @@ union __ec_align_offset1 ec_response_get_next_data {
struct ec_response_motion_sense_fifo_info info; struct ec_response_motion_sense_fifo_info info;
} sensor_fifo; } sensor_fifo;
uint32_t buttons; uint32_t buttons;
uint32_t switches;
uint32_t sysrq; uint32_t switches;
uint32_t fp_events;
uint32_t sysrq;
/* CEC events from enum mkbp_cec_event */
uint32_t cec_events;
}; };
union __ec_align_offset1 ec_response_get_next_data_v1 { union __ec_align_offset1 ec_response_get_next_data_v1 {
uint8_t key_matrix[16]; uint8_t key_matrix[16];
/* Unaligned */
uint32_t host_event; uint32_t host_event;
uint64_t host_event64;
struct __ec_todo_unpacked { struct __ec_todo_unpacked {
/* For aligning the fifo_info */ /* For aligning the fifo_info */
uint8_t reserved[3]; uint8_t reserved[3];
...@@ -3245,11 +3301,19 @@ union __ec_align_offset1 ec_response_get_next_data_v1 { ...@@ -3245,11 +3301,19 @@ union __ec_align_offset1 ec_response_get_next_data_v1 {
} sensor_fifo; } sensor_fifo;
uint32_t buttons; uint32_t buttons;
uint32_t switches; uint32_t switches;
uint32_t fp_events;
uint32_t sysrq; uint32_t sysrq;
/* CEC events from enum mkbp_cec_event */
uint32_t cec_events; uint32_t cec_events;
uint8_t cec_message[16]; uint8_t cec_message[16];
}; };
BUILD_ASSERT(sizeof(union ec_response_get_next_data_v1) == 16);
struct ec_response_get_next_event { struct ec_response_get_next_event {
uint8_t event_type; uint8_t event_type;
...@@ -3268,6 +3332,7 @@ struct ec_response_get_next_event_v1 { ...@@ -3268,6 +3332,7 @@ struct ec_response_get_next_event_v1 {
#define EC_MKBP_POWER_BUTTON 0 #define EC_MKBP_POWER_BUTTON 0
#define EC_MKBP_VOL_UP 1 #define EC_MKBP_VOL_UP 1
#define EC_MKBP_VOL_DOWN 2 #define EC_MKBP_VOL_DOWN 2
#define EC_MKBP_RECOVERY 3
/* Switches */ /* Switches */
#define EC_MKBP_LID_OPEN 0 #define EC_MKBP_LID_OPEN 0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment