summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Tso <kyletso@google.com>2023-10-31 01:25:08 +0800
committerKyle Tso <kyletso@google.com>2023-11-06 21:22:23 +0800
commit6d65a433417a490eb9e56a040013bc662f549507 (patch)
tree28d8bf3459aba58b48b8e74c0774132dd4e82d01
parentb393b980a6006fa0888e30cd64578fc0ee0a10ea (diff)
downloadtangorpro-6d65a433417a490eb9e56a040013bc662f549507.tar.gz
pogo_transport: Support force_pogo in the new state machine
Bug: 306724827 Change-Id: I9aaeb554d0aaf03049972475f777e4d64472da45 Signed-off-by: Kyle Tso <kyletso@google.com>
-rw-r--r--pogo/pogo_transport.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/pogo/pogo_transport.c b/pogo/pogo_transport.c
index a1814e9..b2fad46 100644
--- a/pogo/pogo_transport.c
+++ b/pogo/pogo_transport.c
@@ -183,6 +183,7 @@ enum pogo_event_type {
#define EVENT_USBC_ORIENTATION BIT(7)
#define EVENT_LC_STATUS_CHANGED BIT(8)
#define EVENT_USB_SUSPEND BIT(9)
+#define EVENT_FORCE_POGO BIT(10)
#define EVENT_LAST_EVENT_TYPE BIT(63)
enum lc_stages {
@@ -1566,6 +1567,31 @@ static void pogo_transport_enable_usb_data(struct pogo_transport *pogo_transport
}
/*
+ * Called when device attribute "force_pogo" is written to 1
+ * - Triggered from event: EVENT_FORCE_POGO
+ *
+ * This function is guarded by (max77759_plat)->data_path_lock
+ */
+static void pogo_transport_force_pogo(struct pogo_transport *pogo_transport)
+{
+ struct max77759_plat *chip = pogo_transport->chip;
+
+ switch (pogo_transport->state) {
+ case HOST_DIRECT_DOCK_OFFLINE:
+ switch_to_hub_locked(pogo_transport);
+ /*
+ * Set data_active so that once USB-C cable is detached later, Type-C stack is able
+ * to call back for the data changed event
+ */
+ chip->data_active = true;
+ pogo_transport_set_state(pogo_transport, DOCK_HUB_HOST_OFFLINE, 0);
+ break;
+ default:
+ return;
+ }
+}
+
+/*
* Call this function to:
* - Disable POGO OVP
* - Disable Accessory Detection IRQ
@@ -2273,6 +2299,10 @@ static void pogo_transport_event_handler(struct kthread_work *work)
logbuffer_log(pogo_transport->log, "EV:ENABLE_USB");
pogo_transport_enable_usb_data(pogo_transport);
}
+ if (events & EVENT_FORCE_POGO) {
+ logbuffer_log(pogo_transport->log, "EV:FORCE_POGO");
+ pogo_transport_force_pogo(pogo_transport);
+ }
if (events & EVENT_HES_H1S_CHANGED) {
logbuffer_log(pogo_transport->log, "EV:H1S state %d",
pogo_transport->hall1_s_state);
@@ -3245,10 +3275,16 @@ static ssize_t force_pogo_store(struct device *dev, struct device_attribute *att
if (kstrtobool(buf, &force_pogo))
return -EINVAL;
+ if (pogo_transport->force_pogo == force_pogo)
+ return size;
+
pogo_transport->force_pogo = force_pogo;
if (force_pogo && !pogo_transport->state_machine_enabled)
pogo_transport_event(pogo_transport, EVENT_MOVE_DATA_TO_POGO, 0);
+ if (force_pogo && pogo_transport->state_machine_enabled)
+ pogo_transport_queue_event(pogo_transport, EVENT_FORCE_POGO);
+
return size;
}