summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/usb_charger.c18
-rw-r--r--include/usb_charge.h14
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