USB: typec: tps6598x: Refactor tps6598x port registration
authorAbdel Alkuor <abdelalkuor@geotab.com>
Tue, 3 Oct 2023 15:58:37 +0000 (11:58 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Oct 2023 07:02:07 +0000 (09:02 +0200)
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>
drivers/usb/typec/tipd/core.c

index c5bbf03cb74aadbf226d687e028c5d67b5cb647d..56e4997c484ab5da1e4c4f05f22f083282e6d68b 100644 (file)
@@ -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);