diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2018-09-14 10:47:53 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-09-20 21:29:59 -0700 |
commit | 69246cf51011ca951e5c405f5a4d2ee4448eb66c (patch) | |
tree | d99ec6c42874d825f705bcd3ba3c7a709c103232 | |
parent | d5b9b8c12570a57def102d0039f0aef379582fb0 (diff) | |
download | chrome-ec-69246cf51011ca951e5c405f5a4d2ee4448eb66c.tar.gz |
chgmgr: Allow charge_manager_update_charge to accept NULL
Currently, charge_manager_update_charge does not handle NULL pointer
for struct charge_port_info any differently. It's not sanity-checked
either (thus memory access violation can occur).
This patch will make charge_manager_update_charge accept NULL pointer
and set available current and voltage to zero.
This also helps callers' intentions be clear because callers can
explicitly specify NULL (instead of passing a pointer to chg = {0},
which is initialized somewhere else).
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
BUG=none
BRANCH=none
TEST=buildall
Change-Id: I518662ab6a3a07f93da5d34cf62a6f856884f67d
Reviewed-on: https://chromium-review.googlesource.com/1226125
Commit-Ready: Daisuke Nojiri <dnojiri@chromium.org>
Tested-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
-rw-r--r-- | board/fizz/board.c | 3 | ||||
-rw-r--r-- | board/glkrvp/chg_usb_pd.c | 4 | ||||
-rw-r--r-- | board/glkrvp_ite/chg_usb_pd.c | 4 | ||||
-rw-r--r-- | common/charge_manager.c | 3 | ||||
-rw-r--r-- | common/usb_charger.c | 17 | ||||
-rw-r--r-- | driver/bc12/bq24392.c | 3 | ||||
-rw-r--r-- | driver/bc12/pi3usb9281.c | 42 | ||||
-rw-r--r-- | driver/charger/bd9995x.c | 4 | ||||
-rw-r--r-- | driver/charger/rt946x.c | 13 | ||||
-rw-r--r-- | include/charge_manager.h | 7 |
10 files changed, 39 insertions, 61 deletions
diff --git a/board/fizz/board.c b/board/fizz/board.c index ac51d43c22..b3617155fa 100644 --- a/board/fizz/board.c +++ b/board/fizz/board.c @@ -748,13 +748,12 @@ static void setup_bj(void) static void board_charge_manager_init(void) { enum charge_port port; - struct charge_port_info cpi = { 0 }; int i, j; /* Initialize all charge suppliers to 0 */ for (i = 0; i < CHARGE_PORT_COUNT; i++) { for (j = 0; j < CHARGE_SUPPLIER_COUNT; j++) - charge_manager_update_charge(j, i, &cpi); + charge_manager_update_charge(j, i, NULL); } port = gpio_get_level(GPIO_ADP_IN_L) ? diff --git a/board/glkrvp/chg_usb_pd.c b/board/glkrvp/chg_usb_pd.c index 65866b7c06..e9108d641a 100644 --- a/board/glkrvp/chg_usb_pd.c +++ b/board/glkrvp/chg_usb_pd.c @@ -162,13 +162,11 @@ DECLARE_HOOK(HOOK_AC_CHANGE, board_dc_jack_handle, HOOK_PRIO_FIRST); static void board_charge_init(void) { int port, supplier; - struct charge_port_info charge_init = {0}; /* Initialize all charge suppliers to seed the charge manager */ for (port = 0; port < CHARGE_PORT_COUNT; port++) { for (supplier = 0; supplier < CHARGE_SUPPLIER_COUNT; supplier++) - charge_manager_update_charge(supplier, port, - &charge_init); + charge_manager_update_charge(supplier, port, NULL); } board_dc_jack_handle(); diff --git a/board/glkrvp_ite/chg_usb_pd.c b/board/glkrvp_ite/chg_usb_pd.c index 5ef8d7a77e..0b1a188081 100644 --- a/board/glkrvp_ite/chg_usb_pd.c +++ b/board/glkrvp_ite/chg_usb_pd.c @@ -166,13 +166,11 @@ DECLARE_HOOK(HOOK_AC_CHANGE, board_dc_jack_handle, HOOK_PRIO_FIRST); static void board_charge_init(void) { int port, supplier; - struct charge_port_info charge_init = {0}; /* Initialize all charge suppliers to seed the charge manager */ for (port = 0; port < CHARGE_PORT_COUNT; port++) { for (supplier = 0; supplier < CHARGE_SUPPLIER_COUNT; supplier++) - charge_manager_update_charge(supplier, port, - &charge_init); + charge_manager_update_charge(supplier, port, NULL); } board_dc_jack_handle(); diff --git a/common/charge_manager.c b/common/charge_manager.c index 08bd3d1b0a..c7620a69dc 100644 --- a/common/charge_manager.c +++ b/common/charge_manager.c @@ -910,6 +910,9 @@ void charge_manager_update_charge(int supplier, int port, const struct charge_port_info *charge) { + struct charge_port_info zero = {0}; + if (!charge) + charge = &zero; charge_manager_make_change(CHANGE_CHARGE, supplier, port, charge); } diff --git a/common/usb_charger.c b/common/usb_charger.c index 545907ea72..361d019a52 100644 --- a/common/usb_charger.c +++ b/common/usb_charger.c @@ -18,6 +18,7 @@ #include "console.h" #include "gpio.h" #include "hooks.h" +#include "stddef.h" #include "task.h" #include "usb_charge.h" #include "usb_pd.h" @@ -83,25 +84,19 @@ void usb_charger_vbus_change(int port, int vbus_level) static void usb_charger_init(void) { int i; - struct charge_port_info charge_none = {0}; /* Initialize all charge suppliers */ for (i = 0; i < CONFIG_USB_PD_PORT_COUNT; i++) { charge_manager_update_charge(CHARGE_SUPPLIER_PROPRIETARY, - i, - &charge_none); + i, NULL); charge_manager_update_charge(CHARGE_SUPPLIER_BC12_CDP, - i, - &charge_none); + i, NULL); charge_manager_update_charge(CHARGE_SUPPLIER_BC12_DCP, - i, - &charge_none); + i, NULL); charge_manager_update_charge(CHARGE_SUPPLIER_BC12_SDP, - i, - &charge_none); + i, NULL); charge_manager_update_charge(CHARGE_SUPPLIER_OTHER, - i, - &charge_none); + i, NULL); /* Initialize VBUS supplier based on whether VBUS is present. */ update_vbus_supplier(i, pd_is_vbus_present(i)); } diff --git a/driver/bc12/bq24392.c b/driver/bc12/bq24392.c index 3092f9f794..b74781f221 100644 --- a/driver/bc12/bq24392.c +++ b/driver/bc12/bq24392.c @@ -107,13 +107,12 @@ static void bc12_detect(const int port) static void power_down_ic(const int port) { const struct bq24392_config_t * const cfg = &bq24392_config[port]; - struct charge_port_info no_chg = { 0 }; /* Turn off the IC. */ activate_chip_enable(cfg, 0); /* Let charge manager know there's no more charge available. */ - charge_manager_update_charge(CHARGE_SUPPLIER_OTHER, port, &no_chg); + charge_manager_update_charge(CHARGE_SUPPLIER_OTHER, port, NULL); } /** diff --git a/driver/bc12/pi3usb9281.c b/driver/bc12/pi3usb9281.c index 9bdf875468..f1bd3ce8d4 100644 --- a/driver/bc12/pi3usb9281.c +++ b/driver/bc12/pi3usb9281.c @@ -289,7 +289,6 @@ void usb_charger_set_switches(int port, enum usb_switch setting) static void bc12_detect(int port) { int device_type, charger_status; - struct charge_port_info charge = {0}; int type; if (usb_charger_port_is_sourcing_vbus(port)) { @@ -351,6 +350,7 @@ static void bc12_detect(int port) /* Attachment: decode + update available charge */ if (device_type || PI3USB9281_CHG_STATUS_ANY(charger_status)) { + struct charge_port_info chg; if (PI3USB9281_CHG_STATUS_ANY(charger_status)) type = CHARGE_SUPPLIER_PROPRIETARY; else if (device_type & PI3USB9281_TYPE_CDP) @@ -362,31 +362,21 @@ static void bc12_detect(int port) else type = CHARGE_SUPPLIER_OTHER; - charge.voltage = USB_CHARGER_VOLTAGE_MV; - charge.current = pi3usb9281_get_ilim(device_type, - charger_status); - charge_manager_update_charge(type, port, &charge); - } else { /* Detachment */ - charge_manager_update_charge( - CHARGE_SUPPLIER_PROPRIETARY, - port, - &charge); - charge_manager_update_charge( - CHARGE_SUPPLIER_BC12_CDP, - port, - &charge); - charge_manager_update_charge( - CHARGE_SUPPLIER_BC12_DCP, - port, - &charge); - charge_manager_update_charge( - CHARGE_SUPPLIER_BC12_SDP, - port, - &charge); - charge_manager_update_charge( - CHARGE_SUPPLIER_OTHER, - port, - &charge); + chg.voltage = USB_CHARGER_VOLTAGE_MV; + chg.current = pi3usb9281_get_ilim(device_type, charger_status); + charge_manager_update_charge(type, port, &chg); + } else { + /* Detachment */ + charge_manager_update_charge(CHARGE_SUPPLIER_PROPRIETARY, + port, NULL); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_CDP, + port, NULL); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_DCP, + port, NULL); + charge_manager_update_charge(CHARGE_SUPPLIER_BC12_SDP, + port, NULL); + charge_manager_update_charge(CHARGE_SUPPLIER_OTHER, + port, NULL); } } diff --git a/driver/charger/bd9995x.c b/driver/charger/bd9995x.c index 5423099e52..9ab69a7c38 100644 --- a/driver/charger/bd9995x.c +++ b/driver/charger/bd9995x.c @@ -438,10 +438,8 @@ static int bd9995x_bc12_check_type(int port) static void bd9995x_bc12_detach(int port, int type) { - struct charge_port_info charge = {0}; - /* Update charge manager */ - charge_manager_update_charge(type, port, &charge); + charge_manager_update_charge(type, port, NULL); /* Disable charging trigger by BC1.2 detection */ bd9995x_bc12_enable_charging(port, 0); diff --git a/driver/charger/rt946x.c b/driver/charger/rt946x.c index 757d5a3c0d..9bb1a6cfd7 100644 --- a/driver/charger/rt946x.c +++ b/driver/charger/rt946x.c @@ -903,10 +903,11 @@ void rt946x_interrupt(enum gpio_signal signal) void usb_charger_task(void *u) { - struct charge_port_info charge; + struct charge_port_info chg; int bc12_type = CHARGE_SUPPLIER_NONE; int reg = 0; + chg.voltage = USB_CHARGER_VOLTAGE_MV; while (1) { rt946x_read8(RT946X_REG_DPDMIRQ, ®); @@ -914,20 +915,16 @@ void usb_charger_task(void *u) if (reg & RT946X_MASK_DPDMIRQ_ATTACH) { bc12_type = rt946x_get_bc12_device_type(); if (bc12_type != CHARGE_SUPPLIER_NONE) { - charge.voltage = USB_CHARGER_VOLTAGE_MV; - charge.current = - rt946x_get_bc12_ilim(bc12_type); + chg.current = rt946x_get_bc12_ilim(bc12_type); charge_manager_update_charge(bc12_type, - 0, &charge); + 0, &chg); rt946x_enable_bc12_detection(0); } } /* VBUS detach event */ if (reg & RT946X_MASK_DPDMIRQ_DETACH) { - charge.current = 0; - charge.voltage = 0; - charge_manager_update_charge(bc12_type, 0, &charge); + charge_manager_update_charge(bc12_type, 0, NULL); rt946x_enable_bc12_detection(1); } diff --git a/include/charge_manager.h b/include/charge_manager.h index 17b649052b..41ba9bcb59 100644 --- a/include/charge_manager.h +++ b/include/charge_manager.h @@ -57,9 +57,10 @@ struct charge_port_info { /** * Called by charging tasks to update their available charge. * - * @param supplier Charge supplier to update. - * @param port Charge port to update. - * @param charge Charge port current / voltage. + * @param supplier Charge supplier to update. + * @param port Charge port to update. + * @param charge Charge port current / voltage. If NULL, current = 0 + * voltage = 0 will be used. */ void charge_manager_update_charge(int supplier, int port, |