Message ID | 20200713203838.339297-1-badhri@google.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [1/2] usb: typec: tcpm: Support bist test data mode for compliance | expand |
On 7/13/20 1:38 PM, Badhri Jagan Sridharan wrote: > TCPM supports BIST carried mode. PD compliance tests require > BIST Test Data to be supported as well. > > Signed-off-by: Badhri Jagan Sridharan <badhri@google.com> This should be two patches: One to introduce support for BDO_MODE_TESTDATA into tcpm, and one to enable it in the tcpci code. > --- > drivers/usb/typec/tcpm/tcpci.c | 14 ++++++++++++++ > drivers/usb/typec/tcpm/tcpci.h | 3 +++ > drivers/usb/typec/tcpm/tcpm.c | 7 +++++++ > include/linux/usb/tcpm.h | 2 ++ > 4 files changed, 26 insertions(+) > > diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c > index 753645bb25273a..3616263f661233 100644 > --- a/drivers/usb/typec/tcpm/tcpci.c > +++ b/drivers/usb/typec/tcpm/tcpci.c > @@ -227,6 +227,19 @@ static int tcpci_set_vconn(struct tcpc_dev *tcpc, bool enable) > enable ? TCPC_POWER_CTRL_VCONN_ENABLE : 0); > } > > +static int tcpci_set_bist_data(struct tcpc_dev *tcpc, bool enable) > +{ > + struct tcpci *tcpci = tcpc_to_tcpci(tcpc); > + int ret; > + > + dev_info(tcpci->dev, "set bist %s\n", enable ? "true" : "false"); This should be a tcpm log message in the calling code, and not go to the kernel log. > + ret = regmap_update_bits(tcpci->regmap, TCPC_TCPC_CTRL, > + TCPC_TCPC_CTRL_BIST_TM, enable ? > + TCPC_TCPC_CTRL_BIST_TM : 0); Formatting is a bit off here. First, the limit is now 100 columns, and "enable ? ..." should be in one line. > + > + return ret; Just return regmap_update_bits(...); > +} > + > static int tcpci_set_roles(struct tcpc_dev *tcpc, bool attached, > enum typec_role role, enum typec_data_role data) > { > @@ -530,6 +543,7 @@ struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data) > tcpci->tcpc.set_pd_rx = tcpci_set_pd_rx; > tcpci->tcpc.set_roles = tcpci_set_roles; > tcpci->tcpc.pd_transmit = tcpci_pd_transmit; > + tcpci->tcpc.set_bist_data = tcpci_set_bist_data; > > err = tcpci_parse_config(tcpci); > if (err < 0) > diff --git a/drivers/usb/typec/tcpm/tcpci.h b/drivers/usb/typec/tcpm/tcpci.h > index 303ebde265465c..a29c8b6c2efe07 100644 > --- a/drivers/usb/typec/tcpm/tcpci.h > +++ b/drivers/usb/typec/tcpm/tcpci.h > @@ -36,6 +36,7 @@ > > #define TCPC_TCPC_CTRL 0x19 > #define TCPC_TCPC_CTRL_ORIENTATION BIT(0) > +#define TCPC_TCPC_CTRL_BIST_TM BIT(1) > > #define TCPC_ROLE_CTRL 0x1a > #define TCPC_ROLE_CTRL_DRP BIT(6) > @@ -130,6 +131,8 @@ struct tcpci_data { > bool enable); > int (*start_drp_toggling)(struct tcpci *tcpci, struct tcpci_data *data, > enum typec_cc_status cc); > + int (*set_bist_data)(struct tcpci *tcpci, struct tcpci_data *data, > + bool enable); > }; > > struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data); > diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c > index 82b19ebd7838e0..525379798d6c5c 100644 > --- a/drivers/usb/typec/tcpm/tcpm.c > +++ b/drivers/usb/typec/tcpm/tcpm.c > @@ -2746,6 +2746,9 @@ static void tcpm_detach(struct tcpm_port *port) > if (!port->attached) > return; > > + if (port->tcpc->set_bist_data) > + port->tcpc->set_bist_data(port->tcpc, false); > + > if (tcpm_port_is_disconnected(port)) > port->hard_reset_count = 0; > > @@ -3555,6 +3558,10 @@ static void run_state_machine(struct tcpm_port *port) > case BDO_MODE_CARRIER2: > tcpm_pd_transmit(port, TCPC_TX_BIST_MODE_2, NULL); > break; > + case BDO_MODE_TESTDATA: > + if (port->tcpc->set_bist_data) > + port->tcpc->set_bist_data(port->tcpc, true); > + break; > default: > break; > } > diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h > index e7979c01c3517c..89f58760cf4800 100644 > --- a/include/linux/usb/tcpm.h > +++ b/include/linux/usb/tcpm.h > @@ -79,6 +79,7 @@ enum tcpm_transmit_type { > * @try_role: Optional; called to set a preferred role > * @pd_transmit:Called to transmit PD message > * @mux: Pointer to multiplexer data > + * @set_bist_data: Turn on/off bist data mode for compliance testing > */ > struct tcpc_dev { > struct fwnode_handle *fwnode; > @@ -103,6 +104,7 @@ struct tcpc_dev { > int (*try_role)(struct tcpc_dev *dev, int role); > int (*pd_transmit)(struct tcpc_dev *dev, enum tcpm_transmit_type type, > const struct pd_message *msg); > + int (*set_bist_data)(struct tcpc_dev *dev, bool on); > }; > > struct tcpm_port; >
diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c index 753645bb25273a..3616263f661233 100644 --- a/drivers/usb/typec/tcpm/tcpci.c +++ b/drivers/usb/typec/tcpm/tcpci.c @@ -227,6 +227,19 @@ static int tcpci_set_vconn(struct tcpc_dev *tcpc, bool enable) enable ? TCPC_POWER_CTRL_VCONN_ENABLE : 0); } +static int tcpci_set_bist_data(struct tcpc_dev *tcpc, bool enable) +{ + struct tcpci *tcpci = tcpc_to_tcpci(tcpc); + int ret; + + dev_info(tcpci->dev, "set bist %s\n", enable ? "true" : "false"); + ret = regmap_update_bits(tcpci->regmap, TCPC_TCPC_CTRL, + TCPC_TCPC_CTRL_BIST_TM, enable ? + TCPC_TCPC_CTRL_BIST_TM : 0); + + return ret; +} + static int tcpci_set_roles(struct tcpc_dev *tcpc, bool attached, enum typec_role role, enum typec_data_role data) { @@ -530,6 +543,7 @@ struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data) tcpci->tcpc.set_pd_rx = tcpci_set_pd_rx; tcpci->tcpc.set_roles = tcpci_set_roles; tcpci->tcpc.pd_transmit = tcpci_pd_transmit; + tcpci->tcpc.set_bist_data = tcpci_set_bist_data; err = tcpci_parse_config(tcpci); if (err < 0) diff --git a/drivers/usb/typec/tcpm/tcpci.h b/drivers/usb/typec/tcpm/tcpci.h index 303ebde265465c..a29c8b6c2efe07 100644 --- a/drivers/usb/typec/tcpm/tcpci.h +++ b/drivers/usb/typec/tcpm/tcpci.h @@ -36,6 +36,7 @@ #define TCPC_TCPC_CTRL 0x19 #define TCPC_TCPC_CTRL_ORIENTATION BIT(0) +#define TCPC_TCPC_CTRL_BIST_TM BIT(1) #define TCPC_ROLE_CTRL 0x1a #define TCPC_ROLE_CTRL_DRP BIT(6) @@ -130,6 +131,8 @@ struct tcpci_data { bool enable); int (*start_drp_toggling)(struct tcpci *tcpci, struct tcpci_data *data, enum typec_cc_status cc); + int (*set_bist_data)(struct tcpci *tcpci, struct tcpci_data *data, + bool enable); }; struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data); diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 82b19ebd7838e0..525379798d6c5c 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -2746,6 +2746,9 @@ static void tcpm_detach(struct tcpm_port *port) if (!port->attached) return; + if (port->tcpc->set_bist_data) + port->tcpc->set_bist_data(port->tcpc, false); + if (tcpm_port_is_disconnected(port)) port->hard_reset_count = 0; @@ -3555,6 +3558,10 @@ static void run_state_machine(struct tcpm_port *port) case BDO_MODE_CARRIER2: tcpm_pd_transmit(port, TCPC_TX_BIST_MODE_2, NULL); break; + case BDO_MODE_TESTDATA: + if (port->tcpc->set_bist_data) + port->tcpc->set_bist_data(port->tcpc, true); + break; default: break; } diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h index e7979c01c3517c..89f58760cf4800 100644 --- a/include/linux/usb/tcpm.h +++ b/include/linux/usb/tcpm.h @@ -79,6 +79,7 @@ enum tcpm_transmit_type { * @try_role: Optional; called to set a preferred role * @pd_transmit:Called to transmit PD message * @mux: Pointer to multiplexer data + * @set_bist_data: Turn on/off bist data mode for compliance testing */ struct tcpc_dev { struct fwnode_handle *fwnode; @@ -103,6 +104,7 @@ struct tcpc_dev { int (*try_role)(struct tcpc_dev *dev, int role); int (*pd_transmit)(struct tcpc_dev *dev, enum tcpm_transmit_type type, const struct pd_message *msg); + int (*set_bist_data)(struct tcpc_dev *dev, bool on); }; struct tcpm_port;
TCPM supports BIST carried mode. PD compliance tests require BIST Test Data to be supported as well. Signed-off-by: Badhri Jagan Sridharan <badhri@google.com> --- drivers/usb/typec/tcpm/tcpci.c | 14 ++++++++++++++ drivers/usb/typec/tcpm/tcpci.h | 3 +++ drivers/usb/typec/tcpm/tcpm.c | 7 +++++++ include/linux/usb/tcpm.h | 2 ++ 4 files changed, 26 insertions(+)