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). TCPM passes this information for chip specific
operations.
Signed-off-by: Badhri Jagan Sridharan <[email protected]>
---
drivers/usb/typec/tcpm/tcpci.c | 9 +++++++++
drivers/usb/typec/tcpm/tcpci.h | 6 ++++++
2 files changed, 15 insertions(+)
diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c
index f676abab044b..a27deb0b5f03 100644
--- a/drivers/usb/typec/tcpm/tcpci.c
+++ b/drivers/usb/typec/tcpm/tcpci.c
@@ -255,6 +255,14 @@ static int tcpci_set_polarity(struct tcpc_dev *tcpc,
TCPC_TCPC_CTRL_ORIENTATION : 0);
}
+static void tcpci_set_partner_usb_comm_capable(struct tcpc_dev *tcpc, bool capable)
+{
+ struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
+
+ if (tcpci->data->set_partner_usb_comm_capable)
+ tcpci->data->set_partner_usb_comm_capable(tcpci, tcpci->data, capable);
+}
+
static int tcpci_set_vconn(struct tcpc_dev *tcpc, bool enable)
{
struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
@@ -720,6 +728,7 @@ struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data)
tcpci->tcpc.set_bist_data = tcpci_set_bist_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;
if (tcpci->data->auto_discharge_disconnect) {
tcpci->tcpc.enable_auto_vbus_discharge = tcpci_enable_auto_vbus_discharge;
diff --git a/drivers/usb/typec/tcpm/tcpci.h b/drivers/usb/typec/tcpm/tcpci.h
index c3c7d07d9b4e..57b6e24e0a0c 100644
--- a/drivers/usb/typec/tcpm/tcpci.h
+++ b/drivers/usb/typec/tcpm/tcpci.h
@@ -161,6 +161,10 @@ struct tcpci;
* Optional; Enables TCPC to autonously discharge vbus on disconnect.
* @vbus_vsafe0v:
* optional; Set when TCPC can detect whether vbus is at VSAFE0V.
+ * @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 tcpci_data {
struct regmap *regmap;
@@ -175,6 +179,8 @@ struct tcpci_data {
enum typec_cc_status cc);
int (*set_vbus)(struct tcpci *tcpci, struct tcpci_data *data, bool source, bool sink);
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);
};
struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data);
--
2.30.0.365.g02bc693789-goog
On Mon, Feb 01, 2021 at 04:31:00PM -0800, Badhri Jagan Sridharan wrote:
> 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). TCPM passes this information for chip specific
> operations.
>
> Signed-off-by: Badhri Jagan Sridharan <[email protected]>
Reviewed-by: Heikki Krogerus <[email protected]>
> ---
> drivers/usb/typec/tcpm/tcpci.c | 9 +++++++++
> drivers/usb/typec/tcpm/tcpci.h | 6 ++++++
> 2 files changed, 15 insertions(+)
>
> diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c
> index f676abab044b..a27deb0b5f03 100644
> --- a/drivers/usb/typec/tcpm/tcpci.c
> +++ b/drivers/usb/typec/tcpm/tcpci.c
> @@ -255,6 +255,14 @@ static int tcpci_set_polarity(struct tcpc_dev *tcpc,
> TCPC_TCPC_CTRL_ORIENTATION : 0);
> }
>
> +static void tcpci_set_partner_usb_comm_capable(struct tcpc_dev *tcpc, bool capable)
> +{
> + struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
> +
> + if (tcpci->data->set_partner_usb_comm_capable)
> + tcpci->data->set_partner_usb_comm_capable(tcpci, tcpci->data, capable);
> +}
> +
> static int tcpci_set_vconn(struct tcpc_dev *tcpc, bool enable)
> {
> struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
> @@ -720,6 +728,7 @@ struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data)
> tcpci->tcpc.set_bist_data = tcpci_set_bist_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;
>
> if (tcpci->data->auto_discharge_disconnect) {
> tcpci->tcpc.enable_auto_vbus_discharge = tcpci_enable_auto_vbus_discharge;
> diff --git a/drivers/usb/typec/tcpm/tcpci.h b/drivers/usb/typec/tcpm/tcpci.h
> index c3c7d07d9b4e..57b6e24e0a0c 100644
> --- a/drivers/usb/typec/tcpm/tcpci.h
> +++ b/drivers/usb/typec/tcpm/tcpci.h
> @@ -161,6 +161,10 @@ struct tcpci;
> * Optional; Enables TCPC to autonously discharge vbus on disconnect.
> * @vbus_vsafe0v:
> * optional; Set when TCPC can detect whether vbus is at VSAFE0V.
> + * @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 tcpci_data {
> struct regmap *regmap;
> @@ -175,6 +179,8 @@ struct tcpci_data {
> enum typec_cc_status cc);
> int (*set_vbus)(struct tcpci *tcpci, struct tcpci_data *data, bool source, bool sink);
> 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);
> };
>
> struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data);
> --
> 2.30.0.365.g02bc693789-goog
thanks,
--
heikki
On Mon, Feb 01, 2021 at 04:31:00PM -0800, Badhri Jagan Sridharan wrote:
> 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). TCPM passes this information for chip specific
> operations.
>
> Signed-off-by: Badhri Jagan Sridharan <[email protected]>
Reviewed-by: Guenter Roeck <[email protected]>
> ---
> drivers/usb/typec/tcpm/tcpci.c | 9 +++++++++
> drivers/usb/typec/tcpm/tcpci.h | 6 ++++++
> 2 files changed, 15 insertions(+)
>
> diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c
> index f676abab044b..a27deb0b5f03 100644
> --- a/drivers/usb/typec/tcpm/tcpci.c
> +++ b/drivers/usb/typec/tcpm/tcpci.c
> @@ -255,6 +255,14 @@ static int tcpci_set_polarity(struct tcpc_dev *tcpc,
> TCPC_TCPC_CTRL_ORIENTATION : 0);
> }
>
> +static void tcpci_set_partner_usb_comm_capable(struct tcpc_dev *tcpc, bool capable)
> +{
> + struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
> +
> + if (tcpci->data->set_partner_usb_comm_capable)
> + tcpci->data->set_partner_usb_comm_capable(tcpci, tcpci->data, capable);
> +}
> +
> static int tcpci_set_vconn(struct tcpc_dev *tcpc, bool enable)
> {
> struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
> @@ -720,6 +728,7 @@ struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data)
> tcpci->tcpc.set_bist_data = tcpci_set_bist_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;
>
> if (tcpci->data->auto_discharge_disconnect) {
> tcpci->tcpc.enable_auto_vbus_discharge = tcpci_enable_auto_vbus_discharge;
> diff --git a/drivers/usb/typec/tcpm/tcpci.h b/drivers/usb/typec/tcpm/tcpci.h
> index c3c7d07d9b4e..57b6e24e0a0c 100644
> --- a/drivers/usb/typec/tcpm/tcpci.h
> +++ b/drivers/usb/typec/tcpm/tcpci.h
> @@ -161,6 +161,10 @@ struct tcpci;
> * Optional; Enables TCPC to autonously discharge vbus on disconnect.
> * @vbus_vsafe0v:
> * optional; Set when TCPC can detect whether vbus is at VSAFE0V.
> + * @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 tcpci_data {
> struct regmap *regmap;
> @@ -175,6 +179,8 @@ struct tcpci_data {
> enum typec_cc_status cc);
> int (*set_vbus)(struct tcpci *tcpci, struct tcpci_data *data, bool source, bool sink);
> 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);
> };
>
> struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data);
> --
> 2.30.0.365.g02bc693789-goog
>