253 lines
7.0 KiB
C
253 lines
7.0 KiB
C
/*
|
|
* Copyright (c) 2022 The Chromium OS Authors
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_SUBSYS_USBC_STACK_PRIV_H_
|
|
#define ZEPHYR_SUBSYS_USBC_STACK_PRIV_H_
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/usb_c/usbc.h>
|
|
|
|
#include "usbc_tc_common_internal.h"
|
|
#include "usbc_pe_common_internal.h"
|
|
#include "usbc_prl.h"
|
|
|
|
#define PRIV_PORT_REQUEST_SUSPEND -1
|
|
#define PRIV_PORT_REQUEST_START -2
|
|
|
|
/**
|
|
* @brief Each layer of the stack is composed of state machines that can be
|
|
* in one of the following states.
|
|
*/
|
|
enum usbc_sm_state {
|
|
/** The state machine is paused */
|
|
SM_PAUSED,
|
|
/** The state machine is initializing */
|
|
SM_INIT,
|
|
/** The state machine is running */
|
|
SM_RUN
|
|
};
|
|
|
|
/**
|
|
* @brief Port config
|
|
*/
|
|
struct usbc_port_config {
|
|
/**
|
|
* The usbc stack initializes this pointer that creates the
|
|
* main thread for this port
|
|
*/
|
|
void (*create_thread)(const struct device *dev);
|
|
/** The thread stack for this port's thread */
|
|
k_thread_stack_t *stack;
|
|
};
|
|
|
|
/**
|
|
* @brief Request FIFO
|
|
*/
|
|
struct request_value {
|
|
/** First word is reserved for use by FIFO */
|
|
void *fifo_reserved;
|
|
/** Request value */
|
|
int32_t val;
|
|
};
|
|
|
|
/**
|
|
* @brief Port data
|
|
*/
|
|
struct usbc_port_data {
|
|
/** This port's thread */
|
|
k_tid_t port_thread;
|
|
/** This port thread's data */
|
|
struct k_thread thread_data;
|
|
|
|
/* Type-C layer data */
|
|
|
|
/** Type-C state machine object */
|
|
struct tc_sm_t *tc;
|
|
/** Enables or Disables the Type-C state machine */
|
|
bool tc_enabled;
|
|
/** The state of the Type-C state machine */
|
|
enum usbc_sm_state tc_sm_state;
|
|
|
|
/* Policy Engine layer data */
|
|
|
|
/** Policy Engine state machine object */
|
|
struct policy_engine *pe;
|
|
/** Enables or Disables the Policy Engine state machine */
|
|
bool pe_enabled;
|
|
/** The state of the Policy Engine state machine */
|
|
enum usbc_sm_state pe_sm_state;
|
|
|
|
/* Protocol Layer data */
|
|
|
|
/** Protocol Receive Layer state machine object */
|
|
struct protocol_layer_rx_t *prl_rx;
|
|
/** Protocol Transmit Layer state machine object */
|
|
struct protocol_layer_tx_t *prl_tx;
|
|
/** Protocol Hard Reset Layer state machine object */
|
|
struct protocol_hard_reset_t *prl_hr;
|
|
/** Enables or Disables the Protocol Layer state machine */
|
|
bool prl_enabled;
|
|
/** The state of the Protocol Layer state machine */
|
|
enum usbc_sm_state prl_sm_state;
|
|
|
|
/* Common data for all layers */
|
|
|
|
/** Power Delivery revisions for each packet type */
|
|
enum pd_rev_type rev[NUM_SOP_STAR_TYPES];
|
|
/** The Type-C Port Controller on this port */
|
|
const struct device *tcpc;
|
|
/** VBUS Measurement and control device on this port */
|
|
const struct device *vbus;
|
|
/** Power Path Controller device on this port */
|
|
const struct device *ppc;
|
|
|
|
/** Device Policy Manager Request FIFO */
|
|
struct k_fifo request_fifo;
|
|
/** Device Policy manager Request */
|
|
struct request_value request;
|
|
|
|
/** Bypass next sleep and request one more iteration of the USB-C state machines */
|
|
bool bypass_next_sleep;
|
|
|
|
/* USB-C Callbacks */
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to ask the Device Policy Manager
|
|
* if a particular policy should be allowed
|
|
*/
|
|
bool (*policy_cb_check)(const struct device *dev,
|
|
const enum usbc_policy_check_t policy_check);
|
|
/**
|
|
* Callback used by the Policy Engine to notify the Device Policy
|
|
* Manager of a policy change
|
|
*/
|
|
void (*policy_cb_notify)(const struct device *dev,
|
|
const enum usbc_policy_notify_t policy_notify);
|
|
/**
|
|
* Callback used by the Policy Engine to notify the Device Policy
|
|
* Manager of WAIT message reception
|
|
*/
|
|
bool (*policy_cb_wait_notify)(const struct device *dev,
|
|
const enum usbc_policy_wait_t policy_notify);
|
|
|
|
#ifdef CONFIG_USBC_CSM_SINK_ONLY
|
|
/**
|
|
* Callback used by the Policy Engine to get the Sink Capabilities
|
|
* from the Device Policy Manager
|
|
*/
|
|
int (*policy_cb_get_snk_cap)(const struct device *dev, uint32_t **pdos, int *num_pdos);
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to send the received Source
|
|
* Capabilities to the Device Policy Manager
|
|
*/
|
|
void (*policy_cb_set_src_cap)(const struct device *dev, const uint32_t *pdos,
|
|
const int num_pdos);
|
|
/**
|
|
* Callback used by the Policy Engine to get the Request Data Object
|
|
* (RDO) from the Device Policy Manager
|
|
*/
|
|
uint32_t (*policy_cb_get_rdo)(const struct device *dev);
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to check if Sink Power Supply
|
|
* is at default level
|
|
*/
|
|
bool (*policy_cb_is_snk_at_default)(const struct device *dev);
|
|
#else /* CONFIG_USBC_CSM_SOURCE_ONLY */
|
|
/**
|
|
* Callback used by the Policy Engine get the Rp pull-up that should
|
|
* be placed on the CC lines
|
|
*/
|
|
int (*policy_cb_get_src_rp)(const struct device *dev,
|
|
enum tc_rp_value *rp);
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to enable and disable the
|
|
* Source Power Supply
|
|
*/
|
|
int (*policy_cb_src_en)(const struct device *dev, bool en);
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to get the Source Caps that
|
|
* will be sent to the Sink
|
|
*/
|
|
int (*policy_cb_get_src_caps)(const struct device *dev,
|
|
const uint32_t **pdos,
|
|
uint32_t *num_pdos);
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to check if the Sink's request
|
|
* is valid
|
|
*/
|
|
enum usbc_snk_req_reply_t (*policy_cb_check_sink_request)(const struct device *dev,
|
|
const uint32_t request_msg);
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to check if the Present Contract
|
|
* is still valid
|
|
*/
|
|
bool (*policy_present_contract_is_valid)(const struct device *dev,
|
|
const uint32_t present_contract);
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to check if the Source Power Supply
|
|
* is ready
|
|
*/
|
|
bool (*policy_is_ps_ready)(const struct device *dev);
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to request that a different set of
|
|
* Source Caps be used
|
|
*/
|
|
bool (*policy_change_src_caps)(const struct device *dev);
|
|
|
|
/**
|
|
* Callback used by the Policy Engine to store the Sink's Capabilities
|
|
*/
|
|
void (*policy_cb_set_port_partner_snk_cap)(const struct device *dev,
|
|
const uint32_t *pdos,
|
|
const int num_pdos);
|
|
#endif /* CONFIG_USBC_CSM_SINK_ONLY */
|
|
/** Device Policy Manager data */
|
|
void *dpm_data;
|
|
};
|
|
|
|
#ifdef CONFIG_USBC_CSM_SOURCE_ONLY
|
|
/**
|
|
* @brief Function that enables the source path either using callback or by the TCPC.
|
|
* If source and sink paths are controlled by the TCPC, this callback doesn't have to be set.
|
|
*
|
|
* @param dev USB-C connector device
|
|
* @param tcpc Type-C Port Controller device
|
|
* @param en True to enable the sourcing, false to disable
|
|
* @return int 0 if success, -ENOSYS if both callback and TCPC function are not implemented.
|
|
* In case of error, value from any of the functions is returned
|
|
*/
|
|
static inline int usbc_policy_src_en(const struct device *dev, const struct device *tcpc, bool en)
|
|
{
|
|
struct usbc_port_data *data = dev->data;
|
|
int ret_cb = -ENOSYS;
|
|
int ret_tcpc;
|
|
|
|
if (data->policy_cb_src_en != NULL) {
|
|
ret_cb = data->policy_cb_src_en(dev, en);
|
|
if (ret_cb != 0 && ret_cb != -ENOSYS) {
|
|
return ret_cb;
|
|
}
|
|
}
|
|
|
|
ret_tcpc = tcpc_set_src_ctrl(tcpc, en);
|
|
if (ret_tcpc == -ENOSYS) {
|
|
return ret_cb;
|
|
}
|
|
|
|
return ret_tcpc;
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_SUBSYS_USBC_STACK_PRIV_H_ */
|