RE: [PATCH v3 3/3] usb: otg: utils: devres: Add API's to associate a device with the phy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 
> 
> 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


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux