blob: 5e1fb6945aad60fd9dd280662469fa20c91111a1 [file] [log] [blame]
/* Copyright (c) 2012 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.
*/
/* USB mux driver */
#ifndef __CROS_EC_USB_MUX_H
#define __CROS_EC_USB_MUX_H
#include "ec_commands.h"
#include "usb_charge.h"
#include "usb_pd.h"
/* USB-C mux state */
typedef uint8_t mux_state_t;
/* Mux state attributes */
/* TODO: Directly use USB_PD_MUX_* everywhere and remove these 3 defines */
#define MUX_USB_ENABLED USB_PD_MUX_USB_ENABLED
#define MUX_DP_ENABLED USB_PD_MUX_DP_ENABLED
#define MUX_POLARITY_INVERTED USB_PD_MUX_POLARITY_INVERTED
/* Mux modes, decoded to attributes */
enum typec_mux {
TYPEC_MUX_NONE = 0, /* Open switch */
TYPEC_MUX_USB = MUX_USB_ENABLED, /* USB only */
TYPEC_MUX_DP = MUX_DP_ENABLED, /* DP only */
TYPEC_MUX_DOCK = MUX_USB_ENABLED | /* Both USB and DP */
MUX_DP_ENABLED,
};
/* Mux driver function pointers */
struct usb_mux_driver {
/**
* Initialize USB mux.
*
* @param port_addr Port/address driver-defined parameter.
* @return EC_SUCCESS on success, non-zero error code on failure.
*/
int (*init)(int port_addr);
/**
* Set USB mux state.
*
* @param port_addr Port/address driver-defined parameter.
* @param mux_state State to set mux to.
* @return EC_SUCCESS on success, non-zero error code on failure.
*/
int (*set)(int port_addr, mux_state_t mux_state);
/**
* Get current state of USB mux.
*
* @param port_addr Port / address driver-defined parameter.
* @param mux_state Gets set to current state of mux.
* @return EC_SUCCESS on success, non-zero error code on failure.
*/
int (*get)(int port_addr, mux_state_t *mux_state);
};
/* Describes a USB mux present in the system */
struct usb_mux {
/*
* Driver-defined parameter, typically an i2c slave address
* (for i2c muxes) or a port number (for GPIO 'muxes').
*/
const int port_addr;
/* Mux driver */
const struct usb_mux_driver *driver;
/**
* Board specific initialization for USB mux that is
* called after mux->driver->init() function and every time the port
* leaves auto-toggle state.
*
* @param mux USB mux to tune
* @return EC_SUCCESS on success, non-zero error code on failure.
*/
int (*board_init)(const struct usb_mux *mux);
/*
* USB Type-C DP alt mode support. Notify Type-C controller
* there is DP dongle hot-plug.
* TODO: Move this function to usb_mux_driver struct.
*/
void (*hpd_update)(int port, int hpd_lvl, int hpd_irq);
};
/* Supported USB mux drivers */
extern const struct usb_mux_driver pi3usb30532_usb_mux_driver;
extern const struct usb_mux_driver ps8740_usb_mux_driver;
extern const struct usb_mux_driver tcpm_usb_mux_driver;
extern const struct usb_mux_driver virtual_usb_mux_driver;
/* Supported hpd_update functions */
void virtual_hpd_update(int port, int hpd_lvl, int hpd_irq);
/* USB muxes present in system, ordered by PD port #, defined at board-level */
extern struct usb_mux usb_muxes[];
/**
* Initialize USB mux to its default state.
*
* @param port Port number.
*/
void usb_mux_init(int port);
/**
* Configure superspeed muxes on type-C port.
*
* @param port port number.
* @param mux_mode mux selected function.
* @param usb_config usb2.0 selected function.
* @param polarity plug polarity (0=CC1, 1=CC2).
*/
void usb_mux_set(int port, enum typec_mux mux_mode,
enum usb_switch usb_config, int polarity);
/**
* Query superspeed mux status on type-C port.
*
* @param port port number.
* @param dp_str pointer to the DP string to return.
* @param usb_str pointer to the USB string to return.
* @return Non-zero if superspeed connection is enabled; otherwise, zero.
*/
int usb_mux_get(int port, const char **dp_str, const char **usb_str);
/**
* Flip the superspeed muxes on type-C port.
*
* This is used for factory test automation. Note that this function should
* only flip the superspeed muxes and leave CC lines alone. Without further
* changes, this function MUST ONLY be used for testing purpose, because
* the protocol layer loses track of the superspeed polarity and DP/USB3.0
* connection may break.
*
* @param port port number.
*/
void usb_mux_flip(int port);
#endif