- MIPS: mscc: ocelot: add ethernet switch and network support
- MIPS: mscc: add support for ServalT SoC family - MIPS: mscc: add support for Serval SoC family -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEiQkHUH+J02LLC9InKPlOlyTyXBgFAlxIpMwACgkQKPlOlyTy XBhkLQ//XCrtiY/DYK/BsXINgv61EHqGpXPE63k/hQnelrEIz5ayoqB5UqBp48p4 2XwA/iyP7PEpPeGov/oRGm5aK1wsuz4hl/Graw2XC+VVRkw8g2m/TWpBVN07MCOV BcePczV4AqPXNomWo3J+oh49vgpw4rQyA/oSrhLRlOBrgz7W2JHvUhANAoIBwsRy IOxC23wNHDjd+qP7BZIRoT58Zy70xN9JyhXaD823H9J6Szrzj6vKmqd8GNP7G/YP JmJl4uCWF6RTjfutY+o9Hq6zMWTG8dyDpSusAxlcWwZE4YOK24OTr1uJP8NzfQBU ShJ4FC6dekkNdmVueSZpL423si6WJCKMW2BMc34vE+pa9iBS8QvNQSRGnL8qjSqu nkVZWHMZwHd9sVhZMmsfawjhE5EmkFIeYCBuoRcGQmbHkgUjM2CcfdZbzlDlkzKe xZiitc05pRR2ubHjL76SsJmDCtdieXNkxE6p2Pyfh7blJi4yC84kDndyTrJVZJWi Ij7jTAKU4VCb77ALv7A6o60WSlBDg619FeomGEr9V4afALd/ww6NbJ36V/fdoVdm ptnic9pzMLAZjcc53AUR08qXnNq7n96SPMfVo/tp68WkYcy/AV2k7Sg8BE/od1iW 2pbK/WxzOGuo+wZpMDtuqILHDV96wtEtbVIYp9j4xC9j7+LbxSI= =GjQJ -----END PGP SIGNATURE----- Merge tag 'mips-pull-2019-01-23' of git://git.denx.de/u-boot-mips - MIPS: mscc: ocelot: add ethernet switch and network support - MIPS: mscc: add support for ServalT SoC family - MIPS: mscc: add support for Serval SoC family
This commit is contained in:
commit
aff66f22d6
@ -539,6 +539,7 @@ F: drivers/gpio/mscc_sgpio.c
|
||||
F: drivers/spi/mscc_bb_spi.c
|
||||
F: include/configs/vcoreiii.h
|
||||
F: drivers/pinctrl/mscc/
|
||||
F: drivers/net/ocelot_switch.c
|
||||
|
||||
MIPS JZ4780
|
||||
M: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
|
@ -20,6 +20,8 @@ dtb-$(CONFIG_TARGET_JZ4780_CI20) += ci20.dtb
|
||||
dtb-$(CONFIG_SOC_LUTON) += luton_pcb090.dtb luton_pcb091.dtb
|
||||
dtb-$(CONFIG_SOC_OCELOT) += ocelot_pcb120.dtb ocelot_pcb123.dtb
|
||||
dtb-$(CONFIG_SOC_JR2) += jr2_pcb110.dtb jr2_pcb111.dtb serval2_pcb112.dtb
|
||||
dtb-$(CONFIG_SOC_SERVALT) += servalt_pcb116.dtb
|
||||
dtb-$(CONFIG_SOC_SERVAL) += serval_pcb105.dtb serval_pcb106.dtb
|
||||
|
||||
targets += $(dtb-y)
|
||||
|
||||
|
@ -112,6 +112,98 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
switch@1010000 {
|
||||
pinctrl-0 = <&miim1_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
compatible = "mscc,vsc7514-switch";
|
||||
reg = <0x1010000 0x10000>, /* VTSS_TO_SYS */
|
||||
<0x1030000 0x10000>, /* VTSS_TO_REW */
|
||||
<0x1080000 0x100>, /* VTSS_TO_DEVCPU_QS */
|
||||
<0x10d0000 0x10000>, /* VTSS_TO_HSIO */
|
||||
<0x11e0000 0x100>, /* VTSS_TO_DEV_0 */
|
||||
<0x11f0000 0x100>, /* VTSS_TO_DEV_1 */
|
||||
<0x1200000 0x100>, /* VTSS_TO_DEV_2 */
|
||||
<0x1210000 0x100>, /* VTSS_TO_DEV_3 */
|
||||
<0x1220000 0x100>, /* VTSS_TO_DEV_4 */
|
||||
<0x1230000 0x100>, /* VTSS_TO_DEV_5 */
|
||||
<0x1240000 0x100>, /* VTSS_TO_DEV_6 */
|
||||
<0x1250000 0x100>, /* VTSS_TO_DEV_7 */
|
||||
<0x1260000 0x100>, /* VTSS_TO_DEV_8 */
|
||||
<0x1270000 0x100>, /* NA */
|
||||
<0x1280000 0x100>, /* NA */
|
||||
<0x1800000 0x80000>, /* VTSS_TO_QSYS */
|
||||
<0x1880000 0x10000>; /* VTSS_TO_ANA */
|
||||
reg-names = "sys", "rew", "qs", "hsio", "port0",
|
||||
"port1", "port2", "port3", "port4", "port5",
|
||||
"port6", "port7", "port8", "port9",
|
||||
"port10", "qsys", "ana";
|
||||
interrupts = <21 22>;
|
||||
interrupt-names = "xtr", "inj";
|
||||
status = "okay";
|
||||
|
||||
ethernet-ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port0: port@0 {
|
||||
reg = <0>;
|
||||
};
|
||||
port1: port@1 {
|
||||
reg = <1>;
|
||||
};
|
||||
port2: port@2 {
|
||||
reg = <2>;
|
||||
};
|
||||
port3: port@3 {
|
||||
reg = <3>;
|
||||
};
|
||||
port4: port@4 {
|
||||
reg = <4>;
|
||||
};
|
||||
port5: port@5 {
|
||||
reg = <5>;
|
||||
};
|
||||
port6: port@6 {
|
||||
reg = <6>;
|
||||
};
|
||||
port7: port@7 {
|
||||
reg = <7>;
|
||||
};
|
||||
port8: port@8 {
|
||||
reg = <8>;
|
||||
};
|
||||
port9: port@9 {
|
||||
reg = <9>;
|
||||
};
|
||||
port10: port@10 {
|
||||
reg = <10>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mdio0: mdio@107009c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "mscc,ocelot-miim";
|
||||
reg = <0x107009c 0x24>, <0x10700f0 0x8>;
|
||||
interrupts = <14>;
|
||||
status = "disabled";
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
};
|
||||
phy1: ethernet-phy@1 {
|
||||
reg = <1>;
|
||||
};
|
||||
phy2: ethernet-phy@2 {
|
||||
reg = <2>;
|
||||
};
|
||||
phy3: ethernet-phy@3 {
|
||||
reg = <3>;
|
||||
};
|
||||
};
|
||||
|
||||
reset@1070008 {
|
||||
compatible = "mscc,ocelot-chip-reset";
|
||||
reg = <0x1070008 0x4>;
|
||||
@ -144,6 +236,11 @@
|
||||
function = "si";
|
||||
};
|
||||
|
||||
miim1_pins: miim1-pins {
|
||||
pins = "GPIO_14", "GPIO_15";
|
||||
function = "miim1";
|
||||
};
|
||||
|
||||
spi_cs2_pin: spi-cs2-pin {
|
||||
pins = "GPIO_9";
|
||||
function = "si";
|
||||
|
149
arch/mips/dts/mscc,serval.dtsi
Normal file
149
arch/mips/dts/mscc,serval.dtsi
Normal file
@ -0,0 +1,149 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
/ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "mscc,serval";
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
cpu@0 {
|
||||
compatible = "mips,mips24KEc";
|
||||
device_type = "cpu";
|
||||
clocks = <&cpu_clk>;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
cpuintc: interrupt-controller@0 {
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-controller;
|
||||
compatible = "mti,cpu-interrupt-controller";
|
||||
};
|
||||
|
||||
cpu_clk: cpu-clock {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <416666666>;
|
||||
};
|
||||
|
||||
sys_clk: sys-clk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <208333333>;
|
||||
};
|
||||
|
||||
ahb_clk: ahb-clk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <208333333>;
|
||||
};
|
||||
|
||||
ahb {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x70000000 0x2000000>;
|
||||
|
||||
interrupt-parent = <&intc>;
|
||||
|
||||
cpu_ctrl: syscon@0 {
|
||||
compatible = "mscc,serval-cpu-syscon", "syscon";
|
||||
reg = <0x0 0x2c>;
|
||||
};
|
||||
|
||||
intc: interrupt-controller@70 {
|
||||
compatible = "mscc,serval-icpu-intr";
|
||||
reg = <0x70 0x70>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-controller;
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <2>;
|
||||
};
|
||||
|
||||
uart0: serial@100000 {
|
||||
pinctrl-0 = <&uart_pins>;
|
||||
pinctrl-names = "default";
|
||||
compatible = "ns16550a";
|
||||
reg = <0x100000 0x20>;
|
||||
interrupts = <6>;
|
||||
clocks = <&ahb_clk>;
|
||||
reg-io-width = <4>;
|
||||
reg-shift = <2>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart2: serial@100800 {
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
pinctrl-names = "default";
|
||||
compatible = "ns16550a";
|
||||
reg = <0x100800 0x20>;
|
||||
interrupts = <7>;
|
||||
clocks = <&ahb_clk>;
|
||||
reg-io-width = <4>;
|
||||
reg-shift = <2>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
reset@1070008 {
|
||||
compatible = "mscc,serval-chip-reset";
|
||||
reg = <0x1070008 0x4>;
|
||||
};
|
||||
|
||||
gpio: pinctrl@1070034 {
|
||||
compatible = "mscc,serval-pinctrl";
|
||||
reg = <0x1070034 0x68>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-ranges = <&gpio 0 0 22>;
|
||||
|
||||
sgpio_pins: sgpio-pins {
|
||||
pins = "GPIO_0", "GPIO_2", "GPIO_3", "GPIO_1";
|
||||
function = "sio";
|
||||
};
|
||||
|
||||
uart_pins: uart-pins {
|
||||
pins = "GPIO_26", "GPIO_27";
|
||||
function = "uart";
|
||||
};
|
||||
|
||||
uart2_pins: uart2-pins {
|
||||
pins = "GPIO_13", "GPIO_14";
|
||||
function = "uart2";
|
||||
};
|
||||
};
|
||||
|
||||
spi0: spi-bitbang {
|
||||
compatible = "mscc,luton-bb-spi";
|
||||
status = "okay";
|
||||
reg = <0x50 0x4>;
|
||||
num-chipselects = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
sgpio: gpio@10700b4 {
|
||||
compatible = "mscc,luton-sgpio";
|
||||
status = "disabled";
|
||||
clocks = <&sys_clk>;
|
||||
pinctrl-0 = <&sgpio_pins>;
|
||||
pinctrl-names = "default";
|
||||
reg = <0x10700b4 0x100>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-ranges = <&sgpio 0 0 64>;
|
||||
};
|
||||
};
|
||||
};
|
149
arch/mips/dts/mscc,servalt.dtsi
Normal file
149
arch/mips/dts/mscc,servalt.dtsi
Normal file
@ -0,0 +1,149 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
/ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "mscc,servalt";
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
cpu@0 {
|
||||
compatible = "mips,mips24KEc";
|
||||
device_type = "cpu";
|
||||
clocks = <&cpu_clk>;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
cpuintc: interrupt-controller@0 {
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-controller;
|
||||
compatible = "mti,cpu-interrupt-controller";
|
||||
};
|
||||
|
||||
cpu_clk: cpu-clock {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <500000000>;
|
||||
};
|
||||
|
||||
sys_clk: sys-clk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <250000000>;
|
||||
};
|
||||
|
||||
ahb_clk: ahb-clk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <250000000>;
|
||||
};
|
||||
|
||||
ahb {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x70000000 0x2000000>;
|
||||
|
||||
interrupt-parent = <&intc>;
|
||||
|
||||
cpu_ctrl: syscon@0 {
|
||||
compatible = "mscc,servalt-cpu-syscon", "syscon";
|
||||
reg = <0x0 0x2c>;
|
||||
};
|
||||
|
||||
intc: interrupt-controller@70 {
|
||||
compatible = "mscc,servalt-icpu-intr";
|
||||
reg = <0x70 0x74>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-controller;
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <2>;
|
||||
};
|
||||
|
||||
uart0: serial@100000 {
|
||||
pinctrl-0 = <&uart_pins>;
|
||||
pinctrl-names = "default";
|
||||
compatible = "ns16550a";
|
||||
reg = <0x100000 0x20>;
|
||||
interrupts = <6>;
|
||||
clocks = <&ahb_clk>;
|
||||
reg-io-width = <4>;
|
||||
reg-shift = <2>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart2: serial@100800 {
|
||||
pinctrl-0 = <&uart2_pins>;
|
||||
pinctrl-names = "default";
|
||||
compatible = "ns16550a";
|
||||
reg = <0x100800 0x20>;
|
||||
interrupts = <7>;
|
||||
clocks = <&ahb_clk>;
|
||||
reg-io-width = <4>;
|
||||
reg-shift = <2>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
reset@1010008 {
|
||||
compatible = "mscc,servalt-chip-reset";
|
||||
reg = <0x1010008 0x4>;
|
||||
};
|
||||
|
||||
gpio: pinctrl@1010034 {
|
||||
compatible = "mscc,servalt-pinctrl";
|
||||
reg = <0x1010034 0x90>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-ranges = <&gpio 0 0 36>;
|
||||
|
||||
sgpio_pins: sgpio-pins {
|
||||
pins = "GPIO_0", "GPIO_1", "GPIO_2", "GPIO_3";
|
||||
function = "sio";
|
||||
};
|
||||
|
||||
uart_pins: uart-pins {
|
||||
pins = "GPIO_6", "GPIO_7";
|
||||
function = "uart";
|
||||
};
|
||||
|
||||
uart2_pins: uart2-pins {
|
||||
pins = "GPIO_20", "GPIO_21";
|
||||
function = "uart2";
|
||||
};
|
||||
};
|
||||
|
||||
spi0: spi-bitbang {
|
||||
compatible = "mscc,luton-bb-spi";
|
||||
status = "okay";
|
||||
reg = <0x50 0x4>;
|
||||
num-chipselects = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
sgpio: gpio@1010120 {
|
||||
compatible = "mscc,ocelot-sgpio";
|
||||
status = "disabled";
|
||||
clocks = <&sys_clk>;
|
||||
pinctrl-0 = <&sgpio_pins>;
|
||||
pinctrl-names = "default";
|
||||
reg = <0x1010120 0x100>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-ranges = <&sgpio 0 0 128>;
|
||||
};
|
||||
};
|
||||
};
|
@ -35,3 +35,23 @@
|
||||
status = "okay";
|
||||
mscc,sgpio-ports = <0x00FFFFFF>;
|
||||
};
|
||||
|
||||
&mdio0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&port0 {
|
||||
phy-handle = <&phy0>;
|
||||
};
|
||||
|
||||
&port1 {
|
||||
phy-handle = <&phy1>;
|
||||
};
|
||||
|
||||
&port2 {
|
||||
phy-handle = <&phy2>;
|
||||
};
|
||||
|
||||
&port3 {
|
||||
phy-handle = <&phy3>;
|
||||
};
|
||||
|
56
arch/mips/dts/serval_pcb105.dts
Normal file
56
arch/mips/dts/serval_pcb105.dts
Normal file
@ -0,0 +1,56 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "mscc,serval.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Serval PCB105 Reference Board";
|
||||
compatible = "mscc,serval-pcb105", "mscc,serval";
|
||||
|
||||
aliases {
|
||||
spi0 = &spi0;
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
gpio-leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
status_green {
|
||||
label = "pcb105:green:status";
|
||||
gpios = <&sgpio 43 1>; /* p11.1 */
|
||||
default-state = "on";
|
||||
};
|
||||
|
||||
status_red {
|
||||
label = "pcb105:red:status";
|
||||
gpios = <&sgpio 11 1>; /* p11.0 */
|
||||
default-state = "off";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
status = "okay";
|
||||
spi-flash@0 {
|
||||
compatible = "spi-flash";
|
||||
spi-max-frequency = <18000000>; /* input clock */
|
||||
reg = <0>; /* CS0 */
|
||||
spi-cs-high;
|
||||
};
|
||||
};
|
||||
|
||||
&sgpio {
|
||||
status = "okay";
|
||||
sgpio-ports = <0x00FFFFFF>;
|
||||
};
|
56
arch/mips/dts/serval_pcb106.dts
Normal file
56
arch/mips/dts/serval_pcb106.dts
Normal file
@ -0,0 +1,56 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "mscc,serval.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Serval PCB106 Reference Board";
|
||||
compatible = "mscc,serval-pcb106", "mscc,serval";
|
||||
|
||||
aliases {
|
||||
spi0 = &spi0;
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
gpio-leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
status_green {
|
||||
label = "pcb106:green:status";
|
||||
gpios = <&sgpio 43 1>; /* p11.1 */
|
||||
default-state = "on";
|
||||
};
|
||||
|
||||
status_red {
|
||||
label = "pcb106:red:status";
|
||||
gpios = <&sgpio 11 1>; /* p11.0 */
|
||||
default-state = "off";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
status = "okay";
|
||||
spi-flash@0 {
|
||||
compatible = "spi-flash";
|
||||
spi-max-frequency = <18000000>; /* input clock */
|
||||
reg = <0>; /* CS0 */
|
||||
spi-cs-high;
|
||||
};
|
||||
};
|
||||
|
||||
&sgpio {
|
||||
status = "okay";
|
||||
sgpio-ports = <0x00FFFFFF>;
|
||||
};
|
56
arch/mips/dts/servalt_pcb116.dts
Normal file
56
arch/mips/dts/servalt_pcb116.dts
Normal file
@ -0,0 +1,56 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "mscc,servalt.dtsi"
|
||||
|
||||
/ {
|
||||
model = "ServalT PCB116 Reference Board";
|
||||
compatible = "mscc,servalt-pcb116", "mscc,servalt";
|
||||
|
||||
aliases {
|
||||
spi0 = &spi0;
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
gpio-leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
status_green {
|
||||
label = "pcb116:green:status";
|
||||
gpios = <&sgpio 70 0>; /* p6.2 */
|
||||
default-state = "on";
|
||||
};
|
||||
|
||||
status_red {
|
||||
label = "pcb116:red:status";
|
||||
gpios = <&sgpio 102 0>; /* p6.3 */
|
||||
default-state = "off";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
status = "okay";
|
||||
spi-flash@0 {
|
||||
compatible = "spi-flash";
|
||||
spi-max-frequency = <18000000>; /* input clock */
|
||||
reg = <0>; /* CS0 */
|
||||
spi-cs-high;
|
||||
};
|
||||
};
|
||||
|
||||
&sgpio {
|
||||
status = "okay";
|
||||
sgpio-ports = <0x0000fe7f>;
|
||||
};
|
@ -40,6 +40,20 @@ config SOC_JR2
|
||||
help
|
||||
This supports MSCC Jaguar2 family of SOCs.
|
||||
|
||||
config SOC_SERVALT
|
||||
bool "Servalt SOC Family"
|
||||
select SOC_VCOREIII
|
||||
select MSCC_BB_SPI
|
||||
help
|
||||
This supports MSCC Servalt family of SOCs.
|
||||
|
||||
config SOC_SERVAL
|
||||
bool "Serval SOC Family"
|
||||
select SOC_VCOREIII
|
||||
select MSCC_BB_SPI
|
||||
help
|
||||
This supports MSCC Serval family of SOCs.
|
||||
|
||||
endchoice
|
||||
|
||||
config SYS_CONFIG_NAME
|
||||
@ -74,4 +88,7 @@ source "board/mscc/luton/Kconfig"
|
||||
|
||||
source "board/mscc/jr2/Kconfig"
|
||||
|
||||
source "board/mscc/servalt/Kconfig"
|
||||
|
||||
source "board/mscc/serval/Kconfig"
|
||||
endmenu
|
||||
|
@ -5,3 +5,4 @@ CFLAGS_cpu.o += -finline-limit=64000
|
||||
obj-y += cpu.o dram.o reset.o phy.o lowlevel_init.o
|
||||
obj-$(CONFIG_SOC_LUTON) += lowlevel_init_luton.o gpio.o
|
||||
obj-$(CONFIG_SOC_OCELOT) += gpio.o
|
||||
obj-$(CONFIG_SOC_SERVAL) += gpio.o
|
||||
|
@ -87,11 +87,11 @@ int mach_cpu_init(void)
|
||||
ICPU_SPI_MST_CFG_CS_DESELECT_TIME(0x19) +
|
||||
ICPU_SPI_MST_CFG_CLK_DIV(9), BASE_CFG + ICPU_SPI_MST_CFG);
|
||||
#else
|
||||
#ifdef CONFIG_SOC_OCELOT
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_SERVAL)
|
||||
writel(ICPU_SPI_MST_CFG_CS_DESELECT_TIME(0x19) +
|
||||
ICPU_SPI_MST_CFG_CLK_DIV(9), BASE_CFG + ICPU_SPI_MST_CFG);
|
||||
#endif
|
||||
#ifdef CONFIG_SOC_JR2
|
||||
#if defined(CONFIG_SOC_JR2) || defined(CONFIG_SOC_SERVALT)
|
||||
writel(ICPU_SPI_MST_CFG_FAST_READ_ENA +
|
||||
ICPU_SPI_MST_CFG_CS_DESELECT_TIME(0x19) +
|
||||
ICPU_SPI_MST_CFG_CLK_DIV(14), BASE_CFG + ICPU_SPI_MST_CFG);
|
||||
|
@ -19,7 +19,8 @@ static inline int vcoreiii_train_bytelane(void)
|
||||
|
||||
ret = hal_vcoreiii_train_bytelane(0);
|
||||
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2)
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2) || \
|
||||
defined(CONFIG_SOC_SERVALT) || defined(CONFIG_SOC_SERVAL)
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = hal_vcoreiii_train_bytelane(1);
|
||||
|
@ -21,6 +21,16 @@
|
||||
#include <mach/jr2/jr2_devcpu_gcb.h>
|
||||
#include <mach/jr2/jr2_devcpu_gcb_miim_regs.h>
|
||||
#include <mach/jr2/jr2_icpu_cfg.h>
|
||||
#elif defined(CONFIG_SOC_SERVALT)
|
||||
#include <mach/servalt/servalt.h>
|
||||
#include <mach/servalt/servalt_devcpu_gcb.h>
|
||||
#include <mach/servalt/servalt_devcpu_gcb_miim_regs.h>
|
||||
#include <mach/servalt/servalt_icpu_cfg.h>
|
||||
#elif defined(CONFIG_SOC_SERVAL)
|
||||
#include <mach/serval/serval.h>
|
||||
#include <mach/serval/serval_devcpu_gcb.h>
|
||||
#include <mach/serval/serval_devcpu_gcb_miim_regs.h>
|
||||
#include <mach/serval/serval_icpu_cfg.h>
|
||||
#else
|
||||
#error Unsupported platform
|
||||
#endif
|
||||
|
@ -25,7 +25,7 @@
|
||||
#define VC3_MPAR_CL 6
|
||||
#define VC3_MPAR_tWTR 4
|
||||
#define VC3_MPAR_tRC 16
|
||||
#define VC3_MPR_tFAW 16
|
||||
#define VC3_MPAR_tFAW 16
|
||||
#define VC3_MPAR_tRP 5
|
||||
#define VC3_MPAR_tRRD 4
|
||||
#define VC3_MPAR_tRCD 5
|
||||
@ -161,7 +161,8 @@
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2)
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2) || \
|
||||
defined(CONFIG_SOC_SERVALT) || defined(CONFIG_SOC_SERVAL)
|
||||
#define MIPS_VCOREIII_MEMORY_16BIT 1
|
||||
#endif
|
||||
|
||||
@ -239,7 +240,8 @@
|
||||
ICPU_MEMCTRL_CFG_MSB_ROW_ADDR(VC3_MPAR_row_addr_cnt - 1) | \
|
||||
ICPU_MEMCTRL_CFG_MSB_COL_ADDR(VC3_MPAR_col_addr_cnt - 1)
|
||||
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2)
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2) || \
|
||||
defined(CONFIG_SOC_SERVALT) || defined(CONFIG_SOC_SERVAL)
|
||||
#define MSCC_MEMPARM_PERIOD \
|
||||
ICPU_MEMCTRL_REF_PERIOD_MAX_PEND_REF(8) | \
|
||||
ICPU_MEMCTRL_REF_PERIOD_REF_PERIOD(VC3_MPAR_tREFI)
|
||||
@ -378,7 +380,8 @@ static inline void memphy_soft_reset(void)
|
||||
PAUSE();
|
||||
}
|
||||
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2)
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2) || \
|
||||
defined(CONFIG_SOC_SERVALT) || defined(CONFIG_SOC_SERVAL)
|
||||
static u8 training_data[] = { 0xfe, 0x11, 0x33, 0x55, 0x77, 0x99, 0xbb, 0xdd };
|
||||
|
||||
static inline void sleep_100ns(u32 val)
|
||||
@ -449,7 +452,7 @@ static inline void hal_vcoreiii_ddr_failed(void)
|
||||
|
||||
panic("DDR init failed\n");
|
||||
}
|
||||
#else /* JR2 */
|
||||
#else /* JR2 || ServalT || Serval */
|
||||
static inline void hal_vcoreiii_ddr_reset_assert(void)
|
||||
{
|
||||
/* Ensure the memory controller physical iface is forced reset */
|
||||
@ -468,7 +471,7 @@ static inline void hal_vcoreiii_ddr_failed(void)
|
||||
|
||||
panic("DDR init failed\n");
|
||||
}
|
||||
#endif
|
||||
#endif /* JR2 || ServalT || Serval */
|
||||
|
||||
/*
|
||||
* DDR memory sanity checking done, possibly enable ECC.
|
||||
@ -759,7 +762,8 @@ static inline void hal_vcoreiii_init_memctl(void)
|
||||
/* Wait for ZCAL to clear */
|
||||
while (readl(BASE_CFG + ICPU_MEMPHY_ZCAL) & ICPU_MEMPHY_ZCAL_ZCAL_ENA)
|
||||
;
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2)
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2) || \
|
||||
defined(CONFIG_SOC_SERVALT)
|
||||
/* Check no ZCAL_ERR */
|
||||
if (readl(BASE_CFG + ICPU_MEMPHY_ZCAL_STAT)
|
||||
& ICPU_MEMPHY_ZCAL_STAT_ZCAL_ERR)
|
||||
@ -773,7 +777,8 @@ static inline void hal_vcoreiii_init_memctl(void)
|
||||
writel(MSCC_MEMPARM_MEMCFG, BASE_CFG + ICPU_MEMCTRL_CFG);
|
||||
writel(MSCC_MEMPARM_PERIOD, BASE_CFG + ICPU_MEMCTRL_REF_PERIOD);
|
||||
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2)
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2) || \
|
||||
defined(CONFIG_SOC_SERVALT) || defined(CONFIG_SOC_SERVAL)
|
||||
writel(MSCC_MEMPARM_TIMING0, BASE_CFG + ICPU_MEMCTRL_TIMING0);
|
||||
#else /* Luton */
|
||||
clrbits_le32(BASE_CFG + ICPU_MEMCTRL_TIMING0, ((1 << 20) - 1));
|
||||
@ -788,7 +793,7 @@ static inline void hal_vcoreiii_init_memctl(void)
|
||||
writel(MSCC_MEMPARM_MR2, BASE_CFG + ICPU_MEMCTRL_MR2_VAL);
|
||||
writel(MSCC_MEMPARM_MR3, BASE_CFG + ICPU_MEMCTRL_MR3_VAL);
|
||||
|
||||
#if defined(CONFIG_SOC_OCELOT)
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_SERVAL)
|
||||
/* Termination setup - enable ODT */
|
||||
writel(ICPU_MEMCTRL_TERMRES_CTRL_LOCAL_ODT_RD_ENA |
|
||||
/* Assert ODT0 for any write */
|
||||
@ -796,10 +801,12 @@ static inline void hal_vcoreiii_init_memctl(void)
|
||||
BASE_CFG + ICPU_MEMCTRL_TERMRES_CTRL);
|
||||
|
||||
/* Release Reset from DDR */
|
||||
#if defined(CONFIG_SOC_OCELOT)
|
||||
hal_vcoreiii_ddr_reset_release();
|
||||
#endif
|
||||
|
||||
writel(readl(BASE_CFG + ICPU_GPR(7)) + 1, BASE_CFG + ICPU_GPR(7));
|
||||
#elif defined(CONFIG_SOC_JR2)
|
||||
#elif defined(CONFIG_SOC_JR2) || defined(CONFIG_SOC_SERVALT)
|
||||
writel(ICPU_MEMCTRL_TERMRES_CTRL_ODT_WR_ENA(3),
|
||||
BASE_CFG + ICPU_MEMCTRL_TERMRES_CTRL);
|
||||
#else /* Luton */
|
||||
@ -820,7 +827,8 @@ static inline void hal_vcoreiii_wait_memctl(void)
|
||||
|
||||
/* Settle...? */
|
||||
sleep_100ns(10000);
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2)
|
||||
#if defined(CONFIG_SOC_OCELOT) || defined(CONFIG_SOC_JR2) || \
|
||||
defined(CONFIG_SOC_SERVALT) || defined(CONFIG_SOC_SERVAL)
|
||||
/* Establish data contents in DDR RAM for training */
|
||||
|
||||
__raw_writel(0xcacafefe, ((void __iomem *)MSCC_DDR_TO));
|
||||
|
24
arch/mips/mach-mscc/include/mach/serval/serval.h
Normal file
24
arch/mips/mach-mscc/include/mach/serval/serval.h
Normal file
@ -0,0 +1,24 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||||
/*
|
||||
* Microsemi Serval Switch driver
|
||||
*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#ifndef _MSCC_SERVAL_H_
|
||||
#define _MSCC_SERVAL_H_
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <dm.h>
|
||||
|
||||
/*
|
||||
* Target offset base(s)
|
||||
*/
|
||||
#define MSCC_IO_ORIGIN1_OFFSET 0x70000000
|
||||
#define MSCC_IO_ORIGIN1_SIZE 0x00200000
|
||||
#define MSCC_IO_ORIGIN2_OFFSET 0x71000000
|
||||
#define MSCC_IO_ORIGIN2_SIZE 0x01000000
|
||||
#define BASE_CFG ((void __iomem *)0x70000000)
|
||||
#define BASE_DEVCPU_GCB ((void __iomem *)0x71070000)
|
||||
|
||||
#endif
|
21
arch/mips/mach-mscc/include/mach/serval/serval_devcpu_gcb.h
Normal file
21
arch/mips/mach-mscc/include/mach/serval/serval_devcpu_gcb.h
Normal file
@ -0,0 +1,21 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#ifndef _MSCC_SERVAL_DEVCPU_GCB_H_
|
||||
#define _MSCC_SERVAL_DEVCPU_GCB_H_
|
||||
|
||||
#define CHIP_ID 0x0
|
||||
|
||||
#define PERF_GPR 0x4
|
||||
|
||||
#define PERF_SOFT_RST 0x8
|
||||
|
||||
#define PERF_SOFT_RST_SOFT_NON_CFG_RST BIT(2)
|
||||
#define PERF_SOFT_RST_SOFT_SWC_RST BIT(1)
|
||||
#define PERF_SOFT_RST_SOFT_CHIP_RST BIT(0)
|
||||
|
||||
#define GPIO_ALT(x) (0x54 + 4 * (x))
|
||||
|
||||
#endif
|
@ -0,0 +1,25 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#ifndef _MSCC_SERVAL_DEVCPU_GCB_MIIM_REGS_H_
|
||||
#define _MSCC_SERVAL_DEVCPU_GCB_MIIM_REGS_H_
|
||||
|
||||
#define MIIM_MII_STATUS(gi) (0x5c + (gi * 36))
|
||||
#define MIIM_MII_CMD(gi) (0x64 + (gi * 36))
|
||||
#define MIIM_MII_DATA(gi) (0x68 + (gi * 36))
|
||||
|
||||
#define MSCC_F_MII_STATUS_MIIM_STAT_BUSY(x) ((x) ? BIT(3) : 0)
|
||||
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_VLD(x) ((x) ? BIT(31) : 0)
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_PHYAD(x) (GENMASK(29, 25) & ((x) << 25))
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_REGAD(x) (GENMASK(24, 20) & ((x) << 20))
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_WRDATA(x) (GENMASK(19, 4) & ((x) << 4))
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_OPR_FIELD(x) (GENMASK(2, 1) & ((x) << 1))
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_SCAN(x) ((x) ? BIT(0) : 0)
|
||||
|
||||
#define MSCC_M_MII_DATA_MIIM_DATA_SUCCESS GENMASK(17, 16)
|
||||
#define MSCC_X_MII_DATA_MIIM_DATA_RDDATA(x) (((x) >> 0) & GENMASK(15, 0))
|
||||
|
||||
#endif
|
314
arch/mips/mach-mscc/include/mach/serval/serval_icpu_cfg.h
Normal file
314
arch/mips/mach-mscc/include/mach/serval/serval_icpu_cfg.h
Normal file
@ -0,0 +1,314 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#ifndef _MSCC_SERVAL_ICPU_CFG_H_
|
||||
#define _MSCC_SERVAL_ICPU_CFG_H_
|
||||
|
||||
#define ICPU_GPR(x) (0x4 * (x))
|
||||
#define ICPU_GPR_RSZ 0x8
|
||||
|
||||
#define ICPU_RESET 0x20
|
||||
|
||||
#define ICPU_RESET_CORE_RST_CPU_ONLY BIT(3)
|
||||
#define ICPU_RESET_CORE_RST_PROTECT BIT(2)
|
||||
#define ICPU_RESET_CORE_RST_FORCE BIT(1)
|
||||
#define ICPU_RESET_MEM_RST_FORCE BIT(0)
|
||||
|
||||
#define ICPU_GENERAL_CTRL 0x24
|
||||
|
||||
#define ICPU_GENERAL_CTRL_CPU_BUSIF_SLEEP_DIS BIT(11)
|
||||
#define ICPU_GENERAL_CTRL_CPU_BUSIF_WERR_ENA BIT(10)
|
||||
#define ICPU_GENERAL_CTRL_CPU_8051_IROM_ENA BIT(9)
|
||||
#define ICPU_GENERAL_CTRL_CPU_MIPS_DIS BIT(8)
|
||||
#define ICPU_GENERAL_CTRL_IF_MIIM_SLV_ENA BIT(7)
|
||||
#define ICPU_GENERAL_CTRL_IF_PI_SLV_DONEPOL BIT(6)
|
||||
#define ICPU_GENERAL_CTRL_IF_PI_MST_ENA BIT(5)
|
||||
#define ICPU_GENERAL_CTRL_IF_PI_SLV_ENA BIT(4)
|
||||
#define ICPU_GENERAL_CTRL_IF_SI_MST_ENA BIT(3)
|
||||
#define ICPU_GENERAL_CTRL_CPU_BE_ENA BIT(2)
|
||||
#define ICPU_GENERAL_CTRL_CPU_DIS BIT(1)
|
||||
#define ICPU_GENERAL_CTRL_BOOT_MODE_ENA BIT(0)
|
||||
|
||||
#define ICPU_SPI_MST_CFG 0x3c
|
||||
|
||||
#define ICPU_SPI_MST_CFG_FAST_READ_ENA BIT(10)
|
||||
#define ICPU_SPI_MST_CFG_CS_DESELECT_TIME(x) (((x) << 5) & GENMASK(9, 5))
|
||||
#define ICPU_SPI_MST_CFG_CS_DESELECT_TIME_M GENMASK(9, 5)
|
||||
#define ICPU_SPI_MST_CFG_CS_DESELECT_TIME_X(x) (((x) & GENMASK(9, 5)) >> 5)
|
||||
#define ICPU_SPI_MST_CFG_CLK_DIV(x) ((x) & GENMASK(4, 0))
|
||||
#define ICPU_SPI_MST_CFG_CLK_DIV_M GENMASK(4, 0)
|
||||
|
||||
#define ICPU_SW_MODE 0x50
|
||||
|
||||
#define ICPU_SW_MODE_SW_PIN_CTRL_MODE BIT(13)
|
||||
#define ICPU_SW_MODE_SW_SPI_SCK BIT(12)
|
||||
#define ICPU_SW_MODE_SW_SPI_SCK_OE BIT(11)
|
||||
#define ICPU_SW_MODE_SW_SPI_SDO BIT(10)
|
||||
#define ICPU_SW_MODE_SW_SPI_SDO_OE BIT(9)
|
||||
#define ICPU_SW_MODE_SW_SPI_CS(x) (((x) << 5) & GENMASK(8, 5))
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_M GENMASK(8, 5)
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_X(x) (((x) & GENMASK(8, 5)) >> 5)
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_OE(x) (((x) << 1) & GENMASK(4, 1))
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_OE_M GENMASK(4, 1)
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_OE_X(x) (((x) & GENMASK(4, 1)) >> 1)
|
||||
#define ICPU_SW_MODE_SW_SPI_SDI BIT(0)
|
||||
|
||||
#define ICPU_INTR_ENA 0x84
|
||||
|
||||
#define ICPU_DST_INTR_MAP(x) (0x94 + 0x4 * (x))
|
||||
#define ICPU_DST_INTR_MAP_RSZ 0x4
|
||||
|
||||
#define ICPU_TIMER_TICK_DIV 0xe0
|
||||
|
||||
#define ICPU_TIMER_VALUE(x) (0xe4 + 0x4 * (x))
|
||||
#define ICPU_TIMER_VALUE_RSZ 0x2
|
||||
|
||||
#define ICPU_TIMER_CTRL(x) (0xfc + 0x4 * (x))
|
||||
#define ICPU_TIMER_CTRL_RSZ 0x2
|
||||
|
||||
#define ICPU_TIMER_CTRL_MAX_FREQ_ENA BIT(3)
|
||||
#define ICPU_TIMER_CTRL_ONE_SHOT_ENA BIT(2)
|
||||
#define ICPU_TIMER_CTRL_TIMER_ENA BIT(1)
|
||||
#define ICPU_TIMER_CTRL_FORCE_RELOAD BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_CTRL 0x108
|
||||
|
||||
#define ICPU_MEMCTRL_CTRL_PWR_DOWN BIT(3)
|
||||
#define ICPU_MEMCTRL_CTRL_MDSET BIT(2)
|
||||
#define ICPU_MEMCTRL_CTRL_STALL_REF_ENA BIT(1)
|
||||
#define ICPU_MEMCTRL_CTRL_INITIALIZE BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_CFG 0x10c
|
||||
|
||||
#define ICPU_MEMCTRL_CFG_DDR_512MBYTE_PLUS BIT(16)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_ECC_ERR_ENA BIT(15)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_ECC_COR_ENA BIT(14)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_ECC_ENA BIT(13)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_WIDTH BIT(12)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_MODE BIT(11)
|
||||
#define ICPU_MEMCTRL_CFG_BURST_SIZE BIT(10)
|
||||
#define ICPU_MEMCTRL_CFG_BURST_LEN BIT(9)
|
||||
#define ICPU_MEMCTRL_CFG_BANK_CNT BIT(8)
|
||||
#define ICPU_MEMCTRL_CFG_MSB_ROW_ADDR(x) (((x) << 4) & GENMASK(7, 4))
|
||||
#define ICPU_MEMCTRL_CFG_MSB_ROW_ADDR_M GENMASK(7, 4)
|
||||
#define ICPU_MEMCTRL_CFG_MSB_ROW_ADDR_X(x) (((x) & GENMASK(7, 4)) >> 4)
|
||||
#define ICPU_MEMCTRL_CFG_MSB_COL_ADDR(x) ((x) & GENMASK(3, 0))
|
||||
#define ICPU_MEMCTRL_CFG_MSB_COL_ADDR_M GENMASK(3, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_STAT 0x110
|
||||
|
||||
#define ICPU_MEMCTRL_STAT_RDATA_MASKED BIT(5)
|
||||
#define ICPU_MEMCTRL_STAT_RDATA_DUMMY BIT(4)
|
||||
#define ICPU_MEMCTRL_STAT_RDATA_ECC_ERR BIT(3)
|
||||
#define ICPU_MEMCTRL_STAT_RDATA_ECC_COR BIT(2)
|
||||
#define ICPU_MEMCTRL_STAT_PWR_DOWN_ACK BIT(1)
|
||||
#define ICPU_MEMCTRL_STAT_INIT_DONE BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_REF_PERIOD 0x114
|
||||
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_MAX_PEND_REF(x) (((x) << 16) & GENMASK(19, 16))
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_MAX_PEND_REF_M GENMASK(19, 16)
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_MAX_PEND_REF_X(x) (((x) & GENMASK(19, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_REF_PERIOD(x) ((x) & GENMASK(15, 0))
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_REF_PERIOD_M GENMASK(15, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_ZQCAL 0x118
|
||||
|
||||
#define ICPU_MEMCTRL_ZQCAL_ZQCAL_LONG BIT(1)
|
||||
#define ICPU_MEMCTRL_ZQCAL_ZQCAL_SHORT BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING0 0x11c
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_WR_DLY(x) (((x) << 28) & GENMASK(31, 28))
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_WR_DLY_M GENMASK(31, 28)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_WR_DLY_X(x) (((x) & GENMASK(31, 28)) >> 28)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_CS_CHANGE_DLY(x) (((x) << 24) & GENMASK(27, 24))
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_CS_CHANGE_DLY_M GENMASK(27, 24)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_CS_CHANGE_DLY_X(x) (((x) & GENMASK(27, 24)) >> 24)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_CS_CHANGE_DLY(x) (((x) << 20) & GENMASK(23, 20))
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_CS_CHANGE_DLY_M GENMASK(23, 20)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_CS_CHANGE_DLY_X(x) (((x) & GENMASK(23, 20)) >> 20)
|
||||
#define ICPU_MEMCTRL_TIMING0_RAS_TO_PRECH_DLY(x) (((x) << 16) & GENMASK(19, 16))
|
||||
#define ICPU_MEMCTRL_TIMING0_RAS_TO_PRECH_DLY_M GENMASK(19, 16)
|
||||
#define ICPU_MEMCTRL_TIMING0_RAS_TO_PRECH_DLY_X(x) (((x) & GENMASK(19, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_TO_PRECH_DLY(x) (((x) << 12) & GENMASK(15, 12))
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_TO_PRECH_DLY_M GENMASK(15, 12)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_TO_PRECH_DLY_X(x) (((x) & GENMASK(15, 12)) >> 12)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_PRECH_DLY(x) (((x) << 8) & GENMASK(11, 8))
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_PRECH_DLY_M GENMASK(11, 8)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_PRECH_DLY_X(x) (((x) & GENMASK(11, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_DATA_XFR_DLY(x) (((x) << 4) & GENMASK(7, 4))
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_DATA_XFR_DLY_M GENMASK(7, 4)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_DATA_XFR_DLY_X(x) (((x) & GENMASK(7, 4)) >> 4)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_DATA_XFR_DLY(x) ((x) & GENMASK(3, 0))
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_DATA_XFR_DLY_M GENMASK(3, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING1 0x120
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_SAME_BANK_DLY(x) (((x) << 24) & GENMASK(31, 24))
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_SAME_BANK_DLY_M GENMASK(31, 24)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_SAME_BANK_DLY_X(x) (((x) & GENMASK(31, 24)) >> 24)
|
||||
#define ICPU_MEMCTRL_TIMING1_BANK8_FAW_DLY(x) (((x) << 16) & GENMASK(23, 16))
|
||||
#define ICPU_MEMCTRL_TIMING1_BANK8_FAW_DLY_M GENMASK(23, 16)
|
||||
#define ICPU_MEMCTRL_TIMING1_BANK8_FAW_DLY_X(x) (((x) & GENMASK(23, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_TIMING1_PRECH_TO_RAS_DLY(x) (((x) << 12) & GENMASK(15, 12))
|
||||
#define ICPU_MEMCTRL_TIMING1_PRECH_TO_RAS_DLY_M GENMASK(15, 12)
|
||||
#define ICPU_MEMCTRL_TIMING1_PRECH_TO_RAS_DLY_X(x) (((x) & GENMASK(15, 12)) >> 12)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_DLY(x) (((x) << 8) & GENMASK(11, 8))
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_DLY_M GENMASK(11, 8)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_DLY_X(x) (((x) & GENMASK(11, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_CAS_DLY(x) (((x) << 4) & GENMASK(7, 4))
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_CAS_DLY_M GENMASK(7, 4)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_CAS_DLY_X(x) (((x) & GENMASK(7, 4)) >> 4)
|
||||
#define ICPU_MEMCTRL_TIMING1_WR_TO_RD_DLY(x) ((x) & GENMASK(3, 0))
|
||||
#define ICPU_MEMCTRL_TIMING1_WR_TO_RD_DLY_M GENMASK(3, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING2 0x124
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING2_PRECH_ALL_DLY(x) (((x) << 28) & GENMASK(31, 28))
|
||||
#define ICPU_MEMCTRL_TIMING2_PRECH_ALL_DLY_M GENMASK(31, 28)
|
||||
#define ICPU_MEMCTRL_TIMING2_PRECH_ALL_DLY_X(x) (((x) & GENMASK(31, 28)) >> 28)
|
||||
#define ICPU_MEMCTRL_TIMING2_MDSET_DLY(x) (((x) << 24) & GENMASK(27, 24))
|
||||
#define ICPU_MEMCTRL_TIMING2_MDSET_DLY_M GENMASK(27, 24)
|
||||
#define ICPU_MEMCTRL_TIMING2_MDSET_DLY_X(x) (((x) & GENMASK(27, 24)) >> 24)
|
||||
#define ICPU_MEMCTRL_TIMING2_REF_DLY(x) (((x) << 16) & GENMASK(23, 16))
|
||||
#define ICPU_MEMCTRL_TIMING2_REF_DLY_M GENMASK(23, 16)
|
||||
#define ICPU_MEMCTRL_TIMING2_REF_DLY_X(x) (((x) & GENMASK(23, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_TIMING2_INIT_DLY(x) ((x) & GENMASK(15, 0))
|
||||
#define ICPU_MEMCTRL_TIMING2_INIT_DLY_M GENMASK(15, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING3 0x128
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING3_RMW_DLY(x) (((x) << 16) & GENMASK(19, 16))
|
||||
#define ICPU_MEMCTRL_TIMING3_RMW_DLY_M GENMASK(19, 16)
|
||||
#define ICPU_MEMCTRL_TIMING3_RMW_DLY_X(x) (((x) & GENMASK(19, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_RD_DLY(x) (((x) << 12) & GENMASK(15, 12))
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_RD_DLY_M GENMASK(15, 12)
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_RD_DLY_X(x) (((x) & GENMASK(15, 12)) >> 12)
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_WR_DLY(x) (((x) << 8) & GENMASK(11, 8))
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_WR_DLY_M GENMASK(11, 8)
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_WR_DLY_X(x) (((x) & GENMASK(11, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_TIMING3_LOCAL_ODT_RD_DLY(x) (((x) << 4) & GENMASK(7, 4))
|
||||
#define ICPU_MEMCTRL_TIMING3_LOCAL_ODT_RD_DLY_M GENMASK(7, 4)
|
||||
#define ICPU_MEMCTRL_TIMING3_LOCAL_ODT_RD_DLY_X(x) (((x) & GENMASK(7, 4)) >> 4)
|
||||
#define ICPU_MEMCTRL_TIMING3_WR_TO_RD_CS_CHANGE_DLY(x) ((x) & GENMASK(3, 0))
|
||||
#define ICPU_MEMCTRL_TIMING3_WR_TO_RD_CS_CHANGE_DLY_M GENMASK(3, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING4 0x12c
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_INIT_DLY(x) (((x) << 20) & GENMASK(31, 20))
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_INIT_DLY_M GENMASK(31, 20)
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_INIT_DLY_X(x) (((x) & GENMASK(31, 20)) >> 20)
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_LONG_DLY(x) (((x) << 8) & GENMASK(19, 8))
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_LONG_DLY_M GENMASK(19, 8)
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_LONG_DLY_X(x) (((x) & GENMASK(19, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_SHORT_DLY(x) ((x) & GENMASK(7, 0))
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_SHORT_DLY_M GENMASK(7, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_MR0_VAL 0x130
|
||||
|
||||
#define ICPU_MEMCTRL_MR1_VAL 0x134
|
||||
|
||||
#define ICPU_MEMCTRL_MR2_VAL 0x138
|
||||
|
||||
#define ICPU_MEMCTRL_MR3_VAL 0x13c
|
||||
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL 0x140
|
||||
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_RD_EXT BIT(11)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_RD_ENA(x) (((x) << 7) & GENMASK(10, 7))
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_RD_ENA_M GENMASK(10, 7)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_RD_ENA_X(x) (((x) & GENMASK(10, 7)) >> 7)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_WR_EXT BIT(6)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_WR_ENA(x) (((x) << 2) & GENMASK(5, 2))
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_WR_ENA_M GENMASK(5, 2)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_WR_ENA_X(x) (((x) & GENMASK(5, 2)) >> 2)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_LOCAL_ODT_RD_EXT BIT(1)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_LOCAL_ODT_RD_ENA BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_DFT 0x144
|
||||
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_LBW BIT(7)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_GATE_ENA BIT(6)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_TERM_ENA BIT(5)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_A10 BIT(4)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_STAT BIT(3)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_MODE(x) (((x) << 1) & GENMASK(2, 1))
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_MODE_M GENMASK(2, 1)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_MODE_X(x) (((x) & GENMASK(2, 1)) >> 1)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_ENA BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_DQS_DLY(x) (0x148 + 0x4 * (x))
|
||||
#define ICPU_MEMCTRL_DQS_DLY_RSZ 0x2
|
||||
|
||||
#define ICPU_MEMCTRL_DQS_DLY_TRAIN_DQ_ENA BIT(11)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM1(x) (((x) << 8) & GENMASK(10, 8))
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM1_M GENMASK(10, 8)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM1_X(x) (((x) & GENMASK(10, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM0(x) (((x) << 5) & GENMASK(7, 5))
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM0_M GENMASK(7, 5)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM0_X(x) (((x) & GENMASK(7, 5)) >> 5)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY(x) ((x) & GENMASK(4, 0))
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_M GENMASK(4, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_DQS_AUTO 0x150
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_RSZ 0x2
|
||||
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_DRIFT(x) (((x) << 6) & GENMASK(7, 6))
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_DRIFT_M GENMASK(7, 6)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_DRIFT_X(x) (((x) & GENMASK(7, 6)) >> 6)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_OVERFLOW BIT(5)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_UNDERFLOW BIT(4)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_AUTO_SRC BIT(3)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_AUTO_UP BIT(2)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_AUTO_DOWN BIT(1)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_AUTO_ENA BIT(0)
|
||||
|
||||
#define ICPU_MEMPHY_CFG 0x158
|
||||
|
||||
#define ICPU_MEMPHY_CFG_PHY_FLUSH_DIS BIT(10)
|
||||
#define ICPU_MEMPHY_CFG_PHY_RD_ADJ_DIS BIT(9)
|
||||
#define ICPU_MEMPHY_CFG_PHY_DQS_EXT BIT(8)
|
||||
#define ICPU_MEMPHY_CFG_PHY_FIFO_RST BIT(7)
|
||||
#define ICPU_MEMPHY_CFG_PHY_DLL_BL_RST BIT(6)
|
||||
#define ICPU_MEMPHY_CFG_PHY_DLL_CL_RST BIT(5)
|
||||
#define ICPU_MEMPHY_CFG_PHY_ODT_OE BIT(4)
|
||||
#define ICPU_MEMPHY_CFG_PHY_CK_OE BIT(3)
|
||||
#define ICPU_MEMPHY_CFG_PHY_CL_OE BIT(2)
|
||||
#define ICPU_MEMPHY_CFG_PHY_SSTL_ENA BIT(1)
|
||||
#define ICPU_MEMPHY_CFG_PHY_RST BIT(0)
|
||||
|
||||
#define ICPU_MEMPHY_ZCAL 0x180
|
||||
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_CLK_SEL BIT(9)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_ODT(x) (((x) << 5) & GENMASK(8, 5))
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_ODT_M GENMASK(8, 5)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_ODT_X(x) (((x) & GENMASK(8, 5)) >> 5)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG(x) (((x) << 1) & GENMASK(4, 1))
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_M GENMASK(4, 1)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_X(x) (((x) & GENMASK(4, 1)) >> 1)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_ENA BIT(0)
|
||||
|
||||
#define ICPU_MEMPHY_ZCAL_STAT 0x184
|
||||
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_ZCTRL(x) (((x) << 12) & GENMASK(31, 12))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_ZCTRL_M GENMASK(31, 12)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_ZCTRL_X(x) (((x) & GENMASK(31, 12)) >> 12)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPU(x) (((x) << 8) & GENMASK(9, 8))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPU_M GENMASK(9, 8)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPU_X(x) (((x) & GENMASK(9, 8)) >> 8)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPD(x) (((x) << 6) & GENMASK(7, 6))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPD_M GENMASK(7, 6)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPD_X(x) (((x) & GENMASK(7, 6)) >> 6)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PU(x) (((x) << 4) & GENMASK(5, 4))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PU_M GENMASK(5, 4)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PU_X(x) (((x) & GENMASK(5, 4)) >> 4)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PD(x) (((x) << 2) & GENMASK(3, 2))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PD_M GENMASK(3, 2)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PD_X(x) (((x) & GENMASK(3, 2)) >> 2)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_ERR BIT(1)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_DONE BIT(0)
|
||||
|
||||
#endif
|
24
arch/mips/mach-mscc/include/mach/servalt/servalt.h
Normal file
24
arch/mips/mach-mscc/include/mach/servalt/servalt.h
Normal file
@ -0,0 +1,24 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||||
/*
|
||||
* Microsemi Servalt Switch driver
|
||||
*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#ifndef _MSCC_SERVALT_H_
|
||||
#define _MSCC_SERVALT_H_
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <dm.h>
|
||||
|
||||
/*
|
||||
* Target offset base(s)
|
||||
*/
|
||||
#define MSCC_IO_ORIGIN1_OFFSET 0x70000000
|
||||
#define MSCC_IO_ORIGIN1_SIZE 0x00200000
|
||||
#define MSCC_IO_ORIGIN2_OFFSET 0x71000000
|
||||
#define MSCC_IO_ORIGIN2_SIZE 0x01000000
|
||||
#define BASE_CFG ((void __iomem *)0x70000000)
|
||||
#define BASE_DEVCPU_GCB ((void __iomem *)0x71010000)
|
||||
|
||||
#endif
|
@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#ifndef _MSCC_SERVALT_DEVCPU_GCB_H_
|
||||
#define _MSCC_SERVALT_DEVCPU_GCB_H_
|
||||
|
||||
#define PERF_GPR 0x4
|
||||
|
||||
#define PERF_SOFT_RST 0x8
|
||||
|
||||
#define PERF_SOFT_RST_SOFT_NON_CFG_RST BIT(2)
|
||||
#define PERF_SOFT_RST_SOFT_SWC_RST BIT(1)
|
||||
#define PERF_SOFT_RST_SOFT_CHIP_RST BIT(0)
|
||||
|
||||
#define GPIO_GPIO_ALT(x) (0x74 + 4 * (x))
|
||||
#define GPIO_GPIO_ALT1(x) (0x7c + 4 * (x))
|
||||
|
||||
#endif
|
@ -0,0 +1,25 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#ifndef _MSCC_SERVALT_DEVCPU_GCB_MIIM_REGS_H_
|
||||
#define _MSCC_SERVALT_DEVCPU_GCB_MIIM_REGS_H_
|
||||
|
||||
#define MIIM_MII_STATUS(gi) (0xc4 + (gi * 36))
|
||||
#define MIIM_MII_CMD(gi) (0xcc + (gi * 36))
|
||||
#define MIIM_MII_DATA(gi) (0xd0 + (gi * 36))
|
||||
|
||||
#define MSCC_F_MII_STATUS_MIIM_STAT_BUSY(x) ((x) ? BIT(3) : 0)
|
||||
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_VLD(x) ((x) ? BIT(31) : 0)
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_PHYAD(x) (GENMASK(29, 25) & ((x) << 25))
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_REGAD(x) (GENMASK(24, 20) & ((x) << 20))
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_WRDATA(x) (GENMASK(19, 4) & ((x) << 4))
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_OPR_FIELD(x) (GENMASK(2, 1) & ((x) << 1))
|
||||
#define MSCC_F_MII_CMD_MIIM_CMD_SCAN(x) ((x) ? BIT(0) : 0)
|
||||
|
||||
#define MSCC_M_MII_DATA_MIIM_DATA_SUCCESS GENMASK(17, 16)
|
||||
#define MSCC_X_MII_DATA_MIIM_DATA_RDDATA(x) (((x) >> 0) & GENMASK(15, 0))
|
||||
|
||||
#endif
|
319
arch/mips/mach-mscc/include/mach/servalt/servalt_icpu_cfg.h
Normal file
319
arch/mips/mach-mscc/include/mach/servalt/servalt_icpu_cfg.h
Normal file
@ -0,0 +1,319 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#ifndef _MSCC_SERVALT_ICPU_CFG_H_
|
||||
#define _MSCC_SERVALT_ICPU_CFG_H_
|
||||
|
||||
#define ICPU_GPR(x) (0x4 * (x))
|
||||
#define ICPU_GPR_RSZ 0x8
|
||||
|
||||
#define ICPU_RESET 0x20
|
||||
|
||||
#define ICPU_RESET_CORE_RST_CPU_ONLY BIT(3)
|
||||
#define ICPU_RESET_CORE_RST_PROTECT BIT(2)
|
||||
#define ICPU_RESET_CORE_RST_FORCE BIT(1)
|
||||
#define ICPU_RESET_MEM_RST_FORCE BIT(0)
|
||||
|
||||
#define ICPU_GENERAL_CTRL 0x24
|
||||
|
||||
#define ICPU_GENERAL_CTRL_CPU_BUSIF_SLEEP_DIS BIT(14)
|
||||
#define ICPU_GENERAL_CTRL_CPU_BUSIF_WERR_ENA BIT(13)
|
||||
#define ICPU_GENERAL_CTRL_CPU_8051_IROM_ENA BIT(12)
|
||||
#define ICPU_GENERAL_CTRL_CPU_MIPS_DIS BIT(11)
|
||||
#define ICPU_GENERAL_CTRL_IF_MIIM_SLV_ADDR_SEL BIT(10)
|
||||
#define ICPU_GENERAL_CTRL_IF_MIIM_SLV_ENA BIT(9)
|
||||
#define ICPU_GENERAL_CTRL_IF_PI_SLV_DONEPOL BIT(8)
|
||||
#define ICPU_GENERAL_CTRL_IF_PI_MST_ENA BIT(7)
|
||||
#define ICPU_GENERAL_CTRL_IF_PI_SLV_ENA BIT(6)
|
||||
#define ICPU_GENERAL_CTRL_IF_SI_OWNER(x) (((x) << 4) & GENMASK(5, 4))
|
||||
#define ICPU_GENERAL_CTRL_IF_SI_OWNER_M GENMASK(5, 4)
|
||||
#define ICPU_GENERAL_CTRL_IF_SI_OWNER_X(x) (((x) & GENMASK(5, 4)) >> 4)
|
||||
#define ICPU_GENERAL_CTRL_SIMC_SSP_ENA BIT(3)
|
||||
#define ICPU_GENERAL_CTRL_CPU_BE_ENA BIT(2)
|
||||
#define ICPU_GENERAL_CTRL_CPU_DIS BIT(1)
|
||||
#define ICPU_GENERAL_CTRL_BOOT_MODE_ENA BIT(0)
|
||||
|
||||
#define ICPU_SPI_MST_CFG 0x3c
|
||||
|
||||
#define ICPU_SPI_MST_CFG_A32B_ENA BIT(11)
|
||||
#define ICPU_SPI_MST_CFG_FAST_READ_ENA BIT(10)
|
||||
#define ICPU_SPI_MST_CFG_CS_DESELECT_TIME(x) (((x) << 5) & GENMASK(9, 5))
|
||||
#define ICPU_SPI_MST_CFG_CS_DESELECT_TIME_M GENMASK(9, 5)
|
||||
#define ICPU_SPI_MST_CFG_CS_DESELECT_TIME_X(x) (((x) & GENMASK(9, 5)) >> 5)
|
||||
#define ICPU_SPI_MST_CFG_CLK_DIV(x) ((x) & GENMASK(4, 0))
|
||||
#define ICPU_SPI_MST_CFG_CLK_DIV_M GENMASK(4, 0)
|
||||
|
||||
#define ICPU_SW_MODE 0x50
|
||||
|
||||
#define ICPU_SW_MODE_SW_PIN_CTRL_MODE BIT(13)
|
||||
#define ICPU_SW_MODE_SW_SPI_SCK BIT(12)
|
||||
#define ICPU_SW_MODE_SW_SPI_SCK_OE BIT(11)
|
||||
#define ICPU_SW_MODE_SW_SPI_SDO BIT(10)
|
||||
#define ICPU_SW_MODE_SW_SPI_SDO_OE BIT(9)
|
||||
#define ICPU_SW_MODE_SW_SPI_CS(x) (((x) << 5) & GENMASK(8, 5))
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_M GENMASK(8, 5)
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_X(x) (((x) & GENMASK(8, 5)) >> 5)
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_OE(x) (((x) << 1) & GENMASK(4, 1))
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_OE_M GENMASK(4, 1)
|
||||
#define ICPU_SW_MODE_SW_SPI_CS_OE_X(x) (((x) & GENMASK(4, 1)) >> 1)
|
||||
#define ICPU_SW_MODE_SW_SPI_SDI BIT(0)
|
||||
|
||||
#define ICPU_INTR_ENA 0x88
|
||||
|
||||
#define ICPU_DST_INTR_MAP(x) (0x98 + 0x4 * (x))
|
||||
#define ICPU_DST_INTR_MAP_RSZ 0x4
|
||||
|
||||
#define ICPU_TIMER_TICK_DIV 0xe8
|
||||
|
||||
#define ICPU_TIMER_VALUE(x) (0xec + 0x4 * (x))
|
||||
#define ICPU_TIMER_VALUE_RSZ 0x2
|
||||
|
||||
#define ICPU_TIMER_CTRL(x) (0x104 + 0x4 * (x))
|
||||
#define ICPU_TIMER_CTRL_RSZ 0x2
|
||||
|
||||
#define ICPU_TIMER_CTRL_MAX_FREQ_ENA BIT(3)
|
||||
#define ICPU_TIMER_CTRL_ONE_SHOT_ENA BIT(2)
|
||||
#define ICPU_TIMER_CTRL_TIMER_ENA BIT(1)
|
||||
#define ICPU_TIMER_CTRL_FORCE_RELOAD BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_CTRL 0x110
|
||||
|
||||
#define ICPU_MEMCTRL_CTRL_PWR_DOWN BIT(3)
|
||||
#define ICPU_MEMCTRL_CTRL_MDSET BIT(2)
|
||||
#define ICPU_MEMCTRL_CTRL_STALL_REF_ENA BIT(1)
|
||||
#define ICPU_MEMCTRL_CTRL_INITIALIZE BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_CFG 0x114
|
||||
|
||||
#define ICPU_MEMCTRL_CFG_DDR_512MBYTE_PLUS BIT(16)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_ECC_ERR_ENA BIT(15)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_ECC_COR_ENA BIT(14)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_ECC_ENA BIT(13)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_WIDTH BIT(12)
|
||||
#define ICPU_MEMCTRL_CFG_DDR_MODE BIT(11)
|
||||
#define ICPU_MEMCTRL_CFG_BURST_SIZE BIT(10)
|
||||
#define ICPU_MEMCTRL_CFG_BURST_LEN BIT(9)
|
||||
#define ICPU_MEMCTRL_CFG_BANK_CNT BIT(8)
|
||||
#define ICPU_MEMCTRL_CFG_MSB_ROW_ADDR(x) (((x) << 4) & GENMASK(7, 4))
|
||||
#define ICPU_MEMCTRL_CFG_MSB_ROW_ADDR_M GENMASK(7, 4)
|
||||
#define ICPU_MEMCTRL_CFG_MSB_ROW_ADDR_X(x) (((x) & GENMASK(7, 4)) >> 4)
|
||||
#define ICPU_MEMCTRL_CFG_MSB_COL_ADDR(x) ((x) & GENMASK(3, 0))
|
||||
#define ICPU_MEMCTRL_CFG_MSB_COL_ADDR_M GENMASK(3, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_STAT 0x118
|
||||
|
||||
#define ICPU_MEMCTRL_STAT_RDATA_MASKED BIT(5)
|
||||
#define ICPU_MEMCTRL_STAT_RDATA_DUMMY BIT(4)
|
||||
#define ICPU_MEMCTRL_STAT_RDATA_ECC_ERR BIT(3)
|
||||
#define ICPU_MEMCTRL_STAT_RDATA_ECC_COR BIT(2)
|
||||
#define ICPU_MEMCTRL_STAT_PWR_DOWN_ACK BIT(1)
|
||||
#define ICPU_MEMCTRL_STAT_INIT_DONE BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_REF_PERIOD 0x11c
|
||||
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_MAX_PEND_REF(x) (((x) << 16) & GENMASK(19, 16))
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_MAX_PEND_REF_M GENMASK(19, 16)
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_MAX_PEND_REF_X(x) (((x) & GENMASK(19, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_REF_PERIOD(x) ((x) & GENMASK(15, 0))
|
||||
#define ICPU_MEMCTRL_REF_PERIOD_REF_PERIOD_M GENMASK(15, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_ZQCAL 0x120
|
||||
|
||||
#define ICPU_MEMCTRL_ZQCAL_ZQCAL_LONG BIT(1)
|
||||
#define ICPU_MEMCTRL_ZQCAL_ZQCAL_SHORT BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING0 0x124
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_WR_DLY(x) (((x) << 28) & GENMASK(31, 28))
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_WR_DLY_M GENMASK(31, 28)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_WR_DLY_X(x) (((x) & GENMASK(31, 28)) >> 28)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_CS_CHANGE_DLY(x) (((x) << 24) & GENMASK(27, 24))
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_CS_CHANGE_DLY_M GENMASK(27, 24)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_CS_CHANGE_DLY_X(x) (((x) & GENMASK(27, 24)) >> 24)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_CS_CHANGE_DLY(x) (((x) << 20) & GENMASK(23, 20))
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_CS_CHANGE_DLY_M GENMASK(23, 20)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_CS_CHANGE_DLY_X(x) (((x) & GENMASK(23, 20)) >> 20)
|
||||
#define ICPU_MEMCTRL_TIMING0_RAS_TO_PRECH_DLY(x) (((x) << 16) & GENMASK(19, 16))
|
||||
#define ICPU_MEMCTRL_TIMING0_RAS_TO_PRECH_DLY_M GENMASK(19, 16)
|
||||
#define ICPU_MEMCTRL_TIMING0_RAS_TO_PRECH_DLY_X(x) (((x) & GENMASK(19, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_TO_PRECH_DLY(x) (((x) << 12) & GENMASK(15, 12))
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_TO_PRECH_DLY_M GENMASK(15, 12)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_TO_PRECH_DLY_X(x) (((x) & GENMASK(15, 12)) >> 12)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_PRECH_DLY(x) (((x) << 8) & GENMASK(11, 8))
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_PRECH_DLY_M GENMASK(11, 8)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_TO_PRECH_DLY_X(x) (((x) & GENMASK(11, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_DATA_XFR_DLY(x) (((x) << 4) & GENMASK(7, 4))
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_DATA_XFR_DLY_M GENMASK(7, 4)
|
||||
#define ICPU_MEMCTRL_TIMING0_WR_DATA_XFR_DLY_X(x) (((x) & GENMASK(7, 4)) >> 4)
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_DATA_XFR_DLY(x) ((x) & GENMASK(3, 0))
|
||||
#define ICPU_MEMCTRL_TIMING0_RD_DATA_XFR_DLY_M GENMASK(3, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING1 0x128
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_SAME_BANK_DLY(x) (((x) << 24) & GENMASK(31, 24))
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_SAME_BANK_DLY_M GENMASK(31, 24)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_SAME_BANK_DLY_X(x) (((x) & GENMASK(31, 24)) >> 24)
|
||||
#define ICPU_MEMCTRL_TIMING1_BANK8_FAW_DLY(x) (((x) << 16) & GENMASK(23, 16))
|
||||
#define ICPU_MEMCTRL_TIMING1_BANK8_FAW_DLY_M GENMASK(23, 16)
|
||||
#define ICPU_MEMCTRL_TIMING1_BANK8_FAW_DLY_X(x) (((x) & GENMASK(23, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_TIMING1_PRECH_TO_RAS_DLY(x) (((x) << 12) & GENMASK(15, 12))
|
||||
#define ICPU_MEMCTRL_TIMING1_PRECH_TO_RAS_DLY_M GENMASK(15, 12)
|
||||
#define ICPU_MEMCTRL_TIMING1_PRECH_TO_RAS_DLY_X(x) (((x) & GENMASK(15, 12)) >> 12)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_DLY(x) (((x) << 8) & GENMASK(11, 8))
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_DLY_M GENMASK(11, 8)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_RAS_DLY_X(x) (((x) & GENMASK(11, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_CAS_DLY(x) (((x) << 4) & GENMASK(7, 4))
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_CAS_DLY_M GENMASK(7, 4)
|
||||
#define ICPU_MEMCTRL_TIMING1_RAS_TO_CAS_DLY_X(x) (((x) & GENMASK(7, 4)) >> 4)
|
||||
#define ICPU_MEMCTRL_TIMING1_WR_TO_RD_DLY(x) ((x) & GENMASK(3, 0))
|
||||
#define ICPU_MEMCTRL_TIMING1_WR_TO_RD_DLY_M GENMASK(3, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING2 0x12c
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING2_PRECH_ALL_DLY(x) (((x) << 28) & GENMASK(31, 28))
|
||||
#define ICPU_MEMCTRL_TIMING2_PRECH_ALL_DLY_M GENMASK(31, 28)
|
||||
#define ICPU_MEMCTRL_TIMING2_PRECH_ALL_DLY_X(x) (((x) & GENMASK(31, 28)) >> 28)
|
||||
#define ICPU_MEMCTRL_TIMING2_MDSET_DLY(x) (((x) << 24) & GENMASK(27, 24))
|
||||
#define ICPU_MEMCTRL_TIMING2_MDSET_DLY_M GENMASK(27, 24)
|
||||
#define ICPU_MEMCTRL_TIMING2_MDSET_DLY_X(x) (((x) & GENMASK(27, 24)) >> 24)
|
||||
#define ICPU_MEMCTRL_TIMING2_REF_DLY(x) (((x) << 16) & GENMASK(23, 16))
|
||||
#define ICPU_MEMCTRL_TIMING2_REF_DLY_M GENMASK(23, 16)
|
||||
#define ICPU_MEMCTRL_TIMING2_REF_DLY_X(x) (((x) & GENMASK(23, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_TIMING2_INIT_DLY(x) ((x) & GENMASK(15, 0))
|
||||
#define ICPU_MEMCTRL_TIMING2_INIT_DLY_M GENMASK(15, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING3 0x130
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING3_RMW_DLY(x) (((x) << 16) & GENMASK(19, 16))
|
||||
#define ICPU_MEMCTRL_TIMING3_RMW_DLY_M GENMASK(19, 16)
|
||||
#define ICPU_MEMCTRL_TIMING3_RMW_DLY_X(x) (((x) & GENMASK(19, 16)) >> 16)
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_RD_DLY(x) (((x) << 12) & GENMASK(15, 12))
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_RD_DLY_M GENMASK(15, 12)
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_RD_DLY_X(x) (((x) & GENMASK(15, 12)) >> 12)
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_WR_DLY(x) (((x) << 8) & GENMASK(11, 8))
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_WR_DLY_M GENMASK(11, 8)
|
||||
#define ICPU_MEMCTRL_TIMING3_ODT_WR_DLY_X(x) (((x) & GENMASK(11, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_TIMING3_LOCAL_ODT_RD_DLY(x) (((x) << 4) & GENMASK(7, 4))
|
||||
#define ICPU_MEMCTRL_TIMING3_LOCAL_ODT_RD_DLY_M GENMASK(7, 4)
|
||||
#define ICPU_MEMCTRL_TIMING3_LOCAL_ODT_RD_DLY_X(x) (((x) & GENMASK(7, 4)) >> 4)
|
||||
#define ICPU_MEMCTRL_TIMING3_WR_TO_RD_CS_CHANGE_DLY(x) ((x) & GENMASK(3, 0))
|
||||
#define ICPU_MEMCTRL_TIMING3_WR_TO_RD_CS_CHANGE_DLY_M GENMASK(3, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING4 0x134
|
||||
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_INIT_DLY(x) (((x) << 20) & GENMASK(31, 20))
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_INIT_DLY_M GENMASK(31, 20)
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_INIT_DLY_X(x) (((x) & GENMASK(31, 20)) >> 20)
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_LONG_DLY(x) (((x) << 8) & GENMASK(19, 8))
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_LONG_DLY_M GENMASK(19, 8)
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_LONG_DLY_X(x) (((x) & GENMASK(19, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_SHORT_DLY(x) ((x) & GENMASK(7, 0))
|
||||
#define ICPU_MEMCTRL_TIMING4_ZQCAL_SHORT_DLY_M GENMASK(7, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_MR0_VAL 0x138
|
||||
|
||||
#define ICPU_MEMCTRL_MR1_VAL 0x13c
|
||||
|
||||
#define ICPU_MEMCTRL_MR2_VAL 0x140
|
||||
|
||||
#define ICPU_MEMCTRL_MR3_VAL 0x144
|
||||
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL 0x148
|
||||
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_RD_EXT BIT(11)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_RD_ENA(x) (((x) << 7) & GENMASK(10, 7))
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_RD_ENA_M GENMASK(10, 7)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_RD_ENA_X(x) (((x) & GENMASK(10, 7)) >> 7)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_WR_EXT BIT(6)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_WR_ENA(x) (((x) << 2) & GENMASK(5, 2))
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_WR_ENA_M GENMASK(5, 2)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_ODT_WR_ENA_X(x) (((x) & GENMASK(5, 2)) >> 2)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_LOCAL_ODT_RD_EXT BIT(1)
|
||||
#define ICPU_MEMCTRL_TERMRES_CTRL_LOCAL_ODT_RD_ENA BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_DFT 0x14c
|
||||
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_LBW BIT(7)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_GATE_ENA BIT(6)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_TERM_ENA BIT(5)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_A10 BIT(4)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_STAT BIT(3)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_MODE(x) (((x) << 1) & GENMASK(2, 1))
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_MODE_M GENMASK(2, 1)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_MODE_X(x) (((x) & GENMASK(2, 1)) >> 1)
|
||||
#define ICPU_MEMCTRL_DFT_DDRDFT_ENA BIT(0)
|
||||
|
||||
#define ICPU_MEMCTRL_DQS_DLY(x) (0x150 + 0x4 * (x))
|
||||
#define ICPU_MEMCTRL_DQS_DLY_RSZ 0x2
|
||||
|
||||
#define ICPU_MEMCTRL_DQS_DLY_TRAIN_DQ_ENA BIT(11)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM1(x) (((x) << 8) & GENMASK(10, 8))
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM1_M GENMASK(10, 8)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM1_X(x) (((x) & GENMASK(10, 8)) >> 8)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM0(x) (((x) << 5) & GENMASK(7, 5))
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM0_M GENMASK(7, 5)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_TRM0_X(x) (((x) & GENMASK(7, 5)) >> 5)
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY(x) ((x) & GENMASK(4, 0))
|
||||
#define ICPU_MEMCTRL_DQS_DLY_DQS_DLY_M GENMASK(4, 0)
|
||||
|
||||
#define ICPU_MEMCTRL_DQS_AUTO (0x158 + 0x4 * (x))
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_RSZ 0x2
|
||||
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_DRIFT(x) (((x) << 6) & GENMASK(7, 6))
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_DRIFT_M GENMASK(7, 6)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_DRIFT_X(x) (((x) & GENMASK(7, 6)) >> 6)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_OVERFLOW BIT(5)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_UNDERFLOW BIT(4)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_AUTO_SRC BIT(3)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_AUTO_UP BIT(2)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_AUTO_DOWN BIT(1)
|
||||
#define ICPU_MEMCTRL_DQS_AUTO_DQS_AUTO_ENA BIT(0)
|
||||
|
||||
#define ICPU_MEMPHY_CFG 0x160
|
||||
|
||||
#define ICPU_MEMPHY_CFG_PHY_FLUSH_DIS BIT(10)
|
||||
#define ICPU_MEMPHY_CFG_PHY_RD_ADJ_DIS BIT(9)
|
||||
#define ICPU_MEMPHY_CFG_PHY_DQS_EXT BIT(8)
|
||||
#define ICPU_MEMPHY_CFG_PHY_FIFO_RST BIT(7)
|
||||
#define ICPU_MEMPHY_CFG_PHY_DLL_BL_RST BIT(6)
|
||||
#define ICPU_MEMPHY_CFG_PHY_DLL_CL_RST BIT(5)
|
||||
#define ICPU_MEMPHY_CFG_PHY_ODT_OE BIT(4)
|
||||
#define ICPU_MEMPHY_CFG_PHY_CK_OE BIT(3)
|
||||
#define ICPU_MEMPHY_CFG_PHY_CL_OE BIT(2)
|
||||
#define ICPU_MEMPHY_CFG_PHY_SSTL_ENA BIT(1)
|
||||
#define ICPU_MEMPHY_CFG_PHY_RST BIT(0)
|
||||
|
||||
#define ICPU_MEMPHY_ZCAL 0x188
|
||||
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_CLK_SEL BIT(9)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_ODT(x) (((x) << 5) & GENMASK(8, 5))
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_ODT_M GENMASK(8, 5)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_ODT_X(x) (((x) & GENMASK(8, 5)) >> 5)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG(x) (((x) << 1) & GENMASK(4, 1))
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_M GENMASK(4, 1)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_PROG_X(x) (((x) & GENMASK(4, 1)) >> 1)
|
||||
#define ICPU_MEMPHY_ZCAL_ZCAL_ENA BIT(0)
|
||||
|
||||
#define ICPU_MEMPHY_ZCAL_STAT 0x18c
|
||||
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_ZCTRL(x) (((x) << 12) & GENMASK(31, 12))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_ZCTRL_M GENMASK(31, 12)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_ZCTRL_X(x) (((x) & GENMASK(31, 12)) >> 12)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPU(x) (((x) << 8) & GENMASK(9, 8))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPU_M GENMASK(9, 8)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPU_X(x) (((x) & GENMASK(9, 8)) >> 8)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPD(x) (((x) << 6) & GENMASK(7, 6))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPD_M GENMASK(7, 6)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_ODTPD_X(x) (((x) & GENMASK(7, 6)) >> 6)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PU(x) (((x) << 4) & GENMASK(5, 4))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PU_M GENMASK(5, 4)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PU_X(x) (((x) & GENMASK(5, 4)) >> 4)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PD(x) (((x) << 2) & GENMASK(3, 2))
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PD_M GENMASK(3, 2)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_STAT_PD_X(x) (((x) & GENMASK(3, 2)) >> 2)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_ERR BIT(1)
|
||||
#define ICPU_MEMPHY_ZCAL_STAT_ZCAL_DONE BIT(0)
|
||||
|
||||
#endif
|
@ -12,7 +12,7 @@
|
||||
|
||||
void _machine_restart(void)
|
||||
{
|
||||
#if defined(CONFIG_SOC_JR2)
|
||||
#if defined(CONFIG_SOC_JR2) || defined(CONFIG_SOC_SERVALT)
|
||||
register u32 reg = readl(BASE_CFG + ICPU_GENERAL_CTRL);
|
||||
/* Set owner */
|
||||
reg &= ~ICPU_GENERAL_CTRL_IF_SI_OWNER_M;
|
||||
@ -27,7 +27,30 @@ void _machine_restart(void)
|
||||
ICPU_RESET_CORE_RST_CPU_ONLY |
|
||||
ICPU_RESET_CORE_RST_FORCE,
|
||||
BASE_CFG + ICPU_RESET);
|
||||
#else
|
||||
#elif defined(CONFIG_SOC_SERVAL)
|
||||
register unsigned long i;
|
||||
|
||||
/* Prevent VCore-III from being reset with a global reset */
|
||||
writel(ICPU_RESET_CORE_RST_PROTECT, BASE_CFG + ICPU_RESET);
|
||||
|
||||
/* Do global reset */
|
||||
writel(PERF_SOFT_RST_SOFT_CHIP_RST, BASE_DEVCPU_GCB + PERF_SOFT_RST);
|
||||
|
||||
for (i = 0; i < 1000; i++)
|
||||
;
|
||||
|
||||
/* Power down DDR for clean DDR re-training */
|
||||
writel(readl(BASE_CFG + ICPU_MEMCTRL_CTRL) |
|
||||
ICPU_MEMCTRL_CTRL_PWR_DOWN,
|
||||
BASE_CFG + ICPU_MEMCTRL_CTRL);
|
||||
|
||||
while (!(readl(BASE_CFG + ICPU_MEMCTRL_STAT) &
|
||||
ICPU_MEMCTRL_STAT_PWR_DOWN_ACK))
|
||||
;
|
||||
|
||||
/* Reset VCore-III, only. */
|
||||
writel(ICPU_RESET_CORE_RST_FORCE, BASE_CFG + ICPU_RESET);
|
||||
#else /* Luton || Ocelot */
|
||||
register u32 resetbits = PERF_SOFT_RST_SOFT_CHIP_RST;
|
||||
(void)readl(BASE_DEVCPU_GCB + PERF_SOFT_RST);
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <environment.h>
|
||||
#include <spi.h>
|
||||
#include <led.h>
|
||||
#include <wait_bit.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
@ -18,6 +19,29 @@ enum {
|
||||
BOARD_TYPE_PCB123,
|
||||
};
|
||||
|
||||
void mscc_switch_reset(bool enter)
|
||||
{
|
||||
/* Nasty workaround to avoid GPIO19 (DDR!) being reset */
|
||||
mscc_gpio_set_alternate(19, 2);
|
||||
|
||||
debug("applying SwC reset\n");
|
||||
|
||||
writel(ICPU_RESET_CORE_RST_PROTECT, BASE_CFG + ICPU_RESET);
|
||||
writel(PERF_SOFT_RST_SOFT_CHIP_RST, BASE_DEVCPU_GCB + PERF_SOFT_RST);
|
||||
|
||||
if (wait_for_bit_le32(BASE_DEVCPU_GCB + PERF_SOFT_RST,
|
||||
PERF_SOFT_RST_SOFT_CHIP_RST, false, 5000, false))
|
||||
pr_err("Tiemout while waiting for switch reset\n");
|
||||
|
||||
/*
|
||||
* Reset GPIO19 mode back as regular GPIO, output, high (DDR
|
||||
* not reset) (Order is important)
|
||||
*/
|
||||
setbits_le32(BASE_DEVCPU_GCB + PERF_GPIO_OE, BIT(19));
|
||||
writel(BIT(19), BASE_DEVCPU_GCB + PERF_GPIO_OUT_SET);
|
||||
mscc_gpio_set_alternate(19, 0);
|
||||
}
|
||||
|
||||
void board_debug_uart_init(void)
|
||||
{
|
||||
/* too early for the pinctrl driver, so configure the UART pins here */
|
||||
|
14
board/mscc/serval/Kconfig
Normal file
14
board/mscc/serval/Kconfig
Normal file
@ -0,0 +1,14 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
|
||||
config SYS_VENDOR
|
||||
default "mscc"
|
||||
|
||||
if SOC_SERVAL
|
||||
|
||||
config SYS_BOARD
|
||||
default "serval"
|
||||
|
||||
config SYS_CONFIG_NAME
|
||||
default "serval"
|
||||
|
||||
endif
|
3
board/mscc/serval/Makefile
Normal file
3
board/mscc/serval/Makefile
Normal file
@ -0,0 +1,3 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
|
||||
obj-$(CONFIG_SOC_SERVAL) := serval.o
|
74
board/mscc/serval/serval.c
Normal file
74
board/mscc/serval/serval.c
Normal file
@ -0,0 +1,74 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <led.h>
|
||||
|
||||
enum {
|
||||
BOARD_TYPE_PCB106 = 0xAABBCD00,
|
||||
BOARD_TYPE_PCB105,
|
||||
};
|
||||
|
||||
int board_early_init_r(void)
|
||||
{
|
||||
/* Prepare SPI controller to be used in master mode */
|
||||
writel(0, BASE_CFG + ICPU_SW_MODE);
|
||||
|
||||
/* Address of boot parameters */
|
||||
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE;
|
||||
|
||||
/* LED setup */
|
||||
if (IS_ENABLED(CONFIG_LED))
|
||||
led_default_state();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void do_board_detect(void)
|
||||
{
|
||||
u16 gpio_in_reg;
|
||||
|
||||
/* Set MDIO and MDC */
|
||||
mscc_gpio_set_alternate(9, 2);
|
||||
mscc_gpio_set_alternate(10, 2);
|
||||
|
||||
/* Set GPIO page */
|
||||
mscc_phy_wr(1, 16, 31, 0x10);
|
||||
if (!mscc_phy_rd(1, 16, 15, &gpio_in_reg)) {
|
||||
if (gpio_in_reg & 0x200)
|
||||
gd->board_type = BOARD_TYPE_PCB106;
|
||||
else
|
||||
gd->board_type = BOARD_TYPE_PCB105;
|
||||
mscc_phy_wr(1, 16, 15, 0);
|
||||
} else {
|
||||
gd->board_type = BOARD_TYPE_PCB105;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_MULTI_DTB_FIT)
|
||||
int board_fit_config_name_match(const char *name)
|
||||
{
|
||||
if (gd->board_type == BOARD_TYPE_PCB106 &&
|
||||
strcmp(name, "serval_pcb106") == 0)
|
||||
return 0;
|
||||
|
||||
if (gd->board_type == BOARD_TYPE_PCB105 &&
|
||||
strcmp(name, "serval_pcb105") == 0)
|
||||
return 0;
|
||||
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DTB_RESELECT)
|
||||
int embedded_dtb_select(void)
|
||||
{
|
||||
do_board_detect();
|
||||
fdtdec_setup();
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
14
board/mscc/servalt/Kconfig
Normal file
14
board/mscc/servalt/Kconfig
Normal file
@ -0,0 +1,14 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
|
||||
config SYS_VENDOR
|
||||
default "mscc"
|
||||
|
||||
if SOC_SERVALT
|
||||
|
||||
config SYS_BOARD
|
||||
default "servalt"
|
||||
|
||||
config SYS_CONFIG_NAME
|
||||
default "servalt"
|
||||
|
||||
endif
|
3
board/mscc/servalt/Makefile
Normal file
3
board/mscc/servalt/Makefile
Normal file
@ -0,0 +1,3 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
|
||||
obj-$(CONFIG_SOC_SERVALT) := servalt.o
|
52
board/mscc/servalt/servalt.c
Normal file
52
board/mscc/servalt/servalt.c
Normal file
@ -0,0 +1,52 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <led.h>
|
||||
|
||||
enum {
|
||||
BOARD_TYPE_PCB116 = 0xAABBCE00,
|
||||
};
|
||||
|
||||
int board_early_init_r(void)
|
||||
{
|
||||
/* Prepare SPI controller to be used in master mode */
|
||||
writel(0, BASE_CFG + ICPU_SW_MODE);
|
||||
|
||||
/* Address of boot parameters */
|
||||
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE;
|
||||
|
||||
/* LED setup */
|
||||
if (IS_ENABLED(CONFIG_LED))
|
||||
led_default_state();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void do_board_detect(void)
|
||||
{
|
||||
gd->board_type = BOARD_TYPE_PCB116; /* ServalT */
|
||||
}
|
||||
|
||||
#if defined(CONFIG_MULTI_DTB_FIT)
|
||||
int board_fit_config_name_match(const char *name)
|
||||
{
|
||||
if (gd->board_type == BOARD_TYPE_PCB116 &&
|
||||
strcmp(name, "servalt_pcb116") == 0)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DTB_RESELECT)
|
||||
int embedded_dtb_select(void)
|
||||
{
|
||||
do_board_detect();
|
||||
fdtdec_setup();
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
@ -60,6 +60,7 @@ CONFIG_SPI_FLASH_SPANSION=y
|
||||
CONFIG_SPI_FLASH_WINBOND=y
|
||||
CONFIG_SPI_FLASH_MTD=y
|
||||
CONFIG_DM_ETH=y
|
||||
CONFIG_MSCC_OCELOT_SWITCH=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCONF=y
|
||||
CONFIG_DM_SERIAL=y
|
||||
|
62
configs/mscc_serval_defconfig
Normal file
62
configs/mscc_serval_defconfig
Normal file
@ -0,0 +1,62 @@
|
||||
CONFIG_MIPS=y
|
||||
CONFIG_SYS_TEXT_BASE=0x40000000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_ARCH_MSCC=y
|
||||
CONFIG_SOC_SERVAL=y
|
||||
CONFIG_DDRTYPE_H5TQ1G63BFA=y
|
||||
CONFIG_SYS_LITTLE_ENDIAN=y
|
||||
CONFIG_FIT=y
|
||||
CONFIG_BOOTDELAY=3
|
||||
CONFIG_USE_BOOTARGS=y
|
||||
CONFIG_BOOTARGS="console=ttyS0,115200"
|
||||
CONFIG_LOGLEVEL=7
|
||||
CONFIG_DISPLAY_CPUINFO=y
|
||||
CONFIG_SYS_PROMPT="serval # "
|
||||
# CONFIG_CMD_BDI is not set
|
||||
# CONFIG_CMD_CONSOLE is not set
|
||||
# CONFIG_CMD_ELF is not set
|
||||
# CONFIG_CMD_EXPORTENV is not set
|
||||
# CONFIG_CMD_IMPORTENV is not set
|
||||
# CONFIG_CMD_CRC32 is not set
|
||||
CONFIG_CMD_MD5SUM=y
|
||||
CONFIG_CMD_MEMINFO=y
|
||||
CONFIG_CMD_MEMTEST=y
|
||||
# CONFIG_CMD_FLASH is not set
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_SF=y
|
||||
CONFIG_CMD_SPI=y
|
||||
# CONFIG_CMD_NFS is not set
|
||||
CONFIG_CMD_MTDPARTS=y
|
||||
CONFIG_MTDIDS_DEFAULT="nor0=spi_flash"
|
||||
CONFIG_MTDPARTS_DEFAULT="mtdparts=spi_flash:1m(UBoot),256k(Env),256k(Env.bk)"
|
||||
# CONFIG_ISO_PARTITION is not set
|
||||
CONFIG_DEFAULT_DEVICE_TREE="serval_pcb106"
|
||||
CONFIG_OF_LIST="serval_pcb106 serval_pcb105"
|
||||
CONFIG_DTB_RESELECT=y
|
||||
CONFIG_MULTI_DTB_FIT=y
|
||||
CONFIG_ENV_IS_IN_SPI_FLASH=y
|
||||
CONFIG_NET_RANDOM_ETHADDR=y
|
||||
CONFIG_CLK=y
|
||||
CONFIG_DM_GPIO=y
|
||||
CONFIG_MSCC_SGPIO=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_SPI_FLASH=y
|
||||
CONFIG_SPI_FLASH=y
|
||||
CONFIG_SPI_FLASH_BAR=y
|
||||
CONFIG_SPI_FLASH_GIGADEVICE=y
|
||||
CONFIG_SPI_FLASH_MACRONIX=y
|
||||
CONFIG_SPI_FLASH_SPANSION=y
|
||||
CONFIG_SPI_FLASH_STMICRO=y
|
||||
CONFIG_SPI_FLASH_WINBOND=y
|
||||
CONFIG_SPI_FLASH_MTD=y
|
||||
CONFIG_DM_ETH=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCONF=y
|
||||
CONFIG_DM_SERIAL=y
|
||||
CONFIG_SYS_NS16550=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_DM_SPI=y
|
||||
CONFIG_MSCC_BB_SPI=y
|
||||
CONFIG_LZMA=y
|
||||
CONFIG_XZ=y
|
60
configs/mscc_servalt_defconfig
Normal file
60
configs/mscc_servalt_defconfig
Normal file
@ -0,0 +1,60 @@
|
||||
CONFIG_MIPS=y
|
||||
CONFIG_SYS_TEXT_BASE=0x40000000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_ARCH_MSCC=y
|
||||
CONFIG_SOC_SERVALT=y
|
||||
CONFIG_SYS_LITTLE_ENDIAN=y
|
||||
CONFIG_FIT=y
|
||||
CONFIG_BOOTDELAY=3
|
||||
CONFIG_USE_BOOTARGS=y
|
||||
CONFIG_BOOTARGS="console=ttyS0,115200"
|
||||
CONFIG_LOGLEVEL=7
|
||||
CONFIG_DISPLAY_CPUINFO=y
|
||||
CONFIG_SYS_PROMPT="servalt # "
|
||||
# CONFIG_CMD_BDI is not set
|
||||
# CONFIG_CMD_CONSOLE is not set
|
||||
# CONFIG_CMD_ELF is not set
|
||||
# CONFIG_CMD_EXPORTENV is not set
|
||||
# CONFIG_CMD_IMPORTENV is not set
|
||||
# CONFIG_CMD_CRC32 is not set
|
||||
CONFIG_CMD_MD5SUM=y
|
||||
CONFIG_CMD_MEMINFO=y
|
||||
CONFIG_CMD_MEMTEST=y
|
||||
# CONFIG_CMD_FLASH is not set
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_SF=y
|
||||
CONFIG_CMD_SPI=y
|
||||
# CONFIG_CMD_NET is not set
|
||||
CONFIG_CMD_MTDPARTS=y
|
||||
CONFIG_MTDIDS_DEFAULT="nor0=spi_flash"
|
||||
CONFIG_MTDPARTS_DEFAULT="mtdparts=spi_flash:1m(UBoot),256k(Env),256k(Env.bk)"
|
||||
# CONFIG_ISO_PARTITION is not set
|
||||
CONFIG_DEFAULT_DEVICE_TREE="servalt_pcb116"
|
||||
CONFIG_OF_LIST="servalt_pcb116"
|
||||
CONFIG_DTB_RESELECT=y
|
||||
CONFIG_MULTI_DTB_FIT=y
|
||||
CONFIG_ENV_IS_IN_SPI_FLASH=y
|
||||
CONFIG_NET_RANDOM_ETHADDR=y
|
||||
CONFIG_CLK=y
|
||||
CONFIG_DM_GPIO=y
|
||||
CONFIG_MSCC_SGPIO=y
|
||||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_DM_SPI_FLASH=y
|
||||
CONFIG_SPI_FLASH=y
|
||||
CONFIG_SPI_FLASH_BAR=y
|
||||
CONFIG_SPI_FLASH_GIGADEVICE=y
|
||||
CONFIG_SPI_FLASH_MACRONIX=y
|
||||
CONFIG_SPI_FLASH_SPANSION=y
|
||||
CONFIG_SPI_FLASH_WINBOND=y
|
||||
CONFIG_SPI_FLASH_MTD=y
|
||||
CONFIG_DM_ETH=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCONF=y
|
||||
CONFIG_DM_SERIAL=y
|
||||
CONFIG_SYS_NS16550=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_DM_SPI=y
|
||||
CONFIG_MSCC_BB_SPI=y
|
||||
CONFIG_LZMA=y
|
||||
CONFIG_XZ=y
|
@ -432,6 +432,13 @@ config SNI_AVE
|
||||
This driver implements support for the Socionext AVE Ethernet
|
||||
controller, as found on the Socionext UniPhier family.
|
||||
|
||||
config MSCC_OCELOT_SWITCH
|
||||
bool "Ocelot switch driver"
|
||||
depends on DM_ETH && ARCH_MSCC
|
||||
select PHYLIB
|
||||
help
|
||||
This driver supports the Ocelot network switch device.
|
||||
|
||||
config ETHER_ON_FEC1
|
||||
bool "FEC1"
|
||||
depends on MPC8XX_FEC
|
||||
|
@ -75,3 +75,4 @@ obj-$(CONFIG_FSL_PFE) += pfe_eth/
|
||||
obj-$(CONFIG_SNI_AVE) += sni_ave.o
|
||||
obj-y += ti/
|
||||
obj-$(CONFIG_MEDIATEK_ETH) += mtk_eth.o
|
||||
obj-$(CONFIG_MSCC_OCELOT_SWITCH) += ocelot_switch.o
|
||||
|
765
drivers/net/ocelot_switch.c
Normal file
765
drivers/net/ocelot_switch.c
Normal file
@ -0,0 +1,765 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2018 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <config.h>
|
||||
#include <dm.h>
|
||||
#include <dm/of_access.h>
|
||||
#include <dm/of_addr.h>
|
||||
#include <fdt_support.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <miiphy.h>
|
||||
#include <net.h>
|
||||
#include <wait_bit.h>
|
||||
|
||||
#define MIIM_STATUS 0x0
|
||||
#define MIIM_STAT_BUSY BIT(3)
|
||||
#define MIIM_CMD 0x8
|
||||
#define MIIM_CMD_SCAN BIT(0)
|
||||
#define MIIM_CMD_OPR_WRITE BIT(1)
|
||||
#define MIIM_CMD_OPR_READ BIT(2)
|
||||
#define MIIM_CMD_SINGLE_SCAN BIT(3)
|
||||
#define MIIM_CMD_WRDATA(x) ((x) << 4)
|
||||
#define MIIM_CMD_REGAD(x) ((x) << 20)
|
||||
#define MIIM_CMD_PHYAD(x) ((x) << 25)
|
||||
#define MIIM_CMD_VLD BIT(31)
|
||||
#define MIIM_DATA 0xC
|
||||
#define MIIM_DATA_ERROR (0x2 << 16)
|
||||
|
||||
#define PHY_CFG 0x0
|
||||
#define PHY_CFG_ENA 0xF
|
||||
#define PHY_CFG_COMMON_RST BIT(4)
|
||||
#define PHY_CFG_RST (0xF << 5)
|
||||
#define PHY_STAT 0x4
|
||||
#define PHY_STAT_SUPERVISOR_COMPLETE BIT(0)
|
||||
|
||||
#define ANA_PORT_VLAN_CFG(x) (0x7000 + 0x100 * (x))
|
||||
#define ANA_PORT_VLAN_CFG_AWARE_ENA BIT(20)
|
||||
#define ANA_PORT_VLAN_CFG_POP_CNT(x) ((x) << 18)
|
||||
#define ANA_PORT_PORT_CFG(x) (0x7070 + 0x100 * (x))
|
||||
#define ANA_PORT_PORT_CFG_RECV_ENA BIT(6)
|
||||
#define ANA_TABLES_MACHDATA 0x8b34
|
||||
#define ANA_TABLES_MACLDATA 0x8b38
|
||||
#define ANA_TABLES_MACACCESS 0x8b3c
|
||||
#define ANA_TABLES_MACACCESS_VALID BIT(11)
|
||||
#define ANA_TABLES_MACACCESS_ENTRYTYPE(x) ((x) << 9)
|
||||
#define ANA_TABLES_MACACCESS_DEST_IDX(x) ((x) << 3)
|
||||
#define ANA_TABLES_MACACCESS_MAC_TABLE_CMD(x) (x)
|
||||
#define ANA_TABLES_MACACCESS_MAC_TABLE_CMD_M GENMASK(2, 0)
|
||||
#define MACACCESS_CMD_IDLE 0
|
||||
#define MACACCESS_CMD_LEARN 1
|
||||
#define MACACCESS_CMD_GET_NEXT 4
|
||||
#define ANA_PGID(x) (0x8c00 + 4 * (x))
|
||||
|
||||
#define SYS_FRM_AGING 0x574
|
||||
#define SYS_FRM_AGING_ENA BIT(20)
|
||||
|
||||
#define SYS_SYSTEM_RST_CFG 0x508
|
||||
#define SYS_SYSTEM_RST_MEM_INIT BIT(0)
|
||||
#define SYS_SYSTEM_RST_MEM_ENA BIT(1)
|
||||
#define SYS_SYSTEM_RST_CORE_ENA BIT(2)
|
||||
#define SYS_PORT_MODE(x) (0x514 + 0x4 * (x))
|
||||
#define SYS_PORT_MODE_INCL_INJ_HDR(x) ((x) << 3)
|
||||
#define SYS_PORT_MODE_INCL_INJ_HDR_M GENMASK(4, 3)
|
||||
#define SYS_PORT_MODE_INCL_XTR_HDR(x) ((x) << 1)
|
||||
#define SYS_PORT_MODE_INCL_XTR_HDR_M GENMASK(2, 1)
|
||||
#define SYS_PAUSE_CFG(x) (0x608 + 0x4 * (x))
|
||||
#define SYS_PAUSE_CFG_PAUSE_ENA BIT(0)
|
||||
|
||||
#define QSYS_SWITCH_PORT_MODE(x) (0x11234 + 0x4 * (x))
|
||||
#define QSYS_SWITCH_PORT_MODE_PORT_ENA BIT(14)
|
||||
#define QSYS_QMAP 0x112d8
|
||||
#define QSYS_EGR_NO_SHARING 0x1129c
|
||||
|
||||
/* Port registers */
|
||||
#define DEV_CLOCK_CFG 0x0
|
||||
#define DEV_CLOCK_CFG_LINK_SPEED_1000 1
|
||||
#define DEV_MAC_ENA_CFG 0x1c
|
||||
#define DEV_MAC_ENA_CFG_RX_ENA BIT(4)
|
||||
#define DEV_MAC_ENA_CFG_TX_ENA BIT(0)
|
||||
|
||||
#define DEV_MAC_IFG_CFG 0x30
|
||||
#define DEV_MAC_IFG_CFG_TX_IFG(x) ((x) << 8)
|
||||
#define DEV_MAC_IFG_CFG_RX_IFG2(x) ((x) << 4)
|
||||
#define DEV_MAC_IFG_CFG_RX_IFG1(x) (x)
|
||||
|
||||
#define PCS1G_CFG 0x48
|
||||
#define PCS1G_MODE_CFG_SGMII_MODE_ENA BIT(0)
|
||||
#define PCS1G_MODE_CFG 0x4c
|
||||
#define PCS1G_MODE_CFG_UNIDIR_MODE_ENA BIT(4)
|
||||
#define PCS1G_MODE_CFG_SGMII_MODE_ENA BIT(0)
|
||||
#define PCS1G_SD_CFG 0x50
|
||||
#define PCS1G_ANEG_CFG 0x54
|
||||
#define PCS1G_ANEG_CFG_ADV_ABILITY(x) ((x) << 16)
|
||||
|
||||
#define QS_XTR_GRP_CFG(x) (4 * (x))
|
||||
#define QS_XTR_GRP_CFG_MODE(x) ((x) << 2)
|
||||
#define QS_XTR_GRP_CFG_STATUS_WORD_POS BIT(1)
|
||||
#define QS_XTR_GRP_CFG_BYTE_SWAP BIT(0)
|
||||
#define QS_XTR_RD(x) (0x8 + 4 * (x))
|
||||
#define QS_XTR_FLUSH 0x18
|
||||
#define QS_XTR_FLUSH_FLUSH GENMASK(1, 0)
|
||||
#define QS_XTR_DATA_PRESENT 0x1c
|
||||
#define QS_INJ_GRP_CFG(x) (0x24 + (x) * 4)
|
||||
#define QS_INJ_GRP_CFG_MODE(x) ((x) << 2)
|
||||
#define QS_INJ_GRP_CFG_BYTE_SWAP BIT(0)
|
||||
#define QS_INJ_WR(x) (0x2c + 4 * (x))
|
||||
#define QS_INJ_CTRL(x) (0x34 + 4 * (x))
|
||||
#define QS_INJ_CTRL_GAP_SIZE(x) ((x) << 21)
|
||||
#define QS_INJ_CTRL_EOF BIT(19)
|
||||
#define QS_INJ_CTRL_SOF BIT(18)
|
||||
#define QS_INJ_CTRL_VLD_BYTES(x) ((x) << 16)
|
||||
|
||||
#define XTR_EOF_0 ntohl(0x80000000u)
|
||||
#define XTR_EOF_1 ntohl(0x80000001u)
|
||||
#define XTR_EOF_2 ntohl(0x80000002u)
|
||||
#define XTR_EOF_3 ntohl(0x80000003u)
|
||||
#define XTR_PRUNED ntohl(0x80000004u)
|
||||
#define XTR_ABORT ntohl(0x80000005u)
|
||||
#define XTR_ESCAPE ntohl(0x80000006u)
|
||||
#define XTR_NOT_READY ntohl(0x80000007u)
|
||||
|
||||
#define IFH_INJ_BYPASS BIT(31)
|
||||
#define IFH_TAG_TYPE_C 0
|
||||
#define XTR_VALID_BYTES(x) (4 - ((x) & 3))
|
||||
#define MAC_VID 1
|
||||
#define CPU_PORT 11
|
||||
#define INTERNAL_PORT_MSK 0xF
|
||||
#define IFH_LEN 4
|
||||
#define OCELOT_BUF_CELL_SZ 60
|
||||
#define ETH_ALEN 6
|
||||
#define PGID_BROADCAST 13
|
||||
#define PGID_UNICAST 14
|
||||
#define PGID_SRC 80
|
||||
|
||||
enum ocelot_target {
|
||||
ANA,
|
||||
QS,
|
||||
QSYS,
|
||||
REW,
|
||||
SYS,
|
||||
HSIO,
|
||||
PORT0,
|
||||
PORT1,
|
||||
PORT2,
|
||||
PORT3,
|
||||
TARGET_MAX,
|
||||
};
|
||||
|
||||
#define MAX_PORT (PORT3 - PORT0)
|
||||
|
||||
/* MAC table entry types.
|
||||
* ENTRYTYPE_NORMAL is subject to aging.
|
||||
* ENTRYTYPE_LOCKED is not subject to aging.
|
||||
* ENTRYTYPE_MACv4 is not subject to aging. For IPv4 multicast.
|
||||
* ENTRYTYPE_MACv6 is not subject to aging. For IPv6 multicast.
|
||||
*/
|
||||
enum macaccess_entry_type {
|
||||
ENTRYTYPE_NORMAL = 0,
|
||||
ENTRYTYPE_LOCKED,
|
||||
ENTRYTYPE_MACv4,
|
||||
ENTRYTYPE_MACv6,
|
||||
};
|
||||
|
||||
enum ocelot_mdio_target {
|
||||
MIIM,
|
||||
PHY,
|
||||
TARGET_MDIO_MAX,
|
||||
};
|
||||
|
||||
enum ocelot_phy_id {
|
||||
INTERNAL,
|
||||
EXTERNAL,
|
||||
NUM_PHY,
|
||||
};
|
||||
|
||||
struct ocelot_private {
|
||||
void __iomem *regs[TARGET_MAX];
|
||||
|
||||
struct mii_dev *bus[NUM_PHY];
|
||||
struct phy_device *phydev;
|
||||
int phy_mode;
|
||||
int max_speed;
|
||||
|
||||
int rx_pos;
|
||||
int rx_siz;
|
||||
int rx_off;
|
||||
int tx_num;
|
||||
|
||||
u8 tx_adj_packetbuf[PKTSIZE_ALIGN + PKTALIGN];
|
||||
void *tx_adj_buf;
|
||||
};
|
||||
|
||||
struct mscc_miim_dev {
|
||||
void __iomem *regs;
|
||||
void __iomem *phy_regs;
|
||||
};
|
||||
|
||||
struct mscc_miim_dev miim[NUM_PHY];
|
||||
|
||||
static int mscc_miim_wait_ready(struct mscc_miim_dev *miim)
|
||||
{
|
||||
return wait_for_bit_le32(miim->regs + MIIM_STATUS, MIIM_STAT_BUSY,
|
||||
false, 250, false);
|
||||
}
|
||||
|
||||
static int mscc_miim_reset(struct mii_dev *bus)
|
||||
{
|
||||
struct mscc_miim_dev *miim = (struct mscc_miim_dev *)bus->priv;
|
||||
|
||||
if (miim->phy_regs) {
|
||||
writel(0, miim->phy_regs + PHY_CFG);
|
||||
writel(PHY_CFG_RST | PHY_CFG_COMMON_RST
|
||||
| PHY_CFG_ENA, miim->phy_regs + PHY_CFG);
|
||||
mdelay(500);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mscc_miim_read(struct mii_dev *bus, int addr, int devad, int reg)
|
||||
{
|
||||
struct mscc_miim_dev *miim = (struct mscc_miim_dev *)bus->priv;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
ret = mscc_miim_wait_ready(miim);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
writel(MIIM_CMD_VLD | MIIM_CMD_PHYAD(addr) |
|
||||
MIIM_CMD_REGAD(reg) | MIIM_CMD_OPR_READ,
|
||||
miim->regs + MIIM_CMD);
|
||||
|
||||
ret = mscc_miim_wait_ready(miim);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
val = readl(miim->regs + MIIM_DATA);
|
||||
if (val & MIIM_DATA_ERROR) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = val & 0xFFFF;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mscc_miim_write(struct mii_dev *bus, int addr, int devad, int reg,
|
||||
u16 val)
|
||||
{
|
||||
struct mscc_miim_dev *miim = (struct mscc_miim_dev *)bus->priv;
|
||||
int ret;
|
||||
|
||||
ret = mscc_miim_wait_ready(miim);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
writel(MIIM_CMD_VLD | MIIM_CMD_PHYAD(addr) |
|
||||
MIIM_CMD_REGAD(reg) | MIIM_CMD_WRDATA(val) |
|
||||
MIIM_CMD_OPR_WRITE, miim->regs + MIIM_CMD);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* For now only setup the internal mdio bus */
|
||||
static struct mii_dev *ocelot_mdiobus_init(struct udevice *dev)
|
||||
{
|
||||
unsigned long phy_size[TARGET_MAX];
|
||||
phys_addr_t phy_base[TARGET_MAX];
|
||||
struct ofnode_phandle_args phandle;
|
||||
ofnode eth_node, node, mdio_node;
|
||||
struct resource res;
|
||||
struct mii_dev *bus;
|
||||
fdt32_t faddr;
|
||||
int i;
|
||||
|
||||
bus = mdio_alloc();
|
||||
|
||||
if (!bus)
|
||||
return NULL;
|
||||
|
||||
/* gathered only the first mdio bus */
|
||||
eth_node = dev_read_first_subnode(dev);
|
||||
node = ofnode_first_subnode(eth_node);
|
||||
ofnode_parse_phandle_with_args(node, "phy-handle", NULL, 0, 0,
|
||||
&phandle);
|
||||
mdio_node = ofnode_get_parent(phandle.node);
|
||||
|
||||
for (i = 0; i < TARGET_MDIO_MAX; i++) {
|
||||
if (ofnode_read_resource(mdio_node, i, &res)) {
|
||||
pr_err("%s: get OF resource failed\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
faddr = cpu_to_fdt32(res.start);
|
||||
phy_base[i] = ofnode_translate_address(mdio_node, &faddr);
|
||||
phy_size[i] = res.end - res.start;
|
||||
}
|
||||
|
||||
strcpy(bus->name, "miim-internal");
|
||||
miim[INTERNAL].phy_regs = ioremap(phy_base[PHY], phy_size[PHY]);
|
||||
miim[INTERNAL].regs = ioremap(phy_base[MIIM], phy_size[MIIM]);
|
||||
bus->priv = &miim[INTERNAL];
|
||||
bus->reset = mscc_miim_reset;
|
||||
bus->read = mscc_miim_read;
|
||||
bus->write = mscc_miim_write;
|
||||
|
||||
if (mdio_register(bus))
|
||||
return NULL;
|
||||
else
|
||||
return bus;
|
||||
}
|
||||
|
||||
__weak void mscc_switch_reset(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void ocelot_stop(struct udevice *dev)
|
||||
{
|
||||
struct ocelot_private *priv = dev_get_priv(dev);
|
||||
int i;
|
||||
|
||||
mscc_switch_reset();
|
||||
for (i = 0; i < NUM_PHY; i++)
|
||||
if (priv->bus[i])
|
||||
mscc_miim_reset(priv->bus[i]);
|
||||
}
|
||||
|
||||
static void ocelot_cpu_capture_setup(struct ocelot_private *priv)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* map the 8 CPU extraction queues to CPU port 11 */
|
||||
writel(0, priv->regs[QSYS] + QSYS_QMAP);
|
||||
|
||||
for (i = 0; i <= 1; i++) {
|
||||
/*
|
||||
* Do byte-swap and expect status after last data word
|
||||
* Extraction: Mode: manual extraction) | Byte_swap
|
||||
*/
|
||||
writel(QS_XTR_GRP_CFG_MODE(1) | QS_XTR_GRP_CFG_BYTE_SWAP,
|
||||
priv->regs[QS] + QS_XTR_GRP_CFG(i));
|
||||
/*
|
||||
* Injection: Mode: manual extraction | Byte_swap
|
||||
*/
|
||||
writel(QS_INJ_GRP_CFG_MODE(1) | QS_INJ_GRP_CFG_BYTE_SWAP,
|
||||
priv->regs[QS] + QS_INJ_GRP_CFG(i));
|
||||
}
|
||||
|
||||
for (i = 0; i <= 1; i++)
|
||||
/* Enable IFH insertion/parsing on CPU ports */
|
||||
writel(SYS_PORT_MODE_INCL_INJ_HDR(1) |
|
||||
SYS_PORT_MODE_INCL_XTR_HDR(1),
|
||||
priv->regs[SYS] + SYS_PORT_MODE(CPU_PORT + i));
|
||||
/*
|
||||
* Setup the CPU port as VLAN aware to support switching frames
|
||||
* based on tags
|
||||
*/
|
||||
writel(ANA_PORT_VLAN_CFG_AWARE_ENA | ANA_PORT_VLAN_CFG_POP_CNT(1) |
|
||||
MAC_VID, priv->regs[ANA] + ANA_PORT_VLAN_CFG(CPU_PORT));
|
||||
|
||||
/* Disable learning (only RECV_ENA must be set) */
|
||||
writel(ANA_PORT_PORT_CFG_RECV_ENA,
|
||||
priv->regs[ANA] + ANA_PORT_PORT_CFG(CPU_PORT));
|
||||
|
||||
/* Enable switching to/from cpu port */
|
||||
setbits_le32(priv->regs[QSYS] + QSYS_SWITCH_PORT_MODE(CPU_PORT),
|
||||
QSYS_SWITCH_PORT_MODE_PORT_ENA);
|
||||
|
||||
/* No pause on CPU port - not needed (off by default) */
|
||||
clrbits_le32(priv->regs[SYS] + SYS_PAUSE_CFG(CPU_PORT),
|
||||
SYS_PAUSE_CFG_PAUSE_ENA);
|
||||
|
||||
setbits_le32(priv->regs[QSYS] + QSYS_EGR_NO_SHARING, BIT(CPU_PORT));
|
||||
}
|
||||
|
||||
static void ocelot_port_init(struct ocelot_private *priv, int port)
|
||||
{
|
||||
void __iomem *regs = priv->regs[port];
|
||||
|
||||
/* Enable PCS */
|
||||
writel(PCS1G_MODE_CFG_SGMII_MODE_ENA, regs + PCS1G_CFG);
|
||||
|
||||
/* Disable Signal Detect */
|
||||
writel(0, regs + PCS1G_SD_CFG);
|
||||
|
||||
/* Enable MAC RX and TX */
|
||||
writel(DEV_MAC_ENA_CFG_RX_ENA | DEV_MAC_ENA_CFG_TX_ENA,
|
||||
regs + DEV_MAC_ENA_CFG);
|
||||
|
||||
/* Clear sgmii_mode_ena */
|
||||
writel(0, regs + PCS1G_MODE_CFG);
|
||||
|
||||
/*
|
||||
* Clear sw_resolve_ena(bit 0) and set adv_ability to
|
||||
* something meaningful just in case
|
||||
*/
|
||||
writel(PCS1G_ANEG_CFG_ADV_ABILITY(0x20), regs + PCS1G_ANEG_CFG);
|
||||
|
||||
/* Set MAC IFG Gaps */
|
||||
writel(DEV_MAC_IFG_CFG_TX_IFG(5) | DEV_MAC_IFG_CFG_RX_IFG1(5) |
|
||||
DEV_MAC_IFG_CFG_RX_IFG2(1), regs + DEV_MAC_IFG_CFG);
|
||||
|
||||
/* Set link speed and release all resets */
|
||||
writel(DEV_CLOCK_CFG_LINK_SPEED_1000, regs + DEV_CLOCK_CFG);
|
||||
|
||||
/* Make VLAN aware for CPU traffic */
|
||||
writel(ANA_PORT_VLAN_CFG_AWARE_ENA | ANA_PORT_VLAN_CFG_POP_CNT(1) |
|
||||
MAC_VID, priv->regs[ANA] + ANA_PORT_VLAN_CFG(port - PORT0));
|
||||
|
||||
/* Enable the port in the core */
|
||||
setbits_le32(priv->regs[QSYS] + QSYS_SWITCH_PORT_MODE(port - PORT0),
|
||||
QSYS_SWITCH_PORT_MODE_PORT_ENA);
|
||||
}
|
||||
|
||||
static int ocelot_switch_init(struct ocelot_private *priv)
|
||||
{
|
||||
/* Reset switch & memories */
|
||||
writel(SYS_SYSTEM_RST_MEM_ENA | SYS_SYSTEM_RST_MEM_INIT,
|
||||
priv->regs[SYS] + SYS_SYSTEM_RST_CFG);
|
||||
|
||||
/* Wait to complete */
|
||||
if (wait_for_bit_le32(priv->regs[SYS] + SYS_SYSTEM_RST_CFG,
|
||||
SYS_SYSTEM_RST_MEM_INIT, false, 2000, false)) {
|
||||
pr_err("Timeout in memory reset\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* Enable switch core */
|
||||
setbits_le32(priv->regs[SYS] + SYS_SYSTEM_RST_CFG,
|
||||
SYS_SYSTEM_RST_CORE_ENA);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ocelot_switch_flush(struct ocelot_private *priv)
|
||||
{
|
||||
/* All Queues flush */
|
||||
setbits_le32(priv->regs[QS] + QS_XTR_FLUSH, QS_XTR_FLUSH_FLUSH);
|
||||
/* Allow to drain */
|
||||
mdelay(1);
|
||||
/* All Queues normal */
|
||||
clrbits_le32(priv->regs[QS] + QS_XTR_FLUSH, QS_XTR_FLUSH_FLUSH);
|
||||
}
|
||||
|
||||
static int ocelot_initialize(struct ocelot_private *priv)
|
||||
{
|
||||
int ret, i;
|
||||
|
||||
/* Initialize switch memories, enable core */
|
||||
ret = ocelot_switch_init(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
/*
|
||||
* Disable port-to-port by switching
|
||||
* Put fron ports in "port isolation modes" - i.e. they cant send
|
||||
* to other ports - via the PGID sorce masks.
|
||||
*/
|
||||
for (i = 0; i <= MAX_PORT; i++)
|
||||
writel(0, priv->regs[ANA] + ANA_PGID(PGID_SRC + i));
|
||||
|
||||
/* Flush queues */
|
||||
ocelot_switch_flush(priv);
|
||||
|
||||
/* Setup frame ageing - "2 sec" - The unit is 6.5us on Ocelot */
|
||||
writel(SYS_FRM_AGING_ENA | (20000000 / 65),
|
||||
priv->regs[SYS] + SYS_FRM_AGING);
|
||||
|
||||
for (i = PORT0; i <= PORT3; i++)
|
||||
ocelot_port_init(priv, i);
|
||||
|
||||
ocelot_cpu_capture_setup(priv);
|
||||
|
||||
debug("Ports enabled\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int ocelot_vlant_wait_for_completion(struct ocelot_private *priv)
|
||||
{
|
||||
unsigned int val, timeout = 10;
|
||||
|
||||
/* Wait for the issued mac table command to be completed, or timeout.
|
||||
* When the command read from ANA_TABLES_MACACCESS is
|
||||
* MACACCESS_CMD_IDLE, the issued command completed successfully.
|
||||
*/
|
||||
do {
|
||||
val = readl(priv->regs[ANA] + ANA_TABLES_MACACCESS);
|
||||
val &= ANA_TABLES_MACACCESS_MAC_TABLE_CMD_M;
|
||||
} while (val != MACACCESS_CMD_IDLE && timeout--);
|
||||
|
||||
if (!timeout)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_mac_table_add(struct ocelot_private *priv,
|
||||
const unsigned char mac[ETH_ALEN], int pgid)
|
||||
{
|
||||
u32 macl = 0, mach = 0;
|
||||
int ret;
|
||||
|
||||
/* Set the MAC address to handle and the vlan associated in a format
|
||||
* understood by the hardware.
|
||||
*/
|
||||
mach |= MAC_VID << 16;
|
||||
mach |= ((u32)mac[0]) << 8;
|
||||
mach |= ((u32)mac[1]) << 0;
|
||||
macl |= ((u32)mac[2]) << 24;
|
||||
macl |= ((u32)mac[3]) << 16;
|
||||
macl |= ((u32)mac[4]) << 8;
|
||||
macl |= ((u32)mac[5]) << 0;
|
||||
|
||||
writel(macl, priv->regs[ANA] + ANA_TABLES_MACLDATA);
|
||||
writel(mach, priv->regs[ANA] + ANA_TABLES_MACHDATA);
|
||||
|
||||
writel(ANA_TABLES_MACACCESS_VALID |
|
||||
ANA_TABLES_MACACCESS_DEST_IDX(pgid) |
|
||||
ANA_TABLES_MACACCESS_ENTRYTYPE(ENTRYTYPE_LOCKED) |
|
||||
ANA_TABLES_MACACCESS_MAC_TABLE_CMD(MACACCESS_CMD_LEARN),
|
||||
priv->regs[ANA] + ANA_TABLES_MACACCESS);
|
||||
|
||||
ret = ocelot_vlant_wait_for_completion(priv);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ocelot_write_hwaddr(struct udevice *dev)
|
||||
{
|
||||
struct ocelot_private *priv = dev_get_priv(dev);
|
||||
struct eth_pdata *pdata = dev_get_platdata(dev);
|
||||
|
||||
ocelot_mac_table_add(priv, pdata->enetaddr, PGID_UNICAST);
|
||||
|
||||
writel(BIT(CPU_PORT), priv->regs[ANA] + ANA_PGID(PGID_UNICAST));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_start(struct udevice *dev)
|
||||
{
|
||||
struct ocelot_private *priv = dev_get_priv(dev);
|
||||
struct eth_pdata *pdata = dev_get_platdata(dev);
|
||||
const unsigned char mac[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff };
|
||||
int ret;
|
||||
|
||||
ret = ocelot_initialize(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Set MAC address tables entries for CPU redirection */
|
||||
ocelot_mac_table_add(priv, mac, PGID_BROADCAST);
|
||||
|
||||
writel(BIT(CPU_PORT) | INTERNAL_PORT_MSK,
|
||||
priv->regs[ANA] + ANA_PGID(PGID_BROADCAST));
|
||||
|
||||
/* It should be setup latter in ocelot_write_hwaddr */
|
||||
ocelot_mac_table_add(priv, pdata->enetaddr, PGID_UNICAST);
|
||||
|
||||
writel(BIT(CPU_PORT), priv->regs[ANA] + ANA_PGID(PGID_UNICAST));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_send(struct udevice *dev, void *packet, int length)
|
||||
{
|
||||
struct ocelot_private *priv = dev_get_priv(dev);
|
||||
u32 ifh[IFH_LEN];
|
||||
int port = BIT(0); /* use port 0 */
|
||||
u8 grp = 0; /* Send everything on CPU group 0 */
|
||||
int i, count = (length + 3) / 4, last = length % 4;
|
||||
u32 *buf = packet;
|
||||
|
||||
writel(QS_INJ_CTRL_GAP_SIZE(1) | QS_INJ_CTRL_SOF,
|
||||
priv->regs[QS] + QS_INJ_CTRL(grp));
|
||||
|
||||
/*
|
||||
* Generate the IFH for frame injection
|
||||
*
|
||||
* The IFH is a 128bit-value
|
||||
* bit 127: bypass the analyzer processing
|
||||
* bit 56-67: destination mask
|
||||
* bit 28-29: pop_cnt: 3 disables all rewriting of the frame
|
||||
* bit 20-27: cpu extraction queue mask
|
||||
* bit 16: tag type 0: C-tag, 1: S-tag
|
||||
* bit 0-11: VID
|
||||
*/
|
||||
ifh[0] = IFH_INJ_BYPASS;
|
||||
ifh[1] = (0xf00 & port) >> 8;
|
||||
ifh[2] = (0xff & port) << 24;
|
||||
ifh[3] = (IFH_TAG_TYPE_C << 16);
|
||||
|
||||
for (i = 0; i < IFH_LEN; i++)
|
||||
writel(ifh[i], priv->regs[QS] + QS_INJ_WR(grp));
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
writel(buf[i], priv->regs[QS] + QS_INJ_WR(grp));
|
||||
|
||||
/* Add padding */
|
||||
while (i < (OCELOT_BUF_CELL_SZ / 4)) {
|
||||
writel(0, priv->regs[QS] + QS_INJ_WR(grp));
|
||||
i++;
|
||||
}
|
||||
|
||||
/* Indicate EOF and valid bytes in last word */
|
||||
writel(QS_INJ_CTRL_GAP_SIZE(1) |
|
||||
QS_INJ_CTRL_VLD_BYTES(length < OCELOT_BUF_CELL_SZ ? 0 : last) |
|
||||
QS_INJ_CTRL_EOF, priv->regs[QS] + QS_INJ_CTRL(grp));
|
||||
|
||||
/* Add dummy CRC */
|
||||
writel(0, priv->regs[QS] + QS_INJ_WR(grp));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_recv(struct udevice *dev, int flags, uchar **packetp)
|
||||
{
|
||||
struct ocelot_private *priv = dev_get_priv(dev);
|
||||
u8 grp = 0; /* Send everything on CPU group 0 */
|
||||
u32 *rxbuf = (u32 *)net_rx_packets[0];
|
||||
int i, byte_cnt = 0;
|
||||
bool eof_flag = false, pruned_flag = false, abort_flag = false;
|
||||
|
||||
if (!(readl(priv->regs[QS] + QS_XTR_DATA_PRESENT) & BIT(grp)))
|
||||
return -EAGAIN;
|
||||
|
||||
/* skip IFH */
|
||||
for (i = 0; i < IFH_LEN; i++)
|
||||
readl(priv->regs[QS] + QS_XTR_RD(grp));
|
||||
|
||||
while (!eof_flag) {
|
||||
u32 val = readl(priv->regs[QS] + QS_XTR_RD(grp));
|
||||
|
||||
switch (val) {
|
||||
case XTR_NOT_READY:
|
||||
debug("%d NOT_READY...?\n", byte_cnt);
|
||||
break;
|
||||
case XTR_ABORT:
|
||||
/* really nedeed?? not done in linux */
|
||||
*rxbuf = readl(priv->regs[QS] + QS_XTR_RD(grp));
|
||||
abort_flag = true;
|
||||
eof_flag = true;
|
||||
debug("XTR_ABORT\n");
|
||||
break;
|
||||
case XTR_EOF_0:
|
||||
case XTR_EOF_1:
|
||||
case XTR_EOF_2:
|
||||
case XTR_EOF_3:
|
||||
byte_cnt += XTR_VALID_BYTES(val);
|
||||
*rxbuf = readl(priv->regs[QS] + QS_XTR_RD(grp));
|
||||
eof_flag = true;
|
||||
debug("EOF\n");
|
||||
break;
|
||||
case XTR_PRUNED:
|
||||
/* But get the last 4 bytes as well */
|
||||
eof_flag = true;
|
||||
pruned_flag = true;
|
||||
debug("PRUNED\n");
|
||||
/* fallthrough */
|
||||
case XTR_ESCAPE:
|
||||
*rxbuf = readl(priv->regs[QS] + QS_XTR_RD(grp));
|
||||
byte_cnt += 4;
|
||||
rxbuf++;
|
||||
debug("ESCAPED\n");
|
||||
break;
|
||||
default:
|
||||
*rxbuf = val;
|
||||
byte_cnt += 4;
|
||||
rxbuf++;
|
||||
}
|
||||
}
|
||||
|
||||
if (abort_flag || pruned_flag || !eof_flag) {
|
||||
debug("Discarded frame: abort:%d pruned:%d eof:%d\n",
|
||||
abort_flag, pruned_flag, eof_flag);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
*packetp = net_rx_packets[0];
|
||||
|
||||
return byte_cnt;
|
||||
}
|
||||
|
||||
static int ocelot_probe(struct udevice *dev)
|
||||
{
|
||||
struct ocelot_private *priv = dev_get_priv(dev);
|
||||
int ret, i;
|
||||
|
||||
struct {
|
||||
enum ocelot_target id;
|
||||
char *name;
|
||||
} reg[] = {
|
||||
{ SYS, "sys" },
|
||||
{ REW, "rew" },
|
||||
{ QSYS, "qsys" },
|
||||
{ ANA, "ana" },
|
||||
{ QS, "qs" },
|
||||
{ HSIO, "hsio" },
|
||||
{ PORT0, "port0" },
|
||||
{ PORT1, "port1" },
|
||||
{ PORT2, "port2" },
|
||||
{ PORT3, "port3" },
|
||||
};
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(reg); i++) {
|
||||
priv->regs[reg[i].id] = dev_remap_addr_name(dev, reg[i].name);
|
||||
if (!priv->regs[reg[i].id]) {
|
||||
pr_err
|
||||
("Error %d: can't get regs base addresses for %s\n",
|
||||
ret, reg[i].name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
priv->bus[INTERNAL] = ocelot_mdiobus_init(dev);
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
phy_connect(priv->bus[INTERNAL], i, dev,
|
||||
PHY_INTERFACE_MODE_NONE);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_remove(struct udevice *dev)
|
||||
{
|
||||
struct ocelot_private *priv = dev_get_priv(dev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_PHY; i++) {
|
||||
mdio_unregister(priv->bus[i]);
|
||||
mdio_free(priv->bus[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct eth_ops ocelot_ops = {
|
||||
.start = ocelot_start,
|
||||
.stop = ocelot_stop,
|
||||
.send = ocelot_send,
|
||||
.recv = ocelot_recv,
|
||||
.write_hwaddr = ocelot_write_hwaddr,
|
||||
};
|
||||
|
||||
static const struct udevice_id mscc_ocelot_ids[] = {
|
||||
{.compatible = "mscc,vsc7514-switch"},
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(ocelot) = {
|
||||
.name = "ocelot-switch",
|
||||
.id = UCLASS_ETH,
|
||||
.of_match = mscc_ocelot_ids,
|
||||
.probe = ocelot_probe,
|
||||
.remove = ocelot_remove,
|
||||
.ops = &ocelot_ops,
|
||||
.priv_auto_alloc_size = sizeof(struct ocelot_private),
|
||||
.platdata_auto_alloc_size = sizeof(struct eth_pdata),
|
||||
};
|
@ -29,3 +29,22 @@ config PINCTRL_MSCC_JR2
|
||||
help
|
||||
Support pin multiplexing and pin configuration control on
|
||||
Microsemi jr2 SoCs.
|
||||
|
||||
config PINCTRL_MSCC_SERVALT
|
||||
depends on SOC_SERVALT && PINCTRL_FULL && OF_CONTROL
|
||||
select PINCTRL_MSCC
|
||||
default y
|
||||
bool "Microsemi servalt family pin control driver"
|
||||
help
|
||||
Support pin multiplexing and pin configuration control on
|
||||
Microsemi servalt SoCs.
|
||||
|
||||
config PINCTRL_MSCC_SERVAL
|
||||
depends on SOC_SERVAL && PINCTRL_FULL && OF_CONTROL
|
||||
select PINCTRL_MSCC
|
||||
default y
|
||||
bool "Microsemi serval family pin control driver"
|
||||
help
|
||||
Support pin multiplexing and pin configuration control on
|
||||
Microsemi serval SoCs.
|
||||
|
||||
|
@ -4,3 +4,5 @@ obj-y += mscc-common.o
|
||||
obj-$(CONFIG_PINCTRL_MSCC_OCELOT) += pinctrl-ocelot.o
|
||||
obj-$(CONFIG_PINCTRL_MSCC_LUTON) += pinctrl-luton.o
|
||||
obj-$(CONFIG_PINCTRL_MSCC_JR2) += pinctrl-jr2.o
|
||||
obj-$(CONFIG_PINCTRL_MSCC_SERVALT) += pinctrl-servalt.o
|
||||
obj-$(CONFIG_PINCTRL_MSCC_SERVAL) += pinctrl-serval.o
|
||||
|
233
drivers/pinctrl/mscc/pinctrl-serval.c
Normal file
233
drivers/pinctrl/mscc/pinctrl-serval.c
Normal file
@ -0,0 +1,233 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
/*
|
||||
* Microsemi SoCs pinctrl driver
|
||||
*
|
||||
* Author: <horatiu.vultur@microchip.com>
|
||||
* Copyright (c) 2019 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <config.h>
|
||||
#include <dm.h>
|
||||
#include <dm/device-internal.h>
|
||||
#include <dm/lists.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <dm/root.h>
|
||||
#include <errno.h>
|
||||
#include <fdtdec.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <asm/system.h>
|
||||
#include "mscc-common.h"
|
||||
|
||||
enum {
|
||||
FUNC_NONE,
|
||||
FUNC_GPIO,
|
||||
FUNC_IRQ0,
|
||||
FUNC_IRQ1,
|
||||
FUNC_MIIM1,
|
||||
FUNC_PCI_WAKE,
|
||||
FUNC_PTP0,
|
||||
FUNC_PTP1,
|
||||
FUNC_PTP2,
|
||||
FUNC_PTP3,
|
||||
FUNC_PWM,
|
||||
FUNC_RECO_CLK0,
|
||||
FUNC_RECO_CLK1,
|
||||
FUNC_SFP0,
|
||||
FUNC_SFP1,
|
||||
FUNC_SFP2,
|
||||
FUNC_SFP3,
|
||||
FUNC_SFP4,
|
||||
FUNC_SFP5,
|
||||
FUNC_SFP6,
|
||||
FUNC_SFP7,
|
||||
FUNC_SFP8,
|
||||
FUNC_SFP9,
|
||||
FUNC_SFP10,
|
||||
FUNC_SIO,
|
||||
FUNC_SI,
|
||||
FUNC_TACHO,
|
||||
FUNC_TWI,
|
||||
FUNC_TWI_SCL_M,
|
||||
FUNC_UART,
|
||||
FUNC_UART2,
|
||||
FUNC_MD,
|
||||
FUNC_PTP1588,
|
||||
FUNC_MAX
|
||||
};
|
||||
|
||||
static char * const serval_function_names[] = {
|
||||
[FUNC_NONE] = "none",
|
||||
[FUNC_GPIO] = "gpio",
|
||||
[FUNC_IRQ0] = "irq0",
|
||||
[FUNC_IRQ1] = "irq1",
|
||||
[FUNC_MIIM1] = "miim1",
|
||||
[FUNC_PCI_WAKE] = "pci_wake",
|
||||
[FUNC_PTP0] = "ptp0",
|
||||
[FUNC_PTP1] = "ptp1",
|
||||
[FUNC_PTP2] = "ptp2",
|
||||
[FUNC_PTP3] = "ptp3",
|
||||
[FUNC_PWM] = "pwm",
|
||||
[FUNC_RECO_CLK0] = "reco_clk0",
|
||||
[FUNC_RECO_CLK1] = "reco_clk1",
|
||||
[FUNC_SFP0] = "sfp0",
|
||||
[FUNC_SFP1] = "sfp1",
|
||||
[FUNC_SFP2] = "sfp2",
|
||||
[FUNC_SFP3] = "sfp3",
|
||||
[FUNC_SFP4] = "sfp4",
|
||||
[FUNC_SFP5] = "sfp5",
|
||||
[FUNC_SFP6] = "sfp6",
|
||||
[FUNC_SFP7] = "sfp7",
|
||||
[FUNC_SFP8] = "sfp8",
|
||||
[FUNC_SFP9] = "sfp9",
|
||||
[FUNC_SFP10] = "sfp10",
|
||||
[FUNC_SIO] = "sio",
|
||||
[FUNC_SI] = "si",
|
||||
[FUNC_TACHO] = "tacho",
|
||||
[FUNC_TWI] = "twi",
|
||||
[FUNC_TWI_SCL_M] = "twi_scl_m",
|
||||
[FUNC_UART] = "uart",
|
||||
[FUNC_UART2] = "uart2",
|
||||
[FUNC_MD] = "md",
|
||||
[FUNC_PTP1588] = "1588",
|
||||
};
|
||||
|
||||
MSCC_P(0, SIO, NONE, NONE);
|
||||
MSCC_P(1, SIO, NONE, NONE);
|
||||
MSCC_P(2, SIO, NONE, NONE);
|
||||
MSCC_P(3, SIO, NONE, NONE);
|
||||
MSCC_P(4, TACHO, NONE, NONE);
|
||||
MSCC_P(5, PWM, NONE, NONE);
|
||||
MSCC_P(6, TWI, NONE, NONE);
|
||||
MSCC_P(7, TWI, NONE, NONE);
|
||||
MSCC_P(8, SI, NONE, NONE);
|
||||
MSCC_P(9, SI, MD, NONE);
|
||||
MSCC_P(10, SI, MD, NONE);
|
||||
MSCC_P(11, SFP0, MD, TWI_SCL_M);
|
||||
MSCC_P(12, SFP1, MD, TWI_SCL_M);
|
||||
MSCC_P(13, SFP2, UART2, TWI_SCL_M);
|
||||
MSCC_P(14, SFP3, UART2, TWI_SCL_M);
|
||||
MSCC_P(15, SFP4, PTP1588, TWI_SCL_M);
|
||||
MSCC_P(16, SFP5, PTP1588, TWI_SCL_M);
|
||||
MSCC_P(17, SFP6, PCI_WAKE, TWI_SCL_M);
|
||||
MSCC_P(18, SFP7, NONE, TWI_SCL_M);
|
||||
MSCC_P(19, SFP8, NONE, TWI_SCL_M);
|
||||
MSCC_P(20, SFP9, NONE, TWI_SCL_M);
|
||||
MSCC_P(21, SFP10, NONE, TWI_SCL_M);
|
||||
MSCC_P(22, NONE, NONE, NONE);
|
||||
MSCC_P(23, NONE, NONE, NONE);
|
||||
MSCC_P(24, NONE, NONE, NONE);
|
||||
MSCC_P(25, NONE, NONE, NONE);
|
||||
MSCC_P(26, UART, NONE, NONE);
|
||||
MSCC_P(27, UART, NONE, NONE);
|
||||
MSCC_P(28, IRQ0, NONE, NONE);
|
||||
MSCC_P(29, IRQ1, NONE, NONE);
|
||||
MSCC_P(30, PTP1588, NONE, NONE);
|
||||
MSCC_P(31, PTP1588, NONE, NONE);
|
||||
|
||||
#define SERVAL_PIN(n) { \
|
||||
.name = "GPIO_"#n, \
|
||||
.drv_data = &mscc_pin_##n \
|
||||
}
|
||||
|
||||
static const struct mscc_pin_data serval_pins[] = {
|
||||
SERVAL_PIN(0),
|
||||
SERVAL_PIN(1),
|
||||
SERVAL_PIN(2),
|
||||
SERVAL_PIN(3),
|
||||
SERVAL_PIN(4),
|
||||
SERVAL_PIN(5),
|
||||
SERVAL_PIN(6),
|
||||
SERVAL_PIN(7),
|
||||
SERVAL_PIN(8),
|
||||
SERVAL_PIN(9),
|
||||
SERVAL_PIN(10),
|
||||
SERVAL_PIN(11),
|
||||
SERVAL_PIN(12),
|
||||
SERVAL_PIN(13),
|
||||
SERVAL_PIN(14),
|
||||
SERVAL_PIN(15),
|
||||
SERVAL_PIN(16),
|
||||
SERVAL_PIN(17),
|
||||
SERVAL_PIN(18),
|
||||
SERVAL_PIN(19),
|
||||
SERVAL_PIN(20),
|
||||
SERVAL_PIN(21),
|
||||
SERVAL_PIN(22),
|
||||
SERVAL_PIN(23),
|
||||
SERVAL_PIN(24),
|
||||
SERVAL_PIN(25),
|
||||
SERVAL_PIN(26),
|
||||
SERVAL_PIN(27),
|
||||
SERVAL_PIN(28),
|
||||
SERVAL_PIN(29),
|
||||
SERVAL_PIN(30),
|
||||
SERVAL_PIN(31),
|
||||
};
|
||||
|
||||
static const unsigned long serval_gpios[] = {
|
||||
[MSCC_GPIO_OUT_SET] = 0x00,
|
||||
[MSCC_GPIO_OUT_CLR] = 0x04,
|
||||
[MSCC_GPIO_OUT] = 0x08,
|
||||
[MSCC_GPIO_IN] = 0x0c,
|
||||
[MSCC_GPIO_OE] = 0x10,
|
||||
[MSCC_GPIO_INTR] = 0x14,
|
||||
[MSCC_GPIO_INTR_ENA] = 0x18,
|
||||
[MSCC_GPIO_INTR_IDENT] = 0x1c,
|
||||
[MSCC_GPIO_ALT0] = 0x20,
|
||||
[MSCC_GPIO_ALT1] = 0x24,
|
||||
};
|
||||
|
||||
static int serval_gpio_probe(struct udevice *dev)
|
||||
{
|
||||
struct gpio_dev_priv *uc_priv;
|
||||
|
||||
uc_priv = dev_get_uclass_priv(dev);
|
||||
uc_priv->bank_name = "serval-gpio";
|
||||
uc_priv->gpio_count = ARRAY_SIZE(serval_pins);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct driver serval_gpio_driver = {
|
||||
.name = "serval-gpio",
|
||||
.id = UCLASS_GPIO,
|
||||
.probe = serval_gpio_probe,
|
||||
.ops = &mscc_gpio_ops,
|
||||
};
|
||||
|
||||
static int serval_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mscc_pinctrl_probe(dev, FUNC_MAX, serval_pins,
|
||||
ARRAY_SIZE(serval_pins),
|
||||
serval_function_names,
|
||||
serval_gpios);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = device_bind(dev, &serval_gpio_driver, "serval-gpio", NULL,
|
||||
dev_of_offset(dev), NULL);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct udevice_id serval_pinctrl_of_match[] = {
|
||||
{ .compatible = "mscc,serval-pinctrl" },
|
||||
{},
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(serval_pinctrl) = {
|
||||
.name = "serval-pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = of_match_ptr(serval_pinctrl_of_match),
|
||||
.probe = serval_pinctrl_probe,
|
||||
.priv_auto_alloc_size = sizeof(struct mscc_pinctrl),
|
||||
.ops = &mscc_pinctrl_ops,
|
||||
};
|
269
drivers/pinctrl/mscc/pinctrl-servalt.c
Normal file
269
drivers/pinctrl/mscc/pinctrl-servalt.c
Normal file
@ -0,0 +1,269 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
/*
|
||||
* Microsemi SoCs pinctrl driver
|
||||
*
|
||||
* Author: <horatiu.vultur@microchip.com>
|
||||
* Copyright (c) 2019 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <config.h>
|
||||
#include <dm.h>
|
||||
#include <dm/device-internal.h>
|
||||
#include <dm/lists.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <dm/root.h>
|
||||
#include <errno.h>
|
||||
#include <fdtdec.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <asm/system.h>
|
||||
#include "mscc-common.h"
|
||||
|
||||
enum {
|
||||
FUNC_NONE,
|
||||
FUNC_GPIO,
|
||||
FUNC_IRQ0_IN,
|
||||
FUNC_IRQ0_OUT,
|
||||
FUNC_IRQ1_IN,
|
||||
FUNC_IRQ1_OUT,
|
||||
FUNC_MIIM1,
|
||||
FUNC_MIIM2,
|
||||
FUNC_PCI_WAKE,
|
||||
FUNC_PTP0,
|
||||
FUNC_PTP1,
|
||||
FUNC_PTP2,
|
||||
FUNC_PTP3,
|
||||
FUNC_PWM,
|
||||
FUNC_RCVRD_CLK0,
|
||||
FUNC_RCVRD_CLK1,
|
||||
FUNC_RCVRD_CLK2,
|
||||
FUNC_RCVRD_CLK3,
|
||||
FUNC_REF_CLK0,
|
||||
FUNC_REF_CLK1,
|
||||
FUNC_REF_CLK2,
|
||||
FUNC_REF_CLK3,
|
||||
FUNC_SFP0,
|
||||
FUNC_SFP1,
|
||||
FUNC_SFP2,
|
||||
FUNC_SFP3,
|
||||
FUNC_SFP4,
|
||||
FUNC_SFP5,
|
||||
FUNC_SFP6,
|
||||
FUNC_SFP7,
|
||||
FUNC_SFP8,
|
||||
FUNC_SFP9,
|
||||
FUNC_SFP10,
|
||||
FUNC_SFP11,
|
||||
FUNC_SFP12,
|
||||
FUNC_SFP13,
|
||||
FUNC_SFP14,
|
||||
FUNC_SFP15,
|
||||
FUNC_SIO,
|
||||
FUNC_SPI,
|
||||
FUNC_TACHO,
|
||||
FUNC_TWI,
|
||||
FUNC_TWI2,
|
||||
FUNC_TWI_SCL_M,
|
||||
FUNC_UART,
|
||||
FUNC_UART2,
|
||||
FUNC_MAX
|
||||
};
|
||||
|
||||
static char * const servalt_function_names[] = {
|
||||
[FUNC_NONE] = "none",
|
||||
[FUNC_GPIO] = "gpio",
|
||||
[FUNC_IRQ0_IN] = "irq0_in",
|
||||
[FUNC_IRQ0_OUT] = "irq0_out",
|
||||
[FUNC_IRQ1_IN] = "irq1_in",
|
||||
[FUNC_IRQ1_OUT] = "irq1_out",
|
||||
[FUNC_MIIM1] = "miim1",
|
||||
[FUNC_MIIM2] = "miim2",
|
||||
[FUNC_PCI_WAKE] = "pci_wake",
|
||||
[FUNC_PTP0] = "ptp0",
|
||||
[FUNC_PTP1] = "ptp1",
|
||||
[FUNC_PTP2] = "ptp2",
|
||||
[FUNC_PTP3] = "ptp3",
|
||||
[FUNC_PWM] = "pwm",
|
||||
[FUNC_RCVRD_CLK0] = "rcvrd_clk0",
|
||||
[FUNC_RCVRD_CLK1] = "rcvrd_clk1",
|
||||
[FUNC_RCVRD_CLK2] = "rcvrd_clk2",
|
||||
[FUNC_RCVRD_CLK3] = "rcvrd_clk3",
|
||||
[FUNC_REF_CLK0] = "ref_clk0",
|
||||
[FUNC_REF_CLK1] = "ref_clk1",
|
||||
[FUNC_REF_CLK2] = "ref_clk2",
|
||||
[FUNC_REF_CLK3] = "ref_clk3",
|
||||
[FUNC_SFP0] = "sfp0",
|
||||
[FUNC_SFP1] = "sfp1",
|
||||
[FUNC_SFP2] = "sfp2",
|
||||
[FUNC_SFP3] = "sfp3",
|
||||
[FUNC_SFP4] = "sfp4",
|
||||
[FUNC_SFP5] = "sfp5",
|
||||
[FUNC_SFP6] = "sfp6",
|
||||
[FUNC_SFP7] = "sfp7",
|
||||
[FUNC_SFP8] = "sfp8",
|
||||
[FUNC_SFP9] = "sfp9",
|
||||
[FUNC_SFP10] = "sfp10",
|
||||
[FUNC_SFP11] = "sfp11",
|
||||
[FUNC_SFP12] = "sfp12",
|
||||
[FUNC_SFP13] = "sfp13",
|
||||
[FUNC_SFP14] = "sfp14",
|
||||
[FUNC_SFP15] = "sfp15",
|
||||
[FUNC_SIO] = "sio",
|
||||
[FUNC_SPI] = "spi",
|
||||
[FUNC_TACHO] = "tacho",
|
||||
[FUNC_TWI] = "twi",
|
||||
[FUNC_TWI2] = "twi2",
|
||||
[FUNC_TWI_SCL_M] = "twi_scl_m",
|
||||
[FUNC_UART] = "uart",
|
||||
[FUNC_UART2] = "uart2",
|
||||
};
|
||||
|
||||
MSCC_P(0, SIO, NONE, NONE);
|
||||
MSCC_P(1, SIO, NONE, NONE);
|
||||
MSCC_P(2, SIO, NONE, NONE);
|
||||
MSCC_P(3, SIO, NONE, NONE);
|
||||
MSCC_P(4, IRQ0_IN, IRQ0_OUT, TWI_SCL_M);
|
||||
MSCC_P(5, IRQ1_IN, IRQ1_OUT, TWI_SCL_M);
|
||||
MSCC_P(6, UART, NONE, NONE);
|
||||
MSCC_P(7, UART, NONE, NONE);
|
||||
MSCC_P(8, SPI, SFP0, TWI_SCL_M);
|
||||
MSCC_P(9, PCI_WAKE, SFP1, SPI);
|
||||
MSCC_P(10, PTP0, SFP2, TWI_SCL_M);
|
||||
MSCC_P(11, PTP1, SFP3, TWI_SCL_M);
|
||||
MSCC_P(12, REF_CLK0, SFP4, TWI_SCL_M);
|
||||
MSCC_P(13, REF_CLK1, SFP5, TWI_SCL_M);
|
||||
MSCC_P(14, REF_CLK2, IRQ0_OUT, SPI);
|
||||
MSCC_P(15, REF_CLK3, IRQ1_OUT, SPI);
|
||||
MSCC_P(16, TACHO, SFP6, SPI);
|
||||
MSCC_P(17, PWM, NONE, TWI_SCL_M);
|
||||
MSCC_P(18, PTP2, SFP7, SPI);
|
||||
MSCC_P(19, PTP3, SFP8, SPI);
|
||||
MSCC_P(20, UART2, SFP9, SPI);
|
||||
MSCC_P(21, UART2, NONE, NONE);
|
||||
MSCC_P(22, MIIM1, SFP10, TWI2);
|
||||
MSCC_P(23, MIIM1, SFP11, TWI2);
|
||||
MSCC_P(24, TWI, NONE, NONE);
|
||||
MSCC_P(25, TWI, SFP12, TWI_SCL_M);
|
||||
MSCC_P(26, TWI_SCL_M, SFP13, SPI);
|
||||
MSCC_P(27, TWI_SCL_M, SFP14, SPI);
|
||||
MSCC_P(28, TWI_SCL_M, SFP15, SPI);
|
||||
MSCC_P(29, TWI_SCL_M, NONE, NONE);
|
||||
MSCC_P(30, TWI_SCL_M, NONE, NONE);
|
||||
MSCC_P(31, TWI_SCL_M, NONE, NONE);
|
||||
MSCC_P(32, TWI_SCL_M, NONE, NONE);
|
||||
MSCC_P(33, RCVRD_CLK0, NONE, NONE);
|
||||
MSCC_P(34, RCVRD_CLK1, NONE, NONE);
|
||||
MSCC_P(35, RCVRD_CLK2, NONE, NONE);
|
||||
MSCC_P(36, RCVRD_CLK3, NONE, NONE);
|
||||
|
||||
#define SERVALT_PIN(n) { \
|
||||
.name = "GPIO_"#n, \
|
||||
.drv_data = &mscc_pin_##n \
|
||||
}
|
||||
|
||||
static const struct mscc_pin_data servalt_pins[] = {
|
||||
SERVALT_PIN(0),
|
||||
SERVALT_PIN(1),
|
||||
SERVALT_PIN(2),
|
||||
SERVALT_PIN(3),
|
||||
SERVALT_PIN(4),
|
||||
SERVALT_PIN(5),
|
||||
SERVALT_PIN(6),
|
||||
SERVALT_PIN(7),
|
||||
SERVALT_PIN(8),
|
||||
SERVALT_PIN(9),
|
||||
SERVALT_PIN(10),
|
||||
SERVALT_PIN(11),
|
||||
SERVALT_PIN(12),
|
||||
SERVALT_PIN(13),
|
||||
SERVALT_PIN(14),
|
||||
SERVALT_PIN(15),
|
||||
SERVALT_PIN(16),
|
||||
SERVALT_PIN(17),
|
||||
SERVALT_PIN(18),
|
||||
SERVALT_PIN(19),
|
||||
SERVALT_PIN(20),
|
||||
SERVALT_PIN(21),
|
||||
SERVALT_PIN(22),
|
||||
SERVALT_PIN(23),
|
||||
SERVALT_PIN(24),
|
||||
SERVALT_PIN(25),
|
||||
SERVALT_PIN(26),
|
||||
SERVALT_PIN(27),
|
||||
SERVALT_PIN(28),
|
||||
SERVALT_PIN(29),
|
||||
SERVALT_PIN(30),
|
||||
SERVALT_PIN(31),
|
||||
SERVALT_PIN(32),
|
||||
SERVALT_PIN(33),
|
||||
SERVALT_PIN(34),
|
||||
SERVALT_PIN(35),
|
||||
SERVALT_PIN(36),
|
||||
};
|
||||
|
||||
static const unsigned long servalt_gpios[] = {
|
||||
[MSCC_GPIO_OUT_SET] = 0x00,
|
||||
[MSCC_GPIO_OUT_CLR] = 0x08,
|
||||
[MSCC_GPIO_OUT] = 0x10,
|
||||
[MSCC_GPIO_IN] = 0x18,
|
||||
[MSCC_GPIO_OE] = 0x20,
|
||||
[MSCC_GPIO_INTR] = 0x28,
|
||||
[MSCC_GPIO_INTR_ENA] = 0x30,
|
||||
[MSCC_GPIO_INTR_IDENT] = 0x38,
|
||||
[MSCC_GPIO_ALT0] = 0x40,
|
||||
[MSCC_GPIO_ALT1] = 0x48,
|
||||
};
|
||||
|
||||
static int servalt_gpio_probe(struct udevice *dev)
|
||||
{
|
||||
struct gpio_dev_priv *uc_priv;
|
||||
|
||||
uc_priv = dev_get_uclass_priv(dev);
|
||||
uc_priv->bank_name = "servalt-gpio";
|
||||
uc_priv->gpio_count = ARRAY_SIZE(servalt_pins);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct driver servalt_gpio_driver = {
|
||||
.name = "servalt-gpio",
|
||||
.id = UCLASS_GPIO,
|
||||
.probe = servalt_gpio_probe,
|
||||
.ops = &mscc_gpio_ops,
|
||||
};
|
||||
|
||||
static int servalt_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mscc_pinctrl_probe(dev, FUNC_MAX, servalt_pins,
|
||||
ARRAY_SIZE(servalt_pins),
|
||||
servalt_function_names,
|
||||
servalt_gpios);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = device_bind(dev, &servalt_gpio_driver, "servalt-gpio", NULL,
|
||||
dev_of_offset(dev), NULL);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct udevice_id servalt_pinctrl_of_match[] = {
|
||||
{ .compatible = "mscc,servalt-pinctrl" },
|
||||
{},
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(servalt_pinctrl) = {
|
||||
.name = "servalt-pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = of_match_ptr(servalt_pinctrl_of_match),
|
||||
.probe = servalt_pinctrl_probe,
|
||||
.priv_auto_alloc_size = sizeof(struct mscc_pinctrl),
|
||||
.ops = &mscc_pinctrl_ops,
|
||||
};
|
@ -14,10 +14,11 @@
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x00100000
|
||||
#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
|
||||
|
||||
#define CPU_CLOCK_RATE 500000000 /* Clock for the MIPS core */
|
||||
#ifdef CONFIG_SOC_LUTON
|
||||
#if defined(CONFIG_SOC_LUTON) || defined(CONFIG_SOC_SERVAL)
|
||||
#define CPU_CLOCK_RATE 416666666 /* Clock for the MIPS core */
|
||||
#define CONFIG_SYS_MIPS_TIMER_FREQ 208333333
|
||||
#else
|
||||
#define CPU_CLOCK_RATE 500000000 /* Clock for the MIPS core */
|
||||
#define CONFIG_SYS_MIPS_TIMER_FREQ (CPU_CLOCK_RATE / 2)
|
||||
#endif
|
||||
#define CONFIG_SYS_NS16550_CLK CONFIG_SYS_MIPS_TIMER_FREQ
|
||||
|
Loading…
Reference in New Issue
Block a user