diff options
-rw-r--r-- | board/amenia/ec.tasklist | 3 | ||||
-rw-r--r-- | board/kevin/ec.tasklist | 3 | ||||
-rw-r--r-- | board/reef/ec.tasklist | 3 | ||||
-rw-r--r-- | common/usb_charger.c | 5 | ||||
-rw-r--r-- | driver/charger/bd99955.c | 76 | ||||
-rw-r--r-- | include/usb_charge.h | 7 |
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 |