> > Used devres API's to associate the phy with a device so that on > driver detach, release function is invoked on the devres data(usb_phy) > and devres data(usb_phy) is released. If the phy is got by two devices (like otg and device), will it cause any problems? > > Cc: Felipe Balbi <balbi@xxxxxx> > Signed-off-by: Kishon Vijay Abraham I <kishon@xxxxxx> > --- > Since this is the first version of this patch, I'll get some comments > before > modifying drivers that use usb_get_phy to devm_usb_get_phy. > drivers/usb/otg/otg.c | 60 > +++++++++++++++++++++++++++++++++++++++++++++++ > include/linux/usb/otg.h | 13 ++++++++++ > 2 files changed, 73 insertions(+), 0 deletions(-) > > diff --git a/drivers/usb/otg/otg.c b/drivers/usb/otg/otg.c > index a230658..23c62b0 100644 > --- a/drivers/usb/otg/otg.c > +++ b/drivers/usb/otg/otg.c > @@ -13,6 +13,7 @@ > #include <linux/export.h> > #include <linux/err.h> > #include <linux/device.h> > +#include <linux/slab.h> > > #include <linux/usb/otg.h> > > @@ -34,6 +35,47 @@ static struct usb_phy *__usb_find_phy(struct list_head > *list, > return ERR_PTR(-ENODEV); > } > > +static void devm_usb_phy_release(struct device *dev, void *res) > +{ > + struct usb_phy *phy = *(struct usb_phy **)res; > + > + usb_put_phy(phy); > +} > + > +static int devm_usb_phy_match(struct device *dev, void *res, void > *match_data) > +{ > + return *(struct usb_phy **)res == match_data; > +} > + > +/** > + * devm_usb_get_phy - find the USB PHY > + * @dev - device that requests this phy > + * @type - the type of the phy the controller requires > + * > + * Gets the phy using usb_get_phy(), and associates a device with it > using > + * devres. On driver detach, release function is invoked on the devres > data, > + * then, devres data is freed. > + * > + * For use by USB host and peripheral drivers. > + */ > +struct usb_phy *devm_usb_get_phy(struct device *dev, enum usb_phy_type > type) > +{ > + struct usb_phy **ptr, *phy; > + > + ptr = devres_alloc(devm_usb_phy_release, sizeof(*ptr), GFP_KERNEL); > + if (!ptr) > + return NULL; > + > + phy = *ptr = usb_get_phy(type); > + if (phy) > + devres_add(dev, ptr); > + else > + devres_free(ptr); > + > + return phy; > +} > +EXPORT_SYMBOL(devm_usb_get_phy); > + > /** > * usb_get_phy - find the USB PHY > * @type - the type of the phy the controller requires > @@ -67,6 +109,24 @@ struct usb_phy *usb_get_phy(enum usb_phy_type type) > EXPORT_SYMBOL(usb_get_phy); > > /** > + * devm_usb_put_phy - release the USB PHY > + * @dev - device that wants to release this phy > + * @phy - the phy returned by devm_usb_get_phy() > + * > + * destroys the devres associated with this phy and invokes usb_put_phy > + * to release the phy. > + * > + * For use by USB host and peripheral drivers. > + */ > +void devm_usb_put_phy(struct device *dev, struct usb_phy *phy) > +{ > + WARN_ON(devres_destroy(dev, devm_usb_phy_release, > devm_usb_phy_match, > + phy)); > + usb_put_phy(phy); > +} > +EXPORT_SYMBOL(devm_usb_put_phy); > + > +/** > * usb_put_phy - release the USB PHY > * @x: the phy returned by usb_get_phy() > * > diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h > index 1def65f..0cb2ec2 100644 > --- a/include/linux/usb/otg.h > +++ b/include/linux/usb/otg.h > @@ -185,7 +185,10 @@ usb_phy_shutdown(struct usb_phy *x) > /* for usb host and peripheral controller drivers */ > #ifdef CONFIG_USB_OTG_UTILS > extern struct usb_phy *usb_get_phy(enum usb_phy_type type); > +extern struct usb_phy *devm_usb_get_phy(struct device *dev, > + enum usb_phy_type type); > extern void usb_put_phy(struct usb_phy *); > +extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x); > extern const char *otg_state_string(enum usb_otg_state state); > #else > static inline struct usb_phy *usb_get_phy(enum usb_phy_type type) > @@ -193,10 +196,20 @@ static inline struct usb_phy *usb_get_phy(enum > usb_phy_type type) > return NULL; > } > > +static inline struct usb_phy *devm_usb_get_phy(struct device *dev, > + enum usb_phy_type type) > +{ > + return NULL; > +} > + > static inline void usb_put_phy(struct usb_phy *x) > { > } > > +static inline void devm_usb_put_phy(struct device *dev, struct usb_phy > *x) > +{ > +} > + > static inline const char *otg_state_string(enum usb_otg_state state) > { > return NULL; > -- > 1.7.5.4 > -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html