From 5b7cfac64e971a7e925d17a8b33e651a01e71707 Mon Sep 17 00:00:00 2001 From: Shawn Nematbakhsh Date: Tue, 9 Jun 2015 14:29:09 -0700 Subject: usb: pi3usb9281: Allow flexible chip configurations Previously we supported using a single pi3usb9281 chip, or using two chips on the same i2c bus behind a mux. Now that we need to support a third configuration of multiple chips on different busses, it makes sense to be able to configure the configuration freely at the board level. BUG=chrome-os-partner:40920 TEST=Manual on samus_pd. Plug USB charger, verify detection is correct on both charge ports. BRANCH=None Change-Id: I120dcb1c3ceb6f013b92407effcd8cb66e7ffcce Signed-off-by: Shawn Nematbakhsh Reviewed-on: https://chromium-review.googlesource.com/276511 Reviewed-by: Alec Berg --- driver/pi3usb9281.h | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) (limited to 'driver/pi3usb9281.h') diff --git a/driver/pi3usb9281.h b/driver/pi3usb9281.h index 56b126c1e3..7a23a869b3 100644 --- a/driver/pi3usb9281.h +++ b/driver/pi3usb9281.h @@ -56,46 +56,55 @@ /* Check if charge status has any connection */ #define PI3USB9281_CHG_STATUS_ANY(x) (((x) & 0x1f) > 1) -/* Read PI3USB9281 register. */ -uint8_t pi3usb9281_read(uint8_t chip_idx, uint8_t reg); - -/* Write PI3USB9281 register. */ -int pi3usb9281_write(uint8_t chip_idx, uint8_t reg, uint8_t val); +/* Define configuration of one pi3usb9281 part */ +struct pi3usb9281_config { + /* i2c port that chip resides on */ + int i2c_port; + /* GPIO for chip selection in muxed configuration */ + enum gpio_signal mux_gpio; + /* Logic level of mux_gpio to select chip */ + int mux_gpio_level; + /* Mutex to lock access to mux gpio or NULL if no mux exists */ + struct mutex *mux_lock; +}; + +/* Configuration struct defined at board level */ +extern struct pi3usb9281_config pi3usb9281_chips[]; + +/* Initialize chip and enable interrupts */ +void pi3usb9281_init(int port); /* Enable interrupts. */ -int pi3usb9281_enable_interrupts(uint8_t chip_idx); +int pi3usb9281_enable_interrupts(int port); /* Disable all interrupts. */ -int pi3usb9281_disable_interrupts(uint8_t chip_idx); +int pi3usb9281_disable_interrupts(int port); /* Set interrupt mask. */ -int pi3usb9281_set_interrupt_mask(uint8_t chip_idx, uint8_t mask); +int pi3usb9281_set_interrupt_mask(int port, uint8_t mask); /* Get and clear current interrupt status. */ -int pi3usb9281_get_interrupts(uint8_t chip_idx); - -/* Get but keep interrupt status. */ -int pi3usb9281_peek_interrupts(uint8_t chip_idx); +int pi3usb9281_get_interrupts(int port); /* Get attached device type. */ -int pi3usb9281_get_device_type(uint8_t chip_idx); +int pi3usb9281_get_device_type(int port); /* Get attached charger status. */ -int pi3usb9281_get_charger_status(uint8_t chip_idx); +int pi3usb9281_get_charger_status(int port); /* Get charger current limit based on device type and charger status. */ int pi3usb9281_get_ilim(int device_type, int charger_status); /* Set switch configuration to manual. */ -int pi3usb9281_set_switch_manual(uint8_t chip_idx, int val); +int pi3usb9281_set_switch_manual(int port, int val); /* Set bits to enable pins in manual switch register. */ -int pi3usb9281_set_pins(uint8_t chip_idx, uint8_t mask); +int pi3usb9281_set_pins(int port, uint8_t mask); /* Set D+/D-/Vbus switches to open or closed/auto-control. */ -int pi3usb9281_set_switches(uint8_t chip_idx, int open); +int pi3usb9281_set_switches(int port, int open); /* Reset PI3USB9281. */ -int pi3usb9281_reset(uint8_t chip_idx); +int pi3usb9281_reset(int port); #endif /* PI3USB9281_H */ -- cgit v1.2.1