From: Roger Quadros <rogerq@ti.com>
To: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
"Sergei Shtylyov" <sergei.shtylyov@cogentembedded.com>
Cc: <grant.likely@linaro.org>, <robh+dt@kernel.org>,
<devicetree@vger.kernel.org>, <f.fainelli@gmail.com>,
<netdev@vger.kernel.org>, <frowand.list@gmail.com>,
<pawel.moll@arm.com>, <mark.rutland@arm.com>,
<ijc+devicetree@hellion.org.uk>, <galak@codeaurora.org>,
<linux-kernel@vger.kernel.org>,
Linus Walleij <linus.walleij@linaro.org>
Subject: Re: [PATCH RFT 1/2] phylib: add device reset GPIO support
Date: Fri, 13 May 2016 12:07:39 +0300 [thread overview]
Message-ID: <5735995B.8030802@ti.com> (raw)
In-Reply-To: <20160512184233.GJ30822@pengutronix.de>
Hi Sergei,
On 12/05/16 21:42, Uwe Kleine-König wrote:
> Hello Sergei,
>
> [we already talked about this patch in #armlinux, I'm now just
> forwarding my comments on the list. Background was that I sent an easier
> and less complete patch with the same idea. See
> http://patchwork.ozlabs.org/patch/621418/]
>
> [added Linus Walleij to Cc, there is a question for you/him below]
>
> On Fri, Apr 29, 2016 at 01:12:54AM +0300, Sergei Shtylyov wrote:
>> --- net-next.orig/Documentation/devicetree/bindings/net/phy.txt
>> +++ net-next/Documentation/devicetree/bindings/net/phy.txt
>> @@ -35,6 +35,8 @@ Optional Properties:
>> - broken-turn-around: If set, indicates the PHY device does not correctly
>> release the turn around line low at the end of a MDIO transaction.
>>
>> +- reset-gpios: The GPIO phandle and specifier for the PHY reset signal.
>> +
>> Example:
>>
>> ethernet-phy@0 {
>
> This is great.
>
>> Index: net-next/drivers/net/phy/at803x.c
>> ===================================================================
>> --- net-next.orig/drivers/net/phy/at803x.c
>> +++ net-next/drivers/net/phy/at803x.c
>> @@ -65,7 +65,6 @@ MODULE_LICENSE("GPL");
>> [...]
>
> My patch breaks this driver. I wasn't aware of it.
>
>> [...]
>> Index: net-next/drivers/net/phy/mdio_device.c
>> ===================================================================
>> --- net-next.orig/drivers/net/phy/mdio_device.c
>> +++ net-next/drivers/net/phy/mdio_device.c
>> [...]
>> @@ -103,6 +105,13 @@ void mdio_device_remove(struct mdio_devi
>> }
>> EXPORT_SYMBOL(mdio_device_remove);
>>
>> +void mdio_device_reset(struct mdio_device *mdiodev, int value)
>> +{
>> + if (mdiodev->reset)
>> + gpiod_set_value(mdiodev->reset, value);
>
> Before v4.6-rc1~108^2~91 it was not necessary to check for the first
> parameter being non-NULL before calling gpiod_set_value. Linus, did you
> change this on purpose?
>
>> +}
>> +EXPORT_SYMBOL(mdio_device_reset);
>> +
>> /**
>> * mdio_probe - probe an MDIO device
>> * @dev: device to probe
>> @@ -117,9 +126,16 @@ static int mdio_probe(struct device *dev
>> struct mdio_driver *mdiodrv = to_mdio_driver(drv);
>> int err = 0;
>>
>> - if (mdiodrv->probe)
>> + if (mdiodrv->probe) {
>> + /* Deassert the reset signal */
>> + mdio_device_reset(mdiodev, 0);
>> +
>> err = mdiodrv->probe(mdiodev);
>>
>> + /* Assert the reset signal */
>> + mdio_device_reset(mdiodev, 1);
>
> I wonder if it's safe to do this in general. What if ->probe does
> something with the phy that is lost by resetting but that is relied on
> later?
mdio_probe is called for non PHY devices only, right?
I'm a bit lost as to why we're de-asserting reset at multiple places. i.e.
mdio_probe(), phy_device_register(), phy_init_hw(), phy_probe(), of_mdiobus_register_phy().
Isn't it simpler to just de-assert it once at the topmost level?
i.e. of_mdiobus_register_device() f and of_mdiobus_register_phy()?
Also, how about issuing a reset pulse instead of just de-asserting it.
This would tackle the case where PHY is in invalid state with reset already
de-asserted.
Another issue is that on some boards we have one reset line tied to
multiple PHYs. How do we prevent multiple resets being taking place when each of
the PHYs are registered? Do we just specify the reset line only for one PHY in
the DT or can we have the reset gpio in the mdio_bus node for such case?
cheers,
-roger
>
>> + }
>> +
>> return err;
>> }
>> [...]
>> Index: net-next/drivers/of/of_mdio.c
>> ===================================================================
>> --- net-next.orig/drivers/of/of_mdio.c
>> +++ net-next/drivers/of/of_mdio.c
>> @@ -44,6 +44,7 @@ static int of_get_phy_id(struct device_n
>> static void of_mdiobus_register_phy(struct mii_bus *mdio,
>> struct device_node *child, u32 addr)
>> {
>> + struct gpio_desc *gpiod;
>> struct phy_device *phy;
>> bool is_c45;
>> int rc;
>> @@ -52,10 +53,17 @@ static void of_mdiobus_register_phy(stru
>> is_c45 = of_device_is_compatible(child,
>> "ethernet-phy-ieee802.3-c45");
>>
>> + gpiod = fwnode_get_named_gpiod(&child->fwnode, "reset-gpios");
>> + /* Deassert the reset signal */
>> + if (!IS_ERR(gpiod))
>> + gpiod_direction_output(gpiod, 0);
>
> This is wrong I think. You must only ignore -ENODEV, all other error
> codes should be passed to the caller. (I see that's not trivial because
> of_mdiobus_register_phy returns void.)
>
> In my patch I used devm_gpiod_get_array which has the nice property that
> I can already pass GPIOD_OUT_LOW in flags. Also this binds the lifetime
> of the gpio to the device which is nice and IMHO the right direction for
> the phylib (i.e. better embracing of the device model).
>
> This cannot be used here easily however because there is no struct
> device yet and this is only created after the phy id is determined. The
> phy id is either read from the device tree or must be read from the phy
> which might fail if reset is not deasserted.
>
> Principally there is no reason however that the phy_id must be known
> before the struct device is created however.
>
> Best regards
> Uwe
>
next prev parent reply other threads:[~2016-05-13 9:08 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-08 22:21 [PATCH RFT 0/2] Teach phylib hard-resetting devices Sergei Shtylyov
2016-04-08 22:22 ` [PATCH RFT 1/2] phylib: add device reset GPIO support Sergei Shtylyov
2016-04-11 19:25 ` Rob Herring
2016-04-11 19:28 ` Sergei Shtylyov
2016-04-11 22:46 ` Rob Herring
2016-04-08 22:25 ` [PATCH RFT 2/2] macb: kill PHY reset code Sergei Shtylyov
2016-04-11 2:28 ` Andrew Lunn
2016-04-11 17:41 ` Sergei Shtylyov
2016-04-11 18:19 ` Andrew Lunn
2016-04-11 18:39 ` Sergei Shtylyov
[not found] ` <570BEF46.7060105-M4DtvfQ/ZS1MRgGoP+s0PdBPR1lH4CV8@public.gmane.org>
2016-04-11 18:51 ` Andrew Lunn
[not found] ` <20160411185115.GA30623-g2DYL2Zd6BY@public.gmane.org>
2016-04-11 19:01 ` Sergei Shtylyov
2016-04-26 10:24 ` [PATCH] ARM: dts: at91: VInCo: fix phy reset gpio flag Nicolas Ferre
2016-04-26 17:17 ` David Miller
2016-04-26 18:27 ` Sergei Shtylyov
2016-04-27 7:15 ` Nicolas Ferre
2016-04-26 18:25 ` Sergei Shtylyov
2016-04-12 9:23 ` [PATCH RFT 2/2] macb: kill PHY reset code Nicolas Ferre
2016-04-12 9:22 ` Nicolas Ferre
2016-04-12 13:40 ` Andrew Lunn
2016-04-12 14:45 ` Nicolas Ferre
2016-04-12 13:54 ` Sergei Shtylyov
2016-04-12 14:57 ` Nicolas Ferre
2016-04-28 22:12 ` [PATCH RFT 1/2] phylib: add device reset GPIO support Sergei Shtylyov
2016-05-03 17:03 ` Rob Herring
2016-05-10 18:32 ` Florian Fainelli
[not found] ` <5732294F.3060606-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-05-10 19:11 ` Sergei Shtylyov
[not found] ` <5732327A.6080203-M4DtvfQ/ZS1MRgGoP+s0PdBPR1lH4CV8@public.gmane.org>
2016-05-10 19:13 ` Florian Fainelli
[not found] ` <3641492.klKRrvS8tr-gHKXc3Y1Z8zGSmamagVegGFoWSdPRAKMAL8bYrjMMd8@public.gmane.org>
2016-05-12 18:42 ` Uwe Kleine-König
2016-05-12 21:35 ` Sergei Shtylyov
2016-05-13 4:06 ` Andrew Lunn
2016-05-13 21:16 ` Sergei Shtylyov
2016-05-13 7:06 ` Uwe Kleine-König
2016-05-13 21:49 ` Sergei Shtylyov
2016-05-13 19:18 ` Sergei Shtylyov
2016-05-14 21:14 ` Sergei Shtylyov
2016-05-13 9:07 ` Roger Quadros [this message]
2016-05-13 19:36 ` Sergei Shtylyov
2016-05-13 20:44 ` Andrew Lunn
2016-05-13 20:56 ` Sergei Shtylyov
2016-05-13 23:44 ` Andrew Lunn
2016-05-14 19:36 ` Sergei Shtylyov
2016-05-14 19:50 ` Andrew Lunn
2016-05-14 21:46 ` Sergei Shtylyov
[not found] ` <34922ff9-e566-4829-a631-54ce07cbb325-M4DtvfQ/ZS1MRgGoP+s0PdBPR1lH4CV8@public.gmane.org>
2016-05-15 15:23 ` Andrew Lunn
[not found] ` <20160515152339.GA9021-g2DYL2Zd6BY@public.gmane.org>
2016-05-19 13:40 ` Sergei Shtylyov
2016-05-16 8:51 ` Roger Quadros
2016-05-26 9:00 ` Linus Walleij
2016-05-26 19:00 ` Uwe Kleine-König
2016-05-30 14:57 ` Linus Walleij
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=5735995B.8030802@ti.com \
--to=rogerq@ti.com \
--cc=devicetree@vger.kernel.org \
--cc=f.fainelli@gmail.com \
--cc=frowand.list@gmail.com \
--cc=galak@codeaurora.org \
--cc=grant.likely@linaro.org \
--cc=ijc+devicetree@hellion.org.uk \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=netdev@vger.kernel.org \
--cc=pawel.moll@arm.com \
--cc=robh+dt@kernel.org \
--cc=sergei.shtylyov@cogentembedded.com \
--cc=u.kleine-koenig@pengutronix.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).