Skip to content

Commit

Permalink
board-pbp-add-dp-alt-mode(:1)
Browse files Browse the repository at this point in the history
Original-Subject: add-dp-alt-mode-to-PBP
None
X-Armbian: Patch-File: board-pbp-add-dp-alt-mode
X-Armbian: Patch-File-Counter: 1
X-Armbian: Patch-Rel-Directory: patch/kernel/archive/rockchip64-6.1
X-Armbian: Patch-Type: kernel
X-Armbian: Patch-Root-Type: core
X-Armbian: Patch-Sub-Type: common
X-Armbian: Original-Subject: add-dp-alt-mode-to-PBP
  • Loading branch information
Strit authored and Armbian AutoPatcher committed Jun 2, 2020
1 parent 57724c7 commit d217324
Show file tree
Hide file tree
Showing 5 changed files with 217 additions and 4 deletions.
5 changes: 5 additions & 0 deletions arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
Expand Up @@ -432,6 +432,7 @@

&emmc_phy {
status = "okay";
extcon = <&fusb0>;
};

&gpu {
Expand Down Expand Up @@ -716,6 +717,9 @@
<PDO_FIXED(5000, 1400, PDO_FIXED_USB_COMM)>;
try-power-role = "sink";

extcon-cables = <1 2 5 6 9 10 12 44>;
typec-altmodes = <0xff01 1 0x001c0000 1>;

ports {
#address-cells = <1>;
#size-cells = <0>;
Expand Down Expand Up @@ -982,6 +986,7 @@
};

&tcphy0 {
extcon = <&fusb0>;
status = "okay";
};

Expand Down
17 changes: 17 additions & 0 deletions drivers/phy/rockchip/phy-rockchip-typec.c
Expand Up @@ -40,6 +40,7 @@
#include <linux/clk-provider.h>
#include <linux/delay.h>
#include <linux/extcon.h>
#include <linux/extcon-provider.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/kernel.h>
Expand Down Expand Up @@ -1157,6 +1158,22 @@ static int rockchip_typec_phy_probe(struct platform_device *pdev)
dev_err(dev, "Invalid or missing extcon\n");
return PTR_ERR(tcphy->extcon);
}
} else {
extcon_set_property_capability(tcphy->extcon, EXTCON_USB,
EXTCON_PROP_USB_SS);
extcon_set_property_capability(tcphy->extcon, EXTCON_USB_HOST,
EXTCON_PROP_USB_SS);
extcon_set_property_capability(tcphy->extcon, EXTCON_DISP_DP,
EXTCON_PROP_USB_SS);
extcon_set_property_capability(tcphy->extcon, EXTCON_USB,
EXTCON_PROP_USB_TYPEC_POLARITY);
extcon_set_property_capability(tcphy->extcon, EXTCON_USB_HOST,
EXTCON_PROP_USB_TYPEC_POLARITY);
extcon_set_property_capability(tcphy->extcon, EXTCON_DISP_DP,
EXTCON_PROP_USB_TYPEC_POLARITY);
extcon_sync(tcphy->extcon, EXTCON_USB);
extcon_sync(tcphy->extcon, EXTCON_USB_HOST);
extcon_sync(tcphy->extcon, EXTCON_DISP_DP);
}

pm_runtime_enable(dev);
Expand Down
52 changes: 50 additions & 2 deletions drivers/usb/typec/altmodes/displayport.c
Expand Up @@ -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/property.h>
Expand Down Expand Up @@ -68,6 +70,8 @@ struct dp_altmode {
struct fwnode_handle *connector_fwnode;
};

void dp_altmode_update_extcon(struct dp_altmode *dp, bool disconnect);

static int dp_altmode_notify(struct dp_altmode *dp)
{
unsigned long conf;
Expand All @@ -76,7 +80,9 @@ static int dp_altmode_notify(struct dp_altmode *dp)
if (dp->data.conf) {
state = get_count_order(DP_CONF_GET_PIN_ASSIGN(dp->data.conf));
conf = TYPEC_MODAL_STATE(state);
dp_altmode_update_extcon(dp, false);
} else {
dp_altmode_update_extcon(dp, true);
conf = TYPEC_STATE_USB;
}

Expand Down Expand Up @@ -152,6 +158,40 @@ static int dp_altmode_status_update(struct dp_altmode *dp)
return ret;
}

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)
{
sysfs_notify(&dp->alt->dev.kobj, "displayport", "configuration");
Expand Down Expand Up @@ -221,6 +261,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;
Expand Down Expand Up @@ -538,8 +580,14 @@ int dp_altmode_probe(struct typec_altmode *alt)
if (!(DP_CAP_PIN_ASSIGN_DFP_D(port->vdo) &
DP_CAP_PIN_ASSIGN_UFP_D(alt->vdo)) &&
!(DP_CAP_PIN_ASSIGN_UFP_D(port->vdo) &
DP_CAP_PIN_ASSIGN_DFP_D(alt->vdo)))
return -ENODEV;
DP_CAP_PIN_ASSIGN_DFP_D(alt->vdo))) {
dev_err(&alt->dev, "No compatible pin configuration found:"\
"%04lx -> %04lx, %04lx <- %04lx",
DP_CAP_PIN_ASSIGN_DFP_D(port->vdo), DP_CAP_PIN_ASSIGN_DFP_D(alt->vdo),
DP_CAP_PIN_ASSIGN_UFP_D(port->vdo), DP_CAP_PIN_ASSIGN_UFP_D(alt->vdo));
return -ENODEV;
}


ret = sysfs_create_group(&alt->dev.kobj, &dp_altmode_group);
if (ret)
Expand Down
8 changes: 7 additions & 1 deletion drivers/usb/typec/bus.c
Expand Up @@ -156,8 +156,14 @@ EXPORT_SYMBOL_GPL(typec_altmode_exit);
*/
void typec_altmode_attention(struct typec_altmode *adev, u32 vdo)
{
struct typec_altmode *pdev = &to_altmode(adev)->partner->adev;
struct typec_altmode *pdev;
WARN_ONCE(!adev, "typec bus attention: adev is NULL!");
WARN_ONCE(!to_altmode(adev)->partner, "typec bus attention: partner is NULL!");
if(!adev || !to_altmode(adev)->partner) {
return;
}

pdev = &to_altmode(adev)->partner->adev;
if (pdev->ops && pdev->ops->attention)
pdev->ops->attention(pdev, vdo);
}
Expand Down

0 comments on commit d217324

Please sign in to comment.