Commit 8f999ce6 authored by Abdel Alkuor's avatar Abdel Alkuor Committed by Greg Kroah-Hartman

USB: typec: tps6598x: Refactor tps6598x port registration

tps6598x and cd321x use TPS_REG_SYSTEM_CONF to get dr/pr roles
where other similar devices don't have this register such as tps25750.

Move tps6598x port registration to its own function
Signed-off-by: default avatarAbdel Alkuor <abdelalkuor@geotab.com>
Reviewed-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20231003155842.57313-5-alkuor@gmail.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c5e95ec3
......@@ -711,15 +711,65 @@ static int devm_tps6598_psy_register(struct tps6598x *tps)
return PTR_ERR_OR_ZERO(tps->psy);
}
static int
tps6598x_register_port(struct tps6598x *tps, struct fwnode_handle *fwnode)
{
int ret;
u32 conf;
struct typec_capability typec_cap = { };
ret = tps6598x_read32(tps, TPS_REG_SYSTEM_CONF, &conf);
if (ret)
return ret;
typec_cap.revision = USB_TYPEC_REV_1_2;
typec_cap.pd_revision = 0x200;
typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE;
typec_cap.driver_data = tps;
typec_cap.ops = &tps6598x_ops;
typec_cap.fwnode = fwnode;
switch (TPS_SYSCONF_PORTINFO(conf)) {
case TPS_PORTINFO_SINK_ACCESSORY:
case TPS_PORTINFO_SINK:
typec_cap.type = TYPEC_PORT_SNK;
typec_cap.data = TYPEC_PORT_UFP;
break;
case TPS_PORTINFO_DRP_UFP_DRD:
case TPS_PORTINFO_DRP_DFP_DRD:
typec_cap.type = TYPEC_PORT_DRP;
typec_cap.data = TYPEC_PORT_DRD;
break;
case TPS_PORTINFO_DRP_UFP:
typec_cap.type = TYPEC_PORT_DRP;
typec_cap.data = TYPEC_PORT_UFP;
break;
case TPS_PORTINFO_DRP_DFP:
typec_cap.type = TYPEC_PORT_DRP;
typec_cap.data = TYPEC_PORT_DFP;
break;
case TPS_PORTINFO_SOURCE:
typec_cap.type = TYPEC_PORT_SRC;
typec_cap.data = TYPEC_PORT_DFP;
break;
default:
return -ENODEV;
}
tps->port = typec_register_port(tps->dev, &typec_cap);
if (IS_ERR(tps->port))
return PTR_ERR(tps->port);
return 0;
}
static int tps6598x_probe(struct i2c_client *client)
{
irq_handler_t irq_handler = tps6598x_interrupt;
struct device_node *np = client->dev.of_node;
struct typec_capability typec_cap = { };
struct tps6598x *tps;
struct fwnode_handle *fwnode;
u32 status;
u32 conf;
u32 vid;
int ret;
u64 mask1;
......@@ -780,10 +830,6 @@ static int tps6598x_probe(struct i2c_client *client)
goto err_clear_mask;
trace_tps6598x_status(status);
ret = tps6598x_read32(tps, TPS_REG_SYSTEM_CONF, &conf);
if (ret < 0)
goto err_clear_mask;
/*
* This fwnode has a "compatible" property, but is never populated as a
* struct device. Instead we simply parse it to read the properties.
......@@ -801,50 +847,13 @@ static int tps6598x_probe(struct i2c_client *client)
goto err_fwnode_put;
}
typec_cap.revision = USB_TYPEC_REV_1_2;
typec_cap.pd_revision = 0x200;
typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE;
typec_cap.driver_data = tps;
typec_cap.ops = &tps6598x_ops;
typec_cap.fwnode = fwnode;
switch (TPS_SYSCONF_PORTINFO(conf)) {
case TPS_PORTINFO_SINK_ACCESSORY:
case TPS_PORTINFO_SINK:
typec_cap.type = TYPEC_PORT_SNK;
typec_cap.data = TYPEC_PORT_UFP;
break;
case TPS_PORTINFO_DRP_UFP_DRD:
case TPS_PORTINFO_DRP_DFP_DRD:
typec_cap.type = TYPEC_PORT_DRP;
typec_cap.data = TYPEC_PORT_DRD;
break;
case TPS_PORTINFO_DRP_UFP:
typec_cap.type = TYPEC_PORT_DRP;
typec_cap.data = TYPEC_PORT_UFP;
break;
case TPS_PORTINFO_DRP_DFP:
typec_cap.type = TYPEC_PORT_DRP;
typec_cap.data = TYPEC_PORT_DFP;
break;
case TPS_PORTINFO_SOURCE:
typec_cap.type = TYPEC_PORT_SRC;
typec_cap.data = TYPEC_PORT_DFP;
break;
default:
ret = -ENODEV;
goto err_role_put;
}
ret = devm_tps6598_psy_register(tps);
if (ret)
goto err_role_put;
tps->port = typec_register_port(&client->dev, &typec_cap);
if (IS_ERR(tps->port)) {
ret = PTR_ERR(tps->port);
ret = tps6598x_register_port(tps, fwnode);
if (ret)
goto err_role_put;
}
if (status & TPS_STATUS_PLUG_PRESENT) {
ret = tps6598x_read16(tps, TPS_REG_POWER_STATUS, &tps->pwr_status);
......
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