// SPDX-License-Identifier: GPL-2.0
/*
 * dts file for Hisilicon HiKey Development Board
 *
 * Copyright (C) 2015, HiSilicon Ltd.
 *
 */

/dts-v1/;
#include "hi6220.dtsi"
#include "hikey-pinctrl.dtsi"
#include <dt-bindings/gpio/gpio.h>

/ {
	model = "HiKey Development Board";
	compatible = "hisilicon,hi6220-hikey", "hisilicon,hi6220";

	aliases {
		serial0 = &uart0; /* On board UART0 */
		serial1 = &uart1; /* BT UART */
		serial2 = &uart2; /* LS Expansion UART0 */
		serial3 = &uart3; /* LS Expansion UART1 */
	};

	chosen {
		stdout-path = "serial3:115200n8";
	};

	/*
	 * Reserve below regions from memory node:
	 *
	 *  0x05e0,0000 - 0x05ef,ffff: MCU firmware runtime using
	 *  0x05f0,1000 - 0x05f0,1fff: Reboot reason
	 *  0x06df,f000 - 0x06df,ffff: Mailbox message data
	 *  0x0740,f000 - 0x0740,ffff: MCU firmware section
	 *  0x21f0,0000 - 0x21ff,ffff: pstore/ramoops buffer
	 *  0x3e00,0000 - 0x3fff,ffff: OP-TEE
	 */
	memory@0 {
		device_type = "memory";
		reg = <0x00000000 0x00000000 0x00000000 0x05e00000>,
		      <0x00000000 0x05f00000 0x00000000 0x00001000>,
		      <0x00000000 0x05f02000 0x00000000 0x00efd000>,
		      <0x00000000 0x06e00000 0x00000000 0x0060f000>,
		      <0x00000000 0x07410000 0x00000000 0x1aaf0000>,
		      <0x00000000 0x22000000 0x00000000 0x1c000000>;
	};

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

		ramoops@21f00000 {
			compatible = "ramoops";
			reg = <0x0 0x21f00000 0x0 0x00100000>;
			record-size = <0x00020000>;
			console-size = <0x00020000>;
			ftrace-size = <0x00020000>;
		};

		/* global autoconfigured region for contiguous allocations */
		linux,cma {
			compatible = "shared-dma-pool";
			reusable;
			size = <0x00000000 0x08000000>;
			linux,cma-default;
		};
	};

	reboot-mode-syscon@5f01000 {
		compatible = "syscon", "simple-mfd";
		reg = <0x0 0x05f01000 0x0 0x00001000>;

		reboot-mode {
			compatible = "syscon-reboot-mode";
			offset = <0x0>;

			mode-normal = <0x77665501>;
			mode-bootloader = <0x77665500>;
			mode-recovery = <0x77665502>;
		};
	};

	reg_sys_5v: regulator@0 {
		compatible = "regulator-fixed";
		regulator-name = "SYS_5V";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		regulator-boot-on;
		regulator-always-on;
	};

	reg_vdd_3v3: regulator@1 {
		compatible = "regulator-fixed";
		regulator-name = "VDD_3V3";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-boot-on;
		regulator-always-on;
		vin-supply = <&reg_sys_5v>;
	};

	reg_5v_hub: regulator@2 {
		compatible = "regulator-fixed";
		regulator-name = "5V_HUB";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		regulator-boot-on;
		gpio = <&gpio0 7 0>;
		regulator-always-on;
		vin-supply = <&reg_sys_5v>;
	};

	wl1835_pwrseq: wl1835-pwrseq {
		compatible = "mmc-pwrseq-simple";
		/* WLAN_EN GPIO */
		reset-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
		clocks = <&pmic>;
		clock-names = "ext_clock";
		post-power-on-delay-ms = <10>;
		power-off-delay-us = <10>;
	};

	leds {
		compatible = "gpio-leds";

		led-user-1 {
			label = "green:user1";
			gpios = <&gpio4 0 0>; /* <&gpio_user_led_1>; */
			linux,default-trigger = "heartbeat";
		};

		led-user-2 {
			label = "green:user2";
			gpios = <&gpio4 1 0>; /* <&gpio_user_led_2>; */
			linux,default-trigger = "mmc0";
		};

		led-user-3 {
			label = "green:user3";
			gpios = <&gpio4 2 0>; /* <&gpio_user_led_3>; */
			linux,default-trigger = "mmc1";
		};

		led-user-4 {
			label = "green:user4";
			gpios = <&gpio4 3 0>; /* <&gpio_user_led_4>; */
			panic-indicator;
			linux,default-trigger = "none";
		};

		led-wlan {
			label = "yellow:wlan";
			gpios = <&gpio3 5 0>; /* <&gpio_wlan_active_led>; */
			linux,default-trigger = "phy0tx";
			default-state = "off";
		};

		led-bt {
			label = "blue:bt";
			gpios = <&gpio4 7 0>; /* <&gpio_bt_active_led>; */
			linux,default-trigger = "hci0-power";
			default-state = "off";
		};
	};

	pmic: pmic@f8000000 {
		compatible = "hisilicon,hi655x-pmic";
		reg = <0x0 0xf8000000 0x0 0x1000>;
		#clock-cells = <0>;
		interrupt-controller;
		#interrupt-cells = <2>;
		pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;

		regulators {
			ldo2: LDO2 {
				regulator-name = "LDO2_2V8";
				regulator-min-microvolt = <2500000>;
				regulator-max-microvolt = <3200000>;
				regulator-enable-ramp-delay = <120>;
			};

			ldo7: LDO7 {
				regulator-name = "LDO7_SDIO";
				regulator-min-microvolt = <1800000>;
				regulator-max-microvolt = <3300000>;
				regulator-enable-ramp-delay = <120>;
			};

			ldo10: LDO10 {
				regulator-name = "LDO10_2V85";
				regulator-min-microvolt = <1800000>;
				regulator-max-microvolt = <3000000>;
				regulator-enable-ramp-delay = <360>;
			};

			ldo13: LDO13 {
				regulator-name = "LDO13_1V8";
				regulator-min-microvolt = <1600000>;
				regulator-max-microvolt = <1950000>;
				regulator-enable-ramp-delay = <120>;
			};

			ldo14: LDO14 {
				regulator-name = "LDO14_2V8";
				regulator-min-microvolt = <2500000>;
				regulator-max-microvolt = <3200000>;
				regulator-enable-ramp-delay = <120>;
			};

			ldo15: LDO15 {
				regulator-name = "LDO15_1V8";
				regulator-min-microvolt = <1600000>;
				regulator-max-microvolt = <1950000>;
				regulator-boot-on;
				regulator-always-on;
				regulator-enable-ramp-delay = <120>;
			};

			ldo17: LDO17 {
				regulator-name = "LDO17_2V5";
				regulator-min-microvolt = <2500000>;
				regulator-max-microvolt = <3200000>;
				regulator-enable-ramp-delay = <120>;
			};

			ldo19: LDO19 {
				regulator-name = "LDO19_3V0";
				regulator-min-microvolt = <1800000>;
				regulator-max-microvolt = <3000000>;
				regulator-enable-ramp-delay = <360>;
			};

			ldo21: LDO21 {
				regulator-name = "LDO21_1V8";
				regulator-min-microvolt = <1650000>;
				regulator-max-microvolt = <2000000>;
				regulator-always-on;
				regulator-enable-ramp-delay = <120>;
			};

			ldo22: LDO22 {
				regulator-name = "LDO22_1V2";
				regulator-min-microvolt = <900000>;
				regulator-max-microvolt = <1200000>;
				regulator-boot-on;
				regulator-always-on;
				regulator-enable-ramp-delay = <120>;
			};
		};
	};

	firmware {
		optee {
			compatible = "linaro,optee-tz";
			method = "smc";
		};
	};

	sound_card {
		compatible = "audio-graph-card";
		dais = <&i2s0_port0>;
	};
};

&uart1 {
	assigned-clocks = <&sys_ctrl HI6220_UART1_SRC>;
	assigned-clock-rates = <150000000>;
	status = "okay";

	bluetooth {
		compatible = "ti,wl1835-st";
		enable-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
		clocks = <&pmic>;
		clock-names = "ext_clock";
	};
};

&uart2 {
	status = "okay";
	label = "LS-UART0";
};

&uart3 {
	status = "okay";
	label = "LS-UART1";
};

&ade {
	status = "okay";
};

&dsi {
	status = "okay";

	ports {
		/* 1 for output port */
		port@1 {
			reg = <1>;

			dsi_out0: endpoint@0 {
				remote-endpoint = <&adv7533_in>;
			};
		};
	};
};

&dwmmc_0 {
	cap-mmc-highspeed;
	non-removable;
	bus-width = <0x8>;
	vmmc-supply = <&ldo19>;
};

&dwmmc_1 {
	card-detect-delay = <200>;
	cap-sd-highspeed;
	sd-uhs-sdr12;
	sd-uhs-sdr25;
	sd-uhs-sdr50;
	vqmmc-supply = <&ldo7>;
	vmmc-supply = <&ldo10>;
	bus-width = <0x4>;
	disable-wp;
	cd-gpios = <&gpio1 0 1>;
};

&dwmmc_2 {
	bus-width = <0x4>;
	non-removable;
	cap-power-off-card;
	vmmc-supply = <&reg_vdd_3v3>;
	mmc-pwrseq = <&wl1835_pwrseq>;

	#address-cells = <0x1>;
	#size-cells = <0x0>;
	wlcore: wlcore@2 {
		compatible = "ti,wl1835";
		reg = <2>;	/* sdio func num */
		/* WL_IRQ, WL_HOST_WAKE_GPIO1_3 */
		interrupt-parent = <&gpio1>;
		interrupts = <3 IRQ_TYPE_EDGE_RISING>;
	};
};

/*
 * Legend: proper name = the GPIO line is used as GPIO
 *         NC = not connected (not routed from the SoC)
 *         "[PER]" = pin is muxed for peripheral (not GPIO)
 *         "" = no idea, schematic doesn't say, could be
 *              unrouted (not connected to any external pin)
 *         LSEC = Low Speed External Connector
 *         HSEC = High Speed External Connector
 *
 * Pin assignments taken from LeMaker and CircuitCo Schematics
 * Rev A1.
 *
 * For the lines routed to the external connectors the
 * lines are named after the 96Boards CE Specification 1.0,
 * Appendix "Expansion Connector Signal Description".
 *
 * When the 96Board naming of a line and the schematic name of
 * the same line are in conflict, the 96Board specification
 * takes precedence, which means that the external UART on the
 * LSEC is named UART0 while the schematic and SoC names this
 * UART2. This is only for the informational lines i.e. "[FOO]",
 * the GPIO named lines "GPIO-A" thru "GPIO-L" are the only
 * ones actually used for GPIO.
 */
&gpio0 {
	gpio-line-names = "PWR_HOLD", "DSI_SEL",
	"USB_HUB_RESET_N", "USB_SEL", "HDMI_PD", "WL_REG_ON",
	"PWRON_DET", "5V_HUB_EN";
};

&gpio1 {
	gpio-line-names = "SD_DET", "HDMI_INT", "PMU_IRQ_N",
	"WL_HOST_WAKE", "NC", "NC", "NC", "BT_REG_ON";
};

&gpio2 {
	gpio-line-names =
		"GPIO-A", /* LSEC Pin 23: GPIO2_0 */
		"GPIO-B", /* LSEC Pin 24: GPIO2_1 */
		"GPIO-C", /* LSEC Pin 25: GPIO2_2 */
		"GPIO-D", /* LSEC Pin 26: GPIO2_3 */
		"GPIO-E", /* LSEC Pin 27: GPIO2_4 */
		"USB_ID_DET", "USB_VBUS_DET",
		"GPIO-H"; /* LSEC Pin 30: GPIO2_7 */
};

&gpio3 {
	gpio-line-names = "GPIO3_0", "NC", "NC", "", "NC", "",
	"WLAN_ACTIVE", "NC", "NC";
};

&gpio4 {
	gpio-line-names = "USER_LED1", "USER_LED2", "USER_LED3",
	"USER_LED4", "SD_SEL", "NC", "NC", "BT_ACTIVE";
};

&gpio5 {
	gpio-line-names = "NC", "NC",
	"[UART1_RxD]", /* LSEC Pin 11: UART3_RX */
	"[UART1_TxD]", /* LSEC Pin 13: UART3_TX */
	"[AUX_SSI1]", "NC",
	"[PCM_CLK]", /* LSEC Pin 18: MODEM_PCM_XCLK */
	"[PCM_FS]"; /* LSEC Pin 16: MODEM_PCM_XFS */
};

&gpio6 {
	gpio-line-names =
	"[SPI0_DIN]", /* Pin 10: SPI0_DI */
	"[SPI0_DOUT]", /* Pin 14: SPI0_DO */
	"[SPI0_CS]", /* Pin 12: SPI0_CS_N */
	"[SPI0_SCLK]", /* Pin 8: SPI0_SCLK */
	"NC", "NC", "NC",
	"GPIO-G"; /* Pin 29: GPIO6_7_DSI_TE0 */
};

&gpio7 {
	gpio-line-names = "NC", "NC", "NC", "NC",
	"[PCM_DI]", /* Pin 22: MODEM_PCM_DI */
	"[PCM_DO]", /* Pin 20: MODEM_PCM_DO */
	"NC", "NC";
};

&gpio8 {
	gpio-line-names = "NC", "[CEC_CLK_19_2MHZ]", "NC",
	"", "", "", "", "", "";
};

&gpio9 {
	gpio-line-names = "",
	"GPIO-J", /* LSEC Pin 32: ISP_PWDN0_GPIO9_1 */
	"GPIO-L", /* LSEC Pin 34: ISP_PWDN1_GPIO9_2 */
	"NC", "NC", "NC", "NC", "[ISP_CCLK0]";
};

&gpio10 {
	gpio-line-names = "BOOT_SEL",
	"[ISP_CCLK1]",
	"GPIO-I", /* LSEC Pin 31: ISP_RSTB0_GPIO10_2 */
	"GPIO-K", /* LSEC Pin 33: ISP_RSTB1_GPIO10_3 */
	"NC", "NC",
	"[I2C2_SDA]", /* HSEC Pin 34: ISP0_SDA */
	"[I2C2_SCL]"; /* HSEC Pin 32: ISP0_SCL */
};

&gpio11 {
	gpio-line-names =
	"[I2C3_SDA]", /* HSEC Pin 38: ISP1_SDA */
	"[I2C3_SCL]", /* HSEC Pin 36: ISP1_SCL */
	"", "NC", "NC", "NC", "", "";
};

&gpio12 {
	gpio-line-names = "[BT_PCM_XFS]", "[BT_PCM_DI]",
	"[BT_PCM_DO]",
	"NC", "NC", "NC", "NC",
	"GPIO-F"; /* LSEC Pin 28: BL_PWM_GPIO12_7 */
};

&gpio13 {
	gpio-line-names = "[UART0_RX]", "[UART0_TX]",
	"[BT_UART1_CTS]", "[BT_UART1_RTS]",
	"[BT_UART1_RX]", "[BT_UART1_TX]",
	"[UART0_CTS]", /* LSEC Pin 3: UART2_CTS_N */
	"[UART0_RTS]"; /* LSEC Pin 9: UART2_RTS_N */
};

&gpio14 {
	gpio-line-names =
	"[UART0_RxD]", /* LSEC Pin 7: UART2_RX */
	"[UART0_TxD]", /* LSEC Pin 5: UART2_TX */
	"[I2C0_SCL]", /* LSEC Pin 15: I2C0_SCL */
	"[I2C0_SDA]", /* LSEC Pin 17: I2C0_SDA */
	"[I2C1_SCL]", /* LSEC Pin 19: I2C1_SCL */
	"[I2C1_SDA]", /* LSEC Pin 21: I2C1_SDA */
	"[I2C2_SCL]", "[I2C2_SDA]";
};

&gpio15 {
	gpio-line-names = "", "", "", "", "", "", "NC", "";
};

/* GPIO blocks 16 thru 19 do not appear to be routed to pins */


&i2c0 {
	status = "okay";
};

&i2c1 {
	status = "okay";
};

&i2c2 {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";

	adv7533: adv7533@39 {
		compatible = "adi,adv7533";
		reg = <0x39>;
		interrupt-parent = <&gpio1>;
		interrupts = <1 2>;
		pd-gpios = <&gpio0 4 0>;
		adi,dsi-lanes = <4>;
		#sound-dai-cells = <0>;

		ports {
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				adv7533_in: endpoint {
					remote-endpoint = <&dsi_out0>;
				};
			};
			port@2 {
				reg = <2>;
				codec_endpoint: endpoint {
					remote-endpoint = <&i2s0_cpu_endpoint>;
				};
			};
		};
	};
};

&i2s0 {

	ports {
		i2s0_port0: port@0 {
			i2s0_cpu_endpoint: endpoint {
				remote-endpoint = <&codec_endpoint>;
				dai-format = "i2s";
			};
		};
	};
};

&spi0 {
	status = "okay";
};
