summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2019-05-02 17:58:39 -0700
committerchrome-bot <chrome-bot@chromium.org>2019-05-23 02:14:13 -0700
commit437f541fab07d2b96e873187bba9a5a79529f58e (patch)
tree1334e388312be3d666b1db1412fcc4fd8015b63f /driver
parentddba0154f7c919144b1b0013ac0c6b172667822a (diff)
downloadchrome-ec-437f541fab07d2b96e873187bba9a5a79529f58e.tar.gz
PI3USB9281: Serialize mux setting and BC12 detection
Currently a PD task and a USB charger task can talk to PI3USB9281 to update mux setting and to get BC12 information interleavingly. We suspect this causes unreliable BC12 detection including detach detection. This patch makes the usb_charger_set_switches API schedule a mux update instead of changing the mux setting by itself wakes up a USB charger task. A USB charger task solely handles BC12 detection and mux setting. Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> BUG=b/125176293 BRANCH=nami TEST=Verify BC1.2 and PD charger can be detected correctly and power_supply_info prints 'Discharging' when they're disconnected on Syndra. Change-Id: Iadaf9087be74a4ba0412dd08b95a40eac4e69ce1 Reviewed-on: https://chromium-review.googlesource.com/1622293 Commit-Ready: Daisuke Nojiri <dnojiri@chromium.org> Tested-by: Daisuke Nojiri <dnojiri@chromium.org> Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org> Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r--driver/bc12/pi3usb9281.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/driver/bc12/pi3usb9281.c b/driver/bc12/pi3usb9281.c
index eb4e6a8b6d..0c43bb199b 100644
--- a/driver/bc12/pi3usb9281.c
+++ b/driver/bc12/pi3usb9281.c
@@ -37,7 +37,6 @@
/* Store the state of our USB data switches so that they can be restored. */
static int usb_switch_state[CONFIG_USB_PD_PORT_COUNT];
-static struct mutex usb_switch_lock[CONFIG_USB_PD_PORT_COUNT];
static int pi3usb9281_reset(int port);
static int pi3usb9281_get_interrupts(int port);
@@ -278,14 +277,10 @@ void usb_charger_set_switches(int port, enum usb_switch setting)
/* If switch is not changing then return */
if (setting == usb_switch_state[port])
return;
-
- mutex_lock(&usb_switch_lock[port]);
if (setting != USB_SWITCH_RESTORE)
usb_switch_state[port] = setting;
-
- pi3usb9281_set_switches(port, usb_switch_state[port]);
-
- mutex_unlock(&usb_switch_lock[port]);
+ CPRINTS("USB MUX %d", usb_switch_state[port]);
+ task_set_event(TASK_ID_USB_CHG_P0 + port, USB_CHG_EVENT_MUX, 0);
}
static int pc3usb9281_read_interrupt(int port)
@@ -438,6 +433,9 @@ void usb_charger_task(void *u)
evt = bc12_detect(port);
}
+ if (evt & USB_CHG_EVENT_MUX)
+ pi3usb9281_set_switches(port, usb_switch_state[port]);
+
/*
* Re-enable interrupts on pericom charger detector since the
* chip may periodically reset itself, and come back up with