diff mbox

[v3] usb: hcd: add generic PHY support

Message ID 538891DC.605@renesas.com (mailing list archive)
State Awaiting Upstream
Headers show

Commit Message

Yoshihiro Shimoda May 30, 2014, 2:12 p.m. UTC
From Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>

Add the generic PHY support, analogous to the USB PHY support. Intended it to be
used with the PCI EHCI/OHCI drivers and the xHCI platform driver.

Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
This patch is against the 'usb-next' branch of Greg KH's 'usb.git' repo.
(commit id = 70d2f61fc7559df3d5be32a9d01efdb9ee1b11d8)

Changes in version 3:
 - rebased the current usb-next.
 - I tested this patch on my R-Car H2 USB 3.0 driver (not merged yet)

 drivers/usb/core/hcd.c  |   42 ++++++++++++++++++++++++++++++++++++++++--
 include/linux/usb/hcd.h |    3 ++-
 2 files changed, 42 insertions(+), 3 deletions(-)

Comments

Sergei Shtylyov May 30, 2014, 2:16 p.m. UTC | #1
Hello.

On 05/30/2014 06:12 PM, Yoshihiro Shimoda wrote:

>  From Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>

    Should be "From:".

> Add the generic PHY support, analogous to the USB PHY support. Intended it to be
> used with the PCI EHCI/OHCI drivers and the xHCI platform driver.

> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
> ---
> This patch is against the 'usb-next' branch of Greg KH's 'usb.git' repo.
> (commit id = 70d2f61fc7559df3d5be32a9d01efdb9ee1b11d8)

    I was pondering on reposting this patch, along with the R8A779x device 
tree changes using it as Greg KH requested to see the users of this patch...

WBR, Sergei

--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vivek Gautam June 25, 2014, 10:32 a.m. UTC | #2
Hi Sergei,


On Fri, May 30, 2014 at 7:42 PM, Yoshihiro Shimoda
<yoshihiro.shimoda.uh@renesas.com> wrote:
> From Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>
> Add the generic PHY support, analogous to the USB PHY support. Intended it to be
> used with the PCI EHCI/OHCI drivers and the xHCI platform driver.
>
> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
> ---
> This patch is against the 'usb-next' branch of Greg KH's 'usb.git' repo.
> (commit id = 70d2f61fc7559df3d5be32a9d01efdb9ee1b11d8)
>
> Changes in version 3:
>  - rebased the current usb-next.
>  - I tested this patch on my R-Car H2 USB 3.0 driver (not merged yet)
>
>  drivers/usb/core/hcd.c  |   42 ++++++++++++++++++++++++++++++++++++++++--
>  include/linux/usb/hcd.h |    3 ++-
>  2 files changed, 42 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
> index bec31e2..2841149 100644
> --- a/drivers/usb/core/hcd.c
> +++ b/drivers/usb/core/hcd.c
> @@ -42,6 +42,7 @@
>  #include <linux/pm_runtime.h>
>  #include <linux/types.h>
>
> +#include <linux/phy/phy.h>
>  #include <linux/usb.h>
>  #include <linux/usb/hcd.h>
>  #include <linux/usb/phy.h>
> @@ -2649,6 +2650,29 @@ int usb_add_hcd(struct usb_hcd *hcd,
>                 }
>         }
>
> +       if (IS_ENABLED(CONFIG_GENERIC_PHY)) {
> +               struct phy *phy = phy_get(hcd->self.controller, "usb");

The xHCI host controller is going to have two controllers (main and
shared) USB2 controller and
USB3 controller. So they will have two different PHYs.
For example, the DWC3, which has a xHCI controller, has to have 2
different phys -- usb2-phy and usb3-phy.

So, how the two 'hcd's' will be able to differentiate and get two separate PHYs.
Unfortunately, the xHCI with DWC3 doesn't have a device node too, so
it needs to have
a way out to look up the PHYs (in a way suggested by Heikki :
    usb: dwc3: host: convey the PHYs to xhci
    (https://lkml.org/lkml/2014/6/5/585) and related patch series.
But this also has an issue, since we need to have two separate
constant strings to distinguish between the two PHYs,
while creating the lookup table.

So how do you suggest me to get link the two PHYs in DWC3 with the
XHCI host controller, the issue which i am
facing currently while working with the patch:
usb: host: xhci-plat: Add support to get PHYs    and the related patch
series, since we need to handle PHY from the hcd.

> +
> +               if (IS_ERR(phy)) {
> +                       retval = PTR_ERR(phy);
> +                       if (retval == -EPROBE_DEFER)
> +                               goto err_phy;
> +               } else {
> +                       retval = phy_init(phy);
> +                       if (retval) {
> +                               phy_put(phy);
> +                               goto err_phy;
> +                       }
> +                       retval = phy_power_on(phy);
> +                       if (retval) {
> +                               phy_exit(phy);
> +                               phy_put(phy);
> +                               goto err_phy;
> +                       }
> +                       hcd->gen_phy = phy;
> +               }
> +       }
> +
>         dev_info(hcd->self.controller, "%s\n", hcd->product_desc);
>
>         /* Keep old behaviour if authorized_default is not in [0, 1]. */
> @@ -2664,7 +2688,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
>          */
>         if ((retval = hcd_buffer_create(hcd)) != 0) {
>                 dev_dbg(hcd->self.controller, "pool alloc failed\n");
> -               goto err_remove_phy;
> +               goto err_create_buf;
>         }
>
>         if ((retval = usb_register_bus(&hcd->self)) < 0)
> @@ -2791,7 +2815,14 @@ err_allocate_root_hub:
>         usb_deregister_bus(&hcd->self);
>  err_register_bus:
>         hcd_buffer_destroy(hcd);
> -err_remove_phy:
> +err_create_buf:
> +       if (IS_ENABLED(CONFIG_GENERIC_PHY) && hcd->gen_phy) {
> +               phy_power_off(hcd->gen_phy);
> +               phy_exit(hcd->gen_phy);
> +               phy_put(hcd->gen_phy);
> +               hcd->gen_phy = NULL;
> +       }
> +err_phy:
>         if (hcd->remove_phy && hcd->phy) {
>                 usb_phy_shutdown(hcd->phy);
>                 usb_put_phy(hcd->phy);
> @@ -2868,6 +2899,13 @@ void usb_remove_hcd(struct usb_hcd *hcd)
>
>         usb_deregister_bus(&hcd->self);
>         hcd_buffer_destroy(hcd);
> +
> +       if (IS_ENABLED(CONFIG_GENERIC_PHY) && hcd->gen_phy) {
> +               phy_power_off(hcd->gen_phy);
> +               phy_exit(hcd->gen_phy);
> +               phy_put(hcd->gen_phy);
> +               hcd->gen_phy = NULL;
> +       }
>         if (hcd->remove_phy && hcd->phy) {
>                 usb_phy_shutdown(hcd->phy);
>                 usb_put_phy(hcd->phy);
> diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
> index 485cd5e..2aefbcc 100644
> --- a/include/linux/usb/hcd.h
> +++ b/include/linux/usb/hcd.h
> @@ -106,7 +106,8 @@ struct usb_hcd {
>          * OTG and some Host controllers need software interaction with phys;
>          * other external phys should be software-transparent
>          */
> -       struct usb_phy  *phy;
> +       struct usb_phy          *phy;
> +       struct phy              *gen_phy;
>
>         /* Flags that need to be manipulated atomically because they can
>          * change while the host controller is running.  Always use
> --
> 1.7.9.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vivek Gautam July 3, 2014, 6 a.m. UTC | #3
Cc: Alan, Mathias Nyman, Julius Werner, Heikki Krogerus

Hi,


On Wed, Jun 25, 2014 at 4:02 PM, Vivek Gautam <gautam.vivek@samsung.com> wrote:
> Hi Sergei,
>
>
> On Fri, May 30, 2014 at 7:42 PM, Yoshihiro Shimoda
> <yoshihiro.shimoda.uh@renesas.com> wrote:
>> From Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>>
>> Add the generic PHY support, analogous to the USB PHY support. Intended it to be
>> used with the PCI EHCI/OHCI drivers and the xHCI platform driver.
>>
>> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
>> ---
>> This patch is against the 'usb-next' branch of Greg KH's 'usb.git' repo.
>> (commit id = 70d2f61fc7559df3d5be32a9d01efdb9ee1b11d8)
>>
>> Changes in version 3:
>>  - rebased the current usb-next.
>>  - I tested this patch on my R-Car H2 USB 3.0 driver (not merged yet)
>>
>>  drivers/usb/core/hcd.c  |   42 ++++++++++++++++++++++++++++++++++++++++--
>>  include/linux/usb/hcd.h |    3 ++-
>>  2 files changed, 42 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
>> index bec31e2..2841149 100644
>> --- a/drivers/usb/core/hcd.c
>> +++ b/drivers/usb/core/hcd.c
>> @@ -42,6 +42,7 @@
>>  #include <linux/pm_runtime.h>
>>  #include <linux/types.h>
>>
>> +#include <linux/phy/phy.h>
>>  #include <linux/usb.h>
>>  #include <linux/usb/hcd.h>
>>  #include <linux/usb/phy.h>
>> @@ -2649,6 +2650,29 @@ int usb_add_hcd(struct usb_hcd *hcd,
>>                 }
>>         }
>>
>> +       if (IS_ENABLED(CONFIG_GENERIC_PHY)) {
>> +               struct phy *phy = phy_get(hcd->self.controller, "usb");
>
> The xHCI host controller is going to have two controllers (main and
> shared) USB2 controller and
> USB3 controller. So they will have two different PHYs.
> For example, the DWC3, which has a xHCI controller, has to have 2
> different phys -- usb2-phy and usb3-phy.
>
> So, how the two 'hcd's' will be able to differentiate and get two separate PHYs.
> Unfortunately, the xHCI with DWC3 doesn't have a device node too, so
> it needs to have
> a way out to look up the PHYs (in a way suggested by Heikki :
>     usb: dwc3: host: convey the PHYs to xhci
>     (https://lkml.org/lkml/2014/6/5/585) and related patch series.
> But this also has an issue, since we need to have two separate
> constant strings to distinguish between the two PHYs,
> while creating the lookup table.
>
> So how do you suggest me to get link the two PHYs in DWC3 with the
> XHCI host controller, the issue which i am
> facing currently while working with the patch:
> usb: host: xhci-plat: Add support to get PHYs    and the related patch
> series, since we need to handle PHY from the hcd.

Can someone please clear my doubt here.

This can help me getting a clear picture of how to align with the xhci's request
for PHY to let it handle any sort of phy-calibration, which we are
trying in the patch-series:
[PATCH v1 0/4] Fine tune USB 3.0 PHY on exynos5420
https://lkml.org/lkml/2014/6/6/202

I have also posted my doubts in the thread :
[PATCH 2/4] usb: host: xhci-plat: Add support to get PHYs
https://lkml.org/lkml/2014/6/25/150

[snip]
Sergei Shtylyov July 4, 2014, 11:26 p.m. UTC | #4
Hello.

On 06/25/2014 02:32 PM, Vivek Gautam wrote:

>>  From Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>

>> Add the generic PHY support, analogous to the USB PHY support. Intended it to be
>> used with the PCI EHCI/OHCI drivers and the xHCI platform driver.

>> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
>> ---
>> This patch is against the 'usb-next' branch of Greg KH's 'usb.git' repo.
>> (commit id = 70d2f61fc7559df3d5be32a9d01efdb9ee1b11d8)

>> Changes in version 3:
>>   - rebased the current usb-next.
>>   - I tested this patch on my R-Car H2 USB 3.0 driver (not merged yet)

>>   drivers/usb/core/hcd.c  |   42 ++++++++++++++++++++++++++++++++++++++++--
>>   include/linux/usb/hcd.h |    3 ++-
>>   2 files changed, 42 insertions(+), 3 deletions(-)

>> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
>> index bec31e2..2841149 100644
>> --- a/drivers/usb/core/hcd.c
>> +++ b/drivers/usb/core/hcd.c
[...]
>> @@ -2649,6 +2650,29 @@ int usb_add_hcd(struct usb_hcd *hcd,
>>                  }
>>          }
>>
>> +       if (IS_ENABLED(CONFIG_GENERIC_PHY)) {
>> +               struct phy *phy = phy_get(hcd->self.controller, "usb");

> The xHCI host controller is going to have two controllers (main and
> shared) USB2 controller and
> USB3 controller. So they will have two different PHYs.

    Not necessarily -- in my case there's going be one PHY, even for xHCI.

> For example, the DWC3, which has a xHCI controller, has to have 2
> different phys -- usb2-phy and usb3-phy.

    Yes, I understood that.

> So, how the two 'hcd's' will be able to differentiate and get two separate PHYs.

    Apparently, by name? I don't see any other way...

> Unfortunately, the xHCI with DWC3 doesn't have a device node too, so
> it needs to have
> a way out to look up the PHYs (in a way suggested by Heikki :
>      usb: dwc3: host: convey the PHYs to xhci
>      (https://lkml.org/lkml/2014/6/5/585) and related patch series.
> But this also has an issue, since we need to have two separate
> constant strings to distinguish between the two PHYs,
> while creating the lookup table.

    I'm sorry, where's the issue?

> So how do you suggest me to get link the two PHYs in DWC3 with the
> XHCI host controller, the issue which i am
> facing currently while working with the patch:
> usb: host: xhci-plat: Add support to get PHYs    and the related patch
> series, since we need to handle PHY from the hcd.

    Well, I've already spoke out in another thread: you'll have to carry on 
with your approach, ignoring the patch starting this thread. I'm sorry for 
side-tracking you...

WBR, Sergei

--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vivek Gautam July 7, 2014, 4:57 a.m. UTC | #5
Hi,


On Sat, Jul 5, 2014 at 4:56 AM, Sergei Shtylyov
<sergei.shtylyov@cogentembedded.com> wrote:
> Hello.
>
>
> On 06/25/2014 02:32 PM, Vivek Gautam wrote:
>
>>>  From Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>
>
>>> Add the generic PHY support, analogous to the USB PHY support. Intended
>>> it to be
>>> used with the PCI EHCI/OHCI drivers and the xHCI platform driver.
>
>
>>> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>>> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
>>> ---
>>> This patch is against the 'usb-next' branch of Greg KH's 'usb.git' repo.
>>> (commit id = 70d2f61fc7559df3d5be32a9d01efdb9ee1b11d8)
>
>
>>> Changes in version 3:
>>>   - rebased the current usb-next.
>>>   - I tested this patch on my R-Car H2 USB 3.0 driver (not merged yet)
>
>
>>>   drivers/usb/core/hcd.c  |   42
>>> ++++++++++++++++++++++++++++++++++++++++--
>>>   include/linux/usb/hcd.h |    3 ++-
>>>   2 files changed, 42 insertions(+), 3 deletions(-)
>
>
>>> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
>>> index bec31e2..2841149 100644
>>> --- a/drivers/usb/core/hcd.c
>>> +++ b/drivers/usb/core/hcd.c
>
> [...]
>
>>> @@ -2649,6 +2650,29 @@ int usb_add_hcd(struct usb_hcd *hcd,
>>>                  }
>>>          }
>>>
>>> +       if (IS_ENABLED(CONFIG_GENERIC_PHY)) {
>>> +               struct phy *phy = phy_get(hcd->self.controller, "usb");
>
>
>> The xHCI host controller is going to have two controllers (main and
>> shared) USB2 controller and
>> USB3 controller. So they will have two different PHYs.
>
>
>    Not necessarily -- in my case there's going be one PHY, even for xHCI.

ok.

>
>
>> For example, the DWC3, which has a xHCI controller, has to have 2
>> different phys -- usb2-phy and usb3-phy.
>
>
>    Yes, I understood that.
>
>
>> So, how the two 'hcd's' will be able to differentiate and get two separate
>> PHYs.
>
>
>    Apparently, by name? I don't see any other way...

true, by name string only.

>
>
>> Unfortunately, the xHCI with DWC3 doesn't have a device node too, so
>> it needs to have
>> a way out to look up the PHYs (in a way suggested by Heikki :
>>      usb: dwc3: host: convey the PHYs to xhci
>>      (https://lkml.org/lkml/2014/6/5/585) and related patch series.
>> But this also has an issue, since we need to have two separate
>> constant strings to distinguish between the two PHYs,
>> while creating the lookup table.
>
>
>    I'm sorry, where's the issue?

i actually thought of the phy_get() in core/hcd.c, where we would need
more than one
name string for different PHYs. But now things are clear after your explanation.

>
>
>> So how do you suggest me to get link the two PHYs in DWC3 with the
>> XHCI host controller, the issue which i am
>> facing currently while working with the patch:
>> usb: host: xhci-plat: Add support to get PHYs    and the related patch
>> series, since we need to handle PHY from the hcd.
>
>
>    Well, I've already spoke out in another thread: you'll have to carry on
> with your approach, ignoring the patch starting this thread. I'm sorry for
> side-tracking you...

Thanks Sergei for clearing my doubts and the confusion.
Vivek Gautam Aug. 21, 2014, 12:44 p.m. UTC | #6
On Fri, May 30, 2014 at 7:46 PM, Sergei Shtylyov
<sergei.shtylyov@cogentembedded.com> wrote:
> Hello.
>
> On 05/30/2014 06:12 PM, Yoshihiro Shimoda wrote:
>
>>  From Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>
>
>    Should be "From:".
>
>
>> Add the generic PHY support, analogous to the USB PHY support. Intended it
>> to be
>> used with the PCI EHCI/OHCI drivers and the xHCI platform driver.
>
>
>> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
>> ---
>> This patch is against the 'usb-next' branch of Greg KH's 'usb.git' repo.
>> (commit id = 70d2f61fc7559df3d5be32a9d01efdb9ee1b11d8)
>
>
>    I was pondering on reposting this patch, along with the R8A779x device
> tree changes using it as Greg KH requested to see the users of this patch...

Are we planning a repost of this patch, since we definitely have user
for this change [1],
apart from Antoine's series [2] which makes changes on top of this patch.

It will be easier for us if this patch gets pulled in for 3.18.

[1] [PATCH v4 2/4] usb: host: xhci-plat: Get PHYs for xhci's hcds
     http://lists.infradead.org/pipermail/linux-arm-kernel/2014-July/272833.html

[2] [PATCH v2 0/8] usb: add support for the generic PHY framework
     http://www.spinics.net/lists/linux-usb/msg110557.html
Sergei Shtylyov Aug. 21, 2014, 1:07 p.m. UTC | #7
Hello.

On 08/21/2014 04:44 PM, Vivek Gautam wrote:

>>>   From Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>

>>     Should be "From:".

>>> Add the generic PHY support, analogous to the USB PHY support. Intended it
>>> to be
>>> used with the PCI EHCI/OHCI drivers and the xHCI platform driver.

>>> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>>> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
>>> ---
>>> This patch is against the 'usb-next' branch of Greg KH's 'usb.git' repo.
>>> (commit id = 70d2f61fc7559df3d5be32a9d01efdb9ee1b11d8)

>>     I was pondering on reposting this patch, along with the R8A779x device
>> tree changes using it as Greg KH requested to see the users of this patch...

> Are we planning a repost of this patch,

    Yes, I'm planning this since Greg has lost v4.

WBR, Sergei

--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Vivek Gautam Aug. 21, 2014, 1:24 p.m. UTC | #8
Hi Sergei,


On Thu, Aug 21, 2014 at 6:37 PM, Sergei Shtylyov
<sergei.shtylyov@cogentembedded.com> wrote:
> Hello.
>
>
> On 08/21/2014 04:44 PM, Vivek Gautam wrote:
>
>>>>   From Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>
>
>>>     Should be "From:".
>
>
>>>> Add the generic PHY support, analogous to the USB PHY support. Intended
>>>> it
>>>> to be
>>>> used with the PCI EHCI/OHCI drivers and the xHCI platform driver.
>
>
>>>> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
>>>> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
>>>> ---
>>>> This patch is against the 'usb-next' branch of Greg KH's 'usb.git' repo.
>>>> (commit id = 70d2f61fc7559df3d5be32a9d01efdb9ee1b11d8)
>
>
>>>     I was pondering on reposting this patch, along with the R8A779x
>>> device
>>> tree changes using it as Greg KH requested to see the users of this
>>> patch...
>
>
>> Are we planning a repost of this patch,
>
>
>    Yes, I'm planning this since Greg has lost v4.

Ok, for now i will rebase my series for xhci-plat on this.
Thanks :-)
diff mbox

Patch

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index bec31e2..2841149 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -42,6 +42,7 @@ 
 #include <linux/pm_runtime.h>
 #include <linux/types.h>

+#include <linux/phy/phy.h>
 #include <linux/usb.h>
 #include <linux/usb/hcd.h>
 #include <linux/usb/phy.h>
@@ -2649,6 +2650,29 @@  int usb_add_hcd(struct usb_hcd *hcd,
 		}
 	}

+	if (IS_ENABLED(CONFIG_GENERIC_PHY)) {
+		struct phy *phy = phy_get(hcd->self.controller, "usb");
+
+		if (IS_ERR(phy)) {
+			retval = PTR_ERR(phy);
+			if (retval == -EPROBE_DEFER)
+				goto err_phy;
+		} else {
+			retval = phy_init(phy);
+			if (retval) {
+				phy_put(phy);
+				goto err_phy;
+			}
+			retval = phy_power_on(phy);
+			if (retval) {
+				phy_exit(phy);
+				phy_put(phy);
+				goto err_phy;
+			}
+			hcd->gen_phy = phy;
+		}
+	}
+
 	dev_info(hcd->self.controller, "%s\n", hcd->product_desc);

 	/* Keep old behaviour if authorized_default is not in [0, 1]. */
@@ -2664,7 +2688,7 @@  int usb_add_hcd(struct usb_hcd *hcd,
 	 */
 	if ((retval = hcd_buffer_create(hcd)) != 0) {
 		dev_dbg(hcd->self.controller, "pool alloc failed\n");
-		goto err_remove_phy;
+		goto err_create_buf;
 	}

 	if ((retval = usb_register_bus(&hcd->self)) < 0)
@@ -2791,7 +2815,14 @@  err_allocate_root_hub:
 	usb_deregister_bus(&hcd->self);
 err_register_bus:
 	hcd_buffer_destroy(hcd);
-err_remove_phy:
+err_create_buf:
+	if (IS_ENABLED(CONFIG_GENERIC_PHY) && hcd->gen_phy) {
+		phy_power_off(hcd->gen_phy);
+		phy_exit(hcd->gen_phy);
+		phy_put(hcd->gen_phy);
+		hcd->gen_phy = NULL;
+	}
+err_phy:
 	if (hcd->remove_phy && hcd->phy) {
 		usb_phy_shutdown(hcd->phy);
 		usb_put_phy(hcd->phy);
@@ -2868,6 +2899,13 @@  void usb_remove_hcd(struct usb_hcd *hcd)

 	usb_deregister_bus(&hcd->self);
 	hcd_buffer_destroy(hcd);
+
+	if (IS_ENABLED(CONFIG_GENERIC_PHY) && hcd->gen_phy) {
+		phy_power_off(hcd->gen_phy);
+		phy_exit(hcd->gen_phy);
+		phy_put(hcd->gen_phy);
+		hcd->gen_phy = NULL;
+	}
 	if (hcd->remove_phy && hcd->phy) {
 		usb_phy_shutdown(hcd->phy);
 		usb_put_phy(hcd->phy);
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index 485cd5e..2aefbcc 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -106,7 +106,8 @@  struct usb_hcd {
 	 * OTG and some Host controllers need software interaction with phys;
 	 * other external phys should be software-transparent
 	 */
-	struct usb_phy	*phy;
+	struct usb_phy		*phy;
+	struct phy		*gen_phy;

 	/* Flags that need to be manipulated atomically because they can
 	 * change while the host controller is running.  Always use