blob: b35e5f27f9bd507e0a9bd198b466e287a74aaadb [file] [log] [blame]
/* Copyright 2019 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_USB_COMMON_H
#define __CROS_EC_USB_COMMON_H
/* Functions that are shared between old and new PD stacks */
#include "usb_pd.h"
#include "usb_pd_tcpm.h"
#include "task_id.h"
enum pd_drp_next_states {
DRP_TC_DEFAULT,
DRP_TC_UNATTACHED_SNK,
DRP_TC_UNATTACHED_SRC,
DRP_TC_DRP_AUTO_TOGGLE
};
/**
* Returns the next state to transition to while in the drp auto toggle state.
*
* @param drp_sink_time timer for handling TOGGLE_OFF/FORCE_SINK mode when
* auto-toggle enabled. This is an in/out variable.
* @param power_role current power role
* @param drp_state dual role states
* @param cc1 value of CC1 set by tcpm_get_cc
* @param cc2 value of CC2 set by tcpm_get_cc
*
*/
enum pd_drp_next_states drp_auto_toggle_next_state(uint64_t *drp_sink_time,
enum pd_power_role power_role, enum pd_dual_role_states drp_state,
enum tcpc_cc_voltage_status cc1, enum tcpc_cc_voltage_status cc2);
/* Returns the battery percentage [0-100] of the system. */
int usb_get_battery_soc(void);
/*
* Returns type C current limit (mA), potentially with the DTS flag, based upon
* states of the CC lines on the partner side.
*
* @param polarity 0 if cc1 is primary, otherwise 1
* @param cc1 value of CC1 set by tcpm_get_cc
* @param cc2 value of CC2 set by tcpm_get_cc
* @return current limit (mA) with DTS flag set if appropriate
*/
typec_current_t usb_get_typec_current_limit(enum pd_cc_polarity_type polarity,
enum tcpc_cc_voltage_status cc1, enum tcpc_cc_voltage_status cc2);
/**
* Returns the polarity of a Sink.
*
* @param cc1 value of CC1 set by tcpm_get_cc
* @param cc2 value of CC2 set by tcpm_get_cc
* @return 0 if cc1 is primary, else 1 for cc2 being primary
*/
enum pd_cc_polarity_type get_snk_polarity(enum tcpc_cc_voltage_status cc1,
enum tcpc_cc_voltage_status cc2);
/**
* Find PDO index that offers the most amount of power and stays within
* max_mv voltage.
*
* @param src_cap_cnt
* @param src_caps
* @param max_mv maximum voltage (or -1 if no limit)
* @param pdo raw pdo corresponding to index, or index 0 on error (output)
* @return index of PDO within source cap packet
*/
int pd_find_pdo_index(uint32_t src_cap_cnt, const uint32_t * const src_caps,
int max_mv, uint32_t *selected_pdo);
/**
* Extract power information out of a Power Data Object (PDO)
*
* @param pdo raw pdo to extract
* @param ma current of the PDO (output)
* @param mv voltage of the PDO (output)
*/
void pd_extract_pdo_power(uint32_t pdo, uint32_t *ma, uint32_t *mv);
/**
* Decide which PDO to choose from the source capabilities.
*
* @param src_cap_cnt
* @param src_caps
* @param rdo requested Request Data Object.
* @param ma selected current limit (stored on success)
* @param mv selected supply voltage (stored on success)
* @param req_type request type
* @param max_request_mv max voltage a sink can request before getting
* source caps
*/
void pd_build_request(uint32_t src_cap_cnt, const uint32_t * const src_caps,
int32_t vpd_vdo, uint32_t *rdo, uint32_t *ma, uint32_t *mv,
enum pd_request_type req_type, uint32_t max_request_mv);
/**
* Notifies a task that is waiting on a system jump, that it's complete.
*
* @param sysjump_task_waiting indicates if the task is waiting on the
* system jump.
*/
void notify_sysjump_ready(volatile const task_id_t * const
sysjump_task_waiting);
#endif /* __CROS_EC_USB_COMMON_H */