}
 
 static const struct tegra_xusb_port_ops tegra124_usb2_port_ops = {
+       .release = tegra_xusb_usb2_port_release,
        .remove = tegra_xusb_usb2_port_remove,
        .enable = tegra124_usb2_port_enable,
        .disable = tegra124_usb2_port_disable,
 }
 
 static const struct tegra_xusb_port_ops tegra124_ulpi_port_ops = {
+       .release = tegra_xusb_ulpi_port_release,
        .enable = tegra124_ulpi_port_enable,
        .disable = tegra124_ulpi_port_disable,
        .map = tegra124_ulpi_port_map,
 }
 
 static const struct tegra_xusb_port_ops tegra124_hsic_port_ops = {
+       .release = tegra_xusb_hsic_port_release,
        .enable = tegra124_hsic_port_enable,
        .disable = tegra124_hsic_port_disable,
        .map = tegra124_hsic_port_map,
 }
 
 static const struct tegra_xusb_port_ops tegra124_usb3_port_ops = {
+       .release = tegra_xusb_usb3_port_release,
        .remove = tegra_xusb_usb3_port_remove,
        .enable = tegra124_usb3_port_enable,
        .disable = tegra124_usb3_port_disable,
 
 }
 
 static const struct tegra_xusb_port_ops tegra186_usb2_port_ops = {
+       .release = tegra_xusb_usb2_port_release,
        .remove = tegra_xusb_usb2_port_remove,
        .enable = tegra186_usb2_port_enable,
        .disable = tegra186_usb2_port_disable,
 }
 
 static const struct tegra_xusb_port_ops tegra186_usb3_port_ops = {
+       .release = tegra_xusb_usb3_port_release,
        .remove = tegra_xusb_usb3_port_remove,
        .enable = tegra186_usb3_port_enable,
        .disable = tegra186_usb3_port_disable,
 
 }
 
 static const struct tegra_xusb_port_ops tegra210_usb2_port_ops = {
+       .release = tegra_xusb_usb2_port_release,
        .remove = tegra_xusb_usb2_port_remove,
        .enable = tegra210_usb2_port_enable,
        .disable = tegra210_usb2_port_disable,
 }
 
 static const struct tegra_xusb_port_ops tegra210_hsic_port_ops = {
+       .release = tegra_xusb_hsic_port_release,
        .enable = tegra210_hsic_port_enable,
        .disable = tegra210_hsic_port_disable,
        .map = tegra210_hsic_port_map,
 }
 
 static const struct tegra_xusb_port_ops tegra210_usb3_port_ops = {
+       .release = tegra_xusb_usb3_port_release,
        .remove = tegra_xusb_usb3_port_remove,
        .enable = tegra210_usb3_port_enable,
        .disable = tegra210_usb3_port_disable,
 
 
 static void tegra_xusb_port_release(struct device *dev)
 {
+       struct tegra_xusb_port *port = to_tegra_xusb_port(dev);
+
+       if (port->ops->release)
+               port->ops->release(port);
 }
 
 static struct device_type tegra_xusb_port_type = {
        if (!np || !of_device_is_available(np))
                goto out;
 
-       usb2 = devm_kzalloc(padctl->dev, sizeof(*usb2), GFP_KERNEL);
+       usb2 = kzalloc(sizeof(*usb2), GFP_KERNEL);
        if (!usb2) {
                err = -ENOMEM;
                goto out;
        return err;
 }
 
+void tegra_xusb_usb2_port_release(struct tegra_xusb_port *port)
+{
+       struct tegra_xusb_usb2_port *usb2 = to_usb2_port(port);
+
+       kfree(usb2);
+}
+
 void tegra_xusb_usb2_port_remove(struct tegra_xusb_port *port)
 {
        struct tegra_xusb_usb2_port *usb2 = to_usb2_port(port);
        if (!np || !of_device_is_available(np))
                goto out;
 
-       ulpi = devm_kzalloc(padctl->dev, sizeof(*ulpi), GFP_KERNEL);
+       ulpi = kzalloc(sizeof(*ulpi), GFP_KERNEL);
        if (!ulpi) {
                err = -ENOMEM;
                goto out;
        return err;
 }
 
+void tegra_xusb_ulpi_port_release(struct tegra_xusb_port *port)
+{
+       struct tegra_xusb_ulpi_port *ulpi = to_ulpi_port(port);
+
+       kfree(ulpi);
+}
+
 static int tegra_xusb_hsic_port_parse_dt(struct tegra_xusb_hsic_port *hsic)
 {
        /* XXX */
        if (!np || !of_device_is_available(np))
                goto out;
 
-       hsic = devm_kzalloc(padctl->dev, sizeof(*hsic), GFP_KERNEL);
+       hsic = kzalloc(sizeof(*hsic), GFP_KERNEL);
        if (!hsic) {
                err = -ENOMEM;
                goto out;
        return err;
 }
 
+void tegra_xusb_hsic_port_release(struct tegra_xusb_port *port)
+{
+       struct tegra_xusb_hsic_port *hsic = to_hsic_port(port);
+
+       kfree(hsic);
+}
+
 static int tegra_xusb_usb3_port_parse_dt(struct tegra_xusb_usb3_port *usb3)
 {
        struct tegra_xusb_port *port = &usb3->base;
        if (!np || !of_device_is_available(np))
                goto out;
 
-       usb3 = devm_kzalloc(padctl->dev, sizeof(*usb3), GFP_KERNEL);
+       usb3 = kzalloc(sizeof(*usb3), GFP_KERNEL);
        if (!usb3) {
                err = -ENOMEM;
                goto out;
        return err;
 }
 
+void tegra_xusb_usb3_port_release(struct tegra_xusb_port *port)
+{
+       struct tegra_xusb_usb3_port *usb3 = to_usb3_port(port);
+
+       kfree(usb3);
+}
+
 void tegra_xusb_usb3_port_remove(struct tegra_xusb_port *port)
 {
        struct tegra_xusb_usb3_port *usb3 = to_usb3_port(port);
 
        const struct tegra_xusb_port_ops *ops;
 };
 
+static inline struct tegra_xusb_port *to_tegra_xusb_port(struct device *dev)
+{
+       return container_of(dev, struct tegra_xusb_port, dev);
+}
+
 struct tegra_xusb_lane_map {
        unsigned int port;
        const char *type;
 struct tegra_xusb_usb2_port *
 tegra_xusb_find_usb2_port(struct tegra_xusb_padctl *padctl,
                          unsigned int index);
+void tegra_xusb_usb2_port_release(struct tegra_xusb_port *port);
 void tegra_xusb_usb2_port_remove(struct tegra_xusb_port *port);
 
 struct tegra_xusb_ulpi_port {
        return container_of(port, struct tegra_xusb_ulpi_port, base);
 }
 
+void tegra_xusb_ulpi_port_release(struct tegra_xusb_port *port);
+
 struct tegra_xusb_hsic_port {
        struct tegra_xusb_port base;
 };
        return container_of(port, struct tegra_xusb_hsic_port, base);
 }
 
+void tegra_xusb_hsic_port_release(struct tegra_xusb_port *port);
+
 struct tegra_xusb_usb3_port {
        struct tegra_xusb_port base;
        struct regulator *supply;
 struct tegra_xusb_usb3_port *
 tegra_xusb_find_usb3_port(struct tegra_xusb_padctl *padctl,
                          unsigned int index);
+void tegra_xusb_usb3_port_release(struct tegra_xusb_port *port);
 void tegra_xusb_usb3_port_remove(struct tegra_xusb_port *port);
 
 struct tegra_xusb_port_ops {
+       void (*release)(struct tegra_xusb_port *port);
        void (*remove)(struct tegra_xusb_port *port);
        int (*enable)(struct tegra_xusb_port *port);
        void (*disable)(struct tegra_xusb_port *port);