This adds appropriate bindings for the macs which use the SerDes. The
156.25MHz fixed clock is a crystal. The 100MHz clocks (there are
actually 3) come from a Renesas 6V49205B at address 69 on i2c0. There is
no driver for this device (and as far as I know all you can do with the
100MHz clocks is gate them), so I have chosen to model it as a single
fixed clock.

Note: the SerDes1 lane numbering for the LS1046A is *reversed*.
This means that Lane A (what the driver thinks is lane 0) uses pins
SD1_TX3_P/N.

Because this will break ethernet if the serdes is not enabled, enable
the serdes driver by default on Layerscape.

Signed-off-by: Sean Anderson <sean.ander...@seco.com>
---
This depends on [1].

[1] 
https://lore.kernel.org/netdev/20220804194705.459670-4-sean.ander...@seco.com/

Changes in v9:
- Fix name of phy mode node
- phy-type -> fsl,phy

Changes in v8:
- Rename serdes phy handles to use _A, _B, etc. instead of _0, _1, etc.
  This should help remind readers that the numbering corresponds to the
  physical layout of the registers, and not the lane (pin) number.

Changes in v6:
- XGI.9 -> XFI.9

Changes in v4:
- Convert to new bindings

 .../boot/dts/freescale/fsl-ls1046a-rdb.dts    | 112 ++++++++++++++++++
 drivers/phy/freescale/Kconfig                 |   1 +
 2 files changed, 113 insertions(+)

diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts 
b/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts
index 7025aad8ae89..534f19855b47 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts
@@ -10,6 +10,8 @@
 
 /dts-v1/;
 
+#include <dt-bindings/phy/phy.h>
+
 #include "fsl-ls1046a.dtsi"
 
 / {
@@ -26,8 +28,110 @@ aliases {
        chosen {
                stdout-path = "serial0:115200n8";
        };
+
+       clocks {
+               clk_100mhz: clock-100mhz {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <100000000>;
+               };
+
+               clk_156mhz: clock-156mhz {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <156250000>;
+               };
+       };
 };
 
+&serdes1 {
+       clocks = <&clk_100mhz>, <&clk_156mhz>;
+       clock-names = "ref0", "ref1";
+       status = "okay";
+
+       /*
+        * XXX: Lane A uses pins SD1_RX3_P/N! That is, the lane numbers and pin
+        * numbers are _reversed_. In addition, the PCCR documentation is
+        * _inconsistent_ in its usage of these terms!
+        *
+        * PCCR "Lane 0" refers to...
+        * ==== =====================
+        *    0 Lane A
+        *    2 Lane A
+        *    8 Lane A
+        *    9 Lane A
+        *    B Lane D!
+        */
+       serdes1_A: phy@0 {
+               #phy-cells = <0>;
+               reg = <0>;
+
+               /* SGMII.6 */
+               sgmii-0 {
+                       fsl,pccr = <0x8>;
+                       fsl,index = <0>;
+                       fsl,cfg = <0x1>;
+                       fsl,type = <PHY_TYPE_SGMII>;
+               };
+       };
+
+       serdes1_B: phy@1 {
+               #phy-cells = <0>;
+               reg = <1>;
+
+               /* SGMII.5 */
+               sgmii-1 {
+                       fsl,pccr = <0x8>;
+                       fsl,index = <1>;
+                       fsl,cfg = <0x1>;
+                       fsl,type = <PHY_TYPE_2500BASEX>;
+               };
+       };
+
+       serdes1_C: phy@2 {
+               #phy-cells = <0>;
+               reg = <2>;
+
+               /* SGMII.10 */
+               sgmii-2 {
+                       fsl,pccr = <0x8>;
+                       fsl,index = <2>;
+                       fsl,cfg = <0x1>;
+                       fsl,type = <PHY_TYPE_2500BASEX>;
+               };
+
+               /* XFI.10 */
+               xfi-0 {
+                       fsl,pccr = <0xb>;
+                       fsl,index = <0>;
+                       fsl,cfg = <0x2>;
+                       fsl,type = <PHY_TYPE_10GBASER>;
+               };
+       };
+
+       serdes1_D: phy@3 {
+               #phy-cells = <0>;
+               reg = <3>;
+
+               /* SGMII.9 */
+               sgmii-3 {
+                       fsl,pccr = <0x8>;
+                       fsl,index = <3>;
+                       fsl,cfg = <0x1>;
+                       fsl,type = <PHY_TYPE_2500BASEX>;
+               };
+
+               /* XFI.9 */
+               xfi-1 {
+                       fsl,pccr = <0xb>;
+                       fsl,index = <1>;
+                       fsl,cfg = <0x1>;
+                       fsl,type = <PHY_TYPE_10GBASER>;
+               };
+       };
+};
+
+
 &duart0 {
        status = "okay";
 };
@@ -140,21 +244,29 @@ ethernet@e6000 {
        ethernet@e8000 {
                phy-handle = <&sgmii_phy1>;
                phy-connection-type = "sgmii";
+               phys = <&serdes1_B>;
+               phy-names = "serdes";
        };
 
        ethernet@ea000 {
                phy-handle = <&sgmii_phy2>;
                phy-connection-type = "sgmii";
+               phys = <&serdes1_A>;
+               phy-names = "serdes";
        };
 
        ethernet@f0000 { /* 10GEC1 */
                phy-handle = <&aqr106_phy>;
                phy-connection-type = "xgmii";
+               phys = <&serdes1_D>;
+               phy-names = "serdes";
        };
 
        ethernet@f2000 { /* 10GEC2 */
                fixed-link = <0 1 1000 0 0>;
                phy-connection-type = "xgmii";
+               phys = <&serdes1_C>;
+               phy-names = "serdes";
        };
 
        mdio@fc000 {
diff --git a/drivers/phy/freescale/Kconfig b/drivers/phy/freescale/Kconfig
index 6bebe00f5889..b396162dc859 100644
--- a/drivers/phy/freescale/Kconfig
+++ b/drivers/phy/freescale/Kconfig
@@ -54,6 +54,7 @@ config PHY_FSL_LYNX_10G
        depends on ARCH_LAYERSCAPE || PPC || COMPILE_TEST
        select GENERIC_PHY
        select REGMAP_MMIO
+       default y if ARCH_LAYERSCAPE
        help
          This adds support for the Lynx "SerDes" devices found on various QorIQ
          SoCs. There may be up to four SerDes devices on each SoC, and each
-- 
2.35.1.1320.gc452695387.dirty

Reply via email to