usb: ulpi: Add resource-managed variant of otg_ulpi_create()
authorDmitry Osipenko <digetx@gmail.com>
Mon, 6 Jan 2020 01:34:06 +0000 (04:34 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jan 2020 15:21:57 +0000 (16:21 +0100)
Now drivers (like NVIDIA Tegra USB PHY for example) will be able to
benefit from the resource-managed variant, making driver's code a bit
cleaner.

Suggested-by: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Link: https://lore.kernel.org/r/20200106013416.9604-11-digetx@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/phy/phy-ulpi.c
include/linux/usb/ulpi.h

index a43c493..e683a37 100644 (file)
@@ -240,6 +240,21 @@ static int ulpi_set_vbus(struct usb_otg *otg, bool on)
        return usb_phy_io_write(phy, flags, ULPI_OTG_CTRL);
 }
 
+static void otg_ulpi_init(struct usb_phy *phy, struct usb_otg *otg,
+                         struct usb_phy_io_ops *ops,
+                         unsigned int flags)
+{
+       phy->label      = "ULPI";
+       phy->flags      = flags;
+       phy->io_ops     = ops;
+       phy->otg        = otg;
+       phy->init       = ulpi_init;
+
+       otg->usb_phy    = phy;
+       otg->set_host   = ulpi_set_host;
+       otg->set_vbus   = ulpi_set_vbus;
+}
+
 struct usb_phy *
 otg_ulpi_create(struct usb_phy_io_ops *ops,
                unsigned int flags)
@@ -257,17 +272,32 @@ otg_ulpi_create(struct usb_phy_io_ops *ops,
                return NULL;
        }
 
-       phy->label      = "ULPI";
-       phy->flags      = flags;
-       phy->io_ops     = ops;
-       phy->otg        = otg;
-       phy->init       = ulpi_init;
-
-       otg->usb_phy    = phy;
-       otg->set_host   = ulpi_set_host;
-       otg->set_vbus   = ulpi_set_vbus;
+       otg_ulpi_init(phy, otg, ops, flags);
 
        return phy;
 }
 EXPORT_SYMBOL_GPL(otg_ulpi_create);
 
+struct usb_phy *
+devm_otg_ulpi_create(struct device *dev,
+                    struct usb_phy_io_ops *ops,
+                    unsigned int flags)
+{
+       struct usb_phy *phy;
+       struct usb_otg *otg;
+
+       phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
+       if (!phy)
+               return NULL;
+
+       otg = devm_kzalloc(dev, sizeof(*otg), GFP_KERNEL);
+       if (!otg) {
+               devm_kfree(dev, phy);
+               return NULL;
+       }
+
+       otg_ulpi_init(phy, otg, ops, flags);
+
+       return phy;
+}
+EXPORT_SYMBOL_GPL(devm_otg_ulpi_create);
index c515765..36c2982 100644 (file)
 #if IS_ENABLED(CONFIG_USB_ULPI)
 struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops,
                                        unsigned int flags);
+
+struct usb_phy *devm_otg_ulpi_create(struct device *dev,
+                                    struct usb_phy_io_ops *ops,
+                                    unsigned int flags);
 #else
 static inline struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops,
                                              unsigned int flags)
 {
        return NULL;
 }
+
+static inline struct usb_phy *devm_otg_ulpi_create(struct device *dev,
+                                                  struct usb_phy_io_ops *ops,
+                                                  unsigned int flags)
+{
+       return NULL;
+}
 #endif
 
 #ifdef CONFIG_USB_ULPI_VIEWPORT