mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-30 18:41:11 +00:00
In preparation for adding support for additional USB-C mux chips, add a new high-level USB-C mux interface usb_mux.c. usb_mux functions are now called from pd code instead of board-level functions. usb_mux calls down into a mux chip-specific driver (currently pi3usb30532) or board-specific drivers which toggle GPIOs (for legacy boards). BUG=chrome-os-partner:41696 TEST=Manual on Glados in subsequent commit. Verify set() and get() functions set and return consistent values. Verify that USB SS device functions when muxes are set to dock or USB. Also, verify that DP dongle and USB SS device are functional on both PD ports on samus_pd. BRANCH=None Change-Id: Ib6477f489310f3be1430585ea09fea26f57e3752 Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/281435 Reviewed-by: Alec Berg <alecaberg@chromium.org>
68 lines
1.6 KiB
C
68 lines
1.6 KiB
C
/* Copyright 2015 The Chromium OS Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
/* Ryu-custom USB mux driver. */
|
|
|
|
#include "common.h"
|
|
#include "gpio.h"
|
|
#include "usb_mux.h"
|
|
#include "util.h"
|
|
|
|
static int board_init_usb_mux(int port)
|
|
{
|
|
return EC_SUCCESS;
|
|
}
|
|
|
|
static int board_set_usb_mux(int port, mux_state_t mux_state)
|
|
{
|
|
/* reset everything */
|
|
gpio_set_level(GPIO_USBC_MUX_CONF0, 0);
|
|
gpio_set_level(GPIO_USBC_MUX_CONF1, 0);
|
|
gpio_set_level(GPIO_USBC_MUX_CONF2, 0);
|
|
|
|
if (!(mux_state & (MUX_USB_ENABLED | MUX_DP_ENABLED)))
|
|
/* everything is already disabled, we can return */
|
|
return EC_SUCCESS;
|
|
|
|
gpio_set_level(GPIO_USBC_MUX_CONF0, mux_state & MUX_POLARITY_INVERTED);
|
|
|
|
if (mux_state & MUX_USB_ENABLED)
|
|
/* USB 3.0 uses 2 superspeed lanes */
|
|
gpio_set_level(GPIO_USBC_MUX_CONF2, 1);
|
|
|
|
if (mux_state & MUX_DP_ENABLED)
|
|
/* DP uses available superspeed lanes (x2 or x4) */
|
|
gpio_set_level(GPIO_USBC_MUX_CONF1, 1);
|
|
|
|
return EC_SUCCESS;
|
|
}
|
|
|
|
static int board_get_usb_mux(int port, mux_state_t *mux_state)
|
|
{
|
|
*mux_state = 0;
|
|
|
|
if (gpio_get_level(GPIO_USBC_MUX_CONF2))
|
|
*mux_state |= MUX_USB_ENABLED;
|
|
if (gpio_get_level(GPIO_USBC_MUX_CONF1))
|
|
*mux_state |= MUX_DP_ENABLED;
|
|
if (gpio_get_level(GPIO_USBC_MUX_CONF0))
|
|
*mux_state |= MUX_POLARITY_INVERTED;
|
|
|
|
return EC_SUCCESS;
|
|
}
|
|
|
|
const struct usb_mux_driver board_custom_usb_mux_driver = {
|
|
.init = board_init_usb_mux,
|
|
.set = board_set_usb_mux,
|
|
.get = board_get_usb_mux,
|
|
};
|
|
|
|
struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = {
|
|
{
|
|
.port_addr = 0,
|
|
.driver = &board_custom_usb_mux_driver,
|
|
},
|
|
};
|