summaryrefslogtreecommitdiff
path: root/driver/ppc
diff options
context:
space:
mode:
authorEdward Hill <ecgh@chromium.org>2018-06-04 11:12:16 -0600
committerchrome-bot <chrome-bot@chromium.org>2018-06-07 08:35:53 -0700
commit31815b74ffdcd3979ba075e04f39e7fb704957f8 (patch)
treec1d59a6c29be6363271009332b3bdc13f66009b2 /driver/ppc
parent718b86e1d2e44862602b9f87e391aa0963bf0ee7 (diff)
downloadchrome-ec-31815b74ffdcd3979ba075e04f39e7fb704957f8.tar.gz
sn5s330: Track source enabled state locally
sn5s330_init() will turn off the PP1 (source) FET, but sn5s330_is_sourcing_vbus() can be called before PPC init: by usb_charger_init() and pd_power_supply_reset() from pd_task(). Keep track of the PP1 (source) FET state locally, and use this for sn5s330_is_sourcing_vbus(), instead of reading the state from the PPC chip over I2C every time. This solves the problem of sn5s330_is_sourcing_vbus() being called before sn5s330_init(), and also avoids other problems caused by sn5s330_is_sourcing_vbus() doing I2C communication: crrev.com/c/969701/7/board/cheza/board.c#85 BUG=b:80203727 BRANCH=none TEST=Reboot Grunt EC while one USB-C port is VBUS source. Change-Id: Ie0fdd3d672bc747fcdbb746586149e194165fdac Signed-off-by: Edward Hill <ecgh@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1086115 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'driver/ppc')
-rw-r--r--driver/ppc/sn5s330.c39
1 files changed, 5 insertions, 34 deletions
diff --git a/driver/ppc/sn5s330.c b/driver/ppc/sn5s330.c
index c20a665f75..07ff202436 100644
--- a/driver/ppc/sn5s330.c
+++ b/driver/ppc/sn5s330.c
@@ -26,6 +26,7 @@
#define CPRINTS(format, args...) cprints(CC_USBPD, format, ## args)
static uint32_t irq_pending; /* Bitmask of ports signaling an interrupt. */
+static int source_enabled[CONFIG_USB_PD_PORT_COUNT];
static int read_reg(uint8_t port, int reg, int *regval)
{
@@ -132,29 +133,6 @@ static int get_func_set3(uint8_t port, int *regval)
return status;
}
-static int sn5s330_is_pp_fet_enabled(uint8_t port, enum sn5s330_pp_idx pp,
- int *is_enabled)
-{
- int pp_bit;
- int status;
- int regval;
-
- if (pp == SN5S330_PP1)
- pp_bit = SN5S330_PP1_EN;
- else if (pp == SN5S330_PP2)
- pp_bit = SN5S330_PP2_EN;
- else
- return EC_ERROR_INVAL;
-
- status = get_func_set3(port, &regval);
- if (status)
- return status;
-
- *is_enabled = !!(pp_bit & regval);
-
- return EC_SUCCESS;
-}
-
static int sn5s330_pp_fet_enable(uint8_t port, enum sn5s330_pp_idx pp,
int enable)
{
@@ -184,6 +162,9 @@ static int sn5s330_pp_fet_enable(uint8_t port, enum sn5s330_pp_idx pp,
return status;
}
+ if (pp == SN5S330_PP1)
+ source_enabled[port] = enable;
+
return EC_SUCCESS;
}
@@ -466,17 +447,7 @@ static int sn5s330_is_vbus_present(int port)
static int sn5s330_is_sourcing_vbus(int port)
{
- int is_sourcing_vbus = 0;
- int rv;
-
- rv = sn5s330_is_pp_fet_enabled(port, SN5S330_PP1, &is_sourcing_vbus);
- if (rv) {
- CPRINTS("ppc p%d: Failed to determine source FET status! (%d)",
- port, rv);
- return 0;
- }
-
- return is_sourcing_vbus;
+ return source_enabled[port];
}
#ifdef CONFIG_USBC_PPC_POLARITY