Skip to content

Commit

Permalink
USB: typec: tps6598x: Refactor tps6598x port registration
Browse files Browse the repository at this point in the history
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: Abdel Alkuor <abdelalkuor@geotab.com>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20231003155842.57313-5-alkuor@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Abdel Alkuor authored and Greg Kroah-Hartman committed Oct 10, 2023
1 parent c5e95ec commit 8f999ce
Showing 1 changed file with 54 additions and 45 deletions.
99 changes: 54 additions & 45 deletions drivers/usb/typec/tipd/core.c
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit 8f999ce

Please sign in to comment.