usb: typec: Factor out non-PD fwnode properties

Basic programmable non-PD Type-C port controllers do not need the full
TCPM library, but they share the same devicetree binding and the same
typec_capability structure. Factor out a helper for parsing those
properties which map to fields in struct typec_capability, so the code
can be shared between TCPM and basic non-TCPM drivers.

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Samuel Holland <samuel@sholland.org>
Link: https://lore.kernel.org/r/20220214050118.61015-4-samuel@sholland.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Samuel Holland 2022-02-13 23:01:16 -06:00 committed by Greg Kroah-Hartman
parent 71c16066a5
commit 2e7dfb0e9c
3 changed files with 47 additions and 23 deletions

View file

@ -1894,6 +1894,49 @@ void *typec_get_drvdata(struct typec_port *port)
}
EXPORT_SYMBOL_GPL(typec_get_drvdata);
int typec_get_fw_cap(struct typec_capability *cap,
struct fwnode_handle *fwnode)
{
const char *cap_str;
int ret;
cap->fwnode = fwnode;
ret = fwnode_property_read_string(fwnode, "power-role", &cap_str);
if (ret < 0)
return ret;
ret = typec_find_port_power_role(cap_str);
if (ret < 0)
return ret;
cap->type = ret;
/* USB data support is optional */
ret = fwnode_property_read_string(fwnode, "data-role", &cap_str);
if (ret == 0) {
ret = typec_find_port_data_role(cap_str);
if (ret < 0)
return ret;
cap->data = ret;
}
/* Get the preferred power role for a DRP */
if (cap->type == TYPEC_PORT_DRP) {
cap->prefer_role = TYPEC_NO_PREFERRED_ROLE;
ret = fwnode_property_read_string(fwnode, "try-power-role", &cap_str);
if (ret == 0) {
ret = typec_find_power_role(cap_str);
if (ret < 0)
return ret;
cap->prefer_role = ret;
}
}
return 0;
}
EXPORT_SYMBOL_GPL(typec_get_fw_cap);
/**
* typec_port_register_altmode - Register USB Type-C Port Alternate Mode
* @port: USB Type-C Port that supports the alternate mode

View file

@ -5928,7 +5928,6 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,
struct fwnode_handle *fwnode)
{
const char *opmode_str;
const char *cap_str;
int ret;
u32 mw, frs_current;
@ -5944,23 +5943,10 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,
*/
fw_devlink_purge_absent_suppliers(fwnode);
/* USB data support is optional */
ret = fwnode_property_read_string(fwnode, "data-role", &cap_str);
if (ret == 0) {
ret = typec_find_port_data_role(cap_str);
if (ret < 0)
return ret;
port->typec_caps.data = ret;
}
ret = fwnode_property_read_string(fwnode, "power-role", &cap_str);
ret = typec_get_fw_cap(&port->typec_caps, fwnode);
if (ret < 0)
return ret;
ret = typec_find_port_power_role(cap_str);
if (ret < 0)
return ret;
port->typec_caps.type = ret;
port->port_type = port->typec_caps.type;
port->pd_supported = !fwnode_property_read_bool(fwnode, "pd-disable");
@ -5997,14 +5983,6 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,
if (port->port_type == TYPEC_PORT_SRC)
return 0;
/* Get the preferred power role for DRP */
ret = fwnode_property_read_string(fwnode, "try-power-role", &cap_str);
if (ret < 0)
return ret;
port->typec_caps.prefer_role = typec_find_power_role(cap_str);
if (port->typec_caps.prefer_role < 0)
return -EINVAL;
sink:
port->self_powered = fwnode_property_read_bool(fwnode, "self-powered");

View file

@ -295,6 +295,9 @@ int typec_set_mode(struct typec_port *port, int mode);
void *typec_get_drvdata(struct typec_port *port);
int typec_get_fw_cap(struct typec_capability *cap,
struct fwnode_handle *fwnode);
int typec_find_pwr_opmode(const char *name);
int typec_find_orientation(const char *name);
int typec_find_port_power_role(const char *name);