summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2016-01-06 17:02:49 -0800
committerchrome-bot <chrome-bot@chromium.org>2016-01-07 20:12:58 -0800
commit126f48aa3f31065cb0f340a68219fa7894f1b53b (patch)
tree1ab62633dfe39d3956ec549d2da86d7f02b8b444 /common
parentc7c04e673efe535e00003fa66c83f7b19a5a0786 (diff)
downloadchrome-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.c34
-rw-r--r--common/usb_pd_policy.c6
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")));