* [PATCH 0/3] mfd: cros_ec: non-wake host events support
@ 2017-01-25 17:01 Thierry Escande
2017-01-25 17:01 ` [PATCH 1/3] cros_ec: Don't return error when checking command version Thierry Escande
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Thierry Escande @ 2017-01-25 17:01 UTC (permalink / raw)
To: Lee Jones; +Cc: Benson Leung, linux-kernel
Hi,
This patchset adds support for non-wake host events. These are events
sent by the EC that should not wakeup the device.
This patchset also adds 2 fixes in cros_ec regarding a possible deadlock
and an error code returned when it should not.
Gwendal Grignou (1):
cros_ec: Fix deadlock when EC is not responsive at probe
Shawn Nematbakhsh (1):
cros_ec: Don't signal wake event for non-wake host events
Thierry Escande (1):
cros_ec: Don't return error when checking command version
drivers/mfd/cros_ec.c | 14 +++++-
drivers/platform/chrome/cros_ec_proto.c | 80 ++++++++++++++++++++++++++++++++-
include/linux/mfd/cros_ec.h | 12 +++++
3 files changed, 103 insertions(+), 3 deletions(-)
--
2.7.4
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 1/3] cros_ec: Don't return error when checking command version 2017-01-25 17:01 [PATCH 0/3] mfd: cros_ec: non-wake host events support Thierry Escande @ 2017-01-25 17:01 ` Thierry Escande 2017-01-25 17:01 ` [PATCH 2/3] cros_ec: Fix deadlock when EC is not responsive at probe Thierry Escande 2017-01-25 17:01 ` [PATCH 3/3] cros_ec: Don't signal wake event for non-wake host events Thierry Escande 2 siblings, 0 replies; 6+ messages in thread From: Thierry Escande @ 2017-01-25 17:01 UTC (permalink / raw) To: Lee Jones; +Cc: Benson Leung, linux-kernel With this patch, cros_ec_query_all() does not return an error if it fails to check for MKBP events support. Instead, the EC device structure indicates that it does not support MKBP events (mkbp_event_supported field) and cros_ec_query_all() returns 0. Signed-off-by: Thierry Escande <thierry.escande@collabora.com> --- drivers/platform/chrome/cros_ec_proto.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c index 04053fe..403649a 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -371,6 +371,8 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) else ec_dev->mkbp_event_supported = 1; + ret = 0; + exit: kfree(proto_msg); return ret; -- 2.7.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/3] cros_ec: Fix deadlock when EC is not responsive at probe 2017-01-25 17:01 [PATCH 0/3] mfd: cros_ec: non-wake host events support Thierry Escande 2017-01-25 17:01 ` [PATCH 1/3] cros_ec: Don't return error when checking command version Thierry Escande @ 2017-01-25 17:01 ` Thierry Escande 2017-01-25 17:01 ` [PATCH 3/3] cros_ec: Don't signal wake event for non-wake host events Thierry Escande 2 siblings, 0 replies; 6+ messages in thread From: Thierry Escande @ 2017-01-25 17:01 UTC (permalink / raw) To: Lee Jones; +Cc: Benson Leung, linux-kernel From: Gwendal Grignou <gwendal@chromium.org> When the EC is not responsive at probe, we try to get basic information (protocol to use) later on through cros_xfer_cmd() call. This patch makes sure there is no deadlock when re-probing the EC by replacing call to cros_xfer_cmd() with send_command() in the function cros_ec_get_host_command_version_mask(). Also, this patch adds the function header indicating it must be called protected. Signed-off-by: Gwendal Grignou <gwendal@chromium.org> Signed-off-by: Thierry Escande <thierry.escande@collabora.com> --- drivers/platform/chrome/cros_ec_proto.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c index 403649a..256249b 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -235,6 +235,22 @@ static int cros_ec_host_command_proto_query_v2(struct cros_ec_device *ec_dev) return ret; } +/* + * cros_ec_get_host_command_version_mask + * + * Get the version mask of a given command. + * + * @ec_dev: EC device to call + * @msg: message structure to use + * @cmd: command to get the version of. + * @mask: result when function returns 0. + * + * @return 0 on success, error code otherwise + * + * LOCKING: + * the caller has ec_dev->lock mutex or the caller knows there is + * no other command in progress. + */ static int cros_ec_get_host_command_version_mask(struct cros_ec_device *ec_dev, u16 cmd, u32 *mask) { @@ -256,7 +272,7 @@ static int cros_ec_get_host_command_version_mask(struct cros_ec_device *ec_dev, pver = (struct ec_params_get_cmd_versions *)msg->data; pver->cmd = cmd; - ret = cros_ec_cmd_xfer(ec_dev, msg); + ret = send_command(ec_dev, msg); if (ret > 0) { rver = (struct ec_response_get_cmd_versions *)msg->data; *mask = rver->version_mask; -- 2.7.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 3/3] cros_ec: Don't signal wake event for non-wake host events 2017-01-25 17:01 [PATCH 0/3] mfd: cros_ec: non-wake host events support Thierry Escande 2017-01-25 17:01 ` [PATCH 1/3] cros_ec: Don't return error when checking command version Thierry Escande 2017-01-25 17:01 ` [PATCH 2/3] cros_ec: Fix deadlock when EC is not responsive at probe Thierry Escande @ 2017-01-25 17:01 ` Thierry Escande 2017-02-07 16:12 ` Lee Jones 2 siblings, 1 reply; 6+ messages in thread From: Thierry Escande @ 2017-01-25 17:01 UTC (permalink / raw) To: Lee Jones; +Cc: Benson Leung, linux-kernel From: Shawn Nematbakhsh <shawnn@chromium.org> The subset of wake-enabled host events is defined by the EC, but the EC may still send non-wake host events if we're in the process of suspending. Get the mask of wake-enabled host events from the EC and filter out non-wake events to prevent spurious aborted suspend attempts. Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Signed-off-by: Thierry Escande <thierry.escande@collabora.com> --- drivers/mfd/cros_ec.c | 14 ++++++-- drivers/platform/chrome/cros_ec_proto.c | 60 +++++++++++++++++++++++++++++++++ include/linux/mfd/cros_ec.h | 12 +++++++ 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/drivers/mfd/cros_ec.c b/drivers/mfd/cros_ec.c index abd8342..510dfbb 100644 --- a/drivers/mfd/cros_ec.c +++ b/drivers/mfd/cros_ec.c @@ -53,12 +53,22 @@ static const struct mfd_cell ec_pd_cell = { static irqreturn_t ec_irq_thread(int irq, void *data) { struct cros_ec_device *ec_dev = data; + u8 wake_event = 1; + u32 host_event; int ret; - if (device_may_wakeup(ec_dev->dev)) + ret = cros_ec_get_next_event(ec_dev); + + if (ret > 0 && ec_dev->mkbp_event_supported) { + /* Don't signal wake event for non-wake host events */ + host_event = cros_ec_get_host_event(ec_dev); + if (host_event && !(host_event & ec_dev->host_event_wake_mask)) + wake_event = 0; + } + + if (wake_event && device_may_wakeup(ec_dev->dev)) pm_wakeup_event(ec_dev->dev, 0); - ret = cros_ec_get_next_event(ec_dev); if (ret > 0) blocking_notifier_call_chain(&ec_dev->event_notifier, 0, ec_dev); diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c index 256249b..a216a32 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -150,6 +150,40 @@ int cros_ec_check_result(struct cros_ec_device *ec_dev, } EXPORT_SYMBOL(cros_ec_check_result); +/* + * cros_ec_get_host_event_wake_mask + * + * Get the mask of host events that cause wake from suspend. + * + * @ec_dev: EC device to call + * @msg: message structure to use + * @mask: result when function returns >=0. + * + * LOCKING: + * the caller has ec_dev->lock mutex, or the caller knows there is + * no other command in progress. + */ +static int cros_ec_get_host_event_wake_mask(struct cros_ec_device *ec_dev, + struct cros_ec_command *msg, + uint32_t *mask) +{ + struct ec_response_host_event_mask *r; + int ret; + + msg->command = EC_CMD_HOST_EVENT_GET_WAKE_MASK; + msg->version = 0; + msg->outsize = 0; + msg->insize = sizeof(*r); + + ret = send_command(ec_dev, msg); + if (ret > 0) { + r = (struct ec_response_host_event_mask *)msg->data; + *mask = r->mask; + } + + return ret; +} + static int cros_ec_host_command_proto_query(struct cros_ec_device *ec_dev, int devidx, struct cros_ec_command *msg) @@ -387,6 +421,15 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) else ec_dev->mkbp_event_supported = 1; + /* + * Get host event wake mask, assume all events are wake events + * if unavailable. + */ + ret = cros_ec_get_host_event_wake_mask(ec_dev, proto_msg, + &ec_dev->host_event_wake_mask); + if (ret < 0) + ec_dev->host_event_wake_mask = U32_MAX; + ret = 0; exit: @@ -507,3 +550,20 @@ int cros_ec_get_next_event(struct cros_ec_device *ec_dev) return get_keyboard_state_event(ec_dev); } EXPORT_SYMBOL(cros_ec_get_next_event); + +u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev) +{ + if (WARN_ON(!ec_dev->mkbp_event_supported)) + return 0; + + if (ec_dev->event_data.event_type != EC_MKBP_EVENT_HOST_EVENT) + return 0; + + if (ec_dev->event_size != sizeof(u32)) { + dev_warn(ec_dev->dev, "Invalid host event size\n"); + return 0; + } + + return get_unaligned_le32(&ec_dev->event_data.data.host_event); +} +EXPORT_SYMBOL(cros_ec_get_host_event); diff --git a/include/linux/mfd/cros_ec.h b/include/linux/mfd/cros_ec.h index f62043a..8f37c4e 100644 --- a/include/linux/mfd/cros_ec.h +++ b/include/linux/mfd/cros_ec.h @@ -146,6 +146,7 @@ struct cros_ec_device { struct ec_response_get_next_event event_data; int event_size; + u32 host_event_wake_mask; }; /** @@ -297,6 +298,17 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev); */ int cros_ec_get_next_event(struct cros_ec_device *ec_dev); +/** + * cros_ec_get_host_event - Return a mask of event set by the EC. + * + * Once cros_ec_get_next_event() has been called, if the event source is + * a host event, this function returns the precise event that triggered + * the interrupt. + * + * This function is a helper to know which events are raised. + */ +u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev); + /* sysfs stuff */ extern struct attribute_group cros_ec_attr_group; extern struct attribute_group cros_ec_lightbar_attr_group; -- 2.7.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 3/3] cros_ec: Don't signal wake event for non-wake host events 2017-01-25 17:01 ` [PATCH 3/3] cros_ec: Don't signal wake event for non-wake host events Thierry Escande @ 2017-02-07 16:12 ` Lee Jones 2017-02-13 12:42 ` Thierry Escande 0 siblings, 1 reply; 6+ messages in thread From: Lee Jones @ 2017-02-07 16:12 UTC (permalink / raw) To: Thierry Escande; +Cc: Benson Leung, linux-kernel On Wed, 25 Jan 2017, Thierry Escande wrote: > From: Shawn Nematbakhsh <shawnn@chromium.org> > > The subset of wake-enabled host events is defined by the EC, but the EC > may still send non-wake host events if we're in the process of > suspending. Get the mask of wake-enabled host events from the EC and > filter out non-wake events to prevent spurious aborted suspend > attempts. > > Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> > Signed-off-by: Thierry Escande <thierry.escande@collabora.com> > --- > drivers/mfd/cros_ec.c | 14 ++++++-- > drivers/platform/chrome/cros_ec_proto.c | 60 +++++++++++++++++++++++++++++++++ > include/linux/mfd/cros_ec.h | 12 +++++++ > 3 files changed, 84 insertions(+), 2 deletions(-) > > diff --git a/drivers/mfd/cros_ec.c b/drivers/mfd/cros_ec.c > index abd8342..510dfbb 100644 > --- a/drivers/mfd/cros_ec.c > +++ b/drivers/mfd/cros_ec.c > @@ -53,12 +53,22 @@ static const struct mfd_cell ec_pd_cell = { > static irqreturn_t ec_irq_thread(int irq, void *data) > { > struct cros_ec_device *ec_dev = data; > + u8 wake_event = 1; Bool, true? > + u32 host_event; > int ret; > > - if (device_may_wakeup(ec_dev->dev)) > + ret = cros_ec_get_next_event(ec_dev); What does (ret == 0) mean? ... and is is possible for (ret < 0)? > + if (ret > 0 && ec_dev->mkbp_event_supported) { cros_ec_get_host_event() checks for (ec_dev->mkbp_event_supported) anyway, so you can drop it here no? > + /* Don't signal wake event for non-wake host events */ > + host_event = cros_ec_get_host_event(ec_dev); > + if (host_event && !(host_event & ec_dev->host_event_wake_mask)) > + wake_event = 0; false > + } > + > + if (wake_event && device_may_wakeup(ec_dev->dev)) > pm_wakeup_event(ec_dev->dev, 0); > > - ret = cros_ec_get_next_event(ec_dev); > if (ret > 0) > blocking_notifier_call_chain(&ec_dev->event_notifier, > 0, ec_dev); > diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c > index 256249b..a216a32 100644 > --- a/drivers/platform/chrome/cros_ec_proto.c > +++ b/drivers/platform/chrome/cros_ec_proto.c > @@ -150,6 +150,40 @@ int cros_ec_check_result(struct cros_ec_device *ec_dev, > } > EXPORT_SYMBOL(cros_ec_check_result); > > +/* > + * cros_ec_get_host_event_wake_mask > + * > + * Get the mask of host events that cause wake from suspend. > + * > + * @ec_dev: EC device to call > + * @msg: message structure to use > + * @mask: result when function returns >=0. > + * > + * LOCKING: > + * the caller has ec_dev->lock mutex, or the caller knows there is > + * no other command in progress. > + */ > +static int cros_ec_get_host_event_wake_mask(struct cros_ec_device *ec_dev, > + struct cros_ec_command *msg, > + uint32_t *mask) > +{ > + struct ec_response_host_event_mask *r; > + int ret; > + > + msg->command = EC_CMD_HOST_EVENT_GET_WAKE_MASK; > + msg->version = 0; > + msg->outsize = 0; > + msg->insize = sizeof(*r); > + > + ret = send_command(ec_dev, msg); > + if (ret > 0) { > + r = (struct ec_response_host_event_mask *)msg->data; > + *mask = r->mask; > + } > + > + return ret; > +} > + > static int cros_ec_host_command_proto_query(struct cros_ec_device *ec_dev, > int devidx, > struct cros_ec_command *msg) > @@ -387,6 +421,15 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) > else > ec_dev->mkbp_event_supported = 1; > > + /* > + * Get host event wake mask, assume all events are wake events > + * if unavailable. > + */ > + ret = cros_ec_get_host_event_wake_mask(ec_dev, proto_msg, > + &ec_dev->host_event_wake_mask); > + if (ret < 0) > + ec_dev->host_event_wake_mask = U32_MAX; > + > ret = 0; > > exit: > @@ -507,3 +550,20 @@ int cros_ec_get_next_event(struct cros_ec_device *ec_dev) > return get_keyboard_state_event(ec_dev); > } > EXPORT_SYMBOL(cros_ec_get_next_event); > + > +u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev) > +{ > + if (WARN_ON(!ec_dev->mkbp_event_supported)) > + return 0; > + > + if (ec_dev->event_data.event_type != EC_MKBP_EVENT_HOST_EVENT) > + return 0; > + > + if (ec_dev->event_size != sizeof(u32)) { > + dev_warn(ec_dev->dev, "Invalid host event size\n"); > + return 0; > + } > + > + return get_unaligned_le32(&ec_dev->event_data.data.host_event); > +} > +EXPORT_SYMBOL(cros_ec_get_host_event); > diff --git a/include/linux/mfd/cros_ec.h b/include/linux/mfd/cros_ec.h > index f62043a..8f37c4e 100644 > --- a/include/linux/mfd/cros_ec.h > +++ b/include/linux/mfd/cros_ec.h > @@ -146,6 +146,7 @@ struct cros_ec_device { > > struct ec_response_get_next_event event_data; > int event_size; > + u32 host_event_wake_mask; > }; > > /** > @@ -297,6 +298,17 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev); > */ > int cros_ec_get_next_event(struct cros_ec_device *ec_dev); > > +/** > + * cros_ec_get_host_event - Return a mask of event set by the EC. > + * > + * Once cros_ec_get_next_event() has been called, if the event source is > + * a host event, this function returns the precise event that triggered > + * the interrupt. > + * > + * This function is a helper to know which events are raised. > + */ > +u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev); > + > /* sysfs stuff */ > extern struct attribute_group cros_ec_attr_group; > extern struct attribute_group cros_ec_lightbar_attr_group; -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 3/3] cros_ec: Don't signal wake event for non-wake host events 2017-02-07 16:12 ` Lee Jones @ 2017-02-13 12:42 ` Thierry Escande 0 siblings, 0 replies; 6+ messages in thread From: Thierry Escande @ 2017-02-13 12:42 UTC (permalink / raw) To: Lee Jones; +Cc: Benson Leung, linux-kernel Hi Lee, On 07/02/2017 17:12, Lee Jones wrote: > On Wed, 25 Jan 2017, Thierry Escande wrote: > >> From: Shawn Nematbakhsh <shawnn@chromium.org> >> >> The subset of wake-enabled host events is defined by the EC, but the EC >> may still send non-wake host events if we're in the process of >> suspending. Get the mask of wake-enabled host events from the EC and >> filter out non-wake events to prevent spurious aborted suspend >> attempts. >> >> Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> >> Signed-off-by: Thierry Escande <thierry.escande@collabora.com> >> --- >> drivers/mfd/cros_ec.c | 14 ++++++-- >> drivers/platform/chrome/cros_ec_proto.c | 60 +++++++++++++++++++++++++++++++++ >> include/linux/mfd/cros_ec.h | 12 +++++++ >> 3 files changed, 84 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/mfd/cros_ec.c b/drivers/mfd/cros_ec.c >> index abd8342..510dfbb 100644 >> --- a/drivers/mfd/cros_ec.c >> +++ b/drivers/mfd/cros_ec.c >> @@ -53,12 +53,22 @@ static const struct mfd_cell ec_pd_cell = { >> static irqreturn_t ec_irq_thread(int irq, void *data) >> { >> struct cros_ec_device *ec_dev = data; >> + u8 wake_event = 1; > > Bool, true? Ok. > >> + u32 host_event; >> int ret; >> >> - if (device_may_wakeup(ec_dev->dev)) >> + ret = cros_ec_get_next_event(ec_dev); > > What does (ret == 0) mean? The get_next_event() API called from cros_ec_get_next_event() only sets event_data in the ec_dev structure if the command has actually been sent. So (ret == 0) is not treated as an error and is silently ignored. In this case, the interrupt is treated as a wake event. > > ... and is is possible for (ret < 0)? > >> + if (ret > 0 && ec_dev->mkbp_event_supported) { > > cros_ec_get_host_event() checks for (ec_dev->mkbp_event_supported) > anyway, so you can drop it here no? Sure but we only need to call cros_ec_get_host_event() if mkbp_event_supported is true. Anyway, I'll move the host_event check with cros_ec_get_host_event() into cros_ec_get_next_event() to avoid this double check. > >> + /* Don't signal wake event for non-wake host events */ >> + host_event = cros_ec_get_host_event(ec_dev); >> + if (host_event && !(host_event & ec_dev->host_event_wake_mask)) >> + wake_event = 0; > > false Will do. Thanks, Thierry > >> + } >> + >> + if (wake_event && device_may_wakeup(ec_dev->dev)) >> pm_wakeup_event(ec_dev->dev, 0); >> >> - ret = cros_ec_get_next_event(ec_dev); >> if (ret > 0) >> blocking_notifier_call_chain(&ec_dev->event_notifier, >> 0, ec_dev); >> diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c >> index 256249b..a216a32 100644 >> --- a/drivers/platform/chrome/cros_ec_proto.c >> +++ b/drivers/platform/chrome/cros_ec_proto.c >> @@ -150,6 +150,40 @@ int cros_ec_check_result(struct cros_ec_device *ec_dev, >> } >> EXPORT_SYMBOL(cros_ec_check_result); >> >> +/* >> + * cros_ec_get_host_event_wake_mask >> + * >> + * Get the mask of host events that cause wake from suspend. >> + * >> + * @ec_dev: EC device to call >> + * @msg: message structure to use >> + * @mask: result when function returns >=0. >> + * >> + * LOCKING: >> + * the caller has ec_dev->lock mutex, or the caller knows there is >> + * no other command in progress. >> + */ >> +static int cros_ec_get_host_event_wake_mask(struct cros_ec_device *ec_dev, >> + struct cros_ec_command *msg, >> + uint32_t *mask) >> +{ >> + struct ec_response_host_event_mask *r; >> + int ret; >> + >> + msg->command = EC_CMD_HOST_EVENT_GET_WAKE_MASK; >> + msg->version = 0; >> + msg->outsize = 0; >> + msg->insize = sizeof(*r); >> + >> + ret = send_command(ec_dev, msg); >> + if (ret > 0) { >> + r = (struct ec_response_host_event_mask *)msg->data; >> + *mask = r->mask; >> + } >> + >> + return ret; >> +} >> + >> static int cros_ec_host_command_proto_query(struct cros_ec_device *ec_dev, >> int devidx, >> struct cros_ec_command *msg) >> @@ -387,6 +421,15 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) >> else >> ec_dev->mkbp_event_supported = 1; >> >> + /* >> + * Get host event wake mask, assume all events are wake events >> + * if unavailable. >> + */ >> + ret = cros_ec_get_host_event_wake_mask(ec_dev, proto_msg, >> + &ec_dev->host_event_wake_mask); >> + if (ret < 0) >> + ec_dev->host_event_wake_mask = U32_MAX; >> + >> ret = 0; >> >> exit: >> @@ -507,3 +550,20 @@ int cros_ec_get_next_event(struct cros_ec_device *ec_dev) >> return get_keyboard_state_event(ec_dev); >> } >> EXPORT_SYMBOL(cros_ec_get_next_event); >> + >> +u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev) >> +{ >> + if (WARN_ON(!ec_dev->mkbp_event_supported)) >> + return 0; >> + >> + if (ec_dev->event_data.event_type != EC_MKBP_EVENT_HOST_EVENT) >> + return 0; >> + >> + if (ec_dev->event_size != sizeof(u32)) { >> + dev_warn(ec_dev->dev, "Invalid host event size\n"); >> + return 0; >> + } >> + >> + return get_unaligned_le32(&ec_dev->event_data.data.host_event); >> +} >> +EXPORT_SYMBOL(cros_ec_get_host_event); >> diff --git a/include/linux/mfd/cros_ec.h b/include/linux/mfd/cros_ec.h >> index f62043a..8f37c4e 100644 >> --- a/include/linux/mfd/cros_ec.h >> +++ b/include/linux/mfd/cros_ec.h >> @@ -146,6 +146,7 @@ struct cros_ec_device { >> >> struct ec_response_get_next_event event_data; >> int event_size; >> + u32 host_event_wake_mask; >> }; >> >> /** >> @@ -297,6 +298,17 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev); >> */ >> int cros_ec_get_next_event(struct cros_ec_device *ec_dev); >> >> +/** >> + * cros_ec_get_host_event - Return a mask of event set by the EC. >> + * >> + * Once cros_ec_get_next_event() has been called, if the event source is >> + * a host event, this function returns the precise event that triggered >> + * the interrupt. >> + * >> + * This function is a helper to know which events are raised. >> + */ >> +u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev); >> + >> /* sysfs stuff */ >> extern struct attribute_group cros_ec_attr_group; >> extern struct attribute_group cros_ec_lightbar_attr_group; > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-02-13 12:42 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-01-25 17:01 [PATCH 0/3] mfd: cros_ec: non-wake host events support Thierry Escande 2017-01-25 17:01 ` [PATCH 1/3] cros_ec: Don't return error when checking command version Thierry Escande 2017-01-25 17:01 ` [PATCH 2/3] cros_ec: Fix deadlock when EC is not responsive at probe Thierry Escande 2017-01-25 17:01 ` [PATCH 3/3] cros_ec: Don't signal wake event for non-wake host events Thierry Escande 2017-02-07 16:12 ` Lee Jones 2017-02-13 12:42 ` Thierry Escande
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®