Previous set "New Generic PHY driver for Lynx 10G SerDes": https://lore.kernel.org/linux-phy/[email protected]/ introduced the 10G Lynx SerDes driver with a reduced functionality set. Namely, only minor protocol changes are supported (1GbE <-> 2.5GbE). The major protocol changes need a procedure named RCW override, explained in more detail in commits 6/8 and 7/8.
This series adds kernel and device tree binding support for RCW override, completing the SerDes PHY driver functionality. Two components are involved: - drivers/soc/fsl/guts.c (binding is fsl,layerscape-dcfg.yaml) - Device Configuration Unit, this is API provider for the SerDes driver to request RCW override depending on SoC - drivers/phy/freescale/phy-fsl-lynx-10g.c - SerDes PHY driver, this is API consumer The guts driver probes on DCFG blocks from multiple Freescale SoC generations: - MPC85xx, BSC and QorIQ (PowerPC) are all covered by the Documentation/devicetree/bindings/soc/fsl/guts.txt schema - Layerscape (Arm) is covered by Documentation/devicetree/bindings/soc/fsl/fsl,layerscape-dcfg.yaml It is ultimately the same hardware block, just that (from what I can tell) the Layerscape nodes are also compatible with syscon, and PowerPC aren't. RCW override has only been validated on select Layerscape SoCs, so converting guts.txt to a PowerPC schema is out of scope for this series - we don't even touch that (just in case it gets asked). Using syscon to map the DCFG_DCSR register block in the Lynx SerDes driver instead of creating this guts <-> lynx API was considered, but because the RCW procedure is SoC-specific, it was ruled out for polluting the SerDes driver. The guts driver is all about SoC awareness anyway, and it offers some abstraction of all the gory details. Changes since v2: - fix error handling in fsl_guts_init() and make sure that all newly introduced RCW override API functions fail if fsl_guts_init() failed. - replace __bf_shf() use with __ffs() - use read_poll_timeout_atomic() in fsl_guts_rcw_rmw() to clarify that DCFG_DCSR writes are supposed to reflect back in DCFG_CCSR - only operate on lanes on which fsl_guts_lane_init() was called in ls2088a_serdes_init_rcwcr() - put parentheses around (lane) in LS1088A_RCWSR29_SRDS_PRTCL_S1_LNn() and LS1088A_RCWSR30_SRDS_PRTCL_S2_LNn() macro expressions v2 at: https://lore.kernel.org/linux-phy/[email protected]/ Changes since v1: - add Conor's review tag on 6/8 - update email addresses of DT maintainers - drop DT maintainers from explicit CC on patch 7/8 - keep [email protected] CCed on entire series - include missing <linux/bitfield.h> in patch 7/8 - namespace SRDS_PRTCL values for LS1046A and LS1088A, even if they are the same. For LS1028A (not covered here) they are not. - prefix SRDS_CLK_SEL_{GMII,XGMII} with LS2088A_ - reorder alphanumerically (LS1046A should come before LS1088A) Change logs also in individual patches. v1 at: https://lore.kernel.org/linux-phy/[email protected]/ Cc: Conor Dooley <[email protected]> Cc: Krzysztof Kozlowski <[email protected]> Cc: Rob Herring <[email protected]> Ioana Ciornei (5): soc: fsl: guts: use a macro to encode the DCFG CCSR space soc: fsl: guts: add a global structure to hold state soc: fsl: guts: add a central fsl_guts_read() function soc: fsl: guts: make it easier to determine on which SoC we are running soc: fsl: guts: implement the RCW override procedure Vladimir Oltean (3): soc: fsl: guts: make fsl_soc_data available after fsl_guts_init() dt-bindings: fsl: layerscape-dcfg: define DCFG_DCSR region phy: lynx-10g: use RCW override procedure for dynamic protocol change .../bindings/soc/fsl/fsl,layerscape-dcfg.yaml | 15 +- drivers/phy/freescale/Kconfig | 1 + drivers/phy/freescale/phy-fsl-lynx-10g.c | 24 +- drivers/soc/fsl/guts.c | 438 ++++++++++++++++-- include/linux/fsl/guts.h | 20 +- 5 files changed, 459 insertions(+), 39 deletions(-) -- 2.34.1
