1
0
Fork 0

MLK-16013-9 usb: typec: add interface to get port type and role

Add interface to get typec port type and default power role from
dt. To validate a correct setting is specified, add TYPEC_PORT_TYPE_UNKNOWN
and TYPEC_ROLE_UNKNOWN for typec_port_type and typec_role enum.

Reviewed-by: Peter Chen <peter.chen@nxp.com>
Signed-off-by: Li Jun <jun.li@nxp.com>

During 4.14 rebase renamed to typec_port_types_dt to avoid conflict with
sysfs values.

Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
pull/10/head
Li Jun 2017-07-26 22:08:14 +08:00 committed by Jason Liu
parent 2f8de03d70
commit 62ebe27822
2 changed files with 52 additions and 0 deletions

View File

@ -13,6 +13,7 @@
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/usb/typec.h>
struct typec_mode {
@ -799,6 +800,12 @@ static const char * const typec_port_types[] = {
[TYPEC_PORT_DRP] = "dual",
};
static const char *const typec_port_types_dt[] = {
[TYPEC_PORT_DFP] = "dfp",
[TYPEC_PORT_UFP] = "ufp",
[TYPEC_PORT_DRP] = "drp",
};
static const char * const typec_port_types_drp[] = {
[TYPEC_PORT_DFP] = "dual [source] sink",
[TYPEC_PORT_UFP] = "dual source [sink]",
@ -1150,6 +1157,47 @@ static const struct device_type typec_port_dev_type = {
.release = typec_release,
};
static enum typec_port_type typec_get_port_type_from_string(const char *str)
{
int ret;
ret = match_string(typec_port_types_dt, ARRAY_SIZE(typec_port_types_dt), str);
return (ret < 0) ? TYPEC_PORT_TYPE_UNKNOWN : ret;
}
enum typec_port_type typec_get_port_type(struct device *dev)
{
const char *port_type;
int err;
err = device_property_read_string(dev, "port-type", &port_type);
if (err < 0)
return TYPEC_PORT_TYPE_UNKNOWN;
return typec_get_port_type_from_string(port_type);
}
EXPORT_SYMBOL_GPL(typec_get_port_type);
static enum typec_role typec_get_power_role_from_string(const char *str)
{
int ret;
ret = match_string(typec_roles, ARRAY_SIZE(typec_roles), str);
return (ret < 0) ? TYPEC_ROLE_UNKNOWN : ret;
}
enum typec_role typec_get_power_role(struct device *dev)
{
const char *power_role;
int err;
err = device_property_read_string(dev, "default-role", &power_role);
if (err < 0)
return TYPEC_ROLE_UNKNOWN;
return typec_get_power_role_from_string(power_role);
}
EXPORT_SYMBOL_GPL(typec_get_power_role);
/* --------------------------------------- */
/* Driver callbacks to report role updates */

View File

@ -25,6 +25,7 @@ enum typec_port_type {
TYPEC_PORT_DFP,
TYPEC_PORT_UFP,
TYPEC_PORT_DRP,
TYPEC_PORT_TYPE_UNKNOWN,
};
enum typec_plug_type {
@ -43,6 +44,7 @@ enum typec_data_role {
enum typec_role {
TYPEC_SINK,
TYPEC_SOURCE,
TYPEC_ROLE_UNKNOWN,
};
enum typec_pwr_opmode {
@ -244,5 +246,7 @@ void typec_set_data_role(struct typec_port *port, enum typec_data_role role);
void typec_set_pwr_role(struct typec_port *port, enum typec_role role);
void typec_set_vconn_role(struct typec_port *port, enum typec_role role);
void typec_set_pwr_opmode(struct typec_port *port, enum typec_pwr_opmode mode);
enum typec_port_type typec_get_port_type(struct device *dev);
enum typec_role typec_get_power_role(struct device *dev);
#endif /* __LINUX_USB_TYPEC_H */