All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>
To: Masahiro Yamada
	<yamada.masahiro-uWyLwvC0a2jby3iVrkZq2A@public.gmane.org>
Cc: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
	Peter.Chen-3arQi8VN3Tc@public.gmane.org,
	Neil Armstrong
	<narmstrong-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>,
	linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	Thierry Reding
	<thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Tony Prisk <linux-ci5G2KO2hbZ+pU9mqzGVBQ@public.gmane.org>,
	Felipe Balbi
	<felipe.balbi-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>,
	Jon Hunter <jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>,
	Alan Stern
	<stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org>,
	Chunfeng Yun
	<chunfeng.yun-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
	DTML <devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>,
	yixun.lan-LpR1jeaWuhtBDgjK7y7TUQ@public.gmane.org,
	Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	"moderated list:ARM/Mediatek SoC support"
	<linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>,
	Matthias Brugger
	<matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	Linux-OMAP <linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	linux-arm-kernel
	<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>,
	Greg Kroah-Hartman
	<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>,
	linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	mathias.nyman-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org
Subject: Re: [usb-next PATCH v11 3/8] usb: core: add a wrapper for the USB PHYs on the HCD
Date: Thu, 5 Apr 2018 22:04:01 +0200	[thread overview]
Message-ID: <CAFBinCCRhJLxOCz6_a23XnVcSo35MpE8huA8keNFBrWmr_mR=A@mail.gmail.com> (raw)
In-Reply-To: <CAK7LNARM=F3Ey0aO9PiNftxkcLVo4z10jdrkSrQE1f74nK1=Ng-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>

Hello,

(great to hear that this might be useful on Socionext SoCs as well :))

On Wed, Apr 4, 2018 at 2:10 PM, Masahiro Yamada
<yamada.masahiro-uWyLwvC0a2jby3iVrkZq2A@public.gmane.org> wrote:
> 2018-03-04 6:43 GMT+09:00 Martin Blumenstingl
> <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>:
>> Many SoC platforms have separate devices for the USB PHY which are
>> registered through the generic PHY framework. These PHYs have to be
>> enabled to make the USB controller actually work. They also have to be
>> disabled again on shutdown/suspend.
>>
>> Currently (at least) the following HCI platform drivers are using custom
>> code to obtain all PHYs via devicetree for the roothub/controller and
>> disable/enable them when required:
>> - ehci-platform.c has ehci_platform_power_{on,off}
>> - xhci-mtk.c has xhci_mtk_phy_{init,exit,power_on,power_off}
>> - ohci-platform.c has ohci_platform_power_{on,off}
>>
>> With this new wrapper the USB PHYs can be specified directly in the
>> USB controller's devicetree node (just like on the drivers listed
>> above). This allows SoCs like the Amlogic Meson GXL family to operate
>> correctly once this is wired up correctly. These SoCs use a dwc3
>> controller and require all USB PHYs to be initialized (if one of the USB
>> PHYs it not initialized then none of USB port works at all).
>>
>> Signed-off-by: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>
>> Tested-by: Yixun Lan <yixun.lan-LpR1jeaWuhtBDgjK7y7TUQ@public.gmane.org>
>> Cc: Neil Armstrong <narmstrong-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
>> Cc: Chunfeng Yun <chunfeng.yun-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
>> ---
>>  drivers/usb/core/Makefile |   2 +-
>>  drivers/usb/core/phy.c    | 158 ++++++++++++++++++++++++++++++++++++++++++++++
>>  drivers/usb/core/phy.h    |   7 ++
>>  3 files changed, 166 insertions(+), 1 deletion(-)
>>  create mode 100644 drivers/usb/core/phy.c
>>  create mode 100644 drivers/usb/core/phy.h
>>
>> diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
>> index 92c9cefb4317..18e874b0441e 100644
>> --- a/drivers/usb/core/Makefile
>> +++ b/drivers/usb/core/Makefile
>> @@ -6,7 +6,7 @@
>>  usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
>>  usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
>>  usbcore-y += devio.o notify.o generic.o quirks.o devices.o
>> -usbcore-y += port.o
>> +usbcore-y += phy.o port.o
>>
>>  usbcore-$(CONFIG_OF)           += of.o
>>  usbcore-$(CONFIG_USB_PCI)              += hcd-pci.o
>> diff --git a/drivers/usb/core/phy.c b/drivers/usb/core/phy.c
>> new file mode 100644
>> index 000000000000..09b7c43c0ea4
>> --- /dev/null
>> +++ b/drivers/usb/core/phy.c
>> @@ -0,0 +1,158 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * A wrapper for multiple PHYs which passes all phy_* function calls to
>> + * multiple (actual) PHY devices. This is comes handy when initializing
>> + * all PHYs on a HCD and to keep them all in the same state.
>> + *
>> + * Copyright (C) 2018 Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>
>> + */
>> +
>> +#include <linux/device.h>
>> +#include <linux/list.h>
>> +#include <linux/phy/phy.h>
>> +#include <linux/of.h>
>> +
>> +#include "phy.h"
>> +
>> +struct usb_phy_roothub {
>> +       struct phy              *phy;
>> +       struct list_head        list;
>> +};
>> +
>> +static struct usb_phy_roothub *usb_phy_roothub_alloc(struct device *dev)
>> +{
>> +       struct usb_phy_roothub *roothub_entry;
>> +
>> +       roothub_entry = devm_kzalloc(dev, sizeof(*roothub_entry), GFP_KERNEL);
>> +       if (!roothub_entry)
>> +               return ERR_PTR(-ENOMEM);
>> +
>> +       INIT_LIST_HEAD(&roothub_entry->list);
>> +
>> +       return roothub_entry;
>> +}
>> +
>> +static int usb_phy_roothub_add_phy(struct device *dev, int index,
>> +                                  struct list_head *list)
>> +{
>> +       struct usb_phy_roothub *roothub_entry;
>> +       struct phy *phy = devm_of_phy_get_by_index(dev, dev->of_node, index);
>> +
>> +       if (IS_ERR_OR_NULL(phy)) {
>> +               if (!phy || PTR_ERR(phy) == -ENODEV)
>> +                       return 0;
>> +               else
>> +                       return PTR_ERR(phy);
>> +       }
>> +
>> +       roothub_entry = usb_phy_roothub_alloc(dev);
>> +       if (IS_ERR(roothub_entry))
>> +               return PTR_ERR(roothub_entry);
>> +
>> +       roothub_entry->phy = phy;
>> +
>> +       list_add_tail(&roothub_entry->list, list);
>> +
>> +       return 0;
>> +}
>> +
>> +struct usb_phy_roothub *usb_phy_roothub_init(struct device *dev)
>> +{
>> +       struct usb_phy_roothub *phy_roothub;
>> +       struct usb_phy_roothub *roothub_entry;
>> +       struct list_head *head;
>> +       int i, num_phys, err;
>> +
>> +       num_phys = of_count_phandle_with_args(dev->of_node, "phys",
>> +                                             "#phy-cells");
>> +       if (num_phys <= 0)
>> +               return NULL;
>> +
>> +       phy_roothub = usb_phy_roothub_alloc(dev);
>> +       if (IS_ERR(phy_roothub))
>> +               return phy_roothub;
>> +
>> +       for (i = 0; i < num_phys; i++) {
>> +               err = usb_phy_roothub_add_phy(dev, i, &phy_roothub->list);
>> +               if (err)
>> +                       goto err_out;
>> +       }
>> +
>> +       head = &phy_roothub->list;
>
>
> I think phy_roothub->phy is always empty,
> and only phy_roothub->list is used.
>
>
> I just wondered if we can directly put 'struct list_head' into
> 'struct usb_hcd'.
maybe you can try it and send a patch (note: please wait until
v4.17-rc2-ish because there are some fixes that will be applied by
Greg after v4.17-rc1 is out, as well as the issues you noted below)?
I believe it's not critical so there's plenty of time to get it into v4.18

>> diff --git a/drivers/usb/core/phy.h b/drivers/usb/core/phy.h
>> new file mode 100644
>> index 000000000000..6fde59bfbff8
>> --- /dev/null
>> +++ b/drivers/usb/core/phy.h
>> @@ -0,0 +1,7 @@
>> +struct usb_phy_roothub;
>
> struct device;
>
> is also needed for usb_phy_roothub_init().
do you think that I should still fix this in 4.17?

>> +struct usb_phy_roothub *usb_phy_roothub_init(struct device *dev);
>> +int usb_phy_roothub_exit(struct usb_phy_roothub *phy_roothub);
>> +
>> +int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub);
>> +void usb_phy_roothub_power_off(struct usb_phy_roothub *phy_roothub);
>
>
> Better to add an include guard?
> SPDX-License-Identifier for this header too?
good catch - I'll send a patch for this too (along with the missing
forward declaration for struct device)


Regards
Martin

WARNING: multiple messages have this Message-ID (diff)
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
To: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: linux-usb@vger.kernel.org, mathias.nyman@intel.com,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Felipe Balbi <felipe.balbi@linux.intel.com>,
	Linux-OMAP <linux-omap@vger.kernel.org>,
	linux-tegra@vger.kernel.org,
	"moderated list:ARM/Mediatek SoC support"
	<linux-mediatek@lists.infradead.org>,
	linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
	DTML <devicetree@vger.kernel.org>,
	Jon Hunter <jonathanh@nvidia.com>,
	Thierry Reding <thierry.reding@gmail.com>,
	Alan Stern <stern@rowland.harvard.edu>,
	Tony Prisk <linux@prisktech.co.nz>,
	Peter.Chen@nxp.com, Matthias Brugger <matthias.bgg@gmail.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Rob Herring <robh+dt@kernel.org>,
	Neil Armstrong <narmstrong@baylibre.com>,
	linux-amlogic@lists.infradead.org, yixun.lan@amlogic.com,
	Chunfeng Yun <chunfeng.yun@mediatek.com>
Subject: [usb-next,v11,3/8] usb: core: add a wrapper for the USB PHYs on the HCD
Date: Thu, 5 Apr 2018 22:04:01 +0200	[thread overview]
Message-ID: <CAFBinCCRhJLxOCz6_a23XnVcSo35MpE8huA8keNFBrWmr_mR=A@mail.gmail.com> (raw)

Hello,

(great to hear that this might be useful on Socionext SoCs as well :))

On Wed, Apr 4, 2018 at 2:10 PM, Masahiro Yamada
<yamada.masahiro@socionext.com> wrote:
> 2018-03-04 6:43 GMT+09:00 Martin Blumenstingl
> <martin.blumenstingl@googlemail.com>:
>> Many SoC platforms have separate devices for the USB PHY which are
>> registered through the generic PHY framework. These PHYs have to be
>> enabled to make the USB controller actually work. They also have to be
>> disabled again on shutdown/suspend.
>>
>> Currently (at least) the following HCI platform drivers are using custom
>> code to obtain all PHYs via devicetree for the roothub/controller and
>> disable/enable them when required:
>> - ehci-platform.c has ehci_platform_power_{on,off}
>> - xhci-mtk.c has xhci_mtk_phy_{init,exit,power_on,power_off}
>> - ohci-platform.c has ohci_platform_power_{on,off}
>>
>> With this new wrapper the USB PHYs can be specified directly in the
>> USB controller's devicetree node (just like on the drivers listed
>> above). This allows SoCs like the Amlogic Meson GXL family to operate
>> correctly once this is wired up correctly. These SoCs use a dwc3
>> controller and require all USB PHYs to be initialized (if one of the USB
>> PHYs it not initialized then none of USB port works at all).
>>
>> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
>> Tested-by: Yixun Lan <yixun.lan@amlogic.com>
>> Cc: Neil Armstrong <narmstrong@baylibre.com>
>> Cc: Chunfeng Yun <chunfeng.yun@mediatek.com>
>> ---
>>  drivers/usb/core/Makefile |   2 +-
>>  drivers/usb/core/phy.c    | 158 ++++++++++++++++++++++++++++++++++++++++++++++
>>  drivers/usb/core/phy.h    |   7 ++
>>  3 files changed, 166 insertions(+), 1 deletion(-)
>>  create mode 100644 drivers/usb/core/phy.c
>>  create mode 100644 drivers/usb/core/phy.h
>>
>> diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
>> index 92c9cefb4317..18e874b0441e 100644
>> --- a/drivers/usb/core/Makefile
>> +++ b/drivers/usb/core/Makefile
>> @@ -6,7 +6,7 @@
>>  usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
>>  usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
>>  usbcore-y += devio.o notify.o generic.o quirks.o devices.o
>> -usbcore-y += port.o
>> +usbcore-y += phy.o port.o
>>
>>  usbcore-$(CONFIG_OF)           += of.o
>>  usbcore-$(CONFIG_USB_PCI)              += hcd-pci.o
>> diff --git a/drivers/usb/core/phy.c b/drivers/usb/core/phy.c
>> new file mode 100644
>> index 000000000000..09b7c43c0ea4
>> --- /dev/null
>> +++ b/drivers/usb/core/phy.c
>> @@ -0,0 +1,158 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * A wrapper for multiple PHYs which passes all phy_* function calls to
>> + * multiple (actual) PHY devices. This is comes handy when initializing
>> + * all PHYs on a HCD and to keep them all in the same state.
>> + *
>> + * Copyright (C) 2018 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
>> + */
>> +
>> +#include <linux/device.h>
>> +#include <linux/list.h>
>> +#include <linux/phy/phy.h>
>> +#include <linux/of.h>
>> +
>> +#include "phy.h"
>> +
>> +struct usb_phy_roothub {
>> +       struct phy              *phy;
>> +       struct list_head        list;
>> +};
>> +
>> +static struct usb_phy_roothub *usb_phy_roothub_alloc(struct device *dev)
>> +{
>> +       struct usb_phy_roothub *roothub_entry;
>> +
>> +       roothub_entry = devm_kzalloc(dev, sizeof(*roothub_entry), GFP_KERNEL);
>> +       if (!roothub_entry)
>> +               return ERR_PTR(-ENOMEM);
>> +
>> +       INIT_LIST_HEAD(&roothub_entry->list);
>> +
>> +       return roothub_entry;
>> +}
>> +
>> +static int usb_phy_roothub_add_phy(struct device *dev, int index,
>> +                                  struct list_head *list)
>> +{
>> +       struct usb_phy_roothub *roothub_entry;
>> +       struct phy *phy = devm_of_phy_get_by_index(dev, dev->of_node, index);
>> +
>> +       if (IS_ERR_OR_NULL(phy)) {
>> +               if (!phy || PTR_ERR(phy) == -ENODEV)
>> +                       return 0;
>> +               else
>> +                       return PTR_ERR(phy);
>> +       }
>> +
>> +       roothub_entry = usb_phy_roothub_alloc(dev);
>> +       if (IS_ERR(roothub_entry))
>> +               return PTR_ERR(roothub_entry);
>> +
>> +       roothub_entry->phy = phy;
>> +
>> +       list_add_tail(&roothub_entry->list, list);
>> +
>> +       return 0;
>> +}
>> +
>> +struct usb_phy_roothub *usb_phy_roothub_init(struct device *dev)
>> +{
>> +       struct usb_phy_roothub *phy_roothub;
>> +       struct usb_phy_roothub *roothub_entry;
>> +       struct list_head *head;
>> +       int i, num_phys, err;
>> +
>> +       num_phys = of_count_phandle_with_args(dev->of_node, "phys",
>> +                                             "#phy-cells");
>> +       if (num_phys <= 0)
>> +               return NULL;
>> +
>> +       phy_roothub = usb_phy_roothub_alloc(dev);
>> +       if (IS_ERR(phy_roothub))
>> +               return phy_roothub;
>> +
>> +       for (i = 0; i < num_phys; i++) {
>> +               err = usb_phy_roothub_add_phy(dev, i, &phy_roothub->list);
>> +               if (err)
>> +                       goto err_out;
>> +       }
>> +
>> +       head = &phy_roothub->list;
>
>
> I think phy_roothub->phy is always empty,
> and only phy_roothub->list is used.
>
>
> I just wondered if we can directly put 'struct list_head' into
> 'struct usb_hcd'.
maybe you can try it and send a patch (note: please wait until
v4.17-rc2-ish because there are some fixes that will be applied by
Greg after v4.17-rc1 is out, as well as the issues you noted below)?
I believe it's not critical so there's plenty of time to get it into v4.18

>> diff --git a/drivers/usb/core/phy.h b/drivers/usb/core/phy.h
>> new file mode 100644
>> index 000000000000..6fde59bfbff8
>> --- /dev/null
>> +++ b/drivers/usb/core/phy.h
>> @@ -0,0 +1,7 @@
>> +struct usb_phy_roothub;
>
> struct device;
>
> is also needed for usb_phy_roothub_init().
do you think that I should still fix this in 4.17?

>> +struct usb_phy_roothub *usb_phy_roothub_init(struct device *dev);
>> +int usb_phy_roothub_exit(struct usb_phy_roothub *phy_roothub);
>> +
>> +int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub);
>> +void usb_phy_roothub_power_off(struct usb_phy_roothub *phy_roothub);
>
>
> Better to add an include guard?
> SPDX-License-Identifier for this header too?
good catch - I'll send a patch for this too (along with the missing
forward declaration for struct device)


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

WARNING: multiple messages have this Message-ID (diff)
From: martin.blumenstingl@googlemail.com (Martin Blumenstingl)
To: linux-arm-kernel@lists.infradead.org
Subject: [usb-next PATCH v11 3/8] usb: core: add a wrapper for the USB PHYs on the HCD
Date: Thu, 5 Apr 2018 22:04:01 +0200	[thread overview]
Message-ID: <CAFBinCCRhJLxOCz6_a23XnVcSo35MpE8huA8keNFBrWmr_mR=A@mail.gmail.com> (raw)
In-Reply-To: <CAK7LNARM=F3Ey0aO9PiNftxkcLVo4z10jdrkSrQE1f74nK1=Ng@mail.gmail.com>

Hello,

(great to hear that this might be useful on Socionext SoCs as well :))

On Wed, Apr 4, 2018 at 2:10 PM, Masahiro Yamada
<yamada.masahiro@socionext.com> wrote:
> 2018-03-04 6:43 GMT+09:00 Martin Blumenstingl
> <martin.blumenstingl@googlemail.com>:
>> Many SoC platforms have separate devices for the USB PHY which are
>> registered through the generic PHY framework. These PHYs have to be
>> enabled to make the USB controller actually work. They also have to be
>> disabled again on shutdown/suspend.
>>
>> Currently (at least) the following HCI platform drivers are using custom
>> code to obtain all PHYs via devicetree for the roothub/controller and
>> disable/enable them when required:
>> - ehci-platform.c has ehci_platform_power_{on,off}
>> - xhci-mtk.c has xhci_mtk_phy_{init,exit,power_on,power_off}
>> - ohci-platform.c has ohci_platform_power_{on,off}
>>
>> With this new wrapper the USB PHYs can be specified directly in the
>> USB controller's devicetree node (just like on the drivers listed
>> above). This allows SoCs like the Amlogic Meson GXL family to operate
>> correctly once this is wired up correctly. These SoCs use a dwc3
>> controller and require all USB PHYs to be initialized (if one of the USB
>> PHYs it not initialized then none of USB port works at all).
>>
>> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
>> Tested-by: Yixun Lan <yixun.lan@amlogic.com>
>> Cc: Neil Armstrong <narmstrong@baylibre.com>
>> Cc: Chunfeng Yun <chunfeng.yun@mediatek.com>
>> ---
>>  drivers/usb/core/Makefile |   2 +-
>>  drivers/usb/core/phy.c    | 158 ++++++++++++++++++++++++++++++++++++++++++++++
>>  drivers/usb/core/phy.h    |   7 ++
>>  3 files changed, 166 insertions(+), 1 deletion(-)
>>  create mode 100644 drivers/usb/core/phy.c
>>  create mode 100644 drivers/usb/core/phy.h
>>
>> diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
>> index 92c9cefb4317..18e874b0441e 100644
>> --- a/drivers/usb/core/Makefile
>> +++ b/drivers/usb/core/Makefile
>> @@ -6,7 +6,7 @@
>>  usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
>>  usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
>>  usbcore-y += devio.o notify.o generic.o quirks.o devices.o
>> -usbcore-y += port.o
>> +usbcore-y += phy.o port.o
>>
>>  usbcore-$(CONFIG_OF)           += of.o
>>  usbcore-$(CONFIG_USB_PCI)              += hcd-pci.o
>> diff --git a/drivers/usb/core/phy.c b/drivers/usb/core/phy.c
>> new file mode 100644
>> index 000000000000..09b7c43c0ea4
>> --- /dev/null
>> +++ b/drivers/usb/core/phy.c
>> @@ -0,0 +1,158 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * A wrapper for multiple PHYs which passes all phy_* function calls to
>> + * multiple (actual) PHY devices. This is comes handy when initializing
>> + * all PHYs on a HCD and to keep them all in the same state.
>> + *
>> + * Copyright (C) 2018 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
>> + */
>> +
>> +#include <linux/device.h>
>> +#include <linux/list.h>
>> +#include <linux/phy/phy.h>
>> +#include <linux/of.h>
>> +
>> +#include "phy.h"
>> +
>> +struct usb_phy_roothub {
>> +       struct phy              *phy;
>> +       struct list_head        list;
>> +};
>> +
>> +static struct usb_phy_roothub *usb_phy_roothub_alloc(struct device *dev)
>> +{
>> +       struct usb_phy_roothub *roothub_entry;
>> +
>> +       roothub_entry = devm_kzalloc(dev, sizeof(*roothub_entry), GFP_KERNEL);
>> +       if (!roothub_entry)
>> +               return ERR_PTR(-ENOMEM);
>> +
>> +       INIT_LIST_HEAD(&roothub_entry->list);
>> +
>> +       return roothub_entry;
>> +}
>> +
>> +static int usb_phy_roothub_add_phy(struct device *dev, int index,
>> +                                  struct list_head *list)
>> +{
>> +       struct usb_phy_roothub *roothub_entry;
>> +       struct phy *phy = devm_of_phy_get_by_index(dev, dev->of_node, index);
>> +
>> +       if (IS_ERR_OR_NULL(phy)) {
>> +               if (!phy || PTR_ERR(phy) == -ENODEV)
>> +                       return 0;
>> +               else
>> +                       return PTR_ERR(phy);
>> +       }
>> +
>> +       roothub_entry = usb_phy_roothub_alloc(dev);
>> +       if (IS_ERR(roothub_entry))
>> +               return PTR_ERR(roothub_entry);
>> +
>> +       roothub_entry->phy = phy;
>> +
>> +       list_add_tail(&roothub_entry->list, list);
>> +
>> +       return 0;
>> +}
>> +
>> +struct usb_phy_roothub *usb_phy_roothub_init(struct device *dev)
>> +{
>> +       struct usb_phy_roothub *phy_roothub;
>> +       struct usb_phy_roothub *roothub_entry;
>> +       struct list_head *head;
>> +       int i, num_phys, err;
>> +
>> +       num_phys = of_count_phandle_with_args(dev->of_node, "phys",
>> +                                             "#phy-cells");
>> +       if (num_phys <= 0)
>> +               return NULL;
>> +
>> +       phy_roothub = usb_phy_roothub_alloc(dev);
>> +       if (IS_ERR(phy_roothub))
>> +               return phy_roothub;
>> +
>> +       for (i = 0; i < num_phys; i++) {
>> +               err = usb_phy_roothub_add_phy(dev, i, &phy_roothub->list);
>> +               if (err)
>> +                       goto err_out;
>> +       }
>> +
>> +       head = &phy_roothub->list;
>
>
> I think phy_roothub->phy is always empty,
> and only phy_roothub->list is used.
>
>
> I just wondered if we can directly put 'struct list_head' into
> 'struct usb_hcd'.
maybe you can try it and send a patch (note: please wait until
v4.17-rc2-ish because there are some fixes that will be applied by
Greg after v4.17-rc1 is out, as well as the issues you noted below)?
I believe it's not critical so there's plenty of time to get it into v4.18

>> diff --git a/drivers/usb/core/phy.h b/drivers/usb/core/phy.h
>> new file mode 100644
>> index 000000000000..6fde59bfbff8
>> --- /dev/null
>> +++ b/drivers/usb/core/phy.h
>> @@ -0,0 +1,7 @@
>> +struct usb_phy_roothub;
>
> struct device;
>
> is also needed for usb_phy_roothub_init().
do you think that I should still fix this in 4.17?

>> +struct usb_phy_roothub *usb_phy_roothub_init(struct device *dev);
>> +int usb_phy_roothub_exit(struct usb_phy_roothub *phy_roothub);
>> +
>> +int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub);
>> +void usb_phy_roothub_power_off(struct usb_phy_roothub *phy_roothub);
>
>
> Better to add an include guard?
> SPDX-License-Identifier for this header too?
good catch - I'll send a patch for this too (along with the missing
forward declaration for struct device)


Regards
Martin

WARNING: multiple messages have this Message-ID (diff)
From: martin.blumenstingl@googlemail.com (Martin Blumenstingl)
To: linus-amlogic@lists.infradead.org
Subject: [usb-next PATCH v11 3/8] usb: core: add a wrapper for the USB PHYs on the HCD
Date: Thu, 5 Apr 2018 22:04:01 +0200	[thread overview]
Message-ID: <CAFBinCCRhJLxOCz6_a23XnVcSo35MpE8huA8keNFBrWmr_mR=A@mail.gmail.com> (raw)
In-Reply-To: <CAK7LNARM=F3Ey0aO9PiNftxkcLVo4z10jdrkSrQE1f74nK1=Ng@mail.gmail.com>

Hello,

(great to hear that this might be useful on Socionext SoCs as well :))

On Wed, Apr 4, 2018 at 2:10 PM, Masahiro Yamada
<yamada.masahiro@socionext.com> wrote:
> 2018-03-04 6:43 GMT+09:00 Martin Blumenstingl
> <martin.blumenstingl@googlemail.com>:
>> Many SoC platforms have separate devices for the USB PHY which are
>> registered through the generic PHY framework. These PHYs have to be
>> enabled to make the USB controller actually work. They also have to be
>> disabled again on shutdown/suspend.
>>
>> Currently (at least) the following HCI platform drivers are using custom
>> code to obtain all PHYs via devicetree for the roothub/controller and
>> disable/enable them when required:
>> - ehci-platform.c has ehci_platform_power_{on,off}
>> - xhci-mtk.c has xhci_mtk_phy_{init,exit,power_on,power_off}
>> - ohci-platform.c has ohci_platform_power_{on,off}
>>
>> With this new wrapper the USB PHYs can be specified directly in the
>> USB controller's devicetree node (just like on the drivers listed
>> above). This allows SoCs like the Amlogic Meson GXL family to operate
>> correctly once this is wired up correctly. These SoCs use a dwc3
>> controller and require all USB PHYs to be initialized (if one of the USB
>> PHYs it not initialized then none of USB port works at all).
>>
>> Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
>> Tested-by: Yixun Lan <yixun.lan@amlogic.com>
>> Cc: Neil Armstrong <narmstrong@baylibre.com>
>> Cc: Chunfeng Yun <chunfeng.yun@mediatek.com>
>> ---
>>  drivers/usb/core/Makefile |   2 +-
>>  drivers/usb/core/phy.c    | 158 ++++++++++++++++++++++++++++++++++++++++++++++
>>  drivers/usb/core/phy.h    |   7 ++
>>  3 files changed, 166 insertions(+), 1 deletion(-)
>>  create mode 100644 drivers/usb/core/phy.c
>>  create mode 100644 drivers/usb/core/phy.h
>>
>> diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
>> index 92c9cefb4317..18e874b0441e 100644
>> --- a/drivers/usb/core/Makefile
>> +++ b/drivers/usb/core/Makefile
>> @@ -6,7 +6,7 @@
>>  usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
>>  usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
>>  usbcore-y += devio.o notify.o generic.o quirks.o devices.o
>> -usbcore-y += port.o
>> +usbcore-y += phy.o port.o
>>
>>  usbcore-$(CONFIG_OF)           += of.o
>>  usbcore-$(CONFIG_USB_PCI)              += hcd-pci.o
>> diff --git a/drivers/usb/core/phy.c b/drivers/usb/core/phy.c
>> new file mode 100644
>> index 000000000000..09b7c43c0ea4
>> --- /dev/null
>> +++ b/drivers/usb/core/phy.c
>> @@ -0,0 +1,158 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * A wrapper for multiple PHYs which passes all phy_* function calls to
>> + * multiple (actual) PHY devices. This is comes handy when initializing
>> + * all PHYs on a HCD and to keep them all in the same state.
>> + *
>> + * Copyright (C) 2018 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
>> + */
>> +
>> +#include <linux/device.h>
>> +#include <linux/list.h>
>> +#include <linux/phy/phy.h>
>> +#include <linux/of.h>
>> +
>> +#include "phy.h"
>> +
>> +struct usb_phy_roothub {
>> +       struct phy              *phy;
>> +       struct list_head        list;
>> +};
>> +
>> +static struct usb_phy_roothub *usb_phy_roothub_alloc(struct device *dev)
>> +{
>> +       struct usb_phy_roothub *roothub_entry;
>> +
>> +       roothub_entry = devm_kzalloc(dev, sizeof(*roothub_entry), GFP_KERNEL);
>> +       if (!roothub_entry)
>> +               return ERR_PTR(-ENOMEM);
>> +
>> +       INIT_LIST_HEAD(&roothub_entry->list);
>> +
>> +       return roothub_entry;
>> +}
>> +
>> +static int usb_phy_roothub_add_phy(struct device *dev, int index,
>> +                                  struct list_head *list)
>> +{
>> +       struct usb_phy_roothub *roothub_entry;
>> +       struct phy *phy = devm_of_phy_get_by_index(dev, dev->of_node, index);
>> +
>> +       if (IS_ERR_OR_NULL(phy)) {
>> +               if (!phy || PTR_ERR(phy) == -ENODEV)
>> +                       return 0;
>> +               else
>> +                       return PTR_ERR(phy);
>> +       }
>> +
>> +       roothub_entry = usb_phy_roothub_alloc(dev);
>> +       if (IS_ERR(roothub_entry))
>> +               return PTR_ERR(roothub_entry);
>> +
>> +       roothub_entry->phy = phy;
>> +
>> +       list_add_tail(&roothub_entry->list, list);
>> +
>> +       return 0;
>> +}
>> +
>> +struct usb_phy_roothub *usb_phy_roothub_init(struct device *dev)
>> +{
>> +       struct usb_phy_roothub *phy_roothub;
>> +       struct usb_phy_roothub *roothub_entry;
>> +       struct list_head *head;
>> +       int i, num_phys, err;
>> +
>> +       num_phys = of_count_phandle_with_args(dev->of_node, "phys",
>> +                                             "#phy-cells");
>> +       if (num_phys <= 0)
>> +               return NULL;
>> +
>> +       phy_roothub = usb_phy_roothub_alloc(dev);
>> +       if (IS_ERR(phy_roothub))
>> +               return phy_roothub;
>> +
>> +       for (i = 0; i < num_phys; i++) {
>> +               err = usb_phy_roothub_add_phy(dev, i, &phy_roothub->list);
>> +               if (err)
>> +                       goto err_out;
>> +       }
>> +
>> +       head = &phy_roothub->list;
>
>
> I think phy_roothub->phy is always empty,
> and only phy_roothub->list is used.
>
>
> I just wondered if we can directly put 'struct list_head' into
> 'struct usb_hcd'.
maybe you can try it and send a patch (note: please wait until
v4.17-rc2-ish because there are some fixes that will be applied by
Greg after v4.17-rc1 is out, as well as the issues you noted below)?
I believe it's not critical so there's plenty of time to get it into v4.18

>> diff --git a/drivers/usb/core/phy.h b/drivers/usb/core/phy.h
>> new file mode 100644
>> index 000000000000..6fde59bfbff8
>> --- /dev/null
>> +++ b/drivers/usb/core/phy.h
>> @@ -0,0 +1,7 @@
>> +struct usb_phy_roothub;
>
> struct device;
>
> is also needed for usb_phy_roothub_init().
do you think that I should still fix this in 4.17?

>> +struct usb_phy_roothub *usb_phy_roothub_init(struct device *dev);
>> +int usb_phy_roothub_exit(struct usb_phy_roothub *phy_roothub);
>> +
>> +int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub);
>> +void usb_phy_roothub_power_off(struct usb_phy_roothub *phy_roothub);
>
>
> Better to add an include guard?
> SPDX-License-Identifier for this header too?
good catch - I'll send a patch for this too (along with the missing
forward declaration for struct device)


Regards
Martin

  parent reply	other threads:[~2018-04-05 20:04 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-03 21:43 [usb-next PATCH v11 0/8] initialize (multiple) PHYs for a HCD Martin Blumenstingl
2018-03-03 21:43 ` Martin Blumenstingl
2018-03-03 21:43 ` Martin Blumenstingl
     [not found] ` <20180303214309.25643-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>
2018-03-03 21:43   ` [usb-next PATCH v11 1/8] dt-bindings: usb: add the documentation for USB HCDs Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` [usb-next,v11,1/8] " Martin Blumenstingl
2018-03-03 21:43   ` [usb-next PATCH v11 2/8] usb: add a flag to skip PHY initialization to struct usb_hcd Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` [usb-next,v11,2/8] " Martin Blumenstingl
2018-03-03 21:43   ` [usb-next PATCH v11 3/8] usb: core: add a wrapper for the USB PHYs on the HCD Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` [usb-next,v11,3/8] " Martin Blumenstingl
2018-04-04 12:10     ` [usb-next PATCH v11 3/8] " Masahiro Yamada
2018-04-04 12:10       ` Masahiro Yamada
2018-04-04 12:10       ` Masahiro Yamada
2018-04-04 12:10       ` [usb-next,v11,3/8] " Masahiro Yamada
     [not found]       ` <CAK7LNARM=F3Ey0aO9PiNftxkcLVo4z10jdrkSrQE1f74nK1=Ng-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-04-05 20:04         ` Martin Blumenstingl [this message]
2018-04-05 20:04           ` [usb-next PATCH v11 3/8] " Martin Blumenstingl
2018-04-05 20:04           ` Martin Blumenstingl
2018-04-05 20:04           ` [usb-next,v11,3/8] " Martin Blumenstingl
2018-04-06  3:48           ` [usb-next PATCH v11 3/8] " Masahiro Yamada
2018-04-06  3:48             ` Masahiro Yamada
2018-04-06  3:48             ` Masahiro Yamada
2018-04-06  3:48             ` [usb-next,v11,3/8] " Masahiro Yamada
     [not found]             ` <CAK7LNASN4mgSVXw425CEuFzJdgmgiv=u9h7T+_zSbqU7dwRRcA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-04-06  5:15               ` [usb-next PATCH v11 3/8] " Martin Blumenstingl
2018-04-06  5:15                 ` Martin Blumenstingl
2018-04-06  5:15                 ` Martin Blumenstingl
2018-04-06  5:15                 ` [usb-next,v11,3/8] " Martin Blumenstingl
2018-04-06  8:28                 ` [usb-next PATCH v11 3/8] " Masahiro Yamada
2018-04-06  8:28                   ` Masahiro Yamada
2018-04-06  8:28                   ` Masahiro Yamada
2018-04-06  8:28                   ` [usb-next,v11,3/8] " Masahiro Yamada
2018-03-03 21:43   ` [usb-next PATCH v11 4/8] usb: core: hcd: integrate the PHY wrapper into the HCD core Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` [usb-next,v11,4/8] " Martin Blumenstingl
2018-03-03 21:43   ` [usb-next PATCH v11 5/8] usb: host: xhci-mtk: remove custom USB PHY handling Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` [usb-next,v11,5/8] " Martin Blumenstingl
2018-03-05  8:31     ` [usb-next PATCH v11 5/8] " Sean Wang
2018-03-05  8:31       ` Sean Wang
2018-03-05  8:31       ` Sean Wang
2018-03-05  8:31       ` [usb-next,v11,5/8] " sean.wang
2018-03-03 21:43   ` [usb-next PATCH v11 6/8] usb: host: ehci-platform: " Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` [usb-next,v11,6/8] " Martin Blumenstingl
2018-03-03 21:43   ` [usb-next PATCH v11 7/8] usb: host: ohci-platform: " Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` [usb-next,v11,7/8] " Martin Blumenstingl
2018-03-03 21:43   ` [usb-next PATCH v11 8/8] usb: core: hcd: remove support for initializing a single PHY Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` Martin Blumenstingl
2018-03-03 21:43     ` [usb-next,v11,8/8] " Martin Blumenstingl
2018-03-07 13:13 ` [usb-next PATCH v11 0/8] initialize (multiple) PHYs for a HCD Neil Armstrong
2018-03-07 13:13   ` Neil Armstrong
2018-03-07 13:13   ` Neil Armstrong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAFBinCCRhJLxOCz6_a23XnVcSo35MpE8huA8keNFBrWmr_mR=A@mail.gmail.com' \
    --to=martin.blumenstingl-gm/ye1e23mwn+bqq9rbeug@public.gmane.org \
    --cc=Peter.Chen-3arQi8VN3Tc@public.gmane.org \
    --cc=arnd-r2nGTMty4D4@public.gmane.org \
    --cc=chunfeng.yun-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=felipe.balbi-VuQAYsv1563Yd54FQh9/CA@public.gmane.org \
    --cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
    --cc=jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org \
    --cc=linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=linux-ci5G2KO2hbZ+pU9mqzGVBQ@public.gmane.org \
    --cc=linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
    --cc=mathias.nyman-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=matthias.bgg-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=narmstrong-rdvid1DuHRBWk0Htik3J/w@public.gmane.org \
    --cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
    --cc=stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org \
    --cc=thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=yamada.masahiro-uWyLwvC0a2jby3iVrkZq2A@public.gmane.org \
    --cc=yixun.lan-LpR1jeaWuhtBDgjK7y7TUQ@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.