diff options
author | Kyle Tso <kyletso@google.com> | 2023-10-31 01:25:08 +0800 |
---|---|---|
committer | Kyle Tso <kyletso@google.com> | 2023-11-06 21:22:23 +0800 |
commit | 6d65a433417a490eb9e56a040013bc662f549507 (patch) | |
tree | 28d8bf3459aba58b48b8e74c0774132dd4e82d01 | |
parent | b393b980a6006fa0888e30cd64578fc0ee0a10ea (diff) | |
download | tangorpro-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.c | 36 |
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; } |