Broadcom BCM3390 RGMII and MDIO MUX driver

The RGMII and MDIO MUX control is a configuration register to set up function
selection for RGMII0_TX, RGMII1_TX, Switch_Port7_RX, Switch_Port4_RX,
UniMAC_RX, UniMAC MDIO and Switch MDIO. The function selection options for
1. RGMII0_TX are UniMAC, Switch_Port4, Switch_Port7 or none
2. RGMII1_TX are UniMAC, Switch_Port4, Switch_Port7 or none
3. Switch_Port7_RX are Runner, RGMII0, RGMII1 or none
4. Switch_Port4_RX are Runner, RGMII0, RGMII1 or none
5. UniMAC_RX are RGMII0 or RGMII1
6. UniMAC_MDIO are none, MDIO0, or MDIO1
7. Switch_MDIO are none, MDIO0, or MDIO1

Required properties:

- compatible:
    Must be "brcm,miimdiomux3390"

- reg:
    Defines the register address and size of the RGII_MDIO_UniMAC Control register

- rgmii0-tx-select:
    One of the following human readable string for selecting RGMII0_TX function
        "unimac", "p7", "p4", or "zero"

- rgmii1-tx-select:
    One of the following human readable string for selecting RGMII1_TX function
        "unimac", "p7", "p4", or "zero"

- p7-rx-select:
    One of the following human readable string for selecting Switch_Port7_RX fn
        "runner", "rgmii0", "rgmii1", or "zero"

- p4-rx-select:
    One of the following human readable string for selecting Switch_Port4_RX fn
        "moca", "rgmii0", "rgmii1", or "zero"

- unimac-rx-select:
    One of the following human readable string for selecting UniMAC_RX fn
        "rgmii0" or "rgmii1"

- unimac-mdio-select:
    One of the following human readable string for selecting UniMAC_MDIO fn
        "none", "mdio0", "mdio1" or "both"

- switch-mdio-select:
    One of the following human readable string for selecting Switch_MDIO fn
        "none", "mdio0", "mdio1" or "both"

Example:
	miimdiomux: miimdiomux@d3c026a0 {
		compatible = "brcm,miimdiomux3390";
		reg = <0 0xd3c026a0 0 0x4>;
		rgmii0-tx-select = "unimac";
		rgmii1-tx-select = "unimac";
		p7-rx-select = "runner";
		p4-rx-select = "moca";
		unimac-rx-select = "rgmii1";
		unimac-mdio-select = "mdio1";
		switch-mdio-select = "mdio0";
	};

There are 3 MACs (UniMAC, SF2 Port 7, SF2 Port 4) in 3390 which can muxed to
none or 1 of 5 peripherals (MoCA, Runner, SGMII, RGMII0, RGMII1)
a. UniMAC: Either Not Connected | Connected to RGMII0 | RGMII1
b. SF2 P7: Either Not Connected | Connected to Runner | SGMII | RGMII0 | RGMII1
c. SF2 P4: Either Not Connected | Connected to MoCA | RGMII0 | RGMII1
So there can be 40 combinations (superset) based on following configuration
Out of which,
a. B0 can support all, except combinations having P7:SGMII
b. Z0 can support all, except combinations having P7:SGMII or P4:MoCA
c. S0 can support all combincations
d. V0 can support all, except combinations having P4:MoCA
e. SV board can support all, except combinations having P7:SGMII
f. MWVG board can support all, except combinations having RGMII0 or P7:SGMII
g. VSV board can support all, except combinations having P4:MoCA
h. z0-mwvg can support all, except combinations having P7:SGMII or P4:MoCA
   or RGMII0
and so on ...

01. UniMAC:N.C. P7:N.C. P4:N.C.
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "zero";
    p7-rx-select = "zero";
    p4-rx-select = "zero";
    /delete-property/ethsw@d4e00000/mii-port;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

02. UniMAC:N.C. P7:N.C. P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "zero";
    p7-rx-select = "zero";
    p4-rx-select = "moca";
    mii-port = <4 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

03. UniMAC:N.C. P7:N.C. P4:RGMII0
    /include/ "rg.3390-eth4.dtsi"
    rgmii0-tx-select = "p4";
    rgmii1-tx-select = "zero";
    p7-rx-select = "zero";
    p4-rx-select = "rgmii0";
    mii-port = <4 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

04. UniMAC:N.C. P7:N.C. P4:RGMII1
    /include/ "rg.3390-eth4.dtsi"
    rgmii0-tx-select = "zer0";
    rgmii1-tx-select = "p4";
    p7-rx-select = "zero";
    p4-rx-select = "rgmii1";
    mii-port = <4 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

05. UniMAC:N.C. P7:Runner P4:N.C.
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "zero";
    /delete-property/ethsw@d4e00000/mii-port;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

06. UniMAC:N.C. P7:Runner P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "moca";
    mii-port = <4 0 1000>;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

07. UniMAC:N.C. P7:Runner P4:RGMII0
    /include/ "rg.3390-eth4.dtsi"
    rgmii0-tx-select = "p4";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "rgmii0";
    mii-port = <4 1 1000>;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

08. UniMAC:N.C. P7:Runner P4:RGMII1
    /include/ "rg.3390-eth4.dtsi"
    rgmii0-tx-select = "zer0";
    rgmii1-tx-select = "p4";
    p7-rx-select = "runner";
    p4-rx-select = "rgmii1";
    mii-port = <4 1 1000>;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

09. UniMAC:N.C. P7:SGMII P4:N.C.
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "zero";
    mii-port = <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

10. UniMAC:N.C. P7:SGMII P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "moca";
    mii-port = <4 0 1000>, <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

11. UniMAC:N.C. P7:SGMII P4:RGMII0
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "p4";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "rgmii0";
    mii-port = <4 1 1000> <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

12. UniMAC:N.C. P7:SGMII P4:RGMII1
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "zer0";
    rgmii1-tx-select = "p4";
    p7-rx-select = "runner";
    p4-rx-select = "rgmii1";
    mii-port = <4 1 1000> <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

13. UniMAC:N.C. P7:RGMII0 P4:N.C.
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "p7";
    rgmii1-tx-select = "zero";
    p7-rx-select = "rgmii0";
    p4-rx-select = "zero";
    mii-port = <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

14. UniMAC:N.C. P7:RGMII0 P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "p7";
    rgmii1-tx-select = "zero";
    p7-rx-select = "rgmii0";
    p4-rx-select = "moca";
    mii-port = <4 0 1000> <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

15. UniMAC:N.C. P7:RGMII0 P4:RGMII1
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "p7";
    rgmii1-tx-select = "p4";
    p7-rx-select = "rgmii0";
    p4-rx-select = "rgmii1";
    mii-port = <4 1 1000> <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

16. UniMAC:N.C. P7:RGMII1 P4:N.C.
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "p7";
    p7-rx-select = "rgmii1";
    p4-rx-select = "zero";
    mii-port = <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

17. UniMAC:N.C. P7:RGMII1 P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "p7";
    p7-rx-select = "rgmii1";
    p4-rx-select = "moca";
    mii-port = <4 0 1000> <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

18. UniMAC:N.C. P7:RGMII1 P4:RGMII0
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "p4";
    rgmii1-tx-select = "p7";
    p7-rx-select = "rgmii1";
    p4-rx-select = "rgmii0";
    mii-port = <4 1 1000> <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

19. UniMAC:RGMII0 P7:N.C. P4:N.C.
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "zero";
    p7-rx-select = "zero";
    p4-rx-select = "zero";
    unimac-rx-select = "rgmii0";
    /delete-property/ethsw@d4e00000/mii-port;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

20. UniMAC:RGMII0 P7:N.C. P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "zero";
    p7-rx-select = "zero";
    p4-rx-select = "moca0";
    unimac-rx-select = "rgmii0";
    mii-port = <4 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

21. UniMAC:RGMII0 P7:N.C. P4:RGMII1
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "p4";
    p7-rx-select = "zero";
    p4-rx-select = "rgmii1";
    unimac-rx-select = "rgmii0";
    mii-port = <4 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

22. UniMAC:RGMII0 P7:Runner P4:N.C.
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "zero";
    unimac-rx-select = "rgmii0";
    /delete-property/ethsw@d4e00000/mii-port;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

23. UniMAC:RGMII0 P7:Runner P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "moca";
    unimac-rx-select = "rgmii0";
    mii-port = <4 0 1000>;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

24. UniMAC:RGMII0 P7:Runner P4:RGMII1
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "p4";
    p7-rx-select = "runner";
    p4-rx-select = "rgmii1";
    unimac-rx-select = "rgmii0";
    mii-port = <4 1 1000>;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

25. UniMAC:RGMII0 P7:SGMII P4:N.C.
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "zero";
    unimac-rx-select = "rgmii0";
    mii-port = <4 0 1000>, <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

26. UniMAC:RGMII0 P7:SGMII P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "zero";
    p7-rx-select = "runner";
    p4-rx-select = "moca";
    unimac-rx-select = "rgmii0";
    mii-port = <4 0 1000>, <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

27. UniMAC:RGMII0 P7:SGMII P4:RGMII1
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "p4";
    p7-rx-select = "runner";
    p4-rx-select = "rgmii1";
    unimac-rx-select = "rgmii0";
    mii-port = <4 1 1000>, <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

28. UniMAC:RGMII0 P7:RGMII1 P4:N.C.
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "p7";
    p7-rx-select = "rgmii1";
    p4-rx-select = "zero";
    unimac-rx-select = "rgmii0";
    mii-port = <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

29. UniMAC:RGMII0 P7:RGMII1 P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "unimac";
    rgmii1-tx-select = "p7";
    p7-rx-select = "rgmii1";
    p4-rx-select = "moca";
    unimac-rx-select = "rgmii0";
    mii-port = <4 0 1000>, <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

30. UniMAC:RGMII1 P7:N.C. P4:N.C.
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "zero";
    p4-rx-select = "zero";
    unimac-rx-select = "rgmii1";
    /delete-property/ethsw@d4e00000/mii-port;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

31. UniMAC:RGMII1 P7:N.C. P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "zero";
    p4-rx-select = "moca0";
    unimac-rx-select = "rgmii1";
    mii-port = <4 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

32. UniMAC:RGMII1 P7:N.C. P4:RGMII0
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "p4";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "zero";
    p4-rx-select = "rgmii0";
    unimac-rx-select = "rgmii1";
    mii-port = <4 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

33. UniMAC:RGMII1 P7:Runner P4:N.C.
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "runner";
    p4-rx-select = "zero";
    unimac-rx-select = "rgmii1";
    /delete-property/ethsw@d4e00000/mii-port;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

34. UniMAC:RGMII1 P7:Runner P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "runner";
    p4-rx-select = "moca";
    unimac-rx-select = "rgmii1";
    mii-port = <4 0 1000>;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

35. UniMAC:RGMII1 P7:Runner P4:RGMII0
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    rgmii0-tx-select = "p4";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "runner";
    p4-rx-select = "rgmii0";
    unimac-rx-select = "rgmii1";
    mii-port = <4 1 1000>;
    imp-port = <5 2000>, <7 2000>, <8 2000>;
    lag-ports = <0 1 2>;

36. UniMAC:RGMII1 P7:SGMII P4:N.C.
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "runner";
    p4-rx-select = "zero";
    unimac-rx-select = "rgmii1";
    mii-port = <4 0 1000>, <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

37. UniMAC:RGMII1 P7:SGMII P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "zero";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "runner";
    p4-rx-select = "moca";
    unimac-rx-select = "rgmii1";
    mii-port = <4 0 1000>, <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

38. UniMAC:RGMII1 P7:SGMII P4:RGMII0
    /include/ "rg.3390-eth4.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390s0-sgmii.dtsi"
    rgmii0-tx-select = "p4";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "runner";
    p4-rx-select = "rgmii0";
    unimac-rx-select = "rgmii1";
    mii-port = <4 1 1000>, <7 0 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

39. UniMAC:RGMII1 P7:RGMII0 P4:N.C.
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "p7";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "rgmii0";
    p4-rx-select = "zero";
    unimac-rx-select = "rgmii1";
    mii-port = <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;

40. UniMAC:RGMII1 P7:RGMII0 P4:MoCA
    /include/ "rg.3390b0-moca.dtsi"
    /include/ "rg.3390-ethwan.dtsi"
    /include/ "rg.3390-eth7.dtsi"
    rgmii0-tx-select = "p7";
    rgmii1-tx-select = "unimac";
    p7-rx-select = "rgmii0";
    p4-rx-select = "moca";
    unimac-rx-select = "rgmii1";
    mii-port = <4 0 1000>, <7 1 1000>;
    imp-port = <5 2000>, <8 2000>;
    lag-ports = <0 1>;
