usb: typec: tps6598x: Start using struct typec_operations
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>
Mon, 4 Nov 2019 14:24:22 +0000 (17:24 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 4 Nov 2019 15:03:34 +0000 (16:03 +0100)
Supplying the operation callbacks as part of a struct
typec_operations instead of as part of struct
typec_capability during port registration. After this there
is not need to keep the capabilities stored anywhere in the
driver.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20191104142435.29960-6-heikki.krogerus@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/tps6598x.c

index a38d140..0698add 100644 (file)
@@ -94,7 +94,6 @@ struct tps6598x {
        struct typec_port *port;
        struct typec_partner *partner;
        struct usb_pd_identity partner_identity;
-       struct typec_capability typec_cap;
 };
 
 /*
@@ -307,11 +306,10 @@ static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd,
        return 0;
 }
 
-static int
-tps6598x_dr_set(const struct typec_capability *cap, enum typec_data_role role)
+static int tps6598x_dr_set(struct typec_port *port, enum typec_data_role role)
 {
-       struct tps6598x *tps = container_of(cap, struct tps6598x, typec_cap);
        const char *cmd = (role == TYPEC_DEVICE) ? "SWUF" : "SWDF";
+       struct tps6598x *tps = typec_get_drvdata(port);
        u32 status;
        int ret;
 
@@ -338,11 +336,10 @@ out_unlock:
        return ret;
 }
 
-static int
-tps6598x_pr_set(const struct typec_capability *cap, enum typec_role role)
+static int tps6598x_pr_set(struct typec_port *port, enum typec_role role)
 {
-       struct tps6598x *tps = container_of(cap, struct tps6598x, typec_cap);
        const char *cmd = (role == TYPEC_SINK) ? "SWSk" : "SWSr";
+       struct tps6598x *tps = typec_get_drvdata(port);
        u32 status;
        int ret;
 
@@ -369,6 +366,11 @@ out_unlock:
        return ret;
 }
 
+static const struct typec_operations tps6598x_ops = {
+       .dr_set = tps6598x_dr_set,
+       .pr_set = tps6598x_pr_set,
+};
+
 static irqreturn_t tps6598x_interrupt(int irq, void *data)
 {
        struct tps6598x *tps = data;
@@ -448,6 +450,7 @@ static const struct regmap_config tps6598x_regmap_config = {
 
 static int tps6598x_probe(struct i2c_client *client)
 {
+       struct typec_capability typec_cap = { };
        struct tps6598x *tps;
        u32 status;
        u32 conf;
@@ -492,40 +495,40 @@ static int tps6598x_probe(struct i2c_client *client)
        if (ret < 0)
                return ret;
 
-       tps->typec_cap.revision = USB_TYPEC_REV_1_2;
-       tps->typec_cap.pd_revision = 0x200;
-       tps->typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE;
-       tps->typec_cap.pr_set = tps6598x_pr_set;
-       tps->typec_cap.dr_set = tps6598x_dr_set;
+       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;
 
        switch (TPS_SYSCONF_PORTINFO(conf)) {
        case TPS_PORTINFO_SINK_ACCESSORY:
        case TPS_PORTINFO_SINK:
-               tps->typec_cap.type = TYPEC_PORT_SNK;
-               tps->typec_cap.data = TYPEC_PORT_UFP;
+               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:
-               tps->typec_cap.type = TYPEC_PORT_DRP;
-               tps->typec_cap.data = TYPEC_PORT_DRD;
+               typec_cap.type = TYPEC_PORT_DRP;
+               typec_cap.data = TYPEC_PORT_DRD;
                break;
        case TPS_PORTINFO_DRP_UFP:
-               tps->typec_cap.type = TYPEC_PORT_DRP;
-               tps->typec_cap.data = TYPEC_PORT_UFP;
+               typec_cap.type = TYPEC_PORT_DRP;
+               typec_cap.data = TYPEC_PORT_UFP;
                break;
        case TPS_PORTINFO_DRP_DFP:
-               tps->typec_cap.type = TYPEC_PORT_DRP;
-               tps->typec_cap.data = TYPEC_PORT_DFP;
+               typec_cap.type = TYPEC_PORT_DRP;
+               typec_cap.data = TYPEC_PORT_DFP;
                break;
        case TPS_PORTINFO_SOURCE:
-               tps->typec_cap.type = TYPEC_PORT_SRC;
-               tps->typec_cap.data = TYPEC_PORT_DFP;
+               typec_cap.type = TYPEC_PORT_SRC;
+               typec_cap.data = TYPEC_PORT_DFP;
                break;
        default:
                return -ENODEV;
        }
 
-       tps->port = typec_register_port(&client->dev, &tps->typec_cap);
+       tps->port = typec_register_port(&client->dev, &typec_cap);
        if (IS_ERR(tps->port))
                return PTR_ERR(tps->port);