Files
OpenCellular/include/usbc_ppc.h
Jett Rink f4602ec472 usbc: Moving PPC init after setting TCPC resistors.
We don't want the PPC to connect the CC lines from the
TCPC to the USB connector until the TCPC resistors are
set in a valid state (SINK initially).

If we connect the CC lines (happens in the ppc_init) before
setting the resistor values, some TCPC will be toggling the
CC line between Rp/Rd since it doesn't detect a cable yet.

In the dead battery charging case, connecting the toggling
CC lines to the charger can rail the CC lines to 3.3 V signaling
to the charger to disconnect Vbus, thus browning out the board.

BRANCH=none
BUG=b:71865251
TEST=Grunt powers on via usbc p0 with and without USB hub.

Change-Id: I8e78aa2af42075398fab89a2dccef5e7df27b260
Signed-off-by: Jett Rink <jettrink@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/882305
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Reviewed-by: Edward Hill <ecgh@chromium.org>
2018-01-25 19:23:47 -08:00

161 lines
4.2 KiB
C

/* Copyright 2017 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.
*/
#ifndef __CROS_EC_USBC_PPC_H
#define __CROS_EC_USBC_PPC_H
#include "common.h"
#include "usb_pd_tcpm.h"
/* Common APIs for USB Type-C Power Path Controllers (PPC) */
struct ppc_drv {
/**
* Initialize the PPC.
*
* @param port: The Type-C port number.
* @return EC_SUCCESS when init was successful, error otherwise.
*/
int (*init)(int port);
/**
* Is the port sourcing Vbus?
*
* @param port: The Type-C port number.
* @return 1 if sourcing Vbus, 0 if not.
*/
int (*is_sourcing_vbus)(int port);
/**
* Turn on/off the charge path FET, such that current flows into the
* system.
*
* @param port: The Type-C port number.
* @param enable: 1: Turn on the FET, 0: turn off the FET.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*vbus_sink_enable)(int port, int enable);
/**
* Turn on/off the source path FET, such that current flows from the
* system.
*
* @param port: The Type-C port number.
* @param enable: 1: Turn on the FET, 0: turn off the FET.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*vbus_source_enable)(int port, int enable);
/**
* Set the Vbus source path current limit
*
* @param port: The Type-C port number.
* @param rp: The Rp value which to approximately set the current limit.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*set_vbus_source_current_limit)(int port, enum tcpc_rp_value rp);
#ifdef CONFIG_CMD_PPC_DUMP
/**
* Perform a register dump of the PPC.
*
* @param port: The Type-C port number.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*reg_dump)(int port);
#endif /* defined(CONFIG_CMD_PPC_DUMP) */
#ifdef CONFIG_USB_PD_VBUS_DETECT_PPC
/*
* TODO(aaboagye): In order for VBUS detection to work properly for our
* system, we need to enable VBUS interrupts and send the appropriate
* notifications.
*/
/**
* Determine if VBUS is present or not.
*
* @param port: The Type-C port number.
* @param vbus_present: 1: VBUS is present. 0: VBUS is not present.
* @return EC_SUCCESS if able to determine VBUS status, otherwise an
* error.
*/
int (*is_vbus_present)(int port, int *vbus_present);
#endif /* defined(CONFIG_USB_PD_VBUS_DETECT_PPC) */
};
struct ppc_config_t {
int i2c_port;
int i2c_addr;
const struct ppc_drv *drv;
};
extern const struct ppc_config_t ppc_chips[];
extern const unsigned int ppc_cnt;
/**
* Initializes the PPC for the specified port.
*
* @param port: The Type-C port number.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_init(int port);
/**
* Determine if VBUS is present or not.
*
* @param port: The Type-C port number.
* @param vbus_present: 1: VBUS is present. 0: VBUS is not present.
* @return EC_SUCCESS if able to determine VBUS status, otherwise an
* error.
*/
int ppc_is_vbus_present(int port, int *vbus_present);
/**
* Is the port sourcing Vbus?
*
* @param port: The Type-C port number.
* @return 1 if sourcing Vbus, 0 if not.
*/
int ppc_is_sourcing_vbus(int port);
/**
* Set the Vbus source path current limit
*
* @param port: The Type-C port number.
* @param rp: The Rp value which to approximately set the current limit.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_set_vbus_source_current_limit(int port, enum tcpc_rp_value rp);
/**
* Turn on/off the charge path FET, such that current flows into the
* system.
*
* @param port: The Type-C port number.
* @param enable: 1: Turn on the FET, 0: turn off the FET.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_vbus_sink_enable(int port, int enable);
/**
* Turn on/off the source path FET, such that current flows from the
* system.
*
* @param port: The Type-C port number.
* @param enable: 1: Turn on the FET, 0: turn off the FET.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_vbus_source_enable(int port, int enable);
/**
* Board specific callback when a port overcurrents.
*
* @param port: The Type-C port which overcurrented.
*/
void board_overcurrent_event(int port);
#endif /* !defined(__CROS_EC_USBC_PPC_H) */