summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/amenia/ec.tasklist3
-rw-r--r--board/kevin/ec.tasklist3
-rw-r--r--board/reef/ec.tasklist3
-rw-r--r--common/usb_charger.c5
-rw-r--r--driver/charger/bd99955.c76
-rw-r--r--include/usb_charge.h7
6 files changed, 62 insertions, 35 deletions
diff --git a/board/amenia/ec.tasklist b/board/amenia/ec.tasklist
index 8418f4d0f6..6abae5e7ba 100644
--- a/board/amenia/ec.tasklist
+++ b/board/amenia/ec.tasklist
@@ -19,8 +19,7 @@
#define CONFIG_TASK_LIST \
TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \
TASK_ALWAYS(ALS, als_task, NULL, TASK_STACK_SIZE) \
- TASK_ALWAYS(USB_CHG_P0, usb_charger_task, NULL, TASK_STACK_SIZE) \
- TASK_ALWAYS(USB_CHG_P1, usb_charger_task, NULL, TASK_STACK_SIZE) \
+ TASK_ALWAYS(USB_CHG, usb_charger_task, NULL, TASK_STACK_SIZE) \
TASK_ALWAYS(CHARGER, charger_task, NULL, LARGER_TASK_STACK_SIZE) \
TASK_NOTEST(MOTIONSENSE, motion_sense_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \
diff --git a/board/kevin/ec.tasklist b/board/kevin/ec.tasklist
index 922689f34a..df2e6ae389 100644
--- a/board/kevin/ec.tasklist
+++ b/board/kevin/ec.tasklist
@@ -18,8 +18,7 @@
*/
#define CONFIG_TASK_LIST \
TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \
- TASK_ALWAYS(USB_CHG_P0, usb_charger_task, NULL, TASK_STACK_SIZE) \
- TASK_ALWAYS(USB_CHG_P1, usb_charger_task, NULL, TASK_STACK_SIZE) \
+ TASK_ALWAYS(USB_CHG, usb_charger_task, NULL, TASK_STACK_SIZE) \
TASK_ALWAYS(CHARGER, charger_task, NULL, LARGER_TASK_STACK_SIZE) \
TASK_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \
TASK_NOTEST(MOTIONSENSE, motion_sense_task, NULL, VENTI_TASK_STACK_SIZE) \
diff --git a/board/reef/ec.tasklist b/board/reef/ec.tasklist
index cd755be38c..fe4d3eaa10 100644
--- a/board/reef/ec.tasklist
+++ b/board/reef/ec.tasklist
@@ -23,8 +23,7 @@
#define CONFIG_TASK_LIST \
TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \
TASK_ALWAYS(ALS, als_task, NULL, TASK_STACK_SIZE) \
- TASK_ALWAYS(USB_CHG_P0, usb_charger_task, NULL, TASK_STACK_SIZE) \
- TASK_ALWAYS(USB_CHG_P1, usb_charger_task, NULL, TASK_STACK_SIZE) \
+ TASK_ALWAYS(USB_CHG, usb_charger_task, NULL, TASK_STACK_SIZE) \
TASK_ALWAYS(CHARGER, charger_task, NULL, LARGER_TASK_STACK_SIZE) \
TASK_NOTEST(MOTIONSENSE, motion_sense_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \
diff --git a/common/usb_charger.c b/common/usb_charger.c
index 9888dac199..33754120a1 100644
--- a/common/usb_charger.c
+++ b/common/usb_charger.c
@@ -63,8 +63,13 @@ void usb_charger_vbus_change(int port, int vbus_level)
/* Update VBUS supplier and signal VBUS change to USB_CHG task */
update_vbus_supplier(port, vbus_level);
+#ifdef HAS_TASK_USB_CHG
/* USB Charger task */
+ task_set_event(TASK_ID_USB_CHG, (1 << port), 0);
+#else
+ /* USB Charger task(s) */
task_set_event(USB_CHG_PORT_TO_TASK_ID(port), USB_CHG_EVENT_VBUS, 0);
+#endif
#ifdef CONFIG_USB_PD_VBUS_DETECT_CHARGER
/* USB PD task */
diff --git a/driver/charger/bd99955.c b/driver/charger/bd99955.c
index 6f3ce6c90f..4e74823ebc 100644
--- a/driver/charger/bd99955.c
+++ b/driver/charger/bd99955.c
@@ -49,7 +49,7 @@ static enum bd99955_command charger_map_cmd = BD99955_INVALID_COMMAND;
static struct mutex bd99955_map_mutex;
-#if defined(HAS_TASK_USB_CHG_P0) || defined(HAS_TASK_USB_CHG_P1)
+#ifdef HAS_TASK_USB_CHG
/* USB switch */
static enum usb_switch usb_switch_state[BD99955_CHARGE_PORT_COUNT] = {
USB_SWITCH_DISCONNECT,
@@ -176,7 +176,7 @@ static int bd99955_get_charger_op_status(int *status)
BD99955_EXTENDED_COMMAND);
}
-#if defined(HAS_TASK_USB_CHG_P0) || defined(HAS_TASK_USB_CHG_P1)
+#ifdef HAS_TASK_USB_CHG
static int bd99955_get_bc12_device_type(enum bd99955_charge_port port)
{
int rv;
@@ -369,7 +369,36 @@ static int bd99955_get_vbus_detect_interrupts(int port, int get)
BD99955_EXTENDED_COMMAND);
}
#endif /* CONFIG_USB_PD_VBUS_DETECT_CHARGER */
-#endif /* defined(HAS_TASK_USB_CHG_P0) || defined(HAS_TASK_USB_CHG_P1) */
+
+static void usb_charger_task_init(int *bc12_type)
+{
+ int port;
+
+ for (port = 0; port < CONFIG_USB_PD_PORT_COUNT; port++) {
+ bc12_type[port] = CHARGE_SUPPLIER_NONE;
+
+#ifdef CONFIG_USB_PD_VBUS_DETECT_CHARGER
+ /* Clear any pending VBUS interrupts */
+ bd99955_get_vbus_detect_interrupts(port, 0);
+#endif
+ }
+}
+
+static void usb_charger_process(enum bd99955_charge_port port, int *bc12_type)
+{
+ int vbus_provided = pd_snk_is_vbus_provided(port);
+
+ if (vbus_provided) {
+ /* Charger/sync attached */
+ bc12_type[port] = bd99955_bc12_detect(port);
+ } else if (bc12_type[port] != CHARGE_SUPPLIER_NONE &&
+ !vbus_provided) {
+ /* Charger/sync detached */
+ bd99955_bc12_detach(port, bc12_type[port]);
+ bc12_type[port] = CHARGE_SUPPLIER_NONE;
+ }
+}
+#endif /* HAS_TASK_USB_CHG */
/* chip specific interfaces */
@@ -633,8 +662,7 @@ static void bd99995_init(void)
ch_raw_write16(BD99955_CMD_VM_CTRL_SET, reg,
BD99955_EXTENDED_COMMAND);
-#if (defined(HAS_TASK_USB_CHG_P0) || defined(HAS_TASK_USB_CHG_P1)) && \
- defined(CONFIG_USB_PD_VBUS_DETECT_CHARGER)
+#if defined(HAS_TASK_USB_CHG) && defined(CONFIG_USB_PD_VBUS_DETECT_CHARGER)
bd99955_enable_vbus_detect_interrupts(BD99955_CHARGE_PORT_VBUS, 1);
bd99955_enable_vbus_detect_interrupts(BD99955_CHARGE_PORT_VCC, 1);
#endif
@@ -721,7 +749,7 @@ int bd99955_select_input_port(enum bd99955_charge_port port)
BD99955_EXTENDED_COMMAND);
}
-#if defined(HAS_TASK_USB_CHG_P0) || defined(HAS_TASK_USB_CHG_P1)
+#ifdef HAS_TASK_USB_CHG
int bd99955_bc12_enable_charging(enum bd99955_charge_port port, int enable)
{
int rv;
@@ -756,8 +784,7 @@ int bd99955_bc12_enable_charging(enum bd99955_charge_port port, int enable)
void usb_charger_set_switches(int port, enum usb_switch setting)
{
/* If switch is not changing then return */
- if (setting == usb_switch_state[port] ||
- pd_snk_is_vbus_provided(port))
+ if (setting == usb_switch_state[port])
return;
if (setting != USB_SWITCH_RESTORE)
@@ -766,7 +793,6 @@ void usb_charger_set_switches(int port, enum usb_switch setting)
}
#ifdef CONFIG_USB_PD_VBUS_DETECT_CHARGER
-/* TODO: Use only one usb_charger_task for both the ports */
void bd99955_vbus_interrupt_deferred(void)
{
int port;
@@ -798,33 +824,25 @@ void bd99955_vbus_interrupt(enum gpio_signal signal)
void usb_charger_task(void)
{
- int port = (task_get_current() == TASK_ID_USB_CHG_P0 ? 0 : 1);
- int bc12_type = CHARGE_SUPPLIER_NONE;
- int vbus_provided;
+ int evt = USB_CHG_EVENT_VBUS_P0 | USB_CHG_EVENT_VBUS_P1;
+ int bc12_type[CONFIG_USB_PD_PORT_COUNT];
-#ifdef CONFIG_USB_PD_VBUS_DETECT_CHARGER
- /* Clear any pending VBUS interrupts */
- bd99955_get_vbus_detect_interrupts(port, 0);
-#endif
+ usb_charger_task_init(bc12_type);
while (1) {
- vbus_provided = pd_snk_is_vbus_provided(port);
-
- if (vbus_provided) {
- /* Charger/sync attached */
- bc12_type = bd99955_bc12_detect(port);
- } else if (bc12_type != CHARGE_SUPPLIER_NONE &&
- !vbus_provided) {
- /* Charger/sync detached */
- bd99955_bc12_detach(port, bc12_type);
- bc12_type = CHARGE_SUPPLIER_NONE;
- }
+ if (evt & USB_CHG_EVENT_VBUS_P0)
+ usb_charger_process(BD99955_CHARGE_PORT_VBUS,
+ &bc12_type[BD99955_CHARGE_PORT_VBUS]);
+
+ if (evt & USB_CHG_EVENT_VBUS_P1)
+ usb_charger_process(BD99955_CHARGE_PORT_VCC,
+ &bc12_type[BD99955_CHARGE_PORT_VCC]);
/* Wait for interrupt */
- task_wait_event(-1);
+ evt = task_wait_event(-1);
}
}
-#endif /* defined(HAS_TASK_USB_CHG_P0) || defined(HAS_TASK_USB_CHG_P1) */
+#endif /* HAS_TASK_USB_CHG */
/*** Console commands ***/
diff --git a/include/usb_charge.h b/include/usb_charge.h
index 5de334583d..382f373f8a 100644
--- a/include/usb_charge.h
+++ b/include/usb_charge.h
@@ -48,9 +48,16 @@ int usb_charge_set_mode(int usb_port_id, enum usb_charge_mode mode);
int usb_charge_ports_enabled(void);
/* Events handled by the USB_CHG task */
+#ifdef HAS_TASK_USB_CHG
+/* One task for all the ports */
+#define USB_CHG_EVENT_VBUS_P0 TASK_EVENT_CUSTOM(1)
+#define USB_CHG_EVENT_VBUS_P1 TASK_EVENT_CUSTOM(2)
+#elif defined(HAS_TASK_USB_CHG_P0)
+/* One task per port */
#define USB_CHG_EVENT_BC12 TASK_EVENT_CUSTOM(1)
#define USB_CHG_EVENT_VBUS TASK_EVENT_CUSTOM(2)
#define USB_CHG_EVENT_INTR TASK_EVENT_CUSTOM(4)
+#endif
/*
* Define USB_CHG_PORT_TO_TASK_ID() and TASK_ID_TO_USB_CHG__PORT() macros to