forked from mirror/openwrt
Until now the the SerDes configuration is realized with helper functions
scattered around the DSA and PHY driver. Give them a new home as a PCS
driver.
The target design is as follows:
- dsa driver manages switch
- pcs driver manages SerDes on high level (this commit)
- mdio driver manages SerDes on low level
This driver adds the high level SerDes access via PCS. It makes use of
the low level mdio SerDes driver to access the registers.
Remark: This initial version provides exactly all phylink_pcs_ops that
are currently part of the DSA driver. So this can be swapped in one of
the next commits as a drop in replacement. To make use of it something
like this is needed:
...
ports = of_get_child_by_name(node, "ethernet-ports");
if (!ports)
return -EINVAL;
for_each_available_child_of_node(ports, port) {
pcs_node = of_parse_phandle(port, "pcs-handle", 0);
of_property_read_u32(port, "reg", &port_nr)) {
priv->pcs[port_nr] = rtpcs_create(dev, pcs_node, port_nr);
}
...
Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/20075
Signed-off-by: Robert Marko <robimarko@gmail.com>
380 lines
7.3 KiB
Text
380 lines
7.3 KiB
Text
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
|
|
|
#include "macros.dtsi"
|
|
#include <dt-bindings/clock/rtl83xx-clk.h>
|
|
#include <dt-bindings/gpio/gpio.h>
|
|
|
|
/dts-v1/;
|
|
|
|
/ {
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
|
|
compatible = "realtek,rtl838x-soc";
|
|
|
|
osc: oscillator {
|
|
compatible = "fixed-clock";
|
|
#clock-cells = <0>;
|
|
clock-frequency = <25000000>;
|
|
};
|
|
|
|
ccu: clock-controller {
|
|
compatible = "realtek,rtl8380-clock";
|
|
#clock-cells = <1>;
|
|
clocks = <&osc>;
|
|
clock-names = "ref_clk";
|
|
};
|
|
|
|
cpus {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
cpu@0 {
|
|
compatible = "mips,mips4KEc";
|
|
reg = <0>;
|
|
clocks = <&ccu CLK_CPU>;
|
|
operating-points-v2 = <&cpu_opp_table>;
|
|
};
|
|
};
|
|
|
|
cpu_opp_table: opp-table-0 {
|
|
compatible = "operating-points-v2";
|
|
opp-shared;
|
|
|
|
opp00 {
|
|
opp-hz = /bits/ 64 <325000000>;
|
|
};
|
|
opp01 {
|
|
opp-hz = /bits/ 64 <350000000>;
|
|
};
|
|
opp02 {
|
|
opp-hz = /bits/ 64 <375000000>;
|
|
};
|
|
opp03 {
|
|
opp-hz = /bits/ 64 <400000000>;
|
|
};
|
|
opp04 {
|
|
opp-hz = /bits/ 64 <425000000>;
|
|
};
|
|
opp05 {
|
|
opp-hz = /bits/ 64 <450000000>;
|
|
};
|
|
opp06 {
|
|
opp-hz = /bits/ 64 <475000000>;
|
|
};
|
|
opp07 {
|
|
opp-hz = /bits/ 64 <500000000>;
|
|
};
|
|
};
|
|
|
|
aliases {
|
|
serial0 = &uart0;
|
|
serial1 = &uart1;
|
|
mdio-gpio1 = &mdio_gpio;
|
|
};
|
|
|
|
chosen {
|
|
bootargs = "earlycon";
|
|
stdout-path = "serial0:115200n8";
|
|
};
|
|
|
|
cpuintc: cpuintc {
|
|
compatible = "mti,cpu-interrupt-controller";
|
|
#address-cells = <0>;
|
|
#interrupt-cells = <1>;
|
|
interrupt-controller;
|
|
};
|
|
|
|
/*
|
|
* Provided for devices with RTL838xM SoC with revision A silicon.
|
|
* Newer SoCs can use the &mdio_aux bus instead.
|
|
*/
|
|
mdio_gpio: mdio {
|
|
compatible = "virtual,mdio-gpio";
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>,
|
|
<&gpio0 3 GPIO_ACTIVE_HIGH>;
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&mdio_aux_gpio>;
|
|
|
|
status = "disabled";
|
|
};
|
|
|
|
soc: soc {
|
|
compatible = "simple-bus";
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
ranges = <0x0 0x18000000 0x10000>;
|
|
|
|
intc: interrupt-controller@3000 {
|
|
compatible = "realtek,rtl8380-intc", "realtek,rtl-intc";
|
|
reg = <0x3000 0x18>;
|
|
interrupt-controller;
|
|
#interrupt-cells = <2>;
|
|
|
|
interrupt-parent = <&cpuintc>;
|
|
interrupts = <2>, <3>, <4>, <5>, <6>;
|
|
};
|
|
|
|
spi0: spi@1200 {
|
|
compatible = "realtek,rtl8380-spi";
|
|
reg = <0x1200 0x100>;
|
|
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
};
|
|
|
|
timer0: timer@3100 {
|
|
compatible = "realtek,rtl8380-timer", "realtek,otto-timer";
|
|
reg = <0x3100 0x10>, <0x3110 0x10>, <0x3120 0x10>,
|
|
<0x3130 0x10>, <0x3140 0x10>;
|
|
|
|
interrupt-parent = <&intc>;
|
|
interrupts = <29 4>, <28 4>, <17 4>, <16 4>, <15 4>;
|
|
clocks = <&ccu CLK_LXB>;
|
|
};
|
|
|
|
uart0: uart@2000 {
|
|
compatible = "ns16550a";
|
|
reg = <0x2000 0x100>;
|
|
|
|
clocks = <&ccu CLK_LXB>;
|
|
|
|
interrupt-parent = <&intc>;
|
|
interrupts = <31 1>;
|
|
|
|
reg-io-width = <1>;
|
|
reg-shift = <2>;
|
|
fifo-size = <1>;
|
|
no-loopback-test;
|
|
};
|
|
|
|
uart1: uart@2100 {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&enable_uart1>;
|
|
|
|
compatible = "ns16550a";
|
|
reg = <0x2100 0x100>;
|
|
|
|
clocks = <&ccu CLK_LXB>;
|
|
|
|
interrupt-parent = <&intc>;
|
|
interrupts = <30 0>;
|
|
|
|
reg-io-width = <1>;
|
|
reg-shift = <2>;
|
|
fifo-size = <1>;
|
|
no-loopback-test;
|
|
|
|
status = "disabled";
|
|
};
|
|
|
|
watchdog0: watchdog@3150 {
|
|
compatible = "realtek,rtl8380-wdt";
|
|
reg = <0x3150 0xc>;
|
|
|
|
realtek,reset-mode = "soc";
|
|
|
|
clocks = <&ccu CLK_LXB>;
|
|
timeout-sec = <30>;
|
|
|
|
interrupt-parent = <&intc>;
|
|
interrupt-names = "phase1", "phase2";
|
|
interrupts = <19 3>, <18 4>;
|
|
};
|
|
|
|
gpio0: gpio-controller@3500 {
|
|
compatible = "realtek,rtl8380-gpio", "realtek,otto-gpio";
|
|
reg = <0x3500 0x20>;
|
|
|
|
gpio-controller;
|
|
#gpio-cells = <2>;
|
|
ngpios = <24>;
|
|
|
|
interrupt-controller;
|
|
#interrupt-cells = <2>;
|
|
interrupt-parent = <&intc>;
|
|
interrupts = <23 3>;
|
|
};
|
|
};
|
|
|
|
switchcore@1b000000 {
|
|
compatible = "syscon", "simple-mfd";
|
|
reg = <0x1b000000 0x10000>;
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
|
|
mdio_ctrl: mdio-controller {
|
|
compatible = "realtek,rtl8380-mdio", "realtek,otto-mdio";
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
mdio_bus0: mdio-bus@0 {
|
|
reg = <0>;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
};
|
|
};
|
|
|
|
mdio_aux: mdio-aux {
|
|
compatible = "realtek,rtl8380-aux-mdio";
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
status = "disabled";
|
|
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&mdio_aux_mdx>, <&aux_mode_mdio>;
|
|
};
|
|
|
|
mdio_serdes: mdio-serdes {
|
|
compatible = "realtek,rtl8380-serdes-mdio", "realtek,otto-serdes-mdio";
|
|
};
|
|
|
|
pcs {
|
|
compatible = "realtek,rtl8380-pcs", "realtek,otto-pcs";
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
serdes0: serdes@0 {
|
|
reg = <0>;
|
|
};
|
|
serdes1: serdes@1 {
|
|
reg = <1>;
|
|
};
|
|
serdes2: serdes@2 {
|
|
reg = <2>;
|
|
};
|
|
serdes3: serdes@3 {
|
|
reg = <3>;
|
|
};
|
|
serdes4: serdes@4 {
|
|
reg = <4>;
|
|
};
|
|
serdes5: serdes@5 {
|
|
reg = <5>;
|
|
};
|
|
};
|
|
|
|
soc_thermal: thermal {
|
|
compatible = "realtek,rtl8380-thermal";
|
|
#thermal-sensor-cells = <0>;
|
|
};
|
|
};
|
|
|
|
pinmux@1b000144 {
|
|
compatible = "pinctrl-single";
|
|
reg = <0x1b000144 0x4>;
|
|
|
|
pinctrl-single,bit-per-mux;
|
|
pinctrl-single,register-width = <32>;
|
|
pinctrl-single,function-mask = <0x1>;
|
|
#pinctrl-cells = <2>;
|
|
|
|
/* I2C mode */
|
|
aux_mode_i2c: i2c-pins {
|
|
pinctrl-single,bits = <0x0 0x0 0x1>;
|
|
};
|
|
|
|
/* MDIO mode */
|
|
aux_mode_mdio: mdx-pins {
|
|
pinctrl-single,bits = <0x0 0x1 0x1>;
|
|
};
|
|
};
|
|
|
|
pinmux: pinmux@1b001000 {
|
|
compatible = "pinctrl-single";
|
|
reg = <0x1b001000 0x4>;
|
|
|
|
pinctrl-single,bit-per-mux;
|
|
pinctrl-single,register-width = <32>;
|
|
pinctrl-single,function-mask = <0x1>;
|
|
#pinctrl-cells = <2>;
|
|
|
|
enable_uart1: pinmux_enable_uart1 {
|
|
pinctrl-single,bits = <0x0 0x10 0x10>;
|
|
};
|
|
};
|
|
|
|
/* LED_GLB_CTRL */
|
|
pinmux_led: pinmux@1b00a000 {
|
|
compatible = "pinctrl-single";
|
|
reg = <0x1b00a000 0x4>;
|
|
|
|
pinctrl-single,bit-per-mux;
|
|
pinctrl-single,register-width = <32>;
|
|
pinctrl-single,function-mask = <0x1>;
|
|
#pinctrl-cells = <2>;
|
|
|
|
/* enable GPIO 0 */
|
|
pinmux_disable_sys_led: disable_sys_led {
|
|
pinctrl-single,bits = <0x0 0x0 0x8000>;
|
|
};
|
|
};
|
|
|
|
pinmux@1b00a0e0 {
|
|
compatible = "pinctrl-single";
|
|
reg = <0x1b00a0e0 0x4>;
|
|
|
|
pinctrl-single,bit-per-mux;
|
|
pinctrl-single,register-width = <32>;
|
|
pinctrl-single,function-mask = <0x1>;
|
|
#pinctrl-cells = <2>;
|
|
|
|
/* Use SoC GPIO 2/3 as GPIO */
|
|
mdio_aux_gpio: gpio-pins {
|
|
pinctrl-single,bits = <0x0 0x0 0x1>;
|
|
};
|
|
|
|
/* Use SoC GPIO 2/3 as MDC/MDIO */
|
|
mdio_aux_mdx: mdx-pins {
|
|
pinctrl-single,bits = <0x0 0x1 0x1>;
|
|
};
|
|
};
|
|
|
|
ethernet0: ethernet@1b00a300 {
|
|
compatible = "realtek,rtl838x-eth";
|
|
reg = <0x1b00a300 0x100>;
|
|
interrupt-parent = <&intc>;
|
|
interrupts = <24 3>;
|
|
#interrupt-cells = <1>;
|
|
phy-mode = "internal";
|
|
|
|
fixed-link {
|
|
speed = <1000>;
|
|
full-duplex;
|
|
};
|
|
};
|
|
|
|
sram0: sram@9f000000 {
|
|
compatible = "mmio-sram";
|
|
reg = <0x9f000000 0x10000>;
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
ranges = <0 0x9f000000 0x10000>;
|
|
};
|
|
|
|
switch0: switch@1b000000 {
|
|
compatible = "realtek,rtl83xx-switch";
|
|
|
|
interrupt-parent = <&intc>;
|
|
interrupts = <20 2>;
|
|
};
|
|
|
|
thermal_zones: thermal-zones {
|
|
cpu-thermal {
|
|
polling-delay-passive = <1000>;
|
|
polling-delay = <1000>;
|
|
coefficients = <1000 0>;
|
|
thermal-sensors = <&soc_thermal>;
|
|
trips {
|
|
cpu-crit {
|
|
temperature = <105000>;
|
|
hysteresis = <2000>;
|
|
type = "critical";
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|