Commit 14ef3575 authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'omap-for-v5.1/dt-ti-81xx-signed' of...

Merge tag 'omap-for-v5.1/dt-ti-81xx-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into arm/dt

dts updates for ti81xx for v5.1 merge window

Two changes to add support for McGill University's IceBoard telescope
ARM + FPGA instrumentation board. This board is used for several
telescopes around the world, see the related device tree commit for
some interesting links for more information.

Note that these changes are based on the related ti81xx soc changes.

* tag 'omap-for-v5.1/dt-ti-81xx-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
  ARM: dts: Adds device tree file for McGill's IceBoard, based on TI AM3874
  ARM: dts: ti81xx: Add dts boilerplate for all GPIO and SPI peripherals
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents e4354c1a d0317731
......@@ -700,6 +700,7 @@ dtb-$(CONFIG_ARCH_OMAP3) += \
omap3-thunder.dtb \
omap3-zoom3.dtb
dtb-$(CONFIG_SOC_TI81XX) += \
am3874-iceboard.dtb \
dm8148-evm.dtb \
dm8148-t410.dtb \
dm8168-evm.dtb \
......
// SPDX-License-Identifier: GPL-2.0
/*
* Device tree for Winterland IceBoard
*
* http://mcgillcosmology.com
* http://threespeedlogic.com
*
* This is an ARM + FPGA instrumentation board used at telescopes in
* Antarctica (the South Pole Telescope), Chile (POLARBEAR), and at the DRAO
* observatory in British Columbia (CHIME).
*
* Copyright (c) 2019 Three-Speed Logic, Inc. <gsmecher@threespeedlogic.com>
*/
/dts-v1/;
#include "dm814x.dtsi"
#include <dt-bindings/interrupt-controller/irq.h>
/ {
model = "Winterland IceBoard";
compatible = "ti,dm8148", "ti,dm814";
chosen {
stdout-path = "serial1:115200n8";
bootargs = "earlycon";
};
memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x40000000>; /* 1 GB */
};
vmmcsd_fixed: fixedregulator0 {
compatible = "regulator-fixed";
regulator-name = "vmmcsd_fixed";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
};
/* The MAC provides internal delay for the transmit path ONLY, which is enabled
* provided no -id/-txid/-rxid suffix is provided to "phy-mode".
*
* The receive path is delayed at the PHY. The recommended register settings
* are 0xf0 for the control bits, and 0x7777 for the data bits. However, the
* conversion code in the kernel lies: the PHY's registers are 120 ps per tap,
* and the kernel assumes 200 ps per tap. So we have fudged the numbers here to
* obtain the correct register settings.
*/
&mac { dual_emac = <1>; };
&cpsw_emac0 {
phy-handle = <&ethphy0>;
phy-mode = "rgmii";
dual_emac_res_vlan = <1>;
};
&cpsw_emac1 {
phy-handle = <&ethphy1>;
phy-mode = "rgmii";
dual_emac_res_vlan = <2>;
};
&davinci_mdio {
ethphy0: ethernet-phy@0 {
reg = <0x2>;
rxc-skew-ps = <3000>;
rxdv-skew-ps = <0>;
rxd3-skew-ps = <0>;
rxd2-skew-ps = <0>;
rxd1-skew-ps = <0>;
rxd0-skew-ps = <0>;
phy-reset-gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
};
ethphy1: ethernet-phy@1 {
reg = <0x1>;
rxc-skew-ps = <3000>;
rxdv-skew-ps = <0>;
rxd3-skew-ps = <0>;
rxd2-skew-ps = <0>;
rxd1-skew-ps = <0>;
rxd0-skew-ps = <0>;
phy-reset-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
};
};
&mmc1 { status = "disabled"; };
&mmc2 {
pinctrl-names = "default";
pinctrl-0 = <&mmc2_pins>;
vmmc-supply = <&vmmcsd_fixed>;
bus-width = <4>;
};
&mmc3 { status = "disabled"; };
&i2c1 {
/* Most I2C activity happens through this port, with the sole exception
* of the backplane. Since there are multiply assigned addresses, the
* "i2c-mux-idle-disconnect" is important.
*/
pca9548@70 {
compatible = "nxp,pca9548";
reg = <0x70>;
#address-cells = <1>;
#size-cells = <0>;
i2c@0 {
/* FMC A */
#address-cells = <1>;
#size-cells = <0>;
reg = <0>;
i2c-mux-idle-disconnect;
};
i2c@1 {
/* FMC B */
#address-cells = <1>;
#size-cells = <0>;
reg = <1>;
i2c-mux-idle-disconnect;
};
i2c@2 {
/* QSFP A */
#address-cells = <1>;
#size-cells = <0>;
reg = <2>;
i2c-mux-idle-disconnect;
};
i2c@3 {
/* QSFP B */
#address-cells = <1>;
#size-cells = <0>;
reg = <3>;
i2c-mux-idle-disconnect;
};
i2c@4 {
/* SFP */
#address-cells = <1>;
#size-cells = <0>;
reg = <4>;
i2c-mux-idle-disconnect;
};
i2c@5 {
#address-cells = <1>;
#size-cells = <0>;
reg = <5>;
i2c-mux-idle-disconnect;
ina230@40 { compatible = "ti,ina230"; reg = <0x40>; shunt-resistor = <5000>; };
ina230@41 { compatible = "ti,ina230"; reg = <0x41>; shunt-resistor = <5000>; };
ina230@42 { compatible = "ti,ina230"; reg = <0x42>; shunt-resistor = <5000>; };
ina230@44 { compatible = "ti,ina230"; reg = <0x44>; shunt-resistor = <5000>; };
ina230@45 { compatible = "ti,ina230"; reg = <0x45>; shunt-resistor = <5000>; };
ina230@46 { compatible = "ti,ina230"; reg = <0x46>; shunt-resistor = <5000>; };
ina230@47 { compatible = "ti,ina230"; reg = <0x47>; shunt-resistor = <5500>; };
ina230@48 { compatible = "ti,ina230"; reg = <0x48>; shunt-resistor = <2360>; };
ina230@49 { compatible = "ti,ina230"; reg = <0x49>; shunt-resistor = <2360>; };
ina230@43 { compatible = "ti,ina230"; reg = <0x43>; shunt-resistor = <2360>; };
ina230@4b { compatible = "ti,ina230"; reg = <0x4b>; shunt-resistor = <5500>; };
ina230@4c { compatible = "ti,ina230"; reg = <0x4c>; shunt-resistor = <2360>; };
ina230@4d { compatible = "ti,ina230"; reg = <0x4d>; shunt-resistor = <770>; };
ina230@4e { compatible = "ti,ina230"; reg = <0x4e>; shunt-resistor = <770>; };
ina230@4f { compatible = "ti,ina230"; reg = <0x4f>; shunt-resistor = <770>; };
};
i2c@6 {
/* Backplane */
#address-cells = <1>;
#size-cells = <0>;
reg = <6>;
i2c-mux-idle-disconnect;
};
i2c@7 {
#address-cells = <1>;
#size-cells = <0>;
reg = <7>;
i2c-mux-idle-disconnect;
u41: pca9575@20 {
compatible = "nxp,pca9575";
reg = <0x20>;
gpio-controller;
#gpio-cells = <2>;
gpio-line-names =
"FMCA_EN_12V0", "FMCA_EN_3V3", "FMCA_EN_VADJ", "FMCA_PG_M2C",
"FMCA_PG_C2M", "FMCA_PRSNT_M2C_L", "FMCA_CLK_DIR", "SFP_LOS",
"FMCB_EN_12V0", "FMCB_EN_3V3", "FMCB_EN_VADJ", "FMCB_PG_M2C",
"FMCB_PG_C2M", "FMCB_PRSNT_M2C_L", "FMCB_CLK_DIR", "SFP_ModPrsL";
reset_gpios = <&gpio2 11 GPIO_ACTIVE_LOW>;
};
u42: pca9575@21 {
compatible = "nxp,pca9575";
reg = <0x21>;
gpio-controller;
#gpio-cells = <2>;
gpio-line-names =
"QSFPA_ModPrsL", "QSFPA_IntL", "QSFPA_ResetL", "QSFPA_ModSelL",
"QSFPA_LPMode", "QSFPB_ModPrsL", "QSFPB_IntL", "QSFPB_ResetL",
"SFP_TxFault", "SFP_TxDisable", "SFP_RS0", "SFP_RS1",
"QSFPB_ModSelL", "QSFPB_LPMode", "SEL_SFP", "ARM_MR";
reset_gpios = <&gpio2 11 GPIO_ACTIVE_LOW>;
};
u48: pca9575@22 {
compatible = "nxp,pca9575";
reg=<0x22>;
gpio-controller;
#gpio-cells = <2>;
sw-gpios = <&u48 0 0>, <&u48 1 0>, <&u48 2 0>, <&u48 3 0>,
<&u48 4 0>, <&u48 5 0>, <&u48 6 0>, <&u48 7 0>;
led-gpios = <&u48 7 0>, <&u48 6 0>, <&u48 5 0>, <&u48 4 0>,
<&u48 3 0>, <&u48 2 0>, <&u48 1 0>, <&u48 0 0>;
gpio-line-names =
"GP_SW1", "GP_SW2", "GP_SW3", "GP_SW4",
"GP_SW5", "GP_SW6", "GP_SW7", "GP_SW8",
"GP_LED8", "GP_LED7", "GP_LED6", "GP_LED5",
"GP_LED4", "GP_LED3", "GP_LED2", "GP_LED1";
reset_gpios = <&gpio2 11 GPIO_ACTIVE_LOW>;
};
u59: pca9575@23 {
compatible = "nxp,pca9575";
reg=<0x23>;
gpio-controller;
#gpio-cells = <2>;
gpio-line-names =
"GP_LED9", "GP_LED10", "GP_LED11", "GP_LED12",
"GTX1V8PowerFault", "PHYAPowerFault", "PHYBPowerFault", "ArmPowerFault",
"BP_SLOW_GPIO0", "BP_SLOW_GPIO1", "BP_SLOW_GPIO2", "BP_SLOW_GPIO3",
"BP_SLOW_GPIO4", "BP_SLOW_GPIO5", "__unused_u59_p16", "__unused_u59_p17";
reset_gpios = <&gpio2 11 GPIO_ACTIVE_LOW>;
};
tmp100@48 { compatible = "ti,tmp100"; reg = <0x48>; };
tmp100@4a { compatible = "ti,tmp100"; reg = <0x4a>; };
tmp100@4b { compatible = "ti,tmp100"; reg = <0x4b>; };
tmp100@4c { compatible = "ti,tmp100"; reg = <0x4c>; };
/* EEPROM bank and serial number are treated as separate devices */
at24c01@57 { compatible = "atmel,24c01"; reg = <0x57>; };
at24cs01@5f { compatible = "atmel,24cs01"; reg = <0x5f>; };
};
};
};
&i2c2 {
pca9548@71 {
compatible = "nxp,pca9548";
reg = <0x71>;
#address-cells = <1>;
#size-cells = <0>;
i2c@6 {
/* Backplane */
#address-cells = <1>;
#size-cells = <0>;
reg = <6>;
multi-master;
/* All backplanes should have this -- it's how we know they're there. */
at24c08@54 { compatible="atmel,24c08"; reg=<0x54>; };
at24cs08@5c { compatible="atmel,24cs08"; reg=<0x5c>; };
/* 16 slot backplane */
tmp421@4d { compatible="ti,tmp421"; reg=<0x4d>; };
tmp421@4e { compatible="ti,tmp421"; reg=<0x4e>; };
ina230@40 { compatible = "ti,ina230"; reg = <0x40>; shunt-resistor = <2360>; };
amc6821@18 { compatible = "ti,amc6821"; reg = <0x18>; };
/* Single slot backplane */
};
};
};
&pincntl {
mmc2_pins: pinmux_mmc2_pins {
pinctrl-single,pins = <
DM814X_IOPAD(0x0800, PIN_INPUT | 0x1) /* SD1_CLK */
DM814X_IOPAD(0x0804, PIN_INPUT_PULLUP | 0x1) /* SD1_CMD */
DM814X_IOPAD(0x0808, PIN_INPUT_PULLUP | 0x1) /* SD1_DAT[0] */
DM814X_IOPAD(0x080c, PIN_INPUT_PULLUP | 0x1) /* SD1_DAT[1] */
DM814X_IOPAD(0x0810, PIN_INPUT_PULLUP | 0x1) /* SD1_DAT[2] */
DM814X_IOPAD(0x0814, PIN_INPUT_PULLUP | 0x1) /* SD1_DAT[3] */
DM814X_IOPAD(0x0924, PIN_INPUT_PULLUP | 0x40) /* SD1_POW */
DM814X_IOPAD(0x0928, PIN_INPUT | 0x40) /* SD1_SDWP */
DM814X_IOPAD(0x093C, PIN_INPUT | 0x2) /* SD1_SDCD */
>;
};
usb0_pins: pinmux_usb0_pins {
pinctrl-single,pins = <
DM814X_IOPAD(0x0c34, PIN_OUTPUT | 0x1) /* USB0_DRVVBUS */
>;
};
usb1_pins: pinmux_usb1_pins {
pinctrl-single,pins = <
DM814X_IOPAD(0x0834, PIN_OUTPUT | 0x80) /* USB1_DRVVBUS */
>;
};
gpio1_pins: pinmux_gpio1_pins {
pinctrl-single,pins = <
DM814X_IOPAD(0x081c, PIN_OUTPUT | 0x80) /* PROGRAM_B */
DM814X_IOPAD(0x0820, PIN_INPUT | 0x80) /* INIT_B */
DM814X_IOPAD(0x0824, PIN_INPUT | 0x80) /* DONE */
DM814X_IOPAD(0x0838, PIN_INPUT_PULLUP | 0x80) /* FMCA_TMS */
DM814X_IOPAD(0x083c, PIN_INPUT_PULLUP | 0x80) /* FMCA_TCK */
DM814X_IOPAD(0x0898, PIN_INPUT_PULLUP | 0x80) /* FMCA_TDO */
DM814X_IOPAD(0x089c, PIN_INPUT_PULLUP | 0x80) /* FMCA_TDI */
DM814X_IOPAD(0x08ac, PIN_INPUT_PULLUP | 0x80) /* FMCA_TRST */
DM814X_IOPAD(0x08b0, PIN_INPUT_PULLUP | 0x80) /* FMCB_TMS */
DM814X_IOPAD(0x0a88, PIN_INPUT_PULLUP | 0x80) /* FMCB_TCK */
DM814X_IOPAD(0x0a8c, PIN_INPUT_PULLUP | 0x80) /* FMCB_TDO */
DM814X_IOPAD(0x08bc, PIN_INPUT_PULLUP | 0x80) /* FMCB_TDI */
DM814X_IOPAD(0x0a94, PIN_INPUT_PULLUP | 0x80) /* FMCB_TRST */
DM814X_IOPAD(0x08d4, PIN_INPUT_PULLUP | 0x80) /* FPGA_TMS */
DM814X_IOPAD(0x0aa8, PIN_INPUT_PULLUP | 0x80) /* FPGA_TCK */
DM814X_IOPAD(0x0adc, PIN_INPUT_PULLUP | 0x80) /* FPGA_TDO */
DM814X_IOPAD(0x0ab0, PIN_INPUT_PULLUP | 0x80) /* FPGA_TDI */
>;
};
gpio2_pins: pinmux_gpio2_pins {
pinctrl-single,pins = <
DM814X_IOPAD(0x090c, PIN_INPUT_PULLUP | 0x80) /* PHY A IRQ */
DM814X_IOPAD(0x0910, PIN_INPUT_PULLUP | 0x80) /* PHY A RESET */
DM814X_IOPAD(0x08f4, PIN_INPUT_PULLUP | 0x80) /* PHY B IRQ */
DM814X_IOPAD(0x08f8, PIN_INPUT_PULLUP | 0x80) /* PHY B RESET */
//DM814X_IOPAD(0x0a14, PIN_INPUT_PULLUP | 0x80) /* ARM IRQ */
//DM814X_IOPAD(0x0900, PIN_INPUT | 0x80) /* GPIO IRQ */
DM814X_IOPAD(0x0a2c, PIN_INPUT_PULLUP | 0x80) /* GPIO RESET */
>;
};
gpio4_pins: pinmux_gpio4_pins {
pinctrl-single,pins = <
/* The PLL doesn't react well to the SPI controller reset, so
* we force the CS lines to pull up as GPIOs until we're ready.
* See https://e2e.ti.com/support/processors/f/791/t/276011?Linux-support-for-AM3874-DM8148-in-Arago-linux-omap3
*/
DM814X_IOPAD(0x0b3c, PIN_INPUT_PULLUP | 0x80) /* BP_ARM_GPIO0 */
DM814X_IOPAD(0x0b40, PIN_INPUT_PULLUP | 0x80) /* BP_ARM_GPIO1 */
DM814X_IOPAD(0x0b44, PIN_INPUT_PULLUP | 0x80) /* BP_ARM_GPIO2 */
DM814X_IOPAD(0x0b48, PIN_INPUT_PULLUP | 0x80) /* BP_ARM_GPIO3 */
DM814X_IOPAD(0x0b4c, PIN_INPUT_PULLUP | 0x80) /* BP_ARM_GPIO4 */
DM814X_IOPAD(0x0b50, PIN_INPUT_PULLUP | 0x80) /* BP_ARM_GPIO5 */
>;
};
spi2_pins: pinmux_spi2_pins {
pinctrl-single,pins = <
DM814X_IOPAD(0x0950, PIN_INPUT_PULLUP | 0x80) /* PLL SPI CS1 as GPIO */
DM814X_IOPAD(0x0818, PIN_INPUT_PULLUP | 0x80) /* PLL SPI CS2 as GPIO */
>;
};
spi4_pins: pinmux_spi4_pins {
pinctrl-single,pins = <
DM814X_IOPAD(0x0a7c, 0x20)
DM814X_IOPAD(0x0b74, 0x20)
DM814X_IOPAD(0x0b78, PIN_OUTPUT | 0x20)
DM814X_IOPAD(0x0b7c, PIN_OUTPUT_PULLDOWN | 0x20)
DM814X_IOPAD(0x0b80, PIN_INPUT | 0x20)
>;
};
};
&gpio1 {
pinctrl-names = "default";
pinctrl-0 = <&gpio1_pins>;
gpio-line-names =
"", "PROGRAM_B", "INIT_B", "DONE", /* 0-3 */
"", "", "", "", /* 4-7 */
"FMCA_TMS", "FMCA_TCK", "FMCA_TDO", "FMCA_TDI", /* 8-11 */
"", "", "", "FMCA_TRST", /* 12-15 */
"FMCB_TMS", "FMCB_TCK", "FMCB_TDO", "FMCB_TDI", /* 16-19 */
"FMCB_TRST", "", "", "", /* 20-23 */
"FPGA_TMS", "FPGA_TCK", "FPGA_TDO", "FPGA_TDI", /* 24-27 */
"", "", "", ""; /* 28-31 */
};
&gpio2 {
pinctrl-names = "default";
pinctrl-0 = <&gpio2_pins>;
gpio-line-names =
"PHYA_IRQ_N", "PHYA_RESET_N", "", "", /* 0-3 */
"", "", "", "PHYB_IRQ_N", /* 4-7 */
"PHYB_RESET_N", "ARM_IRQ", "GPIO_IRQ", ""; /* 8-11 */
};
&gpio3 {
pinctrl-names = "default";
/*pinctrl-0 = <&gpio3_pins>;*/
gpio-line-names =
"", "", "ARMClkSel0", "", /* 0-3 */
"EnFPGARef", "", "", "ARMClkSel1"; /* 4-7 */
};
&gpio4 {
pinctrl-names = "default";
pinctrl-0 = <&gpio4_pins>;
gpio-line-names =
"BP_ARM_GPIO0", "BP_ARM_GPIO1", "BP_ARM_GPIO2", "BP_ARM_GPIO3",
"BP_ARM_GPIO4", "BP_ARM_GPIO5";
};
&usb0 {
pinctrl-names = "default";
pinctrl-0 = <&usb0_pins>;
dr_mode = "host";
};
&usb1 {
pinctrl-names = "default";
pinctrl-0 = <&usb1_pins>;
dr_mode = "host";
};
&mcspi1 {
s25fl256@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <40000000>;
fsbl@0 {
/* 256 kB */
label = "U-Boot-min";
reg = <0 0x40000>;
};
ssbl@1 {
/* 512 kB */
label = "U-Boot";
reg = <0x40000 0x80000>;
};
bootenv@2 {
/* 256 kB */
label = "U-Boot Env";
reg = <0xc0000 0x40000>;
};
kernel@3 {
/* 4 MB */
label = "Kernel";
reg = <0x100000 0x400000>;
};
ipmi@4 {
label = "IPMI FRU";
reg = <0x500000 0x40000>;
};
fs@5 {
label = "File System";
reg = <0x540000 0x1ac0000>;
};
};
};
&mcspi3 {
/* DMA event numbers stolen from MCASP */
dmas = <&edma_xbar 8 0 16 &edma_xbar 9 0 17
&edma_xbar 10 0 18 &edma_xbar 11 0 19>;
dma-names = "tx0", "rx0", "tx1", "rx1";
};
&mcspi4 {
pinctrl-names = "default";
pinctrl-0 = <&spi4_pins>;
/* DMA event numbers stolen from MCASP, MCBSP */
dmas = <&edma_xbar 12 0 20 &edma_xbar 13 0 21>;
dma-names = "tx0", "rx0";
};
......@@ -222,6 +222,30 @@ gpio2: gpio@4c000 {
#interrupt-cells = <2>;
};
gpio3: gpio@1ac000 {
compatible = "ti,omap4-gpio";
ti,hwmods = "gpio3";
ti,gpio-always-on;
reg = <0x1ac000 0x2000>;
interrupts = <32>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
gpio4: gpio@1ae000 {
compatible = "ti,omap4-gpio";
ti,hwmods = "gpio4";
ti,gpio-always-on;
reg = <0x1ae000 0x2000>;
interrupts = <62>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
i2c2: i2c@2a000 {
compatible = "ti,omap4-i2c";
#address-cells = <1>;
......@@ -240,10 +264,48 @@ mcspi1: spi@30000 {
ti,spi-num-cs = <4>;
ti,hwmods = "mcspi1";
dmas = <&edma 16 0 &edma 17 0
&edma 18 0 &edma 19 0>;
&edma 18 0 &edma 19 0
&edma 20 0 &edma 21 0
&edma 22 0 &edma 23 0>;
dma-names = "tx0", "rx0", "tx1", "rx1",
"tx2", "rx2", "tx3", "rx3";
};
mcspi2: spi@1a0000 {
compatible = "ti,omap4-mcspi";
reg = <0x1a0000 0x1000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <125>;
ti,spi-num-cs = <4>;
ti,hwmods = "mcspi2";
dmas = <&edma 42 0 &edma 43 0
&edma 44 0 &edma 45 0>;
dma-names = "tx0", "rx0", "tx1", "rx1";
};
/* Board must configure dmas with edma_xbar for EDMA */
mcspi3: spi@1a2000 {
compatible = "ti,omap4-mcspi";
reg = <0x1a2000 0x1000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <126>;
ti,spi-num-cs = <4>;
ti,hwmods = "mcspi3";
};
mcspi4: spi@1a4000 {
compatible = "ti,omap4-mcspi";
reg = <0x1a4000 0x1000>;
#address-cells = <1>;
#size-cells = <0>;
interrupts = <127>;
ti,spi-num-cs = <4>;
ti,hwmods = "mcspi4";
};
timer1: timer@2e000 {
compatible = "ti,dm814-timer";
reg = <0x2e000 0x2000>;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment