summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2018-09-14 10:47:53 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2018-09-20 23:29:00 +0000
commit380d42e7e7078bdc5183f227fb7bfadc4eb699e0 (patch)
tree28708b03808547c81e057fa57ac39e25618ff642
parent60554b14ea792cb647b5f6959b5bd532064ca809 (diff)
downloadchrome-ec-380d42e7e7078bdc5183f227fb7bfadc4eb699e0.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/1236851 Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org> Tested-by: Daisuke Nojiri <dnojiri@chromium.org> Commit-Queue: Daisuke Nojiri <dnojiri@chromium.org>
-rw-r--r--board/fizz/board.c3
-rw-r--r--board/glkrvp_ite/chg_usb_pd.c4
-rw-r--r--common/charge_manager.c3
-rw-r--r--common/usb_charger.c17
-rw-r--r--driver/bc12/bq24392.c2
-rw-r--r--driver/bc12/pi3usb9281.c42
-rw-r--r--driver/charger/bd9995x.c4
-rw-r--r--include/charge_manager.h7
8 files changed, 33 insertions, 49 deletions
diff --git a/board/fizz/board.c b/board/fizz/board.c
index f8de83b255..0de6ff12b7 100644
--- a/board/fizz/board.c
+++ b/board/fizz/board.c
@@ -750,13 +750,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_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 76c9d4e436..5120944007 100644
--- a/common/charge_manager.c
+++ b/common/charge_manager.c
@@ -912,6 +912,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 1b88adb444..7a35d0f4b9 100644
--- a/common/usb_charger.c
+++ b/common/usb_charger.c
@@ -17,6 +17,7 @@
#include "console.h"
#include "gpio.h"
#include "hooks.h"
+#include "stddef.h"
#include "task.h"
#include "usb_charge.h"
#include "usb_pd.h"
@@ -80,25 +81,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 8f97ad704f..c06f8746a0 100644
--- a/driver/bc12/bq24392.c
+++ b/driver/bc12/bq24392.c
@@ -96,7 +96,7 @@ static void power_down_ic(const int port)
gpio_set_level(pin_tbl[port].chip_enable_l, 1);
/* 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 4fb5e9a347..65c72e65bd 100644
--- a/driver/charger/bd9995x.c
+++ b/driver/charger/bd9995x.c
@@ -407,10 +407,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/include/charge_manager.h b/include/charge_manager.h
index 984d119319..54253d66c7 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,