From: rogerq@ti.com (Roger Quadros)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 1/2] ehci-platform: Add support for controllers with multiple reset lines
Date: Wed, 24 Feb 2016 13:37:49 +0200 [thread overview]
Message-ID: <56CD960D.3000900@ti.com> (raw)
In-Reply-To: <1456312517-24211-2-git-send-email-hdegoede@redhat.com>
Hi,
On 24/02/16 13:15, Hans de Goede wrote:
> From: Reinder de Haan <patchesrdh@mveas.com>
>
> At least the EHCI/OHCI found on the Allwinnner H3 SoC needs multiple
> reset lines, the controller will not initialize while the reset for
> its companion is still asserted, which means we need to de-assert
> 2 resets for the controller to work.
>
> Signed-off-by: Reinder de Haan <patchesrdh@mveas.com>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
> Changes in v2:
> -Use the new reset_control_[de]assert_shared reset-controller functions
> Changes in v3:
> -Adjust for changes to shared-reset reset-controller functions
> ---
> Documentation/devicetree/bindings/usb/usb-ehci.txt | 2 +-
> drivers/usb/host/ehci-platform.c | 41 ++++++++++++----------
> 2 files changed, 24 insertions(+), 19 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/usb/usb-ehci.txt b/Documentation/devicetree/bindings/usb/usb-ehci.txt
> index a12d601..0701812 100644
> --- a/Documentation/devicetree/bindings/usb/usb-ehci.txt
> +++ b/Documentation/devicetree/bindings/usb/usb-ehci.txt
> @@ -18,7 +18,7 @@ Optional properties:
> - clocks : a list of phandle + clock specifier pairs
> - phys : phandle + phy specifier pair
> - phy-names : "usb"
> - - resets : phandle + reset specifier pair
> + - resets : a list of phandle + reset specifier pairs
>
> Example (Sequoia 440EPx):
> ehci at e0000300 {
> diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c
> index bd7082f2..3f195ba 100644
> --- a/drivers/usb/host/ehci-platform.c
> +++ b/drivers/usb/host/ehci-platform.c
> @@ -39,11 +39,12 @@
>
> #define DRIVER_DESC "EHCI generic platform driver"
> #define EHCI_MAX_CLKS 3
> +#define EHCI_MAX_RESETS 2
> #define hcd_to_ehci_priv(h) ((struct ehci_platform_priv *)hcd_to_ehci(h)->priv)
>
> struct ehci_platform_priv {
> struct clk *clks[EHCI_MAX_CLKS];
> - struct reset_control *rst;
> + struct reset_control *resets[EHCI_MAX_RESETS];
> struct phy **phys;
> int num_phys;
> bool reset_on_resume;
> @@ -149,7 +150,7 @@ static int ehci_platform_probe(struct platform_device *dev)
> struct usb_ehci_pdata *pdata = dev_get_platdata(&dev->dev);
> struct ehci_platform_priv *priv;
> struct ehci_hcd *ehci;
> - int err, irq, phy_num, clk = 0;
> + int err, irq, phy_num, clk = 0, rst = 0;
>
> if (usb_disabled())
> return -ENODEV;
> @@ -232,18 +233,22 @@ static int ehci_platform_probe(struct platform_device *dev)
> break;
> }
> }
> - }
>
> - priv->rst = devm_reset_control_get_optional(&dev->dev, NULL);
> - if (IS_ERR(priv->rst)) {
> - err = PTR_ERR(priv->rst);
> - if (err == -EPROBE_DEFER)
> - goto err_put_clks;
> - priv->rst = NULL;
> - } else {
> - err = reset_control_deassert(priv->rst);
> - if (err)
> - goto err_put_clks;
> + for (rst = 0; rst < EHCI_MAX_RESETS; rst++) {
> + priv->resets[rst] =
> + devm_reset_control_get_shared_by_index(
> + &dev->dev, rst);
> + if (IS_ERR(priv->resets[rst])) {
> + err = PTR_ERR(priv->resets[rst]);
> + if (err == -EPROBE_DEFER)
> + goto err_reset;
> + priv->resets[rst] = NULL;
> + break;
> + }
> + err = reset_control_deassert(priv->resets[rst]);
> + if (err)
> + goto err_reset;
> + }
Why is this code within "if (dev->of.node)" ?
Previous code looked like it worked for non-DT boots as well.
> }
>
> if (pdata->big_endian_desc)
> @@ -300,8 +305,8 @@ err_power:
> if (pdata->power_off)
> pdata->power_off(dev);
> err_reset:
> - if (priv->rst)
> - reset_control_assert(priv->rst);
> + while (--rst >= 0)
> + reset_control_assert(priv->resets[rst]);
> err_put_clks:
> while (--clk >= 0)
> clk_put(priv->clks[clk]);
> @@ -319,15 +324,15 @@ static int ehci_platform_remove(struct platform_device *dev)
> struct usb_hcd *hcd = platform_get_drvdata(dev);
> struct usb_ehci_pdata *pdata = dev_get_platdata(&dev->dev);
> struct ehci_platform_priv *priv = hcd_to_ehci_priv(hcd);
> - int clk;
> + int clk, rst;
>
> usb_remove_hcd(hcd);
>
> if (pdata->power_off)
> pdata->power_off(dev);
>
> - if (priv->rst)
> - reset_control_assert(priv->rst);
> + for (rst = 0; rst < EHCI_MAX_RESETS && priv->resets[rst]; rst++)
> + reset_control_assert(priv->resets[rst]);
>
> for (clk = 0; clk < EHCI_MAX_CLKS && priv->clks[clk]; clk++)
> clk_put(priv->clks[clk]);
>
cheers,
-roger
WARNING: multiple messages have this Message-ID (diff)
From: Roger Quadros <rogerq-l0cyMroinI0@public.gmane.org>
To: Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
Greg Kroah-Hartman
<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
Cc: Alan Stern
<stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org>,
Tony Prisk <linux-ci5G2KO2hbZ+pU9mqzGVBQ@public.gmane.org>,
Florian Fainelli
<f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Maxime Ripard
<maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>,
Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>,
linux-usb <linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
linux-sunxi-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
devicetree <devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Reinder de Haan
<patchesrdh-I1/eAgTnXDYAvxtiuMwx3w@public.gmane.org>
Subject: Re: [PATCH v3 1/2] ehci-platform: Add support for controllers with multiple reset lines
Date: Wed, 24 Feb 2016 13:37:49 +0200 [thread overview]
Message-ID: <56CD960D.3000900@ti.com> (raw)
In-Reply-To: <1456312517-24211-2-git-send-email-hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Hi,
On 24/02/16 13:15, Hans de Goede wrote:
> From: Reinder de Haan <patchesrdh-I1/eAgTnXDYAvxtiuMwx3w@public.gmane.org>
>
> At least the EHCI/OHCI found on the Allwinnner H3 SoC needs multiple
> reset lines, the controller will not initialize while the reset for
> its companion is still asserted, which means we need to de-assert
> 2 resets for the controller to work.
>
> Signed-off-by: Reinder de Haan <patchesrdh-I1/eAgTnXDYAvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> ---
> Changes in v2:
> -Use the new reset_control_[de]assert_shared reset-controller functions
> Changes in v3:
> -Adjust for changes to shared-reset reset-controller functions
> ---
> Documentation/devicetree/bindings/usb/usb-ehci.txt | 2 +-
> drivers/usb/host/ehci-platform.c | 41 ++++++++++++----------
> 2 files changed, 24 insertions(+), 19 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/usb/usb-ehci.txt b/Documentation/devicetree/bindings/usb/usb-ehci.txt
> index a12d601..0701812 100644
> --- a/Documentation/devicetree/bindings/usb/usb-ehci.txt
> +++ b/Documentation/devicetree/bindings/usb/usb-ehci.txt
> @@ -18,7 +18,7 @@ Optional properties:
> - clocks : a list of phandle + clock specifier pairs
> - phys : phandle + phy specifier pair
> - phy-names : "usb"
> - - resets : phandle + reset specifier pair
> + - resets : a list of phandle + reset specifier pairs
>
> Example (Sequoia 440EPx):
> ehci@e0000300 {
> diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c
> index bd7082f2..3f195ba 100644
> --- a/drivers/usb/host/ehci-platform.c
> +++ b/drivers/usb/host/ehci-platform.c
> @@ -39,11 +39,12 @@
>
> #define DRIVER_DESC "EHCI generic platform driver"
> #define EHCI_MAX_CLKS 3
> +#define EHCI_MAX_RESETS 2
> #define hcd_to_ehci_priv(h) ((struct ehci_platform_priv *)hcd_to_ehci(h)->priv)
>
> struct ehci_platform_priv {
> struct clk *clks[EHCI_MAX_CLKS];
> - struct reset_control *rst;
> + struct reset_control *resets[EHCI_MAX_RESETS];
> struct phy **phys;
> int num_phys;
> bool reset_on_resume;
> @@ -149,7 +150,7 @@ static int ehci_platform_probe(struct platform_device *dev)
> struct usb_ehci_pdata *pdata = dev_get_platdata(&dev->dev);
> struct ehci_platform_priv *priv;
> struct ehci_hcd *ehci;
> - int err, irq, phy_num, clk = 0;
> + int err, irq, phy_num, clk = 0, rst = 0;
>
> if (usb_disabled())
> return -ENODEV;
> @@ -232,18 +233,22 @@ static int ehci_platform_probe(struct platform_device *dev)
> break;
> }
> }
> - }
>
> - priv->rst = devm_reset_control_get_optional(&dev->dev, NULL);
> - if (IS_ERR(priv->rst)) {
> - err = PTR_ERR(priv->rst);
> - if (err == -EPROBE_DEFER)
> - goto err_put_clks;
> - priv->rst = NULL;
> - } else {
> - err = reset_control_deassert(priv->rst);
> - if (err)
> - goto err_put_clks;
> + for (rst = 0; rst < EHCI_MAX_RESETS; rst++) {
> + priv->resets[rst] =
> + devm_reset_control_get_shared_by_index(
> + &dev->dev, rst);
> + if (IS_ERR(priv->resets[rst])) {
> + err = PTR_ERR(priv->resets[rst]);
> + if (err == -EPROBE_DEFER)
> + goto err_reset;
> + priv->resets[rst] = NULL;
> + break;
> + }
> + err = reset_control_deassert(priv->resets[rst]);
> + if (err)
> + goto err_reset;
> + }
Why is this code within "if (dev->of.node)" ?
Previous code looked like it worked for non-DT boots as well.
> }
>
> if (pdata->big_endian_desc)
> @@ -300,8 +305,8 @@ err_power:
> if (pdata->power_off)
> pdata->power_off(dev);
> err_reset:
> - if (priv->rst)
> - reset_control_assert(priv->rst);
> + while (--rst >= 0)
> + reset_control_assert(priv->resets[rst]);
> err_put_clks:
> while (--clk >= 0)
> clk_put(priv->clks[clk]);
> @@ -319,15 +324,15 @@ static int ehci_platform_remove(struct platform_device *dev)
> struct usb_hcd *hcd = platform_get_drvdata(dev);
> struct usb_ehci_pdata *pdata = dev_get_platdata(&dev->dev);
> struct ehci_platform_priv *priv = hcd_to_ehci_priv(hcd);
> - int clk;
> + int clk, rst;
>
> usb_remove_hcd(hcd);
>
> if (pdata->power_off)
> pdata->power_off(dev);
>
> - if (priv->rst)
> - reset_control_assert(priv->rst);
> + for (rst = 0; rst < EHCI_MAX_RESETS && priv->resets[rst]; rst++)
> + reset_control_assert(priv->resets[rst]);
>
> for (clk = 0; clk < EHCI_MAX_CLKS && priv->clks[clk]; clk++)
> clk_put(priv->clks[clk]);
>
cheers,
-roger
next prev parent reply other threads:[~2016-02-24 11:37 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-24 11:15 [PATCH v3 0/2] ?hci-platform: Add support for controllers with more then one reset line Hans de Goede
2016-02-24 11:15 ` Hans de Goede
2016-02-24 11:15 ` [PATCH v3 1/2] ehci-platform: Add support for controllers with multiple reset lines Hans de Goede
2016-02-24 11:15 ` Hans de Goede
2016-02-24 11:32 ` kbuild test robot
2016-02-24 11:32 ` kbuild test robot
2016-02-24 11:37 ` Roger Quadros [this message]
2016-02-24 11:37 ` Roger Quadros
2016-02-24 13:22 ` Hans de Goede
2016-02-24 13:22 ` Hans de Goede
2016-02-24 18:47 ` Alan Stern
2016-02-24 18:47 ` Alan Stern
2016-02-24 11:15 ` [PATCH v3 2/2] ohci-platform: " Hans de Goede
2016-02-24 11:15 ` Hans de Goede
2016-02-24 11:29 ` kbuild test robot
2016-02-24 11:29 ` kbuild test robot
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=56CD960D.3000900@ti.com \
--to=rogerq@ti.com \
--cc=linux-arm-kernel@lists.infradead.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.