diff options
-rw-r--r-- | common/usb_charger.c | 18 | ||||
-rw-r--r-- | include/usb_charge.h | 14 |
2 files changed, 27 insertions, 5 deletions
diff --git a/common/usb_charger.c b/common/usb_charger.c index 60deade0ef..1452ada079 100644 --- a/common/usb_charger.c +++ b/common/usb_charger.c @@ -133,6 +133,15 @@ void usb_charger_task_set_event(int port, uint8_t event) #endif } +void usb_charger_task_set_event_sync(int port, uint8_t event) +{ + struct bc12_config *bc12_port; + + bc12_port = &bc12_ports[port]; + + bc12_port->drv->usb_charger_task_event(port, event); +} + static void usb_charger_init(void) { int i; @@ -175,9 +184,7 @@ void usb_charger_task_shared(void *u) atomic_and(&usb_charger_port_events, ~PORT_EVENT_PACK(port, port_evt)); - bc12_port = &bc12_ports[port]; - - bc12_port->drv->usb_charger_task_event(port, port_evt); + usb_charger_task_set_event_sync(port, port_evt); } } } @@ -200,13 +207,14 @@ void usb_charger_task(void *u) bc12_port = &bc12_ports[port]; ASSERT(bc12_port->drv->usb_charger_task_init); + ASSERT(bc12_port->drv->usb_charger_task_event); + bc12_port->drv->usb_charger_task_init(port); while (1) { evt = task_wait_event(-1); - ASSERT(bc12_port->drv->usb_charger_task_event); - bc12_port->drv->usb_charger_task_event(port, evt); + usb_charger_task_set_event_sync(port, evt); } } diff --git a/include/usb_charge.h b/include/usb_charge.h index cd022d5f51..290471c1c9 100644 --- a/include/usb_charge.h +++ b/include/usb_charge.h @@ -187,6 +187,20 @@ static inline int usb_charger_ramp_max(int port, int supplier, int sup_curr) void usb_charger_task_set_event(int port, uint8_t event); /** + * Synchronously handle an event for a specific USB charger port. + * + * This is the same as using usb_charger_task_set_event for a given port + * and event, but executes synchronously (on the calling thread) instead of + * asynchronously (on the dedicated USB charger thread). + * + * Most users should prefer to use the asynchronous equivalent, but it is + * sometimes necessary to use this version in order to avoid priority inversion + * when a higher-priority task must ensure BC1.2 processing completes before + * continuing. + */ +void usb_charger_task_set_event_sync(int port, uint8_t event); + +/** * Reset available BC 1.2 chargers on all ports * * @param port |