summaryrefslogtreecommitdiff
path: root/gnu/packages/patches/linux-libre-pinebook-pro-11-usb-typec-altmodes-displayport-Add-hacky-generic-alt.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/patches/linux-libre-pinebook-pro-11-usb-typec-altmodes-displayport-Add-hacky-generic-alt.patch')
-rw-r--r--gnu/packages/patches/linux-libre-pinebook-pro-11-usb-typec-altmodes-displayport-Add-hacky-generic-alt.patch121
1 files changed, 121 insertions, 0 deletions
diff --git a/gnu/packages/patches/linux-libre-pinebook-pro-11-usb-typec-altmodes-displayport-Add-hacky-generic-alt.patch b/gnu/packages/patches/linux-libre-pinebook-pro-11-usb-typec-altmodes-displayport-Add-hacky-generic-alt.patch
new file mode 100644
index 0000000000..383964c34f
--- /dev/null
+++ b/gnu/packages/patches/linux-libre-pinebook-pro-11-usb-typec-altmodes-displayport-Add-hacky-generic-alt.patch
@@ -0,0 +1,121 @@
+From c6e5e01ca875770f71febe4c87f60fd57df86f6f Mon Sep 17 00:00:00 2001
+From: Tobias Schramm <t.schramm@manjaro.org>
+Date: Thu, 28 May 2020 14:26:27 +0200
+Subject: [PATCH 11/22] usb: typec: altmodes: displayport: Add hacky, generic
+ altmode detection
+
+Do not mainline, hack.
+
+Signed-off-by: Tobias Schramm <t.schramm@manjaro.org>
+---
+ drivers/usb/typec/altmodes/displayport.c | 55 ++++++++++++++++++++++--
+ 1 file changed, 52 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c
+index e62e5e3da01e..a3d03db476aa 100644
+--- a/drivers/usb/typec/altmodes/displayport.c
++++ b/drivers/usb/typec/altmodes/displayport.c
+@@ -9,6 +9,8 @@
+ */
+
+ #include <linux/delay.h>
++#include <linux/extcon.h>
++#include <linux/extcon-provider.h>
+ #include <linux/mutex.h>
+ #include <linux/module.h>
+ #include <linux/usb/pd_vdo.h>
+@@ -135,15 +137,53 @@ static int dp_altmode_status_update(struct dp_altmode *dp)
+ return ret;
+ }
+
++static void dp_altmode_update_extcon(struct dp_altmode *dp, bool disconnect) {
++ const struct device *dev = &dp->port->dev;
++ struct extcon_dev* edev = NULL;
++
++ while (dev) {
++ edev = extcon_find_edev_by_node(dev->of_node);
++ if(!IS_ERR(edev)) {
++ break;
++ }
++ dev = dev->parent;
++ }
++
++ if (IS_ERR_OR_NULL(edev)) {
++ return;
++ }
++
++ if (disconnect || !dp->data.conf) {
++ extcon_set_state_sync(edev, EXTCON_DISP_DP, false);
++ } else {
++ union extcon_property_value extcon_true = { .intval = true };
++ extcon_set_state(edev, EXTCON_DISP_DP, true);
++ if (DP_CONF_GET_PIN_ASSIGN(dp->data.conf) & DP_PIN_ASSIGN_MULTI_FUNC_MASK) {
++ extcon_set_state_sync(edev, EXTCON_USB_HOST, true);
++ extcon_set_property(edev, EXTCON_DISP_DP, EXTCON_PROP_USB_SS,
++ extcon_true);
++ } else {
++ extcon_set_state_sync(edev, EXTCON_USB_HOST, false);
++ }
++ extcon_sync(edev, EXTCON_DISP_DP);
++ extcon_set_state_sync(edev, EXTCON_USB, false);
++ }
++
++}
++
+ static int dp_altmode_configured(struct dp_altmode *dp)
+ {
+ int ret;
+
+ sysfs_notify(&dp->alt->dev.kobj, "displayport", "configuration");
+
+- if (!dp->data.conf)
++ if (!dp->data.conf) {
++ dp_altmode_update_extcon(dp, true);
+ return typec_altmode_notify(dp->alt, TYPEC_STATE_USB,
+ &dp->data);
++ }
++
++ dp_altmode_update_extcon(dp, false);
+
+ ret = dp_altmode_notify(dp);
+ if (ret)
+@@ -170,9 +210,11 @@ static int dp_altmode_configure_vdm(struct dp_altmode *dp, u32 conf)
+ if (ret) {
+ if (DP_CONF_GET_PIN_ASSIGN(dp->data.conf))
+ dp_altmode_notify(dp);
+- else
++ else {
++ dp_altmode_update_extcon(dp, true);
+ typec_altmode_notify(dp->alt, TYPEC_STATE_USB,
+ &dp->data);
++ }
+ }
+
+ return ret;
+@@ -211,6 +253,8 @@ static void dp_altmode_work(struct work_struct *work)
+ case DP_STATE_EXIT:
+ if (typec_altmode_exit(dp->alt))
+ dev_err(&dp->alt->dev, "Exit Mode Failed!\n");
++ else
++ dp_altmode_update_extcon(dp, true);
+ break;
+ default:
+ break;
+@@ -521,8 +565,13 @@ int dp_altmode_probe(struct typec_altmode *alt)
+ if (!(DP_CAP_DFP_D_PIN_ASSIGN(port->vdo) &
+ DP_CAP_UFP_D_PIN_ASSIGN(alt->vdo)) &&
+ !(DP_CAP_UFP_D_PIN_ASSIGN(port->vdo) &
+- DP_CAP_DFP_D_PIN_ASSIGN(alt->vdo)))
++ DP_CAP_DFP_D_PIN_ASSIGN(alt->vdo))) {
++ dev_err(&alt->dev, "No compatible pin configuration found:"\
++ "%04lx -> %04lx, %04lx <- %04lx",
++ DP_CAP_DFP_D_PIN_ASSIGN(port->vdo), DP_CAP_UFP_D_PIN_ASSIGN(alt->vdo),
++ DP_CAP_UFP_D_PIN_ASSIGN(port->vdo), DP_CAP_DFP_D_PIN_ASSIGN(alt->vdo));
+ return -ENODEV;
++ }
+
+ ret = sysfs_create_group(&alt->dev.kobj, &dp_altmode_group);
+ if (ret)
+--
+2.30.0
+