// SPDX-License-Identifier: GPL-2.0+
/dts-v1/;

#include "aspeed-g5.dtsi"
#include <dt-bindings/gpio/aspeed-gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>

/ {
	model = "Tyan S7106 BMC";
	compatible = "tyan,s7106-bmc", "aspeed,ast2500";

	chosen {
		stdout-path = &uart5;
		bootargs = "console=ttyS4,115200 earlycon";
	};

	memory@80000000 {
		device_type = "memory";
		reg = <0x80000000 0x20000000>;
	};

	reserved-memory {
		#address-cells = <1>;
		#size-cells = <1>;
		ranges;

		p2a_memory: region@987f0000 {
			no-map;
			reg = <0x987f0000 0x00010000>; /* 64KB */
		};

		vga_memory: framebuffer@9f000000 {
			no-map;
			reg = <0x9f000000 0x01000000>; /* 16M */
		};

		gfx_memory: framebuffer {
			size = <0x01000000>; /* 16M */
			alignment = <0x01000000>;
			compatible = "shared-dma-pool";
			reusable;
		};
	};

	leds {
		compatible = "gpio-leds";

		identify {
			gpios = <&gpio ASPEED_GPIO(A, 2) GPIO_ACTIVE_LOW>;
		};

		heartbeat {
			gpios = <&gpio ASPEED_GPIO(E, 7) GPIO_ACTIVE_LOW>;
		};
	};

	iio-hwmon {
		compatible = "iio-hwmon";
		io-channels = <&adc 0>, <&adc 1>, <&adc 2>, <&adc 3>,
			<&adc 4>, <&adc 5>, <&adc 6>, <&adc 7>,
			<&adc 8>, <&adc 9>, <&adc 10>, <&adc 11>,
			<&adc 12>, <&adc 13>, <&adc 14>;
	};

	iio-hwmon-battery {
		compatible = "iio-hwmon";
		io-channels = <&adc 15>;
	};
};

&fmc {
	status = "okay";
	flash@0 {
		label = "bmc";
		status = "okay";
		m25p,fast-read;
#include "openbmc-flash-layout.dtsi"
	};
};

&spi1 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_spi1_default>;

	flash@0 {
		status = "okay";
		label = "pnor";
		m25p,fast-read;
	};
};

&uart1 {
	/* Rear RS-232 connector */
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_txd1_default
			&pinctrl_rxd1_default>;
};

&uart2 {
	/* RS-232 connector on header */
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_txd2_default
			&pinctrl_rxd2_default>;
};

&uart3 {
	/* Alternative to vuart to internally connect (route) to uart1
	 * when vuart cannot be used due to BIOS limitations.
	 */
	status = "okay";
};

&uart4 {
	/* Alternative to vuart to internally connect (route) to the
	 * external port usually used by uart1 when vuart cannot be
	 * used due to BIOS limitations.
	 */
	status = "okay";
};

&uart5 {
	/* BMC "debug" (console) UART; connected to RS-232 connector
	 * on header; selectable via jumpers as alternative to uart2
	 */
	status = "okay";
};

&uart_routing {
	status = "okay";
};

&vuart {
	status = "okay";

	/* We enable the VUART here, but leave it in a state that does
	 * not interfere with the SuperIO. The goal is to have both the
	 * VUART and the SuperIO available and decide at runtime whether
	 * the VUART should actually be used. For that reason, configure
	 * an "invalid" IO address and an IRQ that is not used by the
	 * BMC.
	 */

	aspeed,lpc-io-reg = <0xffff>;
	aspeed,lpc-interrupts = <15 IRQ_TYPE_LEVEL_HIGH>;
};

&lpc_ctrl {
	status = "okay";
};

&p2a {
	status = "okay";
	memory-region = <&p2a_memory>;
};

&lpc_snoop {
	status = "okay";
	snoop-ports = <0x80>;
};

&adc {
	status = "okay";
};

&vhub {
	status = "okay";
};

&pwm_tacho {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_pwm0_default
			&pinctrl_pwm1_default
			&pinctrl_pwm3_default
			&pinctrl_pwm4_default>;

	/* CPU fan #0 */
	fan@0 {
		reg = <0x00>;
		aspeed,fan-tach-ch = /bits/ 8 <0x00>;
	};

	/* CPU fan #1 */
	fan@1 {
		reg = <0x01>;
		aspeed,fan-tach-ch = /bits/ 8 <0x01>;
	};

	/* PWM group for chassis fans #1, #2, #3 and #4  */
	fan@2 {
		reg = <0x03>;
		aspeed,fan-tach-ch = /bits/ 8 <0x02>;
	};

	fan@3 {
		reg = <0x03>;
		aspeed,fan-tach-ch = /bits/ 8 <0x03>;
	};

	fan@4 {
		reg = <0x03>;
		aspeed,fan-tach-ch = /bits/ 8 <0x04>;
	};

	fan@5 {
		reg = <0x03>;
		aspeed,fan-tach-ch = /bits/ 8 <0x05>;
	};

	/* PWM group for chassis fans #5 and #6  */
	fan@6 {
		reg = <0x04>;
		aspeed,fan-tach-ch = /bits/ 8 <0x06>;
	};

	fan@7 {
		reg = <0x04>;
		aspeed,fan-tach-ch = /bits/ 8 <0x07>;
	};
};

&i2c0 {
	status = "okay";

	/* Hardware monitor with temperature sensors */
	nct7802@28 {
		compatible = "nuvoton,nct7802";
		reg = <0x28>;

		#address-cells = <1>;
		#size-cells = <0>;

		channel@0 { /* LTD */
			reg = <0>;
		};

		channel@1 { /* RTD1 */
			reg = <1>;
			sensor-type = "temperature";
			temperature-mode = "thermistor";
		};

		channel@2 { /* RTD2 */
			reg = <2>;
			sensor-type = "temperature";
			temperature-mode = "thermistor";
		};

		channel@3 { /* RTD3 */
			reg = <3>;
			sensor-type = "temperature";
		};
	};

	/* Also connected to:
	 * - IPMB pin header
	 * - CPU #0 memory error LED @ 0x3A
	 * - CPU #1 memory error LED @ 0x3C
	 */
};

&i2c1 {
	/* Directly connected to PCH SMBUS #0 */
	status = "okay";
};

&i2c2 {
	status = "okay";

	/* BMC EEPROM, incl. mainboard FRU */
	eeprom@50 {
		compatible = "atmel,24c256";
		reg = <0x50>;
	};

	/* Also connected to:
	 * - fan header
	 * - mini-SAS HD connector
	 * - SSATA SGPIO
	 * - via switch (BMC_SMB3_PCH_IE_SML3_EN, active low)
	 *   to PCH SMBUS #3
	 */
};

&i2c3 {
	status = "okay";

	/* PSU1 FRU @ 0xA0 */
	eeprom@50 {
		compatible = "atmel,24c02";
		reg = <0x50>;
	};

	/* PSU2 FRU @ 0xA2 */
	eeprom@51 {
		compatible = "atmel,24c02";
		reg = <0x51>;
	};

	/* PSU1 @ 0xB0 */
	power-supply@58 {
		compatible = "pmbus";
		reg = <0x58>;
	};

	/* PSU2 @ 0xB2 */
	power-supply@59 {
		compatible = "pmbus";
		reg = <0x59>;
	};

	/* Also connected to:
	 * - PCH SMBUS #1
	 */
};

&i2c4 {
	status = "okay";

	/* Connected to:
	 * - PCH SMBUS #2
	 */

	/* Connected via switch to:
	 * - CPU #0 channels ABC VDDQ @ 0x80
	 * - CPU #0 channels DEF VDDQ @ 0x81
	 * - CPU #1 channels ABC VDDQ @ 0x82
	 * - CPU #1 channels DEF VDDQ @ 0x83
	 * - CPU #0 VCCIO & VMCP @ 0x52
	 * - CPU #1 VCCIO & VMCP @ 0x53
	 * - CPU #0 VCCIN @ 0xC0
	 * - CPU #0 VSA @ 0xC2
	 * - CPU #1 VCCIN @ 0xC4
	 * - CPU #1 VSA @ 0xC6
	 * - J110
	 */
};

&i2c5 {
	status = "okay";

	/* Connected via switch (PCH_BMC_SMB_SW_P) to:
	 * - mainboard FRU @ 0xAE
	 * - XDP connector
	 * - ME debug header
	 * - clock buffer @ 0xD8
	 * - i2c4 via switch (PCH_VR_SMBUS_SW_P; controlled by PCH)
	 * - PCH SMBUS
	 */
};

&i2c6 {
	status = "okay";

	/* Connected via switch (BMC_PE_SMB_EN_1_N) to
	 * bus mux (selector BMC_PE_SMB_SW_BIT[1..0]) to:
	 * - 0,0: PCIE slot 1, SMB #1
	 * - 0,1: PCIE slot 1, SMB #2
	 * - 1,0: PCIE slot 2, SMB #1
	 * - 1,1: PCIE slot 2, SMB #2
	 */

	/* Connected via switch (BMC_PE_SMB_EN_2_N) to
	 * bus mux (selector BMC_PE_SMB_SW_BIT[1..0]) to:
	 * - 0,0: OCP0 (A) SMB
	 * - 0,1: OCP0 (C) SMB
	 * - 1,0: OCP1 (A) SMB
	 * - 1,1: NC
	 */
};

&i2c7 {
	status = "okay";

	/* Connected to:
	 * - PCH SMBUS #4
	 */
};

&i2c8 {
	status = "okay";

	/* Not connected */
};

&mac0 {
	status = "okay";
	use-ncsi;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_rmii1_default>;
};

&mac1 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_rgmii2_default &pinctrl_mdio2_default>;
};

&ibt {
	status = "okay";
};

&kcs1 {
	status = "okay";
	aspeed,lpc-io-reg = <0xca8>;
};

&kcs3 {
	status = "okay";
	aspeed,lpc-io-reg = <0xca2>;
};

/* Enable BMC VGA output to show an early (pre-BIOS) boot screen */
&gfx {
	status = "okay";
	memory-region = <&gfx_memory>;
};

/* We're following the GPIO naming as defined at
 * https://github.com/openbmc/docs/blob/master/designs/device-tree-gpio-naming.md.
 *
 * Notes on led-identify and id-button:
 * - A physical button is connected to id-button which
 *   triggers the clock on a D flip-flop. The /Q output of the
 *   flip-flop drives its D input.
 * - The flip-flop's Q output drives led-identify which is
 *   connected to LEDs.
 * - With that, every button press toggles the LED between on and off.
 *
 * Notes on power-, reset- and nmi- button and control:
 * - The -button signals can be used to monitor physical buttons.
 * - The -control signals can be used to actuate the specific
 *   operation.
 * - In hardware, the -button signals are connected to the -control
 *   signals through drivers with the -control signals being
 *   protected through diodes.
 */
&gpio {
	status = "okay";
	gpio-line-names =
	/*A0*/		"",
	/*A1*/		"",
	/*A2*/		"led-identify", /* in/out: BMC_IDLED_ON_N */
	/*A3*/		"",
	/*A4*/		"",
	/*A5*/		"",
	/*A6*/		"",
	/*A7*/		"",
	/*B0-B7*/	"","","","","","","","",
	/*C0*/		"",
	/*C1*/		"",
	/*C2*/		"",
	/*C3*/		"",
	/*C4*/		"id-button", /* in/out: BMC_IDBTN_IN_OUT_N */
	/*C5*/		"post-complete", /* in: FM_BIOS_POST_CMPLT_N */
	/*C6*/		"",
	/*C7*/		"",
	/*D0*/		"",
	/*D1*/		"",
	/*D2*/		"power-chassis-good", /* in: SYS_PWROK_BUF */
	/*D3*/		"platform-reset", /* in: SYS_PLTRST_N */
	/*D4*/		"",
	/*D5*/		"",
	/*D6*/		"",
	/*D7*/		"",
	/*E0*/		"power-button", /* in: BMC_PWBTN_IN_N */
	/*E1*/		"power-chassis-control", /* out: BMC_PWRBTN_OUT_N */
	/*E2*/		"reset-button", /* in: BMC_RSTBTN_IN_N */
	/*E3*/		"reset-control", /* out: BMC_RSTBTN_OUT_N */
	/*E4*/		"nmi-button", /* in: BMC_NMIBTN_IN_N */
	/*E5*/		"nmi-control", /* out: BMC_NMIBTN_OUT_N */
	/*E6*/		"",
	/*E7*/		"led-heartbeat", /* out: BMC_HEARTBRAT_LED_N */
	/*F0*/		"",
	/*F1*/		"clear-cmos-control", /* out: BMC_CLR_CMOS_N */
	/*F2*/		"",
	/*F3*/		"",
	/*F4*/		"led-fault", /* out: AST_HW_FAULT_N */
	/*F5*/		"",
	/*F6*/		"",
	/*F7*/		"",
	/*G0*/		"BMC_PE_SMB_EN_1_N", /* out */
	/*G1*/		"BMC_PE_SMB_EN_2_N", /* out */
	/*G2*/		"",
	/*G3*/		"",
	/*G4*/		"",
	/*G5*/		"",
	/*G6*/		"",
	/*G7*/		"",
	/*H0-H7*/	"","","","","","","","",
	/*I0-I7*/	"","","","","","","","",
	/*J0-J7*/	"","","","","","","","",
	/*K0-K7*/	"","","","","","","","",
	/*L0-L7*/	"","","","","","","","",
	/*M0-M7*/	"","","","","","","","",
	/*N0-N7*/	"","","","","","","","",
	/*O0-O7*/	"","","","","","","","",
	/*P0-P7*/	"","","","","","","","",
	/*Q0*/		"",
	/*Q1*/		"",
	/*Q2*/		"",
	/*Q3*/		"",
	/*Q4*/		"BMC_PE_SMB_SW_BIT0", /* out */
	/*Q5*/		"BMC_PE_SMB_SW_BIT1", /* out */
	/*Q6*/		"",
	/*Q7*/		"",
	/*R0-R7*/	"","","","","","","","",
	/*S0-S7*/	"","","","","","","","",
	/*T0-T7*/	"","","","","","","","",
	/*U0-U7*/	"","","","","","","","",
	/*V0-V7*/	"","","","","","","","",
	/*W0-W7*/	"","","","","","","","",
	/*X0-X7*/	"","","","","","","","",
	/*Y0-Y7*/	"","","","","","","","",
	/*Z0-Z7*/	"","","","","","","","",
	/*AA0*/		"",
	/*AA1*/		"",
	/*AA2*/		"",
	/*AA3*/		"BMC_SMB3_PCH_IE_SML3_EN", /* out */
	/*AA4*/		"",
	/*AA5*/		"",
	/*AA6*/		"",
	/*AA7*/		"",
	/*AB0-AB7*/	"","","","","","","","";
};