mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02:00
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: 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>
This commit is contained in:
parent
c5e95ec39d
commit
8f999ce60e
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user