diff mbox series

[1/2] usb: typec: ucsi: register DP only for NVIDIA DP VDO

Message ID 20200116013247.16507-1-ajayg@nvidia.com (mailing list archive)
State Superseded
Headers show
Series [1/2] usb: typec: ucsi: register DP only for NVIDIA DP VDO | expand

Commit Message

Ajay Gupta Jan. 16, 2020, 1:32 a.m. UTC
From: Ajay Gupta <ajayg@nvidia.com>

NVIDIA VirtualLink (svid 0x955) has two altmode with vdo values
of vdo=0x1 for VirtualLink DP mode and vdo=0x3 for NVIDIA test
mode. Register display altmode driver only for vdo=0x1

Signed-off-by: Ajay Gupta <ajayg@nvidia.com>
---
 drivers/usb/typec/ucsi/ucsi.c | 12 ++++++++++--
 include/linux/usb/typec_dp.h  |  2 ++
 2 files changed, 12 insertions(+), 2 deletions(-)

Comments

Heikki Krogerus Jan. 23, 2020, 9:24 a.m. UTC | #1
Hi Ajay,

On Wed, Jan 15, 2020 at 05:32:46PM -0800, Ajay Gupta wrote:
> From: Ajay Gupta <ajayg@nvidia.com>
> 
> NVIDIA VirtualLink (svid 0x955) has two altmode with vdo values
> of vdo=0x1 for VirtualLink DP mode and vdo=0x3 for NVIDIA test
> mode. Register display altmode driver only for vdo=0x1
> 
> Signed-off-by: Ajay Gupta <ajayg@nvidia.com>
> ---
>  drivers/usb/typec/ucsi/ucsi.c | 12 ++++++++++--
>  include/linux/usb/typec_dp.h  |  2 ++
>  2 files changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
> index d5a6aac86327..eca9d598a42f 100644
> --- a/drivers/usb/typec/ucsi/ucsi.c
> +++ b/drivers/usb/typec/ucsi/ucsi.c
> @@ -270,9 +270,16 @@ static int ucsi_register_altmode(struct ucsi_connector *con,
>  
>  		switch (desc->svid) {
>  		case USB_TYPEC_DP_SID:
> -		case USB_TYPEC_NVIDIA_VLINK_SID:
>  			alt = ucsi_register_displayport(con, override, i, desc);
>  			break;
> +		case USB_TYPEC_NVIDIA_VLINK_SID:
> +			if (desc->vdo == USB_TYPEC_NVIDIA_VLINK_DBG_VDO)
> +				alt = typec_port_register_altmode(con->port,
> +								  desc);
> +			else
> +				alt = ucsi_register_displayport(con, override,
> +								i, desc);
> +			break;
>  		default:
>  			alt = typec_port_register_altmode(con->port, desc);
>  			break;
> @@ -475,7 +482,8 @@ static void ucsi_unregister_altmodes(struct ucsi_connector *con, u8 recipient)
>  	while (adev[i]) {
>  		if (recipient == UCSI_RECIPIENT_SOP &&
>  		    (adev[i]->svid == USB_TYPEC_DP_SID ||
> -			adev[i]->svid == USB_TYPEC_NVIDIA_VLINK_SID)) {
> +			(adev[i]->svid == USB_TYPEC_NVIDIA_VLINK_SID &&
> +			adev[i]->vdo != USB_TYPEC_NVIDIA_VLINK_DBG_VDO))) {
>  			pdev = typec_altmode_get_partner(adev[i]);
>  			ucsi_displayport_remove_partner((void *)pdev);
>  		}
> diff --git a/include/linux/usb/typec_dp.h b/include/linux/usb/typec_dp.h
> index fc4c7edb2e8a..848321c4498e 100644
> --- a/include/linux/usb/typec_dp.h
> +++ b/include/linux/usb/typec_dp.h
> @@ -10,6 +10,8 @@
>   * IDs as the SVID.
>   */
>  #define USB_TYPEC_NVIDIA_VLINK_SID	0x955	/* NVIDIA VirtualLink */
> +#define USB_TYPEC_NVIDIA_VLINK_DP_VDO	0x1
> +#define USB_TYPEC_NVIDIA_VLINK_DBG_VDO	0x3

I think those should be defined in ucsi.c for now. We can move them to
the header if there is another user.

thanks,
Ajay Gupta Jan. 23, 2020, 6:24 p.m. UTC | #2
Hi Heikki

> On Wed, Jan 15, 2020 at 05:32:46PM -0800, Ajay Gupta wrote:
> > From: Ajay Gupta <ajayg@nvidia.com>
> >
> > NVIDIA VirtualLink (svid 0x955) has two altmode with vdo values of
> > vdo=0x1 for VirtualLink DP mode and vdo=0x3 for NVIDIA test mode.
> > Register display altmode driver only for vdo=0x1
> >
> > Signed-off-by: Ajay Gupta <ajayg@nvidia.com>
> > ---
> >  drivers/usb/typec/ucsi/ucsi.c | 12 ++++++++++--
> > include/linux/usb/typec_dp.h  |  2 ++
> >  2 files changed, 12 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/usb/typec/ucsi/ucsi.c
> > b/drivers/usb/typec/ucsi/ucsi.c index d5a6aac86327..eca9d598a42f
> > 100644
> > --- a/drivers/usb/typec/ucsi/ucsi.c
> > +++ b/drivers/usb/typec/ucsi/ucsi.c
> > @@ -270,9 +270,16 @@ static int ucsi_register_altmode(struct
> > ucsi_connector *con,
> >
> >               switch (desc->svid) {
> >               case USB_TYPEC_DP_SID:
> > -             case USB_TYPEC_NVIDIA_VLINK_SID:
> >                       alt = ucsi_register_displayport(con, override, i, desc);
> >                       break;
> > +             case USB_TYPEC_NVIDIA_VLINK_SID:
> > +                     if (desc->vdo == USB_TYPEC_NVIDIA_VLINK_DBG_VDO)
> > +                             alt = typec_port_register_altmode(con->port,
> > +                                                               desc);
> > +                     else
> > +                             alt = ucsi_register_displayport(con, override,
> > +                                                             i, desc);
> > +                     break;
> >               default:
> >                       alt = typec_port_register_altmode(con->port, desc);
> >                       break;
> > @@ -475,7 +482,8 @@ static void ucsi_unregister_altmodes(struct
> ucsi_connector *con, u8 recipient)
> >       while (adev[i]) {
> >               if (recipient == UCSI_RECIPIENT_SOP &&
> >                   (adev[i]->svid == USB_TYPEC_DP_SID ||
> > -                     adev[i]->svid == USB_TYPEC_NVIDIA_VLINK_SID)) {
> > +                     (adev[i]->svid == USB_TYPEC_NVIDIA_VLINK_SID &&
> > +                     adev[i]->vdo !=
> > + USB_TYPEC_NVIDIA_VLINK_DBG_VDO))) {
> >                       pdev = typec_altmode_get_partner(adev[i]);
> >                       ucsi_displayport_remove_partner((void *)pdev);
> >               }
> > diff --git a/include/linux/usb/typec_dp.h
> > b/include/linux/usb/typec_dp.h index fc4c7edb2e8a..848321c4498e 100644
> > --- a/include/linux/usb/typec_dp.h
> > +++ b/include/linux/usb/typec_dp.h
> > @@ -10,6 +10,8 @@
> >   * IDs as the SVID.
> >   */
> >  #define USB_TYPEC_NVIDIA_VLINK_SID   0x955   /* NVIDIA VirtualLink */
> > +#define USB_TYPEC_NVIDIA_VLINK_DP_VDO        0x1
> > +#define USB_TYPEC_NVIDIA_VLINK_DBG_VDO       0x3
> 
> I think those should be defined in ucsi.c for now. We can move them to the
> header if there is another user.
Sure, I will update the change.

Thanks
> nvpublic
> thanks,
> 
> --
> heikki
diff mbox series

Patch

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index d5a6aac86327..eca9d598a42f 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -270,9 +270,16 @@  static int ucsi_register_altmode(struct ucsi_connector *con,
 
 		switch (desc->svid) {
 		case USB_TYPEC_DP_SID:
-		case USB_TYPEC_NVIDIA_VLINK_SID:
 			alt = ucsi_register_displayport(con, override, i, desc);
 			break;
+		case USB_TYPEC_NVIDIA_VLINK_SID:
+			if (desc->vdo == USB_TYPEC_NVIDIA_VLINK_DBG_VDO)
+				alt = typec_port_register_altmode(con->port,
+								  desc);
+			else
+				alt = ucsi_register_displayport(con, override,
+								i, desc);
+			break;
 		default:
 			alt = typec_port_register_altmode(con->port, desc);
 			break;
@@ -475,7 +482,8 @@  static void ucsi_unregister_altmodes(struct ucsi_connector *con, u8 recipient)
 	while (adev[i]) {
 		if (recipient == UCSI_RECIPIENT_SOP &&
 		    (adev[i]->svid == USB_TYPEC_DP_SID ||
-			adev[i]->svid == USB_TYPEC_NVIDIA_VLINK_SID)) {
+			(adev[i]->svid == USB_TYPEC_NVIDIA_VLINK_SID &&
+			adev[i]->vdo != USB_TYPEC_NVIDIA_VLINK_DBG_VDO))) {
 			pdev = typec_altmode_get_partner(adev[i]);
 			ucsi_displayport_remove_partner((void *)pdev);
 		}
diff --git a/include/linux/usb/typec_dp.h b/include/linux/usb/typec_dp.h
index fc4c7edb2e8a..848321c4498e 100644
--- a/include/linux/usb/typec_dp.h
+++ b/include/linux/usb/typec_dp.h
@@ -10,6 +10,8 @@ 
  * IDs as the SVID.
  */
 #define USB_TYPEC_NVIDIA_VLINK_SID	0x955	/* NVIDIA VirtualLink */
+#define USB_TYPEC_NVIDIA_VLINK_DP_VDO	0x1
+#define USB_TYPEC_NVIDIA_VLINK_DBG_VDO	0x3
 #define USB_TYPEC_DP_MODE	1
 
 /*