Commit cf28369c authored by Ajay Gupta's avatar Ajay Gupta Committed by Greg Kroah-Hartman

usb: typec: Add driver for NVIDIA Alt Modes

Latest NVIDIA GPUs support VirtualLink device. Since USBIF
has not assigned a Standard ID (SID) for VirtualLink
so using NVIDA VID 0x955 as SVID.
Signed-off-by: default avatarAjay Gupta <ajayg@nvidia.com>
Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d266e968
...@@ -12,4 +12,14 @@ config TYPEC_DP_ALTMODE ...@@ -12,4 +12,14 @@ config TYPEC_DP_ALTMODE
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called typec_displayport. module will be called typec_displayport.
config TYPEC_NVIDIA_ALTMODE
tristate "NVIDIA Alternate Mode driver"
depends on TYPEC_DP_ALTMODE
help
Latest NVIDIA GPUs support VirtualLink devices. Select this
to enable support for VirtualLink devices with NVIDIA GPUs.
To compile this driver as a module, choose M here: the
module will be called typec_displayport.
endmenu endmenu
...@@ -2,3 +2,5 @@ ...@@ -2,3 +2,5 @@
obj-$(CONFIG_TYPEC_DP_ALTMODE) += typec_displayport.o obj-$(CONFIG_TYPEC_DP_ALTMODE) += typec_displayport.o
typec_displayport-y := displayport.o typec_displayport-y := displayport.o
obj-$(CONFIG_TYPEC_NVIDIA_ALTMODE) += typec_nvidia.o
typec_nvidia-y := nvidia.o
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2019 NVIDIA Corporation. All rights reserved.
*
* NVIDIA USB Type-C Alt Mode Driver
*/
#include <linux/module.h>
#include <linux/usb/typec_altmode.h>
#include <linux/usb/typec_dp.h>
#include "displayport.h"
static int nvidia_altmode_probe(struct typec_altmode *alt)
{
if (alt->svid == USB_TYPEC_NVIDIA_VLINK_SID)
return dp_altmode_probe(alt);
else
return -ENOTSUPP;
}
static void nvidia_altmode_remove(struct typec_altmode *alt)
{
if (alt->svid == USB_TYPEC_NVIDIA_VLINK_SID)
dp_altmode_remove(alt);
}
static const struct typec_device_id nvidia_typec_id[] = {
{ USB_TYPEC_NVIDIA_VLINK_SID, TYPEC_ANY_MODE },
{ },
};
MODULE_DEVICE_TABLE(typec, nvidia_typec_id);
static struct typec_altmode_driver nvidia_altmode_driver = {
.id_table = nvidia_typec_id,
.probe = nvidia_altmode_probe,
.remove = nvidia_altmode_remove,
.driver = {
.name = "typec_nvidia",
.owner = THIS_MODULE,
},
};
module_typec_altmode_driver(nvidia_altmode_driver);
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("NVIDIA USB Type-C Alt Mode Driver");
...@@ -283,6 +283,7 @@ static int ucsi_register_altmode(struct ucsi_connector *con, ...@@ -283,6 +283,7 @@ static int ucsi_register_altmode(struct ucsi_connector *con,
switch (desc->svid) { switch (desc->svid) {
case USB_TYPEC_DP_SID: case USB_TYPEC_DP_SID:
case USB_TYPEC_NVIDIA_VLINK_SID:
alt = ucsi_register_displayport(con, override, i, desc); alt = ucsi_register_displayport(con, override, i, desc);
break; break;
default: default:
...@@ -404,7 +405,8 @@ static void ucsi_unregister_altmodes(struct ucsi_connector *con, u8 recipient) ...@@ -404,7 +405,8 @@ static void ucsi_unregister_altmodes(struct ucsi_connector *con, u8 recipient)
while (adev[i]) { while (adev[i]) {
if (recipient == UCSI_RECIPIENT_SOP && if (recipient == UCSI_RECIPIENT_SOP &&
adev[i]->svid == USB_TYPEC_DP_SID) { (adev[i]->svid == USB_TYPEC_DP_SID ||
adev[i]->svid == USB_TYPEC_NVIDIA_VLINK_SID)) {
pdev = typec_altmode_get_partner(adev[i]); pdev = typec_altmode_get_partner(adev[i]);
ucsi_displayport_remove_partner((void *)pdev); ucsi_displayport_remove_partner((void *)pdev);
} }
......
...@@ -5,6 +5,11 @@ ...@@ -5,6 +5,11 @@
#include <linux/usb/typec_altmode.h> #include <linux/usb/typec_altmode.h>
#define USB_TYPEC_DP_SID 0xff01 #define USB_TYPEC_DP_SID 0xff01
/* USB IF has not assigned a Standard ID (SID) for VirtualLink,
* so the manufacturers of VirtualLink adapters use their Vendor
* IDs as the SVID.
*/
#define USB_TYPEC_NVIDIA_VLINK_SID 0x955 /* NVIDIA VirtualLink */
#define USB_TYPEC_DP_MODE 1 #define USB_TYPEC_DP_MODE 1
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment