diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2016-01-06 17:02:49 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-01-07 20:12:58 -0800 |
commit | 126f48aa3f31065cb0f340a68219fa7894f1b53b (patch) | |
tree | 1ab62633dfe39d3956ec549d2da86d7f02b8b444 /common | |
parent | c7c04e673efe535e00003fa66c83f7b19a5a0786 (diff) | |
download | chrome-ec-126f48aa3f31065cb0f340a68219fa7894f1b53b.tar.gz |
pd: Add common EC_HOST_EVENT_PD_MCU implementation
For TCPMs with an off chip TCPC, PD MCU host event status can be handled
in a common way. When a status flag is updated (ex. from
charge_manager), notify the AP through the host event, and save the
status flag for later retrieval.
BUG=chrome-os-partner:49124
BRANCH=None
TEST=Verify `cat /sys/class/power_supply/CROS_USB_PD_CHARGER1/online` on
chell reflects the actual online status of the charger. Also verify UI
charge icon tracks the online status correctly.
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Change-Id: I63bc70205627474590e38ffd282faedaea3bcc66
Reviewed-on: https://chromium-review.googlesource.com/320796
Commit-Ready: Shawn N <shawnn@chromium.org>
Tested-by: Shawn N <shawnn@chromium.org>
Reviewed-by: Benson Leung <bleung@chromium.org>
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/host_command_pd.c | 34 | ||||
-rw-r--r-- | common/usb_pd_policy.c | 6 |
2 files changed, 34 insertions, 6 deletions
diff --git a/common/host_command_pd.c b/common/host_command_pd.c index 70178bf933..a6883dcfd8 100644 --- a/common/host_command_pd.c +++ b/common/host_command_pd.c @@ -219,3 +219,37 @@ void pd_command_task(void) pd_exchange_status(ec_state); } } + +#ifdef USB_TCPM_WITH_OFF_CHIP_TCPC +/* + * PD host event status for host command + * Note: this variable must be aligned on 4-byte boundary because we pass the + * address to atomic_ functions which use assembly to access them. + */ +static uint32_t pd_host_event_status __aligned(4); + +static int hc_pd_host_event_status(struct host_cmd_handler_args *args) +{ + struct ec_response_host_event_status *r = args->response; + + /* Read and clear the host event status to return to AP */ + r->status = atomic_read_clear(&pd_host_event_status); + + args->response_size = sizeof(*r); + return EC_RES_SUCCESS; +} +DECLARE_HOST_COMMAND(EC_CMD_PD_HOST_EVENT_STATUS, hc_pd_host_event_status, + EC_VER_MASK(0)); + +/* Send host event up to AP */ +void pd_send_host_event(int mask) +{ + /* mask must be set */ + if (!mask) + return; + + atomic_or(&pd_host_event_status, mask); + /* interrupt the AP */ + host_set_single_event(EC_HOST_EVENT_PD_MCU); +} +#endif diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c index b2bd91a512..a071f8b767 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -953,9 +953,3 @@ int pd_custom_flash_vdm(int port, int cnt, uint32_t *payload) } return rsize; } - -static void stub_pd_send_host_event(int mask) -{ -} -void pd_send_host_event(int mask) - __attribute__((weak, alias("stub_pd_send_host_event"))); |