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.kroge...@linux.intel.com>
Reviewed-by: Guenter Roeck <li...@roeck-us.net>
---
 drivers/usb/typec/hd3ss3220.c | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/usb/typec/hd3ss3220.c b/drivers/usb/typec/hd3ss3220.c
index 8afaf5768a17..db09fa0d85f2 100644
--- a/drivers/usb/typec/hd3ss3220.c
+++ b/drivers/usb/typec/hd3ss3220.c
@@ -37,7 +37,6 @@ struct hd3ss3220 {
        struct regmap *regmap;
        struct usb_role_switch  *role_sw;
        struct typec_port *port;
-       struct typec_capability typec_cap;
 };
 
 static int hd3ss3220_set_source_pref(struct hd3ss3220 *hd3ss3220, int src_pref)
@@ -73,11 +72,9 @@ static enum usb_role hd3ss3220_get_attached_state(struct 
hd3ss3220 *hd3ss3220)
        return attached_state;
 }
 
-static int hd3ss3220_dr_set(const struct typec_capability *cap,
-                           enum typec_data_role role)
+static int hd3ss3220_dr_set(struct typec_port *port, enum typec_data_role role)
 {
-       struct hd3ss3220 *hd3ss3220 = container_of(cap, struct hd3ss3220,
-                                                  typec_cap);
+       struct hd3ss3220 *hd3ss3220 = typec_get_drvdata(port);
        enum usb_role role_val;
        int pref, ret = 0;
 
@@ -98,6 +95,10 @@ static int hd3ss3220_dr_set(const struct typec_capability 
*cap,
        return ret;
 }
 
+static const struct typec_operations hd3ss3220_ops = {
+       .dr_set = hd3ss3220_dr_set
+};
+
 static void hd3ss3220_set_role(struct hd3ss3220 *hd3ss3220)
 {
        enum usb_role role_state = hd3ss3220_get_attached_state(hd3ss3220);
@@ -152,6 +153,7 @@ static const struct regmap_config config = {
 static int hd3ss3220_probe(struct i2c_client *client,
                const struct i2c_device_id *id)
 {
+       struct typec_capability typec_cap = { };
        struct hd3ss3220 *hd3ss3220;
        struct fwnode_handle *connector;
        int ret;
@@ -180,13 +182,13 @@ static int hd3ss3220_probe(struct i2c_client *client,
        if (IS_ERR(hd3ss3220->role_sw))
                return PTR_ERR(hd3ss3220->role_sw);
 
-       hd3ss3220->typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE;
-       hd3ss3220->typec_cap.dr_set = hd3ss3220_dr_set;
-       hd3ss3220->typec_cap.type = TYPEC_PORT_DRP;
-       hd3ss3220->typec_cap.data = TYPEC_PORT_DRD;
+       typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE;
+       typec_cap.driver_data = hd3ss3220;
+       typec_cap.type = TYPEC_PORT_DRP;
+       typec_cap.data = TYPEC_PORT_DRD;
+       typec_cap.ops = &hd3ss3220_ops;
 
-       hd3ss3220->port = typec_register_port(&client->dev,
-                                             &hd3ss3220->typec_cap);
+       hd3ss3220->port = typec_register_port(&client->dev, &typec_cap);
        if (IS_ERR(hd3ss3220->port)) {
                ret = PTR_ERR(hd3ss3220->port);
                goto err_put_role;
-- 
2.23.0

Reply via email to