From: Thierry Reding <thierry.reding@gmail.com>
To: Philipp Zabel <p.zabel@pengutronix.de>
Cc: Alan Stern <stern@rowland.harvard.edu>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Stephen Warren <swarren@wwwdotorg.org>,
Alexandre Courbot <gnurou@gmail.com>,
Jon Hunter <jonathanh@nvidia.com>,
linux-usb@vger.kernel.org, linux-tegra@vger.kernel.org,
linux-kernel@vger.kernel.org, Hans de Goede <hdegoede@redhat.com>
Subject: Re: [PATCH v3 2/2] usb: host: ehci-tegra: Avoid getting the same reset twice
Date: Wed, 4 May 2016 22:16:44 +0200 [thread overview]
Message-ID: <20160504201642.GA21480@mithrandir.ba.sec> (raw)
In-Reply-To: <1462382574.3536.64.camel@pengutronix.de>
[-- Attachment #1: Type: text/plain, Size: 6197 bytes --]
On Wed, May 04, 2016 at 07:22:54PM +0200, Philipp Zabel wrote:
> Hi Thierry,
>
> Am Mittwoch, den 04.05.2016, 16:40 +0200 schrieb Thierry Reding:
> > From: Thierry Reding <treding@nvidia.com>
> >
> > Starting with commit 0b52297f2288 ("reset: Add support for shared reset
> > controls") there is a reference count for reset control assertions. The
> > goal is to allow resets to be shared by multiple devices and an assert
> > will take effect only when all instances have asserted the reset.
> >
> > In order to preserve backwards-compatibility, all reset controls become
> > exclusive by default. This is to ensure that reset_control_assert() can
> > immediately assert in hardware.
> >
> > However, this new behaviour triggers the following warning in the EHCI
> > driver for Tegra:
> >
> > [ 3.365019] ------------[ cut here ]------------
> > [ 3.369639] WARNING: CPU: 0 PID: 1 at drivers/reset/core.c:187 __of_reset_control_get+0x16c/0x23c
> > [ 3.382151] Modules linked in:
> > [ 3.385214] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.6.0-rc6-next-20160503 #140
> > [ 3.392769] Hardware name: NVIDIA Tegra SoC (Flattened Device Tree)
> > [ 3.399046] [<c010fa50>] (unwind_backtrace) from [<c010b120>] (show_stack+0x10/0x14)
> > [ 3.406787] [<c010b120>] (show_stack) from [<c0347dcc>] (dump_stack+0x90/0xa4)
> > [ 3.414007] [<c0347dcc>] (dump_stack) from [<c011f4fc>] (__warn+0xe8/0x100)
> > [ 3.420964] [<c011f4fc>] (__warn) from [<c011f5c4>] (warn_slowpath_null+0x20/0x28)
> > [ 3.428525] [<c011f5c4>] (warn_slowpath_null) from [<c03cc8cc>] (__of_reset_control_get+0x16c/0x23c)
> > [ 3.437648] [<c03cc8cc>] (__of_reset_control_get) from [<c0526858>] (tegra_ehci_probe+0x394/0x518)
> > [ 3.446600] [<c0526858>] (tegra_ehci_probe) from [<c04516d8>] (platform_drv_probe+0x4c/0xb0)
> > [ 3.455029] [<c04516d8>] (platform_drv_probe) from [<c044fe78>] (driver_probe_device+0x1ec/0x330)
> > [ 3.463892] [<c044fe78>] (driver_probe_device) from [<c0450074>] (__driver_attach+0xb8/0xbc)
> > [ 3.472320] [<c0450074>] (__driver_attach) from [<c044e1ec>] (bus_for_each_dev+0x68/0x9c)
> > [ 3.480489] [<c044e1ec>] (bus_for_each_dev) from [<c044f338>] (bus_add_driver+0x1a0/0x218)
> > [ 3.488743] [<c044f338>] (bus_add_driver) from [<c0450768>] (driver_register+0x78/0xf8)
> > [ 3.496738] [<c0450768>] (driver_register) from [<c010178c>] (do_one_initcall+0x40/0x170)
> > [ 3.504909] [<c010178c>] (do_one_initcall) from [<c0c00ddc>] (kernel_init_freeable+0x158/0x1f8)
> > [ 3.513600] [<c0c00ddc>] (kernel_init_freeable) from [<c0810784>] (kernel_init+0x8/0x114)
> > [ 3.521770] [<c0810784>] (kernel_init) from [<c0107778>] (ret_from_fork+0x14/0x3c)
> > [ 3.529361] ---[ end trace 4bda87dbe4ecef8a ]---
> >
> > The reason is that Tegra SoCs have three EHCI controllers, each with a
> > separate reset line. However the first controller contains UTMI pads
> > configuration registers that are shared with its siblings and that are
> > reset as part of the first controller's reset. There is special code in
> > the driver to assert and deassert this shared reset at probe time, and
> > it does so irrespective of which controller is probed first to ensure
> > that these shared registers are reset before any of the controllers are
> > initialized. Unfortunately this means that if the first controller gets
> > probed first, it will request its own reset line and will subsequently
> > request the same reset line again (temporarily) to perform the reset.
> > This used to work fine before the above-mentioned commit, but now
> > triggers the new WARN.
> >
> > Work around this by making sure we reuse the controller's reset if the
> > controller happens to be the first controller.
> >
> > Cc: Philipp Zabel <p.zabel@pengutronix.de>
> > Cc: Hans de Goede <hdegoede@redhat.com>
> > Signed-off-by: Thierry Reding <treding@nvidia.com>
> > ---
> > Changes in v3:
> > - reword commit message to more accurately describe the hardware design
>
> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Thanks.
> > Changes in v2:
> > - restore has_utmi_pad_registers condition (Alan Stern)
> >
> > drivers/usb/host/ehci-tegra.c | 16 +++++++++++++---
> > 1 file changed, 13 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
> > index c1c1024a054c..8396b622f238 100644
> > --- a/drivers/usb/host/ehci-tegra.c
> > +++ b/drivers/usb/host/ehci-tegra.c
> > @@ -81,15 +81,23 @@ static int tegra_reset_usb_controller(struct platform_device *pdev)
> > struct usb_hcd *hcd = platform_get_drvdata(pdev);
> > struct tegra_ehci_hcd *tegra =
> > (struct tegra_ehci_hcd *)hcd_to_ehci(hcd)->priv;
> > + bool has_utmi_pad_registers = false;
> >
> > phy_np = of_parse_phandle(pdev->dev.of_node, "nvidia,phy", 0);
> > if (!phy_np)
> > return -ENOENT;
> >
> > + if (of_property_read_bool(phy_np, "nvidia,has-utmi-pad-registers"))
> > + has_utmi_pad_registers = true;
> > +
> > if (!usb1_reset_attempted) {
> > struct reset_control *usb1_reset;
> >
> > - usb1_reset = of_reset_control_get(phy_np, "utmi-pads");
> > + if (!has_utmi_pad_registers)
> > + usb1_reset = of_reset_control_get(phy_np, "utmi-pads");
> > + else
> > + usb1_reset = tegra->rst;
> > +
> > if (IS_ERR(usb1_reset)) {
> > dev_warn(&pdev->dev,
> > "can't get utmi-pads reset from the PHY\n");
> > @@ -101,11 +109,13 @@ static int tegra_reset_usb_controller(struct platform_device *pdev)
> > reset_control_deassert(usb1_reset);
> > }
> >
> > - reset_control_put(usb1_reset);
> > + if (!has_utmi_pad_registers)
> > + reset_control_put(usb1_reset);
> > +
>
> While you touch this, could you move the reset_control_put inside the
> (!IS_ERR(usb1_reset)) section above, maybe in a separate patch?
>
> We might start to warn in reset_control_put() if it is called with an
> error value as parameter in the future.
Good point. I hadn't noticed that this could potentially be called with
a ERR_PTR()-encoded error code.
Fixed in v4.
Thanks,
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2016-05-04 20:16 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-04 14:39 [PATCH v3 1/2] usb: host: ehci-tegra: Grab the correct UTMI pads reset Thierry Reding
[not found] ` <1462372800-30900-1-git-send-email-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-05-04 14:40 ` [PATCH v3 2/2] usb: host: ehci-tegra: Avoid getting the same reset twice Thierry Reding
2016-05-04 14:40 ` Thierry Reding
[not found] ` <1462372800-30900-2-git-send-email-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-05-04 17:22 ` Philipp Zabel
2016-05-04 17:22 ` Philipp Zabel
2016-05-04 20:16 ` Thierry Reding [this message]
2016-05-04 17:23 ` Stephen Warren
2016-05-04 17:23 ` Stephen Warren
[not found] ` <572A3008.4020602-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2016-05-04 20:25 ` Thierry Reding
2016-05-04 20:25 ` Thierry Reding
2016-05-05 8:05 ` Hans de Goede
[not found] ` <fdf3583d-636e-5619-5df6-17b6ae331ac9-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-05-05 16:00 ` Stephen Warren
2016-05-05 16:00 ` Stephen Warren
[not found] ` <572B6E1B.3060901-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2016-05-05 17:12 ` Hans de Goede
2016-05-05 17:12 ` Hans de Goede
2016-05-05 17:05 ` Jon Hunter
2016-05-05 17:05 ` Jon Hunter
[not found] ` <572B7D48.6010807-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-05-05 17:10 ` Jon Hunter
2016-05-05 17:10 ` Jon Hunter
2016-05-04 14:57 ` [PATCH v3 1/2] usb: host: ehci-tegra: Grab the correct UTMI pads reset Greg Kroah-Hartman
2016-05-04 14:57 ` Greg Kroah-Hartman
[not found] ` <20160504145710.GA14708-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2016-05-04 15:26 ` Thierry Reding
2016-05-04 15:26 ` Thierry Reding
[not found] ` <20160504152648.GA31420-EkSeR96xj6Pcmrwk2tT4+A@public.gmane.org>
2016-05-05 16:05 ` Tuomas Tynkkynen
2016-05-05 16:05 ` Tuomas Tynkkynen
2016-05-04 17:14 ` Stephen Warren
2016-05-04 17:14 ` Stephen Warren
[not found] ` <572A2E0A.8040408-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2016-05-04 20:30 ` Thierry Reding
2016-05-04 20:30 ` Thierry Reding
2016-05-05 7:39 ` Jon Hunter
2016-05-05 7:39 ` Jon Hunter
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=20160504201642.GA21480@mithrandir.ba.sec \
--to=thierry.reding@gmail.com \
--cc=gnurou@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=hdegoede@redhat.com \
--cc=jonathanh@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=stern@rowland.harvard.edu \
--cc=swarren@wwwdotorg.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.