const struct typec_capability   *orig_cap; /* to be removed */
        const struct typec_capability   *cap;
+       const struct typec_operations   *ops;
 };
 
 #define to_typec_port(_dev_) container_of(_dev_, struct typec_port, dev)
                return -EOPNOTSUPP;
        }
 
-       if (!port->cap->try_role) {
+       if (!port->cap->try_role && (!port->ops || !port->ops->try_role)) {
                dev_dbg(dev, "Setting preferred role not supported\n");
                return -EOPNOTSUPP;
        }
                        return -EINVAL;
        }
 
-       ret = port->cap->try_role(port->orig_cap, role);
+       if (port->ops && port->ops->try_role)
+               ret = port->ops->try_role(port, role);
+       else
+               ret = port->cap->try_role(port->orig_cap, role);
        if (ret)
                return ret;
 
        struct typec_port *port = to_typec_port(dev);
        int ret;
 
-       if (!port->cap->dr_set) {
+       if (!port->cap->dr_set && (!port->ops || !port->ops->dr_set)) {
                dev_dbg(dev, "data role swapping not supported\n");
                return -EOPNOTSUPP;
        }
                goto unlock_and_ret;
        }
 
-       ret = port->cap->dr_set(port->orig_cap, ret);
+       if (port->ops && port->ops->dr_set)
+               ret = port->ops->dr_set(port, ret);
+       else
+               ret = port->cap->dr_set(port->orig_cap, ret);
        if (ret)
                goto unlock_and_ret;
 
                return -EOPNOTSUPP;
        }
 
-       if (!port->cap->pr_set) {
+       if (!port->cap->pr_set && (!port->ops || !port->ops->pr_set)) {
                dev_dbg(dev, "power role swapping not supported\n");
                return -EOPNOTSUPP;
        }
                goto unlock_and_ret;
        }
 
-       ret = port->cap->pr_set(port->orig_cap, ret);
+       if (port->ops && port->ops->dr_set)
+               ret = port->ops->pr_set(port, ret);
+       else
+               ret = port->cap->pr_set(port->orig_cap, ret);
        if (ret)
                goto unlock_and_ret;
 
        int ret;
        enum typec_port_type type;
 
-       if (!port->cap->port_type_set || port->cap->type != TYPEC_PORT_DRP) {
+       if (port->cap->type != TYPEC_PORT_DRP || (!port->cap->port_type_set &&
+           (!port->ops || !port->ops->port_type_set))) {
                dev_dbg(dev, "changing port type not supported\n");
                return -EOPNOTSUPP;
        }
                goto unlock_and_ret;
        }
 
-       ret = port->cap->port_type_set(port->orig_cap, type);
+       if (port->ops && port->ops->port_type_set)
+               ret = port->ops->port_type_set(port, type);
+       else
+               ret = port->cap->port_type_set(port->orig_cap, type);
        if (ret)
                goto unlock_and_ret;
 
                return -EOPNOTSUPP;
        }
 
-       if (!port->cap->vconn_set) {
+       if (!port->cap->vconn_set && (!port->ops || !port->ops->vconn_set)) {
                dev_dbg(dev, "VCONN swapping not supported\n");
                return -EOPNOTSUPP;
        }
        if (ret)
                return ret;
 
-       ret = port->cap->vconn_set(port->orig_cap, (enum typec_role)source);
+       if (port->ops && port->ops->vconn_set)
+               ret = port->ops->vconn_set(port, (enum typec_role)source);
+       else
+               ret = port->cap->vconn_set(port->orig_cap,
+                                          (enum typec_role)source);
        if (ret)
                return ret;
 
        mutex_init(&port->port_type_lock);
 
        port->id = id;
+       port->ops = cap->ops;
        port->orig_cap = cap;
        port->port_type = cap->type;
        port->prefer_role = cap->prefer_role;
 
        struct usb_pd_identity  *identity;
 };
 
+/**
+ * struct typec_operations - USB Type-C Port Operations
+ * @try_role: Set data role preference for DRP port
+ * @dr_set: Set Data Role
+ * @pr_set: Set Power Role
+ * @vconn_set: Source VCONN
+ * @port_type_set: Set port type
+ */
+struct typec_operations {
+       int (*try_role)(struct typec_port *port, int role);
+       int (*dr_set)(struct typec_port *port, enum typec_data_role role);
+       int (*pr_set)(struct typec_port *port, enum typec_role role);
+       int (*vconn_set)(struct typec_port *port, enum typec_role role);
+       int (*port_type_set)(struct typec_port *port,
+                            enum typec_port_type type);
+};
+
 /*
  * struct typec_capability - USB Type-C Port Capabilities
  * @type: Supported power role of the port
  * @mux: Multiplexer switch for Alternate/Accessory Modes
  * @fwnode: Optional fwnode of the port
  * @driver_data: Private pointer for driver specific info
+ * @ops: Port operations vector
  * @try_role: Set data role preference for DRP port
  * @dr_set: Set Data Role
  * @pr_set: Set Power Role
        struct fwnode_handle    *fwnode;
        void                    *driver_data;
 
+       const struct typec_operations   *ops;
+
        int             (*try_role)(const struct typec_capability *,
                                    int role);