// 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 S8036 BMC";
	compatible = "tyan,s8036-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 */
	fan@0 {
		reg = <0x00>;
		aspeed,fan-tach-ch = /bits/ 8 <0x00>;
	};

	/* 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 {
	/* Directly connected to Sideband-Temperature Sensor Interface (APML) */
	status = "okay";
};

&i2c1 {
	/* Directly connected to IPMB HDR. */
	status = "okay";
};

&i2c2 {
	status = "okay";

	/* BMC EEPROM, incl. mainboard FRU */
	eeprom@50 {
		compatible = "atmel,24c256";
		reg = <0x50>;
	};
	/* Also connected to:
	 * - BCM5720
	 * - FPGA
	 * - FAN HDR
	 * - FPIO HDR
	 */
};

&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>;
	};

};

&i2c4 {
	status = "okay";
};

&i2c5 {
	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>;
			status = "okay";
		};

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

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

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

	/* Also connected to:
	 * - PCA9544
	 * - CLK BUFF
	 * - OCP FRU
	 */
};

&i2c6 {
	status = "okay";
	/* Connected to:
	 * - PCA9548 @0xE0
	 * - PCA9548 @0xE2
	 * - PCA9544 @0xE4
	 */
};

&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>;
	aspeed,lpc-interrupts = <1 IRQ_TYPE_LEVEL_HIGH>;
};

/* 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_CHASSIS_ID_LED_L */
	/*A3*/		"",
	/*A4*/		"",
	/*A5*/		"",
	/*A6*/		"",
	/*A7*/		"",
	/*B0-B7*/	"","","","","","","","",
	/*C0-C7*/	"","","","","","","","",
	/*D0*/		"",
	/*D1*/		"",
	/*D2*/		"power-chassis-good", /* in: PWR_GOOD_LED -- Check if this is Z3?*/
	/*D3*/		"platform-reset", /* in: RESET_LED_L */
	/*D4*/		"",
	/*D5*/		"",
	/*D6*/		"",
	/*D7*/		"",
	/*E0*/		"power-button", /* in: BMC_SYS_MON_PWR_BTN_L */
	/*E1*/		"power-chassis-control", /* out: BMC_ASSERT_PWR_BTN */
	/*E2*/		"reset-button", /* in: BMC_SYS_MOS_RST_BTN_L*/
	/*E3*/		"reset-control", /* out: BMC_ASSERT_RST_BTN */
	/*E4*/		"nmi-button", /* in: BMC_SYS_MON_NMI_BTN_L */
	/*E5*/		"nmi-control", /* out: BMC_ASSERT_NMI_BTN */
	/*E6*/		"TSI_RESERT",
	/*E7*/		"led-heartbeat", /* out: BMC_GPIOE7 */
	/*F0*/		"",
	/*F1*/		"clear-cmos-control", /* out: BMC_ASSERT_CLR_CMOS_L */
	/*F2*/		"",
	/*F3*/		"",
	/*F4*/		"led-fault", /* out: BMC_HWM_FAULT_LED_L */
	/*F5*/		"BMC_SYS_FAULT_LED_L",
	/*F6*/		"BMC_ASSERT_BIOS_WP_L",
	/*F7*/		"",
	/*G0-G7*/	"","","","","","","","",
	/*H0-H7*/	"","","","","","","","",
	/*I0-I7*/	"","","","","","","","",
	/*J0-J7*/	"","","","","","","","",
	/*K0-K7*/	"","","","","","","","",
	/*L0-L7*/	"","","","","","","","",
	/*M0-M7*/	"","","","","","","","",
	/*N0-N7*/	"","","","","","","","",
	/*O0-O7*/	"","","","","","","","",
	/*P0-P7*/	"","","","","","","","",
	/*Q0*/		"",
	/*Q1*/		"",
	/*Q2*/		"",
	/*Q3*/		"",
	/*Q4*/		"",
	/*Q5*/		"",
	/*Q6*/		"id-button", /* in: BMC_CHASSIS_ID_BTN_L */
	/*Q7*/		"",
	/*R0-R7*/	"","","","","","","","",
	/*S0-S7*/	"","","","","","","","",
	/*T0-T7*/	"","","","","","","","",
	/*U0-U7*/	"","","","","","","","",
	/*V0-V7*/	"","","","","","","","",
	/*W0-W7*/	"","","","","","","","",
	/*X0-X7*/	"","","","","","","","",
	/*Y0-Y7*/	"","","","","","","","",
	/*Z0-Z2*/	"","","",
	/*Z3*/		"post-complete", /* BMC_SYS_MON_PWROK */
	/*Z4-Z7*/	"","","","",
	/*AA0*/		"",
	/*AA1*/		"",
	/*AA2*/		"",
	/*AA3*/		"",
	/*AA4*/		"",
	/*AA5*/		"",
	/*AA6*/		"",
	/*AA7*/		"BMC_ASSERT_BMC_READY",
	/*AB0*/		"BMC_SPD_SEL",
	/*AB1-AB7*/	"","","","","","","";
};