| // SPDX-License-Identifier: (GPL-2.0+ OR MIT) | 
 | /* | 
 |  * Copyright (c) 2019 BayLibre, SAS | 
 |  * Author: Neil Armstrong <narmstrong@baylibre.com> | 
 |  * Copyright (c) 2019 Christian Hewitt <christianshewitt@gmail.com> | 
 |  */ | 
 |  | 
 | #include <dt-bindings/input/input.h> | 
 | #include <dt-bindings/gpio/meson-g12a-gpio.h> | 
 |  | 
 | / { | 
 | 	aliases { | 
 | 		serial0 = &uart_AO; | 
 | 		ethernet0 = ðmac; | 
 | 	}; | 
 |  | 
 | 	chosen { | 
 | 		stdout-path = "serial0:115200n8"; | 
 | 	}; | 
 |  | 
 | 	memory@0 { | 
 | 		device_type = "memory"; | 
 | 		reg = <0x0 0x0 0x0 0x80000000>; | 
 | 	}; | 
 |  | 
 | 	adc-keys { | 
 | 		compatible = "adc-keys"; | 
 | 		io-channels = <&saradc 2>; | 
 | 		io-channel-names = "buttons"; | 
 | 		keyup-threshold-microvolt = <1710000>; | 
 |  | 
 | 		button-function { | 
 | 			label = "Function"; | 
 | 			linux,code = <KEY_FN>; | 
 | 			press-threshold-microvolt = <10000>; | 
 | 		}; | 
 | 	}; | 
 |  | 
 | 	leds { | 
 | 		compatible = "gpio-leds"; | 
 |  | 
 | 		led-white { | 
 | 			label = "vim3:white:sys"; | 
 | 			gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>; | 
 | 			linux,default-trigger = "heartbeat"; | 
 | 		}; | 
 |  | 
 | 		led-red { | 
 | 			label = "vim3:red"; | 
 | 			gpios = <&gpio_expander 5 GPIO_ACTIVE_LOW>; | 
 | 		}; | 
 | 	}; | 
 |  | 
 | 	emmc_pwrseq: emmc-pwrseq { | 
 | 		compatible = "mmc-pwrseq-emmc"; | 
 | 		reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>; | 
 | 	}; | 
 |  | 
 | 	gpio-keys-polled { | 
 | 		compatible = "gpio-keys-polled"; | 
 | 		poll-interval = <100>; | 
 |  | 
 | 		power-button { | 
 | 			label = "power"; | 
 | 			linux,code = <KEY_POWER>; | 
 | 			gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_LOW>; | 
 | 		}; | 
 | 	}; | 
 |  | 
 | 	sdio_pwrseq: sdio-pwrseq { | 
 | 		compatible = "mmc-pwrseq-simple"; | 
 | 		reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; | 
 | 		clocks = <&wifi32k>; | 
 | 		clock-names = "ext_clock"; | 
 | 	}; | 
 |  | 
 | 	dc_in: regulator-dc_in { | 
 | 		compatible = "regulator-fixed"; | 
 | 		regulator-name = "DC_IN"; | 
 | 		regulator-min-microvolt = <5000000>; | 
 | 		regulator-max-microvolt = <5000000>; | 
 | 		regulator-always-on; | 
 | 	}; | 
 |  | 
 | 	vcc_5v: regulator-vcc_5v { | 
 | 		compatible = "regulator-fixed"; | 
 | 		regulator-name = "VCC_5V"; | 
 | 		regulator-min-microvolt = <5000000>; | 
 | 		regulator-max-microvolt = <5000000>; | 
 | 		vin-supply = <&dc_in>; | 
 |  | 
 | 		gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>; | 
 | 		enable-active-high; | 
 | 	}; | 
 |  | 
 | 	vcc_1v8: regulator-vcc_1v8 { | 
 | 		compatible = "regulator-fixed"; | 
 | 		regulator-name = "VCC_1V8"; | 
 | 		regulator-min-microvolt = <1800000>; | 
 | 		regulator-max-microvolt = <1800000>; | 
 | 		vin-supply = <&vcc_3v3>; | 
 | 		regulator-always-on; | 
 | 	}; | 
 |  | 
 | 	vcc_3v3: regulator-vcc_3v3 { | 
 | 		compatible = "regulator-fixed"; | 
 | 		regulator-name = "VCC_3V3"; | 
 | 		regulator-min-microvolt = <3300000>; | 
 | 		regulator-max-microvolt = <3300000>; | 
 | 		vin-supply = <&vsys_3v3>; | 
 | 		regulator-always-on; | 
 | 		/* FIXME: actually controlled by VDDCPU_B_EN */ | 
 | 	}; | 
 |  | 
 | 	vddao_1v8: regulator-vddao_1v8 { | 
 | 		compatible = "regulator-fixed"; | 
 | 		regulator-name = "VDDIO_AO1V8"; | 
 | 		regulator-min-microvolt = <1800000>; | 
 | 		regulator-max-microvolt = <1800000>; | 
 | 		vin-supply = <&vsys_3v3>; | 
 | 		regulator-always-on; | 
 | 	}; | 
 |  | 
 | 	emmc_1v8: regulator-emmc_1v8 { | 
 | 		compatible = "regulator-fixed"; | 
 | 		regulator-name = "EMMC_AO1V8"; | 
 | 		regulator-min-microvolt = <1800000>; | 
 | 		regulator-max-microvolt = <1800000>; | 
 | 		vin-supply = <&vcc_3v3>; | 
 | 		regulator-always-on; | 
 | 	}; | 
 |  | 
 | 	vsys_3v3: regulator-vsys_3v3 { | 
 | 		compatible = "regulator-fixed"; | 
 | 		regulator-name = "VSYS_3V3"; | 
 | 		regulator-min-microvolt = <3300000>; | 
 | 		regulator-max-microvolt = <3300000>; | 
 | 		vin-supply = <&dc_in>; | 
 | 		regulator-always-on; | 
 | 	}; | 
 |  | 
 | 	usb_pwr: regulator-usb_pwr { | 
 | 		compatible = "regulator-fixed"; | 
 | 		regulator-name = "USB_PWR"; | 
 | 		regulator-min-microvolt = <5000000>; | 
 | 		regulator-max-microvolt = <5000000>; | 
 | 		vin-supply = <&vcc_5v>; | 
 |  | 
 | 		gpio = <&gpio GPIOA_6 GPIO_ACTIVE_HIGH>; | 
 | 		enable-active-high; | 
 | 	}; | 
 |  | 
 | 	hdmi-connector { | 
 | 		compatible = "hdmi-connector"; | 
 | 		type = "a"; | 
 |  | 
 | 		port { | 
 | 			hdmi_connector_in: endpoint { | 
 | 				remote-endpoint = <&hdmi_tx_tmds_out>; | 
 | 			}; | 
 | 		}; | 
 | 	}; | 
 |  | 
 | 	wifi32k: wifi32k { | 
 | 		compatible = "pwm-clock"; | 
 | 		#clock-cells = <0>; | 
 | 		clock-frequency = <32768>; | 
 | 		pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */ | 
 | 	}; | 
 | }; | 
 |  | 
 | &cec_AO { | 
 | 	pinctrl-0 = <&cec_ao_a_h_pins>; | 
 | 	pinctrl-names = "default"; | 
 | 	status = "disabled"; | 
 | 	hdmi-phandle = <&hdmi_tx>; | 
 | }; | 
 |  | 
 | &cecb_AO { | 
 | 	pinctrl-0 = <&cec_ao_b_h_pins>; | 
 | 	pinctrl-names = "default"; | 
 | 	status = "okay"; | 
 | 	hdmi-phandle = <&hdmi_tx>; | 
 | }; | 
 |  | 
 | &cpu_thermal { | 
 | 	trips { | 
 | 		cpu_active: cpu-active { | 
 | 			temperature = <80000>; /* millicelsius */ | 
 | 			hysteresis = <2000>; /* millicelsius */ | 
 | 			type = "active"; | 
 | 		}; | 
 | 	}; | 
 |  | 
 | 	cooling-maps { | 
 | 		map { | 
 | 			trip = <&cpu_active>; | 
 | 			cooling-device = <&khadas_mcu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; | 
 | 		}; | 
 | 	}; | 
 | }; | 
 |  | 
 | &ext_mdio { | 
 | 	external_phy: ethernet-phy@0 { | 
 | 		/* Realtek RTL8211F (0x001cc916) */ | 
 | 		reg = <0>; | 
 | 		max-speed = <1000>; | 
 |  | 
 | 		interrupt-parent = <&gpio_intc>; | 
 | 		/* MAC_INTR on GPIOZ_14 */ | 
 | 		interrupts = <26 IRQ_TYPE_LEVEL_LOW>; | 
 | 	}; | 
 | }; | 
 |  | 
 | ðmac { | 
 |         pinctrl-0 = <ð_pins>, <ð_rgmii_pins>; | 
 |         pinctrl-names = "default"; | 
 |         status = "okay"; | 
 |         phy-mode = "rgmii"; | 
 |         phy-handle = <&external_phy>; | 
 |         amlogic,tx-delay-ns = <2>; | 
 | }; | 
 |  | 
 | &hdmi_tx { | 
 | 	status = "okay"; | 
 | 	pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>; | 
 | 	pinctrl-names = "default"; | 
 | 	hdmi-supply = <&vcc_5v>; | 
 | }; | 
 |  | 
 | &hdmi_tx_tmds_port { | 
 | 	hdmi_tx_tmds_out: endpoint { | 
 | 		remote-endpoint = <&hdmi_connector_in>; | 
 | 	}; | 
 | }; | 
 |  | 
 | &i2c_AO { | 
 | 	status = "okay"; | 
 | 	pinctrl-0 = <&i2c_ao_sck_pins>, <&i2c_ao_sda_pins>; | 
 | 	pinctrl-names = "default"; | 
 |  | 
 | 	khadas_mcu: system-controller@18 { | 
 | 		compatible = "khadas,mcu"; | 
 | 		reg = <0x18>; | 
 | 		#cooling-cells = <2>; | 
 | 	}; | 
 |  | 
 | 	gpio_expander: gpio-controller@20 { | 
 | 		compatible = "ti,tca6408"; | 
 | 		reg = <0x20>; | 
 | 		vcc-supply = <&vcc_3v3>; | 
 | 		gpio-controller; | 
 | 		#gpio-cells = <2>; | 
 | 	}; | 
 |  | 
 | 	rtc@51 { | 
 | 		compatible = "haoyu,hym8563"; | 
 | 		reg = <0x51>; | 
 | 		#clock-cells = <0>; | 
 | 	}; | 
 | }; | 
 |  | 
 | &ir { | 
 | 	status = "okay"; | 
 | 	pinctrl-0 = <&remote_input_ao_pins>; | 
 | 	pinctrl-names = "default"; | 
 | 	linux,rc-map-name = "rc-khadas"; | 
 | }; | 
 |  | 
 | &pcie { | 
 | 	reset-gpios = <&gpio GPIOA_8 GPIO_ACTIVE_LOW>; | 
 | }; | 
 |  | 
 | &pwm_ef { | 
 |         status = "okay"; | 
 |         pinctrl-0 = <&pwm_e_pins>; | 
 |         pinctrl-names = "default"; | 
 | }; | 
 |  | 
 | &saradc { | 
 | 	status = "okay"; | 
 | 	vref-supply = <&vddao_1v8>; | 
 | }; | 
 |  | 
 | /* SDIO */ | 
 | &sd_emmc_a { | 
 | 	status = "okay"; | 
 | 	pinctrl-0 = <&sdio_pins>; | 
 | 	pinctrl-1 = <&sdio_clk_gate_pins>; | 
 | 	pinctrl-names = "default", "clk-gate"; | 
 | 	#address-cells = <1>; | 
 | 	#size-cells = <0>; | 
 |  | 
 | 	bus-width = <4>; | 
 | 	cap-sd-highspeed; | 
 | 	max-frequency = <100000000>; | 
 |  | 
 | 	non-removable; | 
 | 	disable-wp; | 
 |  | 
 | 	/* WiFi firmware requires power to be kept while in suspend */ | 
 | 	keep-power-in-suspend; | 
 |  | 
 | 	mmc-pwrseq = <&sdio_pwrseq>; | 
 |  | 
 | 	vmmc-supply = <&vsys_3v3>; | 
 | 	vqmmc-supply = <&vddao_1v8>; | 
 |  | 
 | 	brcmf: wifi@1 { | 
 | 		reg = <1>; | 
 | 		compatible = "brcm,bcm4329-fmac"; | 
 | 	}; | 
 | }; | 
 |  | 
 | /* SD card */ | 
 | &sd_emmc_b { | 
 | 	status = "okay"; | 
 | 	pinctrl-0 = <&sdcard_c_pins>; | 
 | 	pinctrl-1 = <&sdcard_clk_gate_c_pins>; | 
 | 	pinctrl-names = "default", "clk-gate"; | 
 |  | 
 | 	bus-width = <4>; | 
 | 	cap-sd-highspeed; | 
 | 	max-frequency = <50000000>; | 
 | 	disable-wp; | 
 |  | 
 | 	cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>; | 
 | 	vmmc-supply = <&vsys_3v3>; | 
 | 	vqmmc-supply = <&vsys_3v3>; | 
 | }; | 
 |  | 
 | /* eMMC */ | 
 | &sd_emmc_c { | 
 | 	status = "okay"; | 
 | 	pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>; | 
 | 	pinctrl-1 = <&emmc_clk_gate_pins>; | 
 | 	pinctrl-names = "default", "clk-gate"; | 
 |  | 
 | 	bus-width = <8>; | 
 | 	cap-mmc-highspeed; | 
 | 	mmc-ddr-1_8v; | 
 | 	mmc-hs200-1_8v; | 
 | 	max-frequency = <200000000>; | 
 | 	disable-wp; | 
 |  | 
 | 	mmc-pwrseq = <&emmc_pwrseq>; | 
 | 	vmmc-supply = <&vcc_3v3>; | 
 | 	vqmmc-supply = <&emmc_1v8>; | 
 | }; | 
 |  | 
 | /* | 
 |  * EMMC_D4, EMMC_D5, EMMC_D6 and EMMC_D7 pins are shared between SPI NOR CS | 
 |  * and eMMC Data 4 to 7 pins. | 
 |  * Replace emmc_data_8b_pins to emmc_data_4b_pins from sd_emmc_c pinctrl-0, | 
 |  * and change bus-width to 4 then spifc can be enabled. | 
 |  */ | 
 | &spifc { | 
 | 	status = "disabled"; | 
 | 	pinctrl-0 = <&nor_pins>; | 
 | 	pinctrl-names = "default"; | 
 |  | 
 | 	w25q128: spi-flash@0 { | 
 | 		#address-cells = <1>; | 
 | 		#size-cells = <1>; | 
 | 		compatible = "winbond,w25q128fw", "jedec,spi-nor"; | 
 | 		reg = <0>; | 
 | 		spi-max-frequency = <104000000>; | 
 | 	}; | 
 | }; | 
 |  | 
 | &uart_A { | 
 | 	status = "okay"; | 
 | 	pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; | 
 | 	pinctrl-names = "default"; | 
 | 	uart-has-rtscts; | 
 |  | 
 | 	bluetooth { | 
 | 		compatible = "brcm,bcm43438-bt"; | 
 | 		shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; | 
 | 		max-speed = <2000000>; | 
 | 		clocks = <&wifi32k>; | 
 | 		clock-names = "lpo"; | 
 | 	}; | 
 | }; | 
 |  | 
 | &uart_AO { | 
 | 	status = "okay"; | 
 | 	pinctrl-0 = <&uart_ao_a_pins>; | 
 | 	pinctrl-names = "default"; | 
 | }; | 
 |  | 
 | &usb2_phy0 { | 
 | 	phy-supply = <&dc_in>; | 
 | }; | 
 |  | 
 | &usb2_phy1 { | 
 | 	phy-supply = <&usb_pwr>; | 
 | }; | 
 |  | 
 | &usb3_pcie_phy { | 
 | 	phy-supply = <&usb_pwr>; | 
 | }; | 
 |  | 
 | &usb { | 
 | 	status = "okay"; | 
 | 	dr_mode = "peripheral"; | 
 | }; |