Commit dea75ee6 authored by Dmitry Osipenko's avatar Dmitry Osipenko Committed by Greg Kroah-Hartman
Browse files

usb: ulpi: Add resource-managed variant of otg_ulpi_create()



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: default avatarThierry Reding <thierry.reding@gmail.com>
Signed-off-by: default avatarDmitry Osipenko <digetx@gmail.com>
Link: https://lore.kernel.org/r/20200106013416.9604-11-digetx@gmail.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9df3adca
Loading
Loading
Loading
Loading
+39 −9
Original line number Diff line number Diff line
@@ -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);
+11 −0
Original line number Diff line number Diff line
@@ -55,12 +55,23 @@
#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