summaryrefslogtreecommitdiff
path: root/driver/usb_switch_pi3usb9281.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/usb_switch_pi3usb9281.c')
-rw-r--r--driver/usb_switch_pi3usb9281.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/driver/usb_switch_pi3usb9281.c b/driver/usb_switch_pi3usb9281.c
index fd7eecd4d4..d04ea09b8a 100644
--- a/driver/usb_switch_pi3usb9281.c
+++ b/driver/usb_switch_pi3usb9281.c
@@ -9,6 +9,7 @@
#include "gpio.h"
#include "hooks.h"
#include "i2c.h"
+#include "task.h"
#include "timer.h"
#include "pi3usb9281.h"
#include "util.h"
@@ -25,13 +26,22 @@
#ifdef CONFIG_USB_SWITCH_PI3USB9281_MUX_GPIO
#define PI3USB9281_COUNT 2
+struct mutex mux_lock;
static inline void select_chip(uint8_t chip_idx)
{
+ mutex_lock(&mux_lock);
gpio_set_level(CONFIG_USB_SWITCH_PI3USB9281_MUX_GPIO, chip_idx);
}
+
+static inline void unselect_chip(void)
+{
+ /* Just release the mutex, no need to change the mux gpio */
+ mutex_unlock(&mux_lock);
+}
#else
#define PI3USB9281_COUNT 1
#define select_chip(x)
+#define unselect_chip()
#endif
static int saved_interrupts[PI3USB9281_COUNT];
@@ -42,6 +52,8 @@ uint8_t pi3usb9281_read(uint8_t chip_idx, uint8_t reg)
select_chip(chip_idx);
res = i2c_read8(I2C_PORT_MASTER, PI3USB9281_I2C_ADDR, reg, &val);
+ unselect_chip();
+
if (res)
return 0xee;
@@ -54,6 +66,8 @@ int pi3usb9281_write(uint8_t chip_idx, uint8_t reg, uint8_t val)
select_chip(chip_idx);
res = i2c_write8(I2C_PORT_MASTER, PI3USB9281_I2C_ADDR, reg, val);
+ unselect_chip();
+
if (res)
CPRINTS("PI3USB9281 I2C write failed");
return res;