a26c56ae67
Use the `marvell,reg-init` DT property to configure the LED[2]/INTn pin
of the Marvell 88E1514 ethernet PHY on Turris Omnia into interrupt mode.
Without this the pin is by default in LED[2] mode, and the Marvell PHY
driver configures LED[2] into "On - Link, Blink - Activity" mode.
This fixes the issue where the pca9538 GPIO/interrupt controller (which
can't mask interrupts in HW) received too many interrupts and after a
time started ignoring the interrupt with error message:
IRQ 71: nobody cared
There is a work in progress to have the Marvell PHY driver support
parsing PHY LED nodes from OF and registering the LEDs as Linux LED
class devices. Once this is done the PHY driver can also automatically
set the pin into INTn mode if it does not find LED[2] in OF.
Until then, though, we fix this via `marvell,reg-init` DT property.
Signed-off-by: Marek Behún <kabel@kernel.org>
Reported-by: Rui Salvaterra <rsalvaterra@gmail.com>
Fixes: 26ca8b52d6
("ARM: dts: add support for Turris Omnia")
Cc: Uwe Kleine-König <uwe@kleine-koenig.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Gregory CLEMENT <gregory.clement@bootlin.com>
Cc: <stable@vger.kernel.org>
Tested-by: Rui Salvaterra <rsalvaterra@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
525 lines
9.6 KiB
Plaintext
525 lines
9.6 KiB
Plaintext
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
|
/*
|
|
* Device Tree file for the Turris Omnia
|
|
*
|
|
* Copyright (C) 2016 Uwe Kleine-König <uwe@kleine-koenig.org>
|
|
* Copyright (C) 2016 Tomas Hlavacek <tmshlvkc@gmail.com>
|
|
*
|
|
* Schematic available at https://www.turris.cz/doc/_media/rtrom01-schema.pdf
|
|
*/
|
|
|
|
/dts-v1/;
|
|
|
|
#include <dt-bindings/gpio/gpio.h>
|
|
#include <dt-bindings/input/input.h>
|
|
#include <dt-bindings/leds/common.h>
|
|
#include "armada-385.dtsi"
|
|
|
|
/ {
|
|
model = "Turris Omnia";
|
|
compatible = "cznic,turris-omnia", "marvell,armada385", "marvell,armada380";
|
|
|
|
chosen {
|
|
stdout-path = &uart0;
|
|
};
|
|
|
|
memory {
|
|
device_type = "memory";
|
|
reg = <0x00000000 0x40000000>; /* 1024 MB */
|
|
};
|
|
|
|
soc {
|
|
ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000
|
|
MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000
|
|
MBUS_ID(0x09, 0x19) 0 0xf1100000 0x10000
|
|
MBUS_ID(0x09, 0x15) 0 0xf1110000 0x10000
|
|
MBUS_ID(0x0c, 0x04) 0 0xf1200000 0x100000>;
|
|
|
|
internal-regs {
|
|
|
|
/* USB part of the PCIe2/USB 2.0 port */
|
|
usb@58000 {
|
|
status = "okay";
|
|
};
|
|
|
|
sata@a8000 {
|
|
status = "okay";
|
|
};
|
|
|
|
sdhci@d8000 {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&sdhci_pins>;
|
|
status = "okay";
|
|
|
|
bus-width = <8>;
|
|
no-1-8-v;
|
|
non-removable;
|
|
};
|
|
|
|
usb3@f0000 {
|
|
status = "okay";
|
|
};
|
|
|
|
usb3@f8000 {
|
|
status = "okay";
|
|
};
|
|
};
|
|
|
|
pcie {
|
|
status = "okay";
|
|
|
|
pcie@1,0 {
|
|
/* Port 0, Lane 0 */
|
|
status = "okay";
|
|
};
|
|
|
|
pcie@2,0 {
|
|
/* Port 1, Lane 0 */
|
|
status = "okay";
|
|
};
|
|
|
|
pcie@3,0 {
|
|
/* Port 2, Lane 0 */
|
|
status = "okay";
|
|
};
|
|
};
|
|
};
|
|
|
|
sfp: sfp {
|
|
compatible = "sff,sfp";
|
|
i2c-bus = <&sfp_i2c>;
|
|
tx-fault-gpios = <&pcawan 0 GPIO_ACTIVE_HIGH>;
|
|
tx-disable-gpios = <&pcawan 1 GPIO_ACTIVE_HIGH>;
|
|
rate-select0-gpios = <&pcawan 2 GPIO_ACTIVE_HIGH>;
|
|
los-gpios = <&pcawan 3 GPIO_ACTIVE_HIGH>;
|
|
mod-def0-gpios = <&pcawan 4 GPIO_ACTIVE_LOW>;
|
|
maximum-power-milliwatt = <3000>;
|
|
|
|
/*
|
|
* For now this has to be enabled at boot time by U-Boot when
|
|
* a SFP module is present. Read more in the comment in the
|
|
* eth2 node below.
|
|
*/
|
|
status = "disabled";
|
|
};
|
|
};
|
|
|
|
&bm {
|
|
status = "okay";
|
|
};
|
|
|
|
&bm_bppi {
|
|
status = "okay";
|
|
};
|
|
|
|
/* Connected to 88E6176 switch, port 6 */
|
|
ð0 {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&ge0_rgmii_pins>;
|
|
status = "okay";
|
|
phy-mode = "rgmii";
|
|
buffer-manager = <&bm>;
|
|
bm,pool-long = <0>;
|
|
bm,pool-short = <3>;
|
|
|
|
fixed-link {
|
|
speed = <1000>;
|
|
full-duplex;
|
|
};
|
|
};
|
|
|
|
/* Connected to 88E6176 switch, port 5 */
|
|
ð1 {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&ge1_rgmii_pins>;
|
|
status = "okay";
|
|
phy-mode = "rgmii";
|
|
buffer-manager = <&bm>;
|
|
bm,pool-long = <1>;
|
|
bm,pool-short = <3>;
|
|
|
|
fixed-link {
|
|
speed = <1000>;
|
|
full-duplex;
|
|
};
|
|
};
|
|
|
|
/* WAN port */
|
|
ð2 {
|
|
/*
|
|
* eth2 is connected via a multiplexor to both the SFP cage and to
|
|
* ethernet-phy@1. The multiplexor switches the signal to SFP cage when
|
|
* a SFP module is present, as determined by the mode-def0 GPIO.
|
|
*
|
|
* Until kernel supports this configuration properly, in case SFP module
|
|
* is present, U-Boot has to enable the sfp node above, remove phy
|
|
* handle and add managed = "in-band-status" property.
|
|
*/
|
|
status = "okay";
|
|
phy-mode = "sgmii";
|
|
phy-handle = <&phy1>;
|
|
phys = <&comphy5 2>;
|
|
sfp = <&sfp>;
|
|
buffer-manager = <&bm>;
|
|
bm,pool-long = <2>;
|
|
bm,pool-short = <3>;
|
|
};
|
|
|
|
&i2c0 {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&i2c0_pins>;
|
|
status = "okay";
|
|
|
|
i2cmux@70 {
|
|
compatible = "nxp,pca9547";
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
reg = <0x70>;
|
|
|
|
i2c@0 {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
reg = <0>;
|
|
|
|
/* STM32F0 command interface at address 0x2a */
|
|
|
|
led-controller@2b {
|
|
compatible = "cznic,turris-omnia-leds";
|
|
reg = <0x2b>;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
/*
|
|
* LEDs are controlled by MCU (STM32F0) at
|
|
* address 0x2b.
|
|
*
|
|
* The driver does not support HW control mode
|
|
* for the LEDs yet. Disable the LEDs for now.
|
|
*
|
|
* Also LED functions are not stable yet:
|
|
* - there are 3 LEDs connected via MCU to PCIe
|
|
* ports. One of these ports supports mSATA.
|
|
* There is no mSATA nor PCIe function.
|
|
* For now we use LED_FUNCTION_WLAN, since
|
|
* in most cases users have wifi cards in
|
|
* these slots
|
|
* - there are 2 LEDs dedicated for user: A and
|
|
* B. Again there is no such function defined.
|
|
* For now we use LED_FUNCTION_INDICATOR
|
|
*/
|
|
status = "disabled";
|
|
|
|
multi-led@0 {
|
|
reg = <0x0>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_INDICATOR;
|
|
function-enumerator = <2>;
|
|
};
|
|
|
|
multi-led@1 {
|
|
reg = <0x1>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_INDICATOR;
|
|
function-enumerator = <1>;
|
|
};
|
|
|
|
multi-led@2 {
|
|
reg = <0x2>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_WLAN;
|
|
function-enumerator = <3>;
|
|
};
|
|
|
|
multi-led@3 {
|
|
reg = <0x3>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_WLAN;
|
|
function-enumerator = <2>;
|
|
};
|
|
|
|
multi-led@4 {
|
|
reg = <0x4>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_WLAN;
|
|
function-enumerator = <1>;
|
|
};
|
|
|
|
multi-led@5 {
|
|
reg = <0x5>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_WAN;
|
|
};
|
|
|
|
multi-led@6 {
|
|
reg = <0x6>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_LAN;
|
|
function-enumerator = <4>;
|
|
};
|
|
|
|
multi-led@7 {
|
|
reg = <0x7>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_LAN;
|
|
function-enumerator = <3>;
|
|
};
|
|
|
|
multi-led@8 {
|
|
reg = <0x8>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_LAN;
|
|
function-enumerator = <2>;
|
|
};
|
|
|
|
multi-led@9 {
|
|
reg = <0x9>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_LAN;
|
|
function-enumerator = <1>;
|
|
};
|
|
|
|
multi-led@a {
|
|
reg = <0xa>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_LAN;
|
|
function-enumerator = <0>;
|
|
};
|
|
|
|
multi-led@b {
|
|
reg = <0xb>;
|
|
color = <LED_COLOR_ID_RGB>;
|
|
function = LED_FUNCTION_POWER;
|
|
};
|
|
};
|
|
|
|
eeprom@54 {
|
|
compatible = "atmel,24c64";
|
|
reg = <0x54>;
|
|
|
|
/* The EEPROM contains data for bootloader.
|
|
* Contents:
|
|
* struct omnia_eeprom {
|
|
* u32 magic; (=0x0341a034 in LE)
|
|
* u32 ramsize; (in GiB)
|
|
* char regdomain[4];
|
|
* u32 crc32;
|
|
* };
|
|
*/
|
|
};
|
|
};
|
|
|
|
i2c@1 {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
reg = <1>;
|
|
|
|
/* routed to PCIe0/mSATA connector (CN7A) */
|
|
};
|
|
|
|
i2c@2 {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
reg = <2>;
|
|
|
|
/* routed to PCIe1/USB2 connector (CN61A) */
|
|
};
|
|
|
|
i2c@3 {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
reg = <3>;
|
|
|
|
/* routed to PCIe2 connector (CN62A) */
|
|
};
|
|
|
|
sfp_i2c: i2c@4 {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
reg = <4>;
|
|
|
|
/* routed to SFP+ */
|
|
};
|
|
|
|
i2c@5 {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
reg = <5>;
|
|
|
|
/* ATSHA204A at address 0x64 */
|
|
};
|
|
|
|
i2c@6 {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
reg = <6>;
|
|
|
|
/* exposed on pin header */
|
|
};
|
|
|
|
i2c@7 {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
reg = <7>;
|
|
|
|
pcawan: gpio@71 {
|
|
/*
|
|
* GPIO expander for SFP+ signals and
|
|
* and phy irq
|
|
*/
|
|
compatible = "nxp,pca9538";
|
|
reg = <0x71>;
|
|
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&pcawan_pins>;
|
|
|
|
interrupt-parent = <&gpio1>;
|
|
interrupts = <14 IRQ_TYPE_LEVEL_LOW>;
|
|
|
|
gpio-controller;
|
|
#gpio-cells = <2>;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
&mdio {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&mdio_pins>;
|
|
status = "okay";
|
|
|
|
phy1: ethernet-phy@1 {
|
|
compatible = "ethernet-phy-ieee802.3-c22";
|
|
reg = <1>;
|
|
marvell,reg-init = <3 18 0 0x4985>;
|
|
|
|
/* irq is connected to &pcawan pin 7 */
|
|
};
|
|
|
|
/* Switch MV88E6176 at address 0x10 */
|
|
switch@10 {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&swint_pins>;
|
|
compatible = "marvell,mv88e6085";
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
dsa,member = <0 0>;
|
|
reg = <0x10>;
|
|
|
|
interrupt-parent = <&gpio1>;
|
|
interrupts = <13 IRQ_TYPE_LEVEL_LOW>;
|
|
|
|
ports {
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
ports@0 {
|
|
reg = <0>;
|
|
label = "lan0";
|
|
};
|
|
|
|
ports@1 {
|
|
reg = <1>;
|
|
label = "lan1";
|
|
};
|
|
|
|
ports@2 {
|
|
reg = <2>;
|
|
label = "lan2";
|
|
};
|
|
|
|
ports@3 {
|
|
reg = <3>;
|
|
label = "lan3";
|
|
};
|
|
|
|
ports@4 {
|
|
reg = <4>;
|
|
label = "lan4";
|
|
};
|
|
|
|
ports@5 {
|
|
reg = <5>;
|
|
label = "cpu";
|
|
ethernet = <ð1>;
|
|
phy-mode = "rgmii-id";
|
|
|
|
fixed-link {
|
|
speed = <1000>;
|
|
full-duplex;
|
|
};
|
|
};
|
|
|
|
/* port 6 is connected to eth0 */
|
|
};
|
|
};
|
|
};
|
|
|
|
&pinctrl {
|
|
pcawan_pins: pcawan-pins {
|
|
marvell,pins = "mpp46";
|
|
marvell,function = "gpio";
|
|
};
|
|
|
|
swint_pins: swint-pins {
|
|
marvell,pins = "mpp45";
|
|
marvell,function = "gpio";
|
|
};
|
|
|
|
spi0cs0_pins: spi0cs0-pins {
|
|
marvell,pins = "mpp25";
|
|
marvell,function = "spi0";
|
|
};
|
|
|
|
spi0cs1_pins: spi0cs1-pins {
|
|
marvell,pins = "mpp26";
|
|
marvell,function = "spi0";
|
|
};
|
|
};
|
|
|
|
&spi0 {
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&spi0_pins &spi0cs0_pins>;
|
|
status = "okay";
|
|
|
|
spi-nor@0 {
|
|
compatible = "spansion,s25fl164k", "jedec,spi-nor";
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
reg = <0>;
|
|
spi-max-frequency = <40000000>;
|
|
|
|
partitions {
|
|
compatible = "fixed-partitions";
|
|
#address-cells = <1>;
|
|
#size-cells = <1>;
|
|
|
|
partition@0 {
|
|
reg = <0x0 0x00100000>;
|
|
label = "U-Boot";
|
|
};
|
|
|
|
partition@100000 {
|
|
reg = <0x00100000 0x00700000>;
|
|
label = "Rescue system";
|
|
};
|
|
};
|
|
};
|
|
|
|
/* MISO, MOSI, SCLK and CS1 are routed to pin header CN11 */
|
|
};
|
|
|
|
&uart0 {
|
|
/* Pin header CN10 */
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&uart0_pins>;
|
|
status = "okay";
|
|
};
|
|
|
|
&uart1 {
|
|
/* Pin header CN11 */
|
|
pinctrl-names = "default";
|
|
pinctrl-0 = <&uart1_pins>;
|
|
status = "okay";
|
|
};
|