usb: typec: tcpci: add cable_comm_capable attribute
authorRD Babiera <rdbabiera@google.com>
Mon, 8 Jan 2024 19:16:16 +0000 (19:16 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 28 Jan 2024 01:38:25 +0000 (17:38 -0800)
Add cable_comm_capable to tcpci_data for tcpci drivers to indicate that
the port tcpc is capable of communicating to cables over SOP. A
corresponding tcpci callback tcpci_cable_comm_capable returns this value.
The tcpm will primarily use this in later patches to determine if the port
can transmit and receive SOP' messages.

Maxim based tcpci drivers are capable of SOP' communication, so the
cable_comm_capable flag is set to true.

Signed-off-by: RD Babiera <rdbabiera@google.com>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20240108191620.987785-17-rdbabiera@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/tcpm/tcpci.c
drivers/usb/typec/tcpm/tcpci_maxim_core.c
include/linux/usb/tcpci.h
include/linux/usb/tcpm.h

index 0ee3e6e29bb178418dbcfb60c3d5eaeb542245da..1ededbcecc09cb9ccdd416a1fa69e2cb26e78088 100644 (file)
@@ -584,6 +584,13 @@ static int tcpci_pd_transmit(struct tcpc_dev *tcpc, enum tcpm_transmit_type type
        return 0;
 }
 
+static bool tcpci_cable_comm_capable(struct tcpc_dev *tcpc)
+{
+       struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
+
+       return tcpci->data->cable_comm_capable;
+}
+
 static int tcpci_init(struct tcpc_dev *tcpc)
 {
        struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
@@ -793,6 +800,7 @@ 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.cable_comm_capable = tcpci_cable_comm_capable;
 
        if (tcpci->data->check_contaminant)
                tcpci->tcpc.check_contaminant = tcpci_check_contaminant;
index 7fb966fd639b32296f443a8701e4968c5084bad5..7b2d4e6e52a207ef69c1ba7e3cdb9f4700dc27c5 100644 (file)
@@ -478,6 +478,7 @@ static int max_tcpci_probe(struct i2c_client *client)
        chip->data.vbus_vsafe0v = true;
        chip->data.set_partner_usb_comm_capable = max_tcpci_set_partner_usb_comm_capable;
        chip->data.check_contaminant = max_tcpci_check_contaminant;
+       chip->data.cable_comm_capable = true;
 
        max_tcpci_init_regs(chip);
        chip->tcpci = tcpci_register_port(chip->dev, &chip->data);
index 467e8045e9f8690e461df4094b6afd47346b0c17..1d0b849defd07144e33cc57384c0604a374a1266 100644 (file)
@@ -198,12 +198,15 @@ struct tcpci;
  *             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.
+ * @cable_comm_capable
+ *             optional; Set when TCPC can communicate with cable plugs over SOP'
  */
 struct tcpci_data {
        struct regmap *regmap;
        unsigned char TX_BUF_BYTE_x_hidden:1;
        unsigned char auto_discharge_disconnect:1;
        unsigned char vbus_vsafe0v:1;
+       unsigned char cable_comm_capable:1;
 
        int (*init)(struct tcpci *tcpci, struct tcpci_data *data);
        int (*set_vconn)(struct tcpci *tcpci, struct tcpci_data *data,
index 65fac5e1f3178c4b11650771ded16d35b792b6a2..430fa3ec69bb67f8f8c37d2037f5a408e9f109a1 100644 (file)
@@ -119,6 +119,9 @@ enum tcpm_transmit_type {
  *             at the end of the deboumce period or when the port is still
  *             toggling. Chip level drivers are expected to check for contaminant
  *             and call tcpm_clean_port when the port is clean.
+ * @cable_comm_capable
+ *             Optional; Returns whether cable communication over SOP' is supported
+ *             by the tcpc
  */
 struct tcpc_dev {
        struct fwnode_handle *fwnode;
@@ -154,6 +157,7 @@ struct tcpc_dev {
        bool (*is_vbus_vsafe0v)(struct tcpc_dev *dev);
        void (*set_partner_usb_comm_capable)(struct tcpc_dev *dev, bool enable);
        void (*check_contaminant)(struct tcpc_dev *dev);
+       bool (*cable_comm_capable)(struct tcpc_dev *dev);
 };
 
 struct tcpm_port;