lkml.org 
[lkml]   [2021]   [Feb]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v2 1/3] usb: typec: tcpm: Add Callback to Usb Communication capable partner
    From
    The USB Communications Capable bit indicates if port
    partner is capable of communication over the USB data lines
    (e.g. D+/- or SS Tx/Rx). Notify the status of the bit to low
    level drivers to perform chip specific operation.
    For instance, low level driver enables USB switches on D+/D-
    lines to set up data path when the bit is set.

    Refactored from patch initially authored by
    Kyle Tso <kyletso@google.com>

    Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
    ---
    Changes since V1:
    - Removed partner_usb_comm_capable flag.
    - Fixed capable flag for SNK_NEGOTIATE_CAPABILITIES.
    ---
    drivers/usb/typec/tcpm/tcpm.c | 13 +++++++++++++
    include/linux/usb/tcpm.h | 5 +++++
    2 files changed, 18 insertions(+)

    diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
    index 0afd8ef692e8..997a1a56c161 100644
    --- a/drivers/usb/typec/tcpm/tcpm.c
    +++ b/drivers/usb/typec/tcpm/tcpm.c
    @@ -3429,6 +3429,14 @@ static void tcpm_unregister_altmodes(struct tcpm_port *port)
    memset(modep, 0, sizeof(*modep));
    }

    +static void tcpm_set_partner_usb_comm_capable(struct tcpm_port *port, bool capable)
    +{
    + tcpm_log(port, "Setting usb_comm capable %s", capable ? "true" : "false");
    +
    + if (port->tcpc->set_partner_usb_comm_capable)
    + port->tcpc->set_partner_usb_comm_capable(port->tcpc, capable);
    +}
    +
    static void tcpm_reset_port(struct tcpm_port *port)
    {
    int ret;
    @@ -3445,6 +3453,7 @@ static void tcpm_reset_port(struct tcpm_port *port)
    port->attached = false;
    port->pd_capable = false;
    port->pps_data.supported = false;
    + tcpm_set_partner_usb_comm_capable(port, false);

    /*
    * First Rx ID should be 0; set this to a sentinel of -1 so that
    @@ -3785,6 +3794,8 @@ static void run_state_machine(struct tcpm_port *port)
    }
    } else {
    tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
    + tcpm_set_partner_usb_comm_capable(port,
    + !!(port->sink_request & RDO_USB_COMM));
    tcpm_set_state(port, SRC_TRANSITION_SUPPLY,
    PD_T_SRC_TRANSITION);
    }
    @@ -4004,6 +4015,8 @@ static void run_state_machine(struct tcpm_port *port)
    break;
    case SNK_NEGOTIATE_CAPABILITIES:
    port->pd_capable = true;
    + tcpm_set_partner_usb_comm_capable(port,
    + !!(port->source_caps[0] & PDO_FIXED_USB_COMM));
    port->hard_reset_count = 0;
    ret = tcpm_pd_send_request(port);
    if (ret < 0) {
    diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h
    index 3af99f85e8b9..42fcfbe10590 100644
    --- a/include/linux/usb/tcpm.h
    +++ b/include/linux/usb/tcpm.h
    @@ -108,6 +108,10 @@ enum tcpm_transmit_type {
    * is supported by TCPC, set this callback for TCPM to query
    * whether vbus is at VSAFE0V when needed.
    * Returns true when vbus is at VSAFE0V, false otherwise.
    + * @set_partner_usb_comm_capable:
    + * Optional; The USB Communications Capable bit indicates if port
    + * partner is capable of communication over the USB data lines
    + * (e.g. D+/- or SS Tx/Rx). Called to notify the status of the bit.
    */
    struct tcpc_dev {
    struct fwnode_handle *fwnode;
    @@ -139,6 +143,7 @@ struct tcpc_dev {
    int (*set_auto_vbus_discharge_threshold)(struct tcpc_dev *dev, enum typec_pwr_opmode mode,
    bool pps_active, u32 requested_vbus_voltage);
    bool (*is_vbus_vsafe0v)(struct tcpc_dev *dev);
    + void (*set_partner_usb_comm_capable)(struct tcpc_dev *dev, bool enable);
    };

    struct tcpm_port;
    --
    2.30.0.365.g02bc693789-goog
    \
     
     \ /
      Last update: 2021-02-02 01:35    [W:2.172 / U:0.588 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site