mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-02 13:14:51 +00:00
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>
161 lines
4.2 KiB
C
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) */
|