Re: [PATCH 10/21] net: phy: add X-Powers AC200 EPHY control driver
James Hilliard <[email protected]> Mon, 3 Aug 2026 22:37:51 -0600
| Newsgroups | gmane.linux.drivers.devicetree,gmane.linux.network,gmane.linux.ports.arm.kernel,gmane.linux.kernel,gmane.linux.ports.arm.rockchip |
|---|---|
| Message-ID | <CADvTj4qpHU3F0DrEmc0vFi+JiwTNERniiMHKo1LmBd8sg58wJA@mail.gmail.com> |
On Mon, Aug 3, 2026 at 8:22=E2=80=AFPM Andrew Lunn <[email protected]> wrote: > > > > So what i'm trying to do with both of these is make it look more like > > > standard Linux building blocks. > > > > > > If that is not possible, i would actually put all this code into the > > > PHY driver. You then have a regmap property to gain access to the I2C > > > registers. > > > > I understand the goal of using standard Linux building blocks where the= y > > fit, but I do not think folding these control paths into the common PHY > > driver gives the right device model here. > > > > The AC200 and AC300 expose the same Clause 22 PHY interface, but their > > control functions are separate devices with different transports and > > lifetimes. The AC200 control function is an MFD child accessed through > > the parent I2C regmap. The AC300 control function is a separately > > addressed non-PHY MDIO device. A regmap reference only describes the > > AC200 transport; it does not represent the AC300 control device. > > > > Folding both implementations into the common PHY driver would make that > > driver manage AC200 MFD registers and resources as well as an AC300 MDI= O > > control endpoint. That would mix the package-specific control transport= s > > with the otherwise common Clause 22 implementation. > > Given how messy this hardware is, i doubt it is discoverable. We have > been pushing back on hacks to enable various things before probe in > order to make it discoverable. So you are going to end up putting IDs > in DT so that the driver probes without it being discovered. That > means you can put any ID you want in DT, and the driver. So you have > two different phy driver structs, two different probe functions, etc. I agree that the link PHY cannot be identified by reading its registers before the package control sequence has run. I do not agree that this means an arbitrary ID should be placed in DT, though. The Ethernet PHY binding explicitly defines ethernet-phy-idAAAA.BBBB as the correct contents of the PHY identifier registers. It also documents using that compatible when clocks, resets, supplies, or another initialization sequence must be applied before those registers can be read. That is exactly our situation, so ethernet-phy-id0044.1400 lets phylib create the phy_device without an initial MDIO read. Once the selected control provider has powered the hardware, the driver can read MII_PHYSID1 and MII_PHYSID2 and validate that ID. Both AC200 and AC300 expose the same link-side PHY ID and register layout. The package choice changes how that PHY is initialized, not the identity of the link PHY itself. Inventing separate IDs would turn the compatible into a Linux driver selector and would describe values which the hardware never reports. The package variant is discoverable independently through the SID configuration field. Fixed boards can reference one control provider, while boards shipped with either package can use SID to select between the AC200 I2C control provider and the AC300 MDIO control provider. For that reason, I do not think two phy_driver structures and two PHY probe functions model the hardware correctly. There is one common link PHY, so its Clause 22 implementation should remain in one PHY driver. The two different implementations belong at the control endpoints, where AC200 and AC300 genuinely differ in transport, resources, and lifetime.