Commit ae4ba35d authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Greg Kroah-Hartman

usb: typec: Allow power role swapping even without USB PD

Even though originally the USB Type-C Specification did not
describe the steps for power role swapping without USB PD
contract in place, it did not actually mean power role swap
without USB PD was not allowed. The USB Type-C Specification
did not clearly separate the data and power roles until in
the release 1.2 which is why there also were no clear steps
for the scenario where only the power role was swapped
without USB PD contract before that.

Since in the latest version of the specification the power
role swap without USB PD is now clearly mentioned as allowed
operation, removing the check that prevented power role swap
without USB PD support.
Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20200211112531.86510-4-heikki.krogerus@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7932306a
...@@ -20,13 +20,13 @@ Date: April 2017 ...@@ -20,13 +20,13 @@ Date: April 2017
Contact: Heikki Krogerus <heikki.krogerus@linux.intel.com> Contact: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Description: Description:
The supported power roles. This attribute can be used to request The supported power roles. This attribute can be used to request
power role swap on the port when the port supports USB Power power role swap on the port. Swapping is supported as
Delivery. Swapping is supported as synchronous operation, so synchronous operation, so write(2) to the attribute will not
write(2) to the attribute will not return until the operation return until the operation has finished. The attribute is
has finished. The attribute is notified about role changes so notified about role changes so that poll(2) on the attribute
that poll(2) on the attribute wakes up. Change on the role will wakes up. Change on the role will also generate uevent
also generate uevent KOBJ_CHANGE. The current role is show in KOBJ_CHANGE. The current role is show in brackets, for example
brackets, for example "[source] sink" when in source mode. "[source] sink" when in source mode.
Valid values: source, sink Valid values: source, sink
......
...@@ -1112,11 +1112,6 @@ static ssize_t power_role_store(struct device *dev, ...@@ -1112,11 +1112,6 @@ static ssize_t power_role_store(struct device *dev,
struct typec_port *port = to_typec_port(dev); struct typec_port *port = to_typec_port(dev);
int ret; int ret;
if (!port->cap->pd_revision) {
dev_dbg(dev, "USB Power Delivery not supported\n");
return -EOPNOTSUPP;
}
if (!port->ops || !port->ops->pr_set) { if (!port->ops || !port->ops->pr_set) {
dev_dbg(dev, "power role swapping not supported\n"); dev_dbg(dev, "power role swapping not supported\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -1338,7 +1333,6 @@ static umode_t typec_attr_is_visible(struct kobject *kobj, ...@@ -1338,7 +1333,6 @@ static umode_t typec_attr_is_visible(struct kobject *kobj,
return 0444; return 0444;
} else if (attr == &dev_attr_power_role.attr) { } else if (attr == &dev_attr_power_role.attr) {
if (port->cap->type != TYPEC_PORT_DRP || if (port->cap->type != TYPEC_PORT_DRP ||
!port->cap->pd_revision ||
!port->ops || !port->ops->pr_set) !port->ops || !port->ops->pr_set)
return 0444; return 0444;
} else if (attr == &dev_attr_vconn_source.attr) { } else if (attr == &dev_attr_vconn_source.attr) {
......
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