Re: [PATCH 1/2] usb: typec: tcpm: Support bist test data mode for compliance

From: Guenter Roeck
Date: Tue Jul 14 2020 - 10:09:42 EST


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@xxxxxxxxxx>

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;
>