From: Maxime Ripard <maxime@cerno.tech> To: Andrew Lunn <andrew@lunn.ch>, Florian Fainelli <f.fainelli@gmail.com>, Heiner Kallweit <hkallweit1@gmail.com>, Russell King <linux@armlinux.org.uk> Cc: "Rob Herring" <robh+dt@kernel.org>, "Frank Rowand" <frowand.list@gmail.com>, "David S. Miller" <davem@davemloft.net>, "Jakub Kicinski" <kuba@kernel.org>, netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, "Antoine Ténart" <antoine.tenart@bootlin.com> Subject: PHY reset handling during DT parsing Date: Mon, 6 Jul 2020 20:13:31 +0200 Message-ID: <20200706181331.x2tn5cl5jn5kqmhx@gilmour.lan> (raw) [-- Attachment #1: Type: text/plain, Size: 1901 bytes --] Hi, I came across an issue today on an Allwinner board, but I believe it's a core issue. That board is using the stmac driver together with a phy that happens to have a reset GPIO, except that that GPIO will never be claimed, and the PHY will thus never work. You can find an example of such a board here: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/dts/sun6i-a31-hummingbird.dts#n195 It looks like when of_mdiobus_register() will parse the DT, it will then call of_mdiobus_register_phy() for each PHY it encounters [1]. of_mdiobus_register_phy() will then if the phy doesn't have an ethernet-phy-id* compatible call get_phy_device() [2], and will later on call phy_register_device [3]. get_phy_device() will then call get_phy_id() [4], that will try to access the PHY through the MDIO bus [5]. The code that deals with the PHY reset line / GPIO is however only done in mdiobus_device_register, called through phy_device_register. Since this is happening way after the call to get_phy_device, our PHY might still very well be in reset if the bootloader hasn't put it out of reset and left it there. I'm not entirely sure how to fix that though. I tried to fix it by splitting away the gpio / reset code away from mdiobus_device_register into a new function, and calling it before the first call to get_phy_id so that we can put our phy out of reset, but it looks like the device registration makes it more complicated than that. Any ideas? Thanks! Maxime 1: https://elixir.bootlin.com/linux/latest/source/drivers/of/of_mdio.c#L274 2: https://elixir.bootlin.com/linux/latest/source/drivers/of/of_mdio.c#L82 3: https://elixir.bootlin.com/linux/latest/source/drivers/of/of_mdio.c#L119 4: https://elixir.bootlin.com/linux/latest/source/drivers/net/phy/phy_device.c#L830 5: https://elixir.bootlin.com/linux/latest/source/drivers/net/phy/phy_device.c#L791 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --]
next reply index Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-07-06 18:13 Maxime Ripard [this message] 2020-07-07 14:19 ` Andrew Lunn 2020-07-07 14:54 ` Maxime Ripard 2020-07-07 16:39 ` Florian Fainelli 2020-07-07 17:18 ` Rob Herring 2020-07-07 21:15 ` Florian Fainelli
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=20200706181331.x2tn5cl5jn5kqmhx@gilmour.lan \ --to=maxime@cerno.tech \ --cc=andrew@lunn.ch \ --cc=antoine.tenart@bootlin.com \ --cc=davem@davemloft.net \ --cc=devicetree@vger.kernel.org \ --cc=f.fainelli@gmail.com \ --cc=frowand.list@gmail.com \ --cc=hkallweit1@gmail.com \ --cc=kuba@kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux@armlinux.org.uk \ --cc=netdev@vger.kernel.org \ --cc=robh+dt@kernel.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
Linux-Devicetree Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-devicetree/0 linux-devicetree/git/0.git git clone --mirror https://lore.kernel.org/linux-devicetree/1 linux-devicetree/git/1.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-devicetree linux-devicetree/ https://lore.kernel.org/linux-devicetree \ devicetree@vger.kernel.org public-inbox-index linux-devicetree Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-devicetree AGPL code for this site: git clone https://public-inbox.org/public-inbox.git