/* * 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 #include #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; /** 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; }; #endif /* ZEPHYR_SUBSYS_USBC_STACK_PRIV_H_ */