[PATCH net-next v4 0/4] net: phy: add X-Powers AC200/AC300 EPHY support
From: James Hilliard <hidden>
Date: 2026-08-07 04:51:39
Also in:
linux-devicetree, lkml
The AC200 and AC300 contain compatible Fast Ethernet link PHYs which report the same Clause 22 identifier and use the same link-side register layout. The link endpoint is inaccessible until package-specific control registers have powered and configured it. Version 2 represented those control ranges as separate devices. Version 3 instead modeled each variant as a standard Ethernet PHY package with one forced-ID link-PHY child. The package reg value is the link address. AC300's control range is a fixed package-relative offset of 16 and is accessed with the PHY package helpers; it has no separate DT node or MDIO driver. AC200 references its I2C MFD because the corresponding control registers reside in that multi-function device. This revision retains that model and tightens error cleanup, power sequencing and diagnostics following review. Fixed hardware uses an AC200- or AC300-specific package compatible. Systems which can contain either package use the ACx00 package compatible and one packed SID configuration field. Bits 3 through 0 carry the analog calibration, bit 8 selects AC300, and bit 9 selects its low-calibration tuning. The driver chooses the backend before acquiring any backend-specific resource, so an AC300 system does not instantiate or access the AC200 I2C device. One xpowers-acx00 PHY module binds the link child, joins the parent package and runs the selected AC200 or AC300 backend. Only the link PHY registers a driver. The backend source files are linked into the same module and merely keep the I2C and MDIO implementations separate. Thus the PHY driver owns the complete Ethernet PHY while the AC200 MFD continues to own the shared mixed-signal chip and its regmap. The series contains no generic MDIO reconfiguration. It has no hard CONFIG_OF_DYNAMIC dependency: fixed descriptions work when their provider path is already enabled. When CONFIG_OF_DYNAMIC is available, the AC200 backend can activate an explicitly marked fail-needs-probe I2C/MFD path after the packed field selects AC200. The AC300 path leaves that candidate disabled. The common link implementation performs the vendor analog initialization, supports MII and RMII, preserves automatic MDI/MDI-X, and restores package state across suspend and resume. It preserves standard MAC-managed EEE advertisement while disabling only the vendor PHY-autonomous Intelligent EEE mode. The four patches add the minimal AC200 MFD binding and regmap provider, then the AC200/AC300 PHY-package binding and combined PHY driver. Board Device Trees and optional PHY features remain outside this initial series. The AC200 portions build on earlier work by Jernej Skrabec and Andre Przywara: https://github.com/jernejsk/linux-1/commits/ac200-v4 Public AC200 and AC300 documentation is linked from: https://linux-sunxi.org/AC200 Validation completed for v4: - complete H616 Buildroot kernel, FIT and SWU build from nand-rebase; - arm64 defconfig vmlinux and module builds with W=1; - x86_64 allmodconfig object builds with W=1; - a built-in AC300-only configuration with I2C disabled; - dt_binding_check for both new schemas; and - strict checkpatch checks for all new source files. The AC200 path was hardware-tested on an H616 board with current v4. The driver read the packed SID field as 0x001, selected AC200, dynamically activated the fail-needs-probe I2C/MFD path and reported AC200 revision 0x101 in package 1. The link PHY bound at address 0, applied RMII mode, negotiated a 100 Mbps full-duplex link and passed bidirectional network traffic and cold-boot testing. The AC300 path was hardware-tested on an H616 board with v3. The driver read the packed SID field as 0x106, selected AC300 without enabling the AC200 I2C path, accessed the control range at package base plus 16, bound the link PHY at address 0, applied RMII mode, negotiated a 100 Mbps full-duplex link and passed bidirectional network traffic and cold-boot testing. The AC300 reset-preservation change and removal of the unsupported MDIO-error clear/readback sequence in v4 remain build-tested. Assisted-by: OpenAI Codex (gpt-5.6-sol, max) Signed-off-by: James Hilliard <redacted> --- Changes v2 -> v3: - model AC200 and AC300 as standard Ethernet PHY packages - remove the standalone AC200 and AC300 control bindings and drivers - put the common link implementation and both private backends in one xpowers-acx00 module - access the AC300 control range at package base plus 16 with PHY package helpers - access AC200 package registers through its referenced MFD regmap and a managed device link - add an ACx00 package compatible which selects the backend from one packed SID configuration field - combine calibration, package selection and AC300 tuning into that field - optionally activate only a selected fail-needs-probe AC200 path when CONFIG_OF_DYNAMIC is available - preserve standard MAC-managed EEE advertisement and disable only the PHY-autonomous Intelligent EEE mode - reduce the series from eight patches to four - Link to v2: https://patch.msgid.link/20260804-submit-acx00-of-dynamic-v1-v2-0-3eef49ff1d8c@gmail.com Changes v3 -> v4: - rebase onto current net-next - always restore the PHY page and release the MDIO bus lock after a page-selection error - preserve AC300 external-VDD configuration until package status identifies the supply arrangement - remove the unsupported AC300 MDIO-error clear/readback sequence, which is absent from the BSP initialization - remove AC200 post-reset waits not required by its documentation or hardware testing - report the failing AC200 control register - follow MFD subject and driver-data naming conventions - use the AC200 teardown callback directly, follow reverse Christmas-tree declaration ordering and use a named I2C ID initializer - use named input-clock rates and simplify MII/RMII selection - avoid blocking on the AC200 supplier lock while checking driver readiness - Link to v3: https://patch.msgid.link/20260805-submit-acx00-of-dynamic-v1-v3-0-32c3210a6f25@gmail.com To: Lee Jones <lee@kernel.org> To: Rob Herring <robh@kernel.org> To: Krzysztof Kozlowski <krzk+dt@kernel.org> To: Conor Dooley <conor+dt@kernel.org> To: James Hilliard <redacted> To: Andrew Lunn <andrew+netdev@lunn.ch> To: "David S. Miller" <davem@davemloft.net> To: Eric Dumazet <edumazet@google.com> To: Jakub Kicinski <kuba@kernel.org> To: Paolo Abeni <pabeni@redhat.com> To: Andrew Lunn <andrew@lunn.ch> To: Heiner Kallweit <hkallweit1@gmail.com> To: Russell King <linux@armlinux.org.uk> Cc: mfd@lists.linux.dev Cc: devicetree@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org --- James Hilliard (4): dt-bindings: mfd: x-powers: Add AC200 mfd: ac200: Add X-Powers AC200 support dt-bindings: net: x-powers: add AC200/AC300 EPHY packages net: phy: add X-Powers AC200/AC300 EPHY driver .../devicetree/bindings/mfd/x-powers,ac200.yaml | 69 +++ .../bindings/net/x-powers,acx00-ephy-package.yaml | 208 ++++++++ drivers/mfd/Kconfig | 11 + drivers/mfd/Makefile | 1 + drivers/mfd/ac200.c | 176 +++++++ drivers/net/phy/Kconfig | 11 + drivers/net/phy/Makefile | 3 + drivers/net/phy/xpowers-acx00-ac200.c | 388 +++++++++++++++ drivers/net/phy/xpowers-acx00-ac300.c | 404 ++++++++++++++++ drivers/net/phy/xpowers-acx00-main.c | 536 +++++++++++++++++++++ drivers/net/phy/xpowers-acx00.h | 28 ++ 11 files changed, 1835 insertions(+) --- base-commit: 4fa4977a0d900f936bcae5cd2c510be5554e8dd6 change-id: 20260802-submit-acx00-of-dynamic-v1-94a0dc15f282 Best regards, -- James Hilliard [off-list ref]