lkml.org 
[lkml]   [2022]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v5 2/3] usb: typec: tcpci: Add callback for evaluating contaminant presence
    From
    This change adds callback to evaluate presence of contaminant in
    the TCPCI layer.

    Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
    ---
    Changes since v4:
    * None
    Changes since v3:
    * None
    Changes since v2:
    * Added tcpci_is_potential_contaminant to offload
    * disconnect_while_debounce logic
    ---
    drivers/usb/typec/tcpm/tcpci.c | 20 ++++++++++++++++++++
    include/linux/usb/tcpci.h | 13 +++++++++++++
    2 files changed, 33 insertions(+)

    diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c
    index fe781a38dc82..2aadf785970f 100644
    --- a/drivers/usb/typec/tcpm/tcpci.c
    +++ b/drivers/usb/typec/tcpm/tcpci.c
    @@ -403,6 +403,24 @@ static void tcpci_frs_sourcing_vbus(struct tcpc_dev *dev)
    tcpci->data->frs_sourcing_vbus(tcpci, tcpci->data);
    }

    +static bool tcpci_is_potential_contaminant(struct tcpc_dev *dev, enum tcpm_state current_state)
    +{
    + struct tcpci *tcpci = tcpc_to_tcpci(dev);
    +
    + if (tcpci->data->is_potential_contaminant)
    + return tcpci->data->is_potential_contaminant(tcpci, tcpci->data, current_state);
    +
    + return false;
    +}
    +
    +static void tcpci_check_contaminant(struct tcpc_dev *dev)
    +{
    + struct tcpci *tcpci = tcpc_to_tcpci(dev);
    +
    + if (tcpci->data->check_contaminant)
    + tcpci->data->check_contaminant(tcpci, tcpci->data);
    +}
    +
    static int tcpci_set_bist_data(struct tcpc_dev *tcpc, bool enable)
    {
    struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
    @@ -777,6 +795,8 @@ struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data)
    tcpci->tcpc.enable_frs = tcpci_enable_frs;
    tcpci->tcpc.frs_sourcing_vbus = tcpci_frs_sourcing_vbus;
    tcpci->tcpc.set_partner_usb_comm_capable = tcpci_set_partner_usb_comm_capable;
    + tcpci->tcpc.is_potential_contaminant = tcpci_is_potential_contaminant;
    + tcpci->tcpc.check_contaminant = tcpci_check_contaminant;

    if (tcpci->data->auto_discharge_disconnect) {
    tcpci->tcpc.enable_auto_vbus_discharge = tcpci_enable_auto_vbus_discharge;
    diff --git a/include/linux/usb/tcpci.h b/include/linux/usb/tcpci.h
    index 17657451c762..548e85fdc7fa 100644
    --- a/include/linux/usb/tcpci.h
    +++ b/include/linux/usb/tcpci.h
    @@ -188,6 +188,16 @@ struct tcpci;
    * 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.
    + * @check_contaminant:
    + * Optional; The callback is invoked when chiplevel drivers indicated
    + * that the USB port needs to be checked for contaminant presence.
    + * Chip level drivers are expected to check for contaminant and call
    + * tcpm_clean_port when the port is clean to put the port back into
    + * toggling state.
    + * @is_potential_contaminant:
    + * Optional; TCPM invokes the callback for every TCPM state machine
    + * transition. Chiplevel drivers can monitor the state machine
    + * transitions to flag for potential contaminant presence.
    */
    struct tcpci_data {
    struct regmap *regmap;
    @@ -204,6 +214,9 @@ struct tcpci_data {
    void (*frs_sourcing_vbus)(struct tcpci *tcpci, struct tcpci_data *data);
    void (*set_partner_usb_comm_capable)(struct tcpci *tcpci, struct tcpci_data *data,
    bool capable);
    + void (*check_contaminant)(struct tcpci *tcpci, struct tcpci_data *data);
    + bool (*is_potential_contaminant)(struct tcpci *tcpci, struct tcpci_data *data,
    + enum tcpm_state current_state);
    };

    struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data);
    --
    2.39.0.rc0.267.gcb52ba06e7-goog
    \
     
     \ /
      Last update: 2022-12-08 03:01    [W:3.089 / U:1.940 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site