Messages in this thread |  | | Subject | Re: [PATCH] phy: core: Add consumer device link support | From | Alexandre Torgue <> | Date | Wed, 4 Dec 2019 16:33:14 +0100 |
| |
Hi,
Gentle ping, in case you missed this.
Regards Alex
On 11/4/19 3:37 PM, Alexandre Torgue wrote: > In order to enforce suspend/resume ordering, this commit creates link > between phy consumers and phy devices. This link avoids to suspend phy > before phy consumers. > > Signed-off-by: Alexandre Torgue <alexandre.torgue@st.com> > > --- > > Hi, > > To manage device_link in phy-core I had to "balance" get and put APIs a bit > more. Fot this reason, you'll find updates in Renesas usbhs rcar and rza drivers > as phy API changes. > > Regards > Alex > > diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c > index b04f4fe85ac2..8dfb4868c8c3 100644 > --- a/drivers/phy/phy-core.c > +++ b/drivers/phy/phy-core.c > @@ -29,7 +29,7 @@ static void devm_phy_release(struct device *dev, void *res) > { > struct phy *phy = *(struct phy **)res; > > - phy_put(phy); > + phy_put(dev, phy); > } > > static void devm_phy_provider_release(struct device *dev, void *res) > @@ -566,12 +566,12 @@ struct phy *of_phy_get(struct device_node *np, const char *con_id) > EXPORT_SYMBOL_GPL(of_phy_get); > > /** > - * phy_put() - release the PHY > - * @phy: the phy returned by phy_get() > + * of_phy_put() - release the PHY > + * @phy: the phy returned by of_phy_get() > * > - * Releases a refcount the caller received from phy_get(). > + * Releases a refcount the caller received from of_phy_get(). > */ > -void phy_put(struct phy *phy) > +void of_phy_put(struct phy *phy) > { > if (!phy || IS_ERR(phy)) > return; > @@ -584,6 +584,20 @@ void phy_put(struct phy *phy) > module_put(phy->ops->owner); > put_device(&phy->dev); > } > +EXPORT_SYMBOL_GPL(of_phy_put); > + > +/** > + * phy_put() - release the PHY > + * @dev: device that wants to release this phy > + * @phy: the phy returned by phy_get() > + * > + * Releases a refcount the caller received from phy_get(). > + */ > +void phy_put(struct device *dev, struct phy *phy) > +{ > + device_link_remove(dev, &phy->dev); > + of_phy_put(phy); > +} > EXPORT_SYMBOL_GPL(phy_put); > > /** > @@ -651,6 +665,7 @@ struct phy *phy_get(struct device *dev, const char *string) > { > int index = 0; > struct phy *phy; > + struct device_link *link; > > if (string == NULL) { > dev_WARN(dev, "missing string\n"); > @@ -672,6 +687,13 @@ struct phy *phy_get(struct device *dev, const char *string) > > get_device(&phy->dev); > > + link = device_link_add(dev, &phy->dev, DL_FLAG_STATELESS); > + if (!link) { > + dev_err(dev, "failed to create device link to %s\n", > + dev_name(phy->dev.parent)); > + return ERR_PTR(-EINVAL); > + } > + > return phy; > } > EXPORT_SYMBOL_GPL(phy_get); > @@ -765,6 +787,7 @@ struct phy *devm_of_phy_get(struct device *dev, struct device_node *np, > const char *con_id) > { > struct phy **ptr, *phy; > + struct device_link *link; > > ptr = devres_alloc(devm_phy_release, sizeof(*ptr), GFP_KERNEL); > if (!ptr) > @@ -778,6 +801,13 @@ struct phy *devm_of_phy_get(struct device *dev, struct device_node *np, > devres_free(ptr); > } > > + link = device_link_add(dev, &phy->dev, DL_FLAG_STATELESS); > + if (!link) { > + dev_err(dev, "failed to create device link to %s\n", > + dev_name(phy->dev.parent)); > + return ERR_PTR(-EINVAL); > + } > + > return phy; > } > EXPORT_SYMBOL_GPL(devm_of_phy_get); > @@ -798,6 +828,7 @@ struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np, > int index) > { > struct phy **ptr, *phy; > + struct device_link *link; > > ptr = devres_alloc(devm_phy_release, sizeof(*ptr), GFP_KERNEL); > if (!ptr) > @@ -819,6 +850,13 @@ struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np, > *ptr = phy; > devres_add(dev, ptr); > > + link = device_link_add(dev, &phy->dev, DL_FLAG_STATELESS); > + if (!link) { > + dev_err(dev, "failed to create device link to %s\n", > + dev_name(phy->dev.parent)); > + return ERR_PTR(-EINVAL); > + } > + > return phy; > } > EXPORT_SYMBOL_GPL(devm_of_phy_get_by_index); > diff --git a/drivers/usb/renesas_usbhs/rcar2.c b/drivers/usb/renesas_usbhs/rcar2.c > index 440d213e1749..791908f8cf73 100644 > --- a/drivers/usb/renesas_usbhs/rcar2.c > +++ b/drivers/usb/renesas_usbhs/rcar2.c > @@ -34,7 +34,7 @@ static int usbhs_rcar2_hardware_exit(struct platform_device *pdev) > struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); > > if (priv->phy) { > - phy_put(priv->phy); > + phy_put(&pdev->dev, priv->phy); > priv->phy = NULL; > } > > diff --git a/drivers/usb/renesas_usbhs/rza2.c b/drivers/usb/renesas_usbhs/rza2.c > index 021749594389..3eed3334a17f 100644 > --- a/drivers/usb/renesas_usbhs/rza2.c > +++ b/drivers/usb/renesas_usbhs/rza2.c > @@ -29,7 +29,7 @@ static int usbhs_rza2_hardware_exit(struct platform_device *pdev) > { > struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); > > - phy_put(priv->phy); > + phy_put(&pdev->dev, priv->phy); > priv->phy = NULL; > > return 0; > diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h > index 56d3a100006a..19eddd64c8f6 100644 > --- a/include/linux/phy/phy.h > +++ b/include/linux/phy/phy.h > @@ -234,7 +234,8 @@ struct phy *devm_of_phy_get(struct device *dev, struct device_node *np, > const char *con_id); > struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np, > int index); > -void phy_put(struct phy *phy); > +void of_phy_put(struct phy *phy); > +void phy_put(struct device *dev, struct phy *phy); > void devm_phy_put(struct device *dev, struct phy *phy); > struct phy *of_phy_get(struct device_node *np, const char *con_id); > struct phy *of_phy_simple_xlate(struct device *dev, > @@ -419,7 +420,11 @@ static inline struct phy *devm_of_phy_get_by_index(struct device *dev, > return ERR_PTR(-ENOSYS); > } > > -static inline void phy_put(struct phy *phy) > +static inline void of_phy_put(struct phy *phy) > +{ > +} > + > +static inline void phy_put(struct device *dev, struct phy *phy) > { > } > >
|  |