From: Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
To: Venu Byravarasu <vbyravarasu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org,
stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org,
balbi-l0cyMroinI0@public.gmane.org,
linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Subject: Re: [PATCH 7/7] usb: phy: registering tegra USB PHY as platform driver
Date: Tue, 19 Mar 2013 14:21:10 -0600 [thread overview]
Message-ID: <5148C8B6.90303@wwwdotorg.org> (raw)
In-Reply-To: <1363609781-4045-8-git-send-email-vbyravarasu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
On 03/18/2013 06:29 AM, Venu Byravarasu wrote:
> Registered tegra USB PHY as a separate platform driver.
>
> To synchronize host controller and PHY initialization, used deferred
> probe mechanism. As PHY should be initialized before EHCI starts running,
> deferred probe of Tegra EHCI driver till PHY probe gets completed.
>
> Got rid of instance number based handling in host driver.
>
> Made use of DT params to get the PHY Pad registers.
>
> Merged tegra_phy_init into tegra_usb_phy_init.
> diff --git a/drivers/usb/phy/tegra_usb_phy.c b/drivers/usb/phy/tegra_usb_phy.c
> static void tegra_usb_phy_close(struct usb_phy *x)
> {
> struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
>
> if (phy->is_ulpi_phy)
> clk_put(phy->clk);
phy->clk is obtained using devm_clk_get(). This typically means you
never need to clk_put() it, and if for some reason you really have to,
you should use devm_clk_put() instead of plain clk_put().
> clk_put(phy->pll_u);
Same here.
> @@ -774,23 +667,53 @@ struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,
> + if (phy->is_ulpi_phy) {
> + phy->clk = devm_clk_get(phy->dev, "ulpi-link");
> + if (IS_ERR(phy->clk)) {
> + pr_err("%s: can't get ulpi clock\n", __func__);
> + err = PTR_ERR(phy->clk);
> + goto fail;
> +
> + }
> +
> + err = gpio_request(phy->reset_gpio, "ulpi_phy_reset_b");
I think you can use devm_gpio_request() here to simplify the error-handling.
> + if (err < 0) {
> + dev_err(phy->dev, "request failed for gpio: %d\n",
> + phy->reset_gpio);
> + goto fail;
> + }
> +
> + err = gpio_direction_output(phy->reset_gpio, 0);
> + if (err < 0) {
> + dev_err(phy->dev, "gpio %d direction not set to output\n",
> + phy->reset_gpio);
> + goto cleanup_gpio_req;
> + }
>
> - return phy;
> + phy->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops, 0);
> + if (!phy->ulpi) {
> + dev_err(phy->dev, "otg_ulpi_create returned err\n");
> + err = -ENOMEM;
> + goto cleanup_gpio_req;
> + }
>
> -err1:
> + phy->ulpi->io_priv = phy->regs + ULPI_VIEWPORT;
> + } else {
> + err = utmip_pad_open(phy);
> + if (err < 0)
> + goto fail;
> + }
I wonder why in the ULPI case, all the code is inline here, whereas in
the UTMI case, this simply calls a function. Wouldn't it be more
consistent to have the following code here:
if (phy->is_ulpi_phy)
err = ulpi_open();
else
err = utmip_open();
if (err)
goto fail;
> +static int tegra_usb_phy_probe(struct platform_device *pdev)
Hmmm. Note that in order to make deferred probe work correctly, all the
gpio_request(), clk_get(), etc. calls that acquire resources from other
drivers must happen here in probe() and not in tegra_usb_phy_open().
> + err = of_property_match_string(np, "dr_mode", "otg");
> + if (err < 0) {
> + err = of_property_match_string(np, "dr_mode", "gadget");
Again, use "peripheral", not "gadget".
> +struct usb_phy *tegra_usb_get_phy(struct device_node *dn)
> +{
> + struct device *dev;
> + struct tegra_usb_phy *tegra_phy;
> +
> + dev = driver_find_device(&tegra_usb_phy_driver.driver, NULL, dn,
> + tegra_usb_phy_match);
> + if (!dev)
> + return ERR_PTR(-EPROBE_DEFER);
> +
> + tegra_phy = dev_get_drvdata(dev);
> +
> + return &tegra_phy->u_phy;
> +}
I think you need a module_get() somewhere in there, and also need to add
a tegra_usb_put_phy() function too, so you can call module_put() from it.
WARNING: multiple messages have this Message-ID (diff)
From: Stephen Warren <swarren@wwwdotorg.org>
To: Venu Byravarasu <vbyravarasu@nvidia.com>
Cc: gregkh@linuxfoundation.org, stern@rowland.harvard.edu,
balbi@ti.com, linux-usb@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org,
devicetree-discuss@lists.ozlabs.org
Subject: Re: [PATCH 7/7] usb: phy: registering tegra USB PHY as platform driver
Date: Tue, 19 Mar 2013 14:21:10 -0600 [thread overview]
Message-ID: <5148C8B6.90303@wwwdotorg.org> (raw)
In-Reply-To: <1363609781-4045-8-git-send-email-vbyravarasu@nvidia.com>
On 03/18/2013 06:29 AM, Venu Byravarasu wrote:
> Registered tegra USB PHY as a separate platform driver.
>
> To synchronize host controller and PHY initialization, used deferred
> probe mechanism. As PHY should be initialized before EHCI starts running,
> deferred probe of Tegra EHCI driver till PHY probe gets completed.
>
> Got rid of instance number based handling in host driver.
>
> Made use of DT params to get the PHY Pad registers.
>
> Merged tegra_phy_init into tegra_usb_phy_init.
> diff --git a/drivers/usb/phy/tegra_usb_phy.c b/drivers/usb/phy/tegra_usb_phy.c
> static void tegra_usb_phy_close(struct usb_phy *x)
> {
> struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
>
> if (phy->is_ulpi_phy)
> clk_put(phy->clk);
phy->clk is obtained using devm_clk_get(). This typically means you
never need to clk_put() it, and if for some reason you really have to,
you should use devm_clk_put() instead of plain clk_put().
> clk_put(phy->pll_u);
Same here.
> @@ -774,23 +667,53 @@ struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,
> + if (phy->is_ulpi_phy) {
> + phy->clk = devm_clk_get(phy->dev, "ulpi-link");
> + if (IS_ERR(phy->clk)) {
> + pr_err("%s: can't get ulpi clock\n", __func__);
> + err = PTR_ERR(phy->clk);
> + goto fail;
> +
> + }
> +
> + err = gpio_request(phy->reset_gpio, "ulpi_phy_reset_b");
I think you can use devm_gpio_request() here to simplify the error-handling.
> + if (err < 0) {
> + dev_err(phy->dev, "request failed for gpio: %d\n",
> + phy->reset_gpio);
> + goto fail;
> + }
> +
> + err = gpio_direction_output(phy->reset_gpio, 0);
> + if (err < 0) {
> + dev_err(phy->dev, "gpio %d direction not set to output\n",
> + phy->reset_gpio);
> + goto cleanup_gpio_req;
> + }
>
> - return phy;
> + phy->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops, 0);
> + if (!phy->ulpi) {
> + dev_err(phy->dev, "otg_ulpi_create returned err\n");
> + err = -ENOMEM;
> + goto cleanup_gpio_req;
> + }
>
> -err1:
> + phy->ulpi->io_priv = phy->regs + ULPI_VIEWPORT;
> + } else {
> + err = utmip_pad_open(phy);
> + if (err < 0)
> + goto fail;
> + }
I wonder why in the ULPI case, all the code is inline here, whereas in
the UTMI case, this simply calls a function. Wouldn't it be more
consistent to have the following code here:
if (phy->is_ulpi_phy)
err = ulpi_open();
else
err = utmip_open();
if (err)
goto fail;
> +static int tegra_usb_phy_probe(struct platform_device *pdev)
Hmmm. Note that in order to make deferred probe work correctly, all the
gpio_request(), clk_get(), etc. calls that acquire resources from other
drivers must happen here in probe() and not in tegra_usb_phy_open().
> + err = of_property_match_string(np, "dr_mode", "otg");
> + if (err < 0) {
> + err = of_property_match_string(np, "dr_mode", "gadget");
Again, use "peripheral", not "gadget".
> +struct usb_phy *tegra_usb_get_phy(struct device_node *dn)
> +{
> + struct device *dev;
> + struct tegra_usb_phy *tegra_phy;
> +
> + dev = driver_find_device(&tegra_usb_phy_driver.driver, NULL, dn,
> + tegra_usb_phy_match);
> + if (!dev)
> + return ERR_PTR(-EPROBE_DEFER);
> +
> + tegra_phy = dev_get_drvdata(dev);
> +
> + return &tegra_phy->u_phy;
> +}
I think you need a module_get() somewhere in there, and also need to add
a tegra_usb_put_phy() function too, so you can call module_put() from it.
next prev parent reply other threads:[~2013-03-19 20:21 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-18 12:29 [PATCH 0/7] USB: PHY: Tegra: registering TEGRA USB PHY as platform driver Venu Byravarasu
2013-03-18 12:29 ` Venu Byravarasu
[not found] ` <1363609781-4045-1-git-send-email-vbyravarasu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-03-18 12:29 ` [PATCH 1/7] ARM: tegra: finalize USB EHCI and PHY bindings Venu Byravarasu
2013-03-18 12:29 ` Venu Byravarasu
[not found] ` <1363609781-4045-2-git-send-email-vbyravarasu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-03-20 11:19 ` kishon
2013-03-20 11:19 ` kishon
2013-03-20 12:15 ` Venu Byravarasu
[not found] ` <D958900912E20642BCBC71664EFECE3E6E5092FFE5-QZ+emBqkIFBDw2glCA4ptUEOCMrvLtNR@public.gmane.org>
2013-03-20 17:30 ` Stephen Warren
2013-03-20 17:30 ` Stephen Warren
2013-03-18 12:29 ` [PATCH 2/7] ARM: tegra: update device trees for USB binding rework Venu Byravarasu
2013-03-18 12:29 ` Venu Byravarasu
2013-03-19 19:53 ` Stephen Warren
[not found] ` <5148C253.6030007-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-03-20 12:20 ` Venu Byravarasu
2013-03-20 12:20 ` Venu Byravarasu
2013-04-03 19:38 ` Stephen Warren
2013-04-03 19:38 ` Stephen Warren
[not found] ` <1363609781-4045-3-git-send-email-vbyravarasu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-03-20 11:23 ` kishon
2013-03-20 11:23 ` kishon
[not found] ` <51499C29.6070405-l0cyMroinI0@public.gmane.org>
2013-03-20 12:17 ` Venu Byravarasu
2013-03-20 12:17 ` Venu Byravarasu
[not found] ` <D958900912E20642BCBC71664EFECE3E6E5092FFE7-QZ+emBqkIFBDw2glCA4ptUEOCMrvLtNR@public.gmane.org>
2013-03-20 12:24 ` Felipe Balbi
2013-03-20 12:24 ` Felipe Balbi
2013-03-20 12:30 ` Venu Byravarasu
2013-03-20 17:31 ` Stephen Warren
2013-03-18 12:29 ` [PATCH 7/7] usb: phy: registering tegra USB PHY as platform driver Venu Byravarasu
2013-03-18 12:29 ` Venu Byravarasu
[not found] ` <1363609781-4045-8-git-send-email-vbyravarasu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-03-19 20:21 ` Stephen Warren [this message]
2013-03-19 20:21 ` Stephen Warren
[not found] ` <5148C8B6.90303-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-03-20 12:43 ` Venu Byravarasu
2013-03-20 12:43 ` Venu Byravarasu
2013-03-20 17:51 ` Stephen Warren
2013-03-19 19:51 ` [PATCH 0/7] USB: PHY: Tegra: registering TEGRA " Stephen Warren
2013-03-19 19:51 ` Stephen Warren
[not found] ` <5148C1DC.1020903-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-03-20 5:59 ` Venu Byravarasu
2013-03-20 5:59 ` Venu Byravarasu
2013-04-03 19:47 ` Stephen Warren
2013-04-03 19:47 ` Stephen Warren
2013-03-20 12:12 ` Venu Byravarasu
2013-03-20 12:12 ` Venu Byravarasu
[not found] ` <D958900912E20642BCBC71664EFECE3E6E5092FFE2-QZ+emBqkIFBDw2glCA4ptUEOCMrvLtNR@public.gmane.org>
2013-03-20 17:36 ` Stephen Warren
2013-03-20 17:36 ` Stephen Warren
2013-03-20 18:52 ` Stephen Warren
2013-03-18 12:29 ` [PATCH 3/7] usb: phy: tegra: Get PHY mode using DT Venu Byravarasu
2013-03-18 12:29 ` Venu Byravarasu
2013-03-19 19:58 ` Stephen Warren
2013-03-20 12:24 ` Venu Byravarasu
2013-03-18 12:29 ` [PATCH 4/7] usb: phy: tegra: Return correct error value provided by clk_get_sys Venu Byravarasu
2013-03-18 12:29 ` Venu Byravarasu
2013-03-18 12:29 ` [PATCH 5/7] usb: phy: tegra: get ULPI reset GPIO info using DT Venu Byravarasu
2013-03-18 12:29 ` Venu Byravarasu
[not found] ` <1363609781-4045-6-git-send-email-vbyravarasu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-03-18 13:01 ` Sergei Shtylyov
2013-03-18 13:01 ` Sergei Shtylyov
[not found] ` <5147102F.1060204-M4DtvfQ/ZS1MRgGoP+s0PdBPR1lH4CV8@public.gmane.org>
2013-03-19 4:12 ` Venu Byravarasu
2013-03-19 4:12 ` Venu Byravarasu
2013-03-19 20:03 ` Stephen Warren
2013-03-19 20:03 ` Stephen Warren
2013-03-18 12:29 ` [PATCH 6/7] usb: phy: tegra: Add error handling & clean up Venu Byravarasu
2013-03-18 12:29 ` Venu Byravarasu
[not found] ` <1363609781-4045-7-git-send-email-vbyravarasu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-03-19 19:25 ` Stephen Warren
2013-03-19 19:25 ` Stephen Warren
2013-03-19 20:10 ` Stephen Warren
2013-03-19 20:10 ` Stephen Warren
[not found] ` <5148C61F.9060708-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-04-03 19:34 ` Stephen Warren
2013-04-03 19:34 ` Stephen Warren
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=5148C8B6.90303@wwwdotorg.org \
--to=swarren-3lzwwm7+weoh9zmkesr00q@public.gmane.org \
--cc=balbi-l0cyMroinI0@public.gmane.org \
--cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org \
--cc=vbyravarasu-DDmLM1+adcrQT0dZR+AlfA@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.