* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This automated bisection report was sent to you on the basis * * that you may be involved with the breaking commit it has * * found. No manual investigation has been done to verify it, * * and the root cause of the problem may be somewhere else. * * * * If you do send a fix, please include this trailer: * * Reported-by: "kernelci.org bot" <bot@xxxxxxxxxxxx> * * * * Hope this helps! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * next/master bisection: boot on sun4i-a10-olinuxino-lime Summary: Start: 9eb1b48ca4ce Add linux-next specific files for 20200106 Details: https://kernelci.org/boot/id/5e12e444c423ad7bc6973147 Plain log: https://storage.kernelci.org//next/master/next-20200106/arm/multi_v7_defconfig/gcc-8/lab-baylibre/boot-sun4i-a10-olinuxino-lime.txt HTML log: https://storage.kernelci.org//next/master/next-20200106/arm/multi_v7_defconfig/gcc-8/lab-baylibre/boot-sun4i-a10-olinuxino-lime.html Result: 5253fe05bb47 phy: core: Add consumer device link support Checks: revert: PASS verify: PASS Parameters: Tree: next URL: git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git Branch: master Target: sun4i-a10-olinuxino-lime CPU arch: arm Lab: lab-baylibre Compiler: gcc-8 Config: multi_v7_defconfig Test suite: boot Breaking commit found: ------------------------------------------------------------------------------- commit 5253fe05bb47a2402f471d76078b3dcc66442d6c Author: Alexandre Torgue <alexandre.torgue@xxxxxx> Date: Mon Nov 4 15:37:13 2019 +0100 phy: core: Add consumer device link support 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@xxxxxx> Signed-off-by: Kishon Vijay Abraham I <kishon@xxxxxx> 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) { } ------------------------------------------------------------------------------- Git bisection log: ------------------------------------------------------------------------------- git bisect start # good: [768fc661d12559b0dbd99d941b3bf28fe92fd365] Merge tag 'riscv/for-v5.5-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux git bisect good 768fc661d12559b0dbd99d941b3bf28fe92fd365 # bad: [9eb1b48ca4ce1406628ffe1a11b684a96e83ca08] Add linux-next specific files for 20200106 git bisect bad 9eb1b48ca4ce1406628ffe1a11b684a96e83ca08 # good: [14f98ad9cf39f6dba9a0ee4d5a7844f72fb5dd6c] Merge remote-tracking branch 'crypto/master' git bisect good 14f98ad9cf39f6dba9a0ee4d5a7844f72fb5dd6c # good: [7e83dfa54c9d473f0a79775c97c2ec265300d748] Merge remote-tracking branch 'sound/for-next' git bisect good 7e83dfa54c9d473f0a79775c97c2ec265300d748 # good: [9b19f21b01e41b56d0c4ebb29713058858db4254] Merge remote-tracking branch 'driver-core/driver-core-next' git bisect good 9b19f21b01e41b56d0c4ebb29713058858db4254 # bad: [abe0382594f8afadbbf9774bfa1accb41e9afe39] Merge remote-tracking branch 'vhost/linux-next' git bisect bad abe0382594f8afadbbf9774bfa1accb41e9afe39 # bad: [3c4bafba69e79c34abcf9f2853d6756bf4b6bc1c] Merge remote-tracking branch 'staging/staging-next' git bisect bad 3c4bafba69e79c34abcf9f2853d6756bf4b6bc1c # bad: [9b1e5f8654cffaf96e0194d107ffef4b118a47b8] Merge remote-tracking branch 'tty/tty-next' git bisect bad 9b1e5f8654cffaf96e0194d107ffef4b118a47b8 # good: [5e637d2be26385286748f494fdca30079bbe916f] tty/serial: Migrate sunsu to use has_sysrq git bisect good 5e637d2be26385286748f494fdca30079bbe916f # good: [71a1fa0df2a3728b8ccb97394be420d1f03df40e] usb: typec: ucsi: Store the notification mask git bisect good 71a1fa0df2a3728b8ccb97394be420d1f03df40e # bad: [f17cb451270ca75198eed922da64b076a7176df6] phy: qcom-qmp: Add SW reset register git bisect bad f17cb451270ca75198eed922da64b076a7176df6 # bad: [7c118f6da9b7e46db7c815fd64090ec289f02d19] dt-bindings: phy: drop #clock-cells from rockchip,px30-dsi-dphy git bisect bad 7c118f6da9b7e46db7c815fd64090ec289f02d19 # good: [24dbe0aaa0030231d4d35886d3552121d208df69] phy: ti-pipe3: make clk operations symmetric in probe and remove git bisect good 24dbe0aaa0030231d4d35886d3552121d208df69 # bad: [df0d0e07be73ccb21a8851f777fe4bf49f998bb8] phy: qualcomm: Adjust indentation in read_poll_timeout git bisect bad df0d0e07be73ccb21a8851f777fe4bf49f998bb8 # bad: [5253fe05bb47a2402f471d76078b3dcc66442d6c] phy: core: Add consumer device link support git bisect bad 5253fe05bb47a2402f471d76078b3dcc66442d6c # first bad commit: [5253fe05bb47a2402f471d76078b3dcc66442d6c] phy: core: Add consumer device link support -------------------------------------------------------------------------------