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
parent
2f8de03d70
commit
62ebe27822
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue