1// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
4 *
5 * Based on sun8i-h3-bananapi-m2-plus.dts, which is:
6 *   Copyright (C) 2016 Chen-Yu Tsai <wens@csie.org>
7 */
8
9/dts-v1/;
10#include "sun8i-h3.dtsi"
11#include "sunxi-common-regulators.dtsi"
12
13#include <dt-bindings/gpio/gpio.h>
14#include <dt-bindings/input/input.h>
15
16/ {
17	model = "Banana Pi BPI-M2-Zero";
18	compatible = "sinovoip,bpi-m2-zero", "allwinner,sun8i-h2-plus";
19
20	aliases {
21		serial0 = &uart0;
22		serial1 = &uart1;
23	};
24
25	chosen {
26		stdout-path = "serial0:115200n8";
27	};
28
29	connector {
30		compatible = "hdmi-connector";
31		type = "c";
32
33		port {
34			hdmi_con_in: endpoint {
35				remote-endpoint = <&hdmi_out_con>;
36			};
37		};
38	};
39
40	leds {
41		compatible = "gpio-leds";
42
43		pwr_led {
44			label = "bananapi-m2-zero:red:pwr";
45			gpios = <&r_pio 0 10 GPIO_ACTIVE_LOW>; /* PL10 */
46			default-state = "on";
47		};
48	};
49
50	gpio_keys {
51		compatible = "gpio-keys";
52
53		sw4 {
54			label = "power";
55			linux,code = <BTN_0>;
56			gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
57		};
58	};
59
60	reg_vdd_cpux: vdd-cpux-regulator {
61		compatible = "regulator-gpio";
62		regulator-name = "vdd-cpux";
63		regulator-type = "voltage";
64		regulator-boot-on;
65		regulator-always-on;
66		regulator-min-microvolt = <1100000>;
67		regulator-max-microvolt = <1300000>;
68		regulator-ramp-delay = <50>; /* 4ms */
69
70		gpios = <&r_pio 0 1 GPIO_ACTIVE_HIGH>; /* PL1 */
71		enable-active-high;
72		gpios-states = <0x1>;
73		states = <1100000 0>, <1300000 1>;
74	};
75
76	reg_vcc_dram: vcc-dram {
77		compatible = "regulator-fixed";
78		regulator-name = "vcc-dram";
79		regulator-min-microvolt = <1500000>;
80		regulator-max-microvolt = <1500000>;
81		regulator-always-on;
82		regulator-boot-on;
83		enable-active-high;
84		gpio = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
85		vin-supply = <&reg_vcc5v0>;
86	};
87
88	reg_vcc1v2: vcc1v2 {
89		compatible = "regulator-fixed";
90		regulator-name = "vcc1v2";
91		regulator-min-microvolt = <1200000>;
92		regulator-max-microvolt = <1200000>;
93		regulator-always-on;
94		regulator-boot-on;
95		enable-active-high;
96		gpio = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
97		vin-supply = <&reg_vcc5v0>;
98	};
99
100	poweroff {
101		compatible = "regulator-poweroff";
102		cpu-supply = <&reg_vcc1v2>;
103	};
104
105	wifi_pwrseq: wifi_pwrseq {
106		compatible = "mmc-pwrseq-simple";
107		reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */
108		clocks = <&rtc 1>;
109		clock-names = "ext_clock";
110	};
111};
112
113&cpu0 {
114	cpu-supply = <&reg_vdd_cpux>;
115};
116
117&de {
118	status = "okay";
119};
120
121&ehci0 {
122	status = "okay";
123};
124
125&hdmi {
126	status = "okay";
127};
128
129&hdmi_out {
130	hdmi_out_con: endpoint {
131		remote-endpoint = <&hdmi_con_in>;
132	};
133};
134
135&mmc0 {
136	vmmc-supply = <&reg_vcc3v3>;
137	bus-width = <4>;
138	/*
139	 * On the production batch of this board the card detect GPIO is
140	 * high active (card inserted), although on the early samples it's
141	 * low active.
142	 */
143	cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>; /* PF6 */
144	status = "okay";
145};
146
147&mmc1 {
148	vmmc-supply = <&reg_vcc3v3>;
149	vqmmc-supply = <&reg_vcc3v3>;
150	mmc-pwrseq = <&wifi_pwrseq>;
151	bus-width = <4>;
152	non-removable;
153	status = "okay";
154
155	brcmf: wifi@1 {
156		reg = <1>;
157		compatible = "brcm,bcm4329-fmac";
158		interrupt-parent = <&pio>;
159		interrupts = <6 10 IRQ_TYPE_LEVEL_LOW>; /* PG10 / EINT10 */
160		interrupt-names = "host-wake";
161	};
162};
163
164&ohci0 {
165	status = "okay";
166};
167
168&uart0 {
169	pinctrl-names = "default";
170	pinctrl-0 = <&uart0_pa_pins>;
171	status = "okay";
172};
173
174&uart1 {
175	pinctrl-names = "default";
176	pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
177	uart-has-rtscts;
178	status = "okay";
179
180	bluetooth {
181		compatible = "brcm,bcm43438-bt";
182		max-speed = <1500000>;
183		clocks = <&rtc 1>;
184		clock-names = "lpo";
185		vbat-supply = <&reg_vcc3v3>;
186		vddio-supply = <&reg_vcc3v3>;
187		device-wakeup-gpios = <&pio 6 13 GPIO_ACTIVE_HIGH>; /* PG13 */
188		host-wakeup-gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
189		shutdown-gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
190	};
191
192};
193
194&pio {
195	gpio-line-names =
196		/* PA */
197		"CON2-P13", "CON2-P11", "CON2-P22", "CON2-P15",
198			"CON3-P03", "CON3-P02", "CON2-P07", "CON2-P29",
199		"CON2-P31", "CON2-P33", "CON2-P35", "CON2-P05",
200			"CON2-P03", "CON2-P08", "CON2-P10", "CON2-P16",
201		"CON2-P12", "CON2-P37", "CON2-P28", "CON2-P27",
202			"CON2-P40", "CON2-P38", "", "",
203		"", "", "", "", "", "", "", "",
204
205		/* PB */
206		"", "", "", "", "", "", "", "",
207		"", "", "", "", "", "", "", "",
208		"", "", "", "", "", "", "", "",
209		"", "", "", "", "", "", "", "",
210
211		/* PC */
212		"CON2-P19", "CON2-P21", "CON2-P23", "CON2-P24",
213			"CON2-P18", "", "", "CON2-P26",
214		"", "", "", "", "", "", "", "",
215		"", "", "", "", "", "", "", "",
216		"", "", "", "", "", "", "", "",
217
218		/* PD */
219		"", "", "", "", "", "", "", "",
220		"", "", "", "", "", "", "CSI-PWR-EN", "",
221		"", "", "", "", "", "", "", "",
222		"", "", "", "", "", "", "", "",
223
224		/* PE */
225		"CN3-P17", "CN3-P13", "CN3-P09", "CN3-P07",
226			"CN3-P19", "CN3-P21", "CN3-P22", "CN3-P20",
227		"CN3-P18", "CN3-P16", "CN3-P14", "CN3-P12",
228			"CN3-P05", "CN3-P03", "CN3-P06", "CN3-P08",
229		"", "", "", "", "", "", "", "",
230		"", "", "", "", "", "", "", "",
231
232		/* PF */
233		"SDC0-D1", "SDC0-D0", "SDC0-CLK", "SDC0-CMD", "SDC0-D3",
234			"SDC0-D2", "SDC0-DET", "",
235		"", "", "", "", "", "", "", "",
236		"", "", "", "", "", "", "", "",
237		"", "", "", "", "", "", "", "",
238
239		/* PG */
240		"WL-SDIO-CLK", "WL-SDIO-CMD", "WL-SDIO-D0", "WL-SDIO-D1",
241			"WL-SDIO-D2", "WL-SDIO-D3", "BT-UART-TX", "BT-UART-RX",
242		"BT-UART-RTS", "BT-UART-CTS", "WL-WAKE-AP", "BT-WAKE-AP",
243			"BT-RST-N", "AP-WAKE-BT", "", "",
244		"", "", "", "", "", "", "", "",
245		"", "", "", "", "", "", "", "";
246};
247
248&r_pio {
249	gpio-line-names =
250		/* PL */
251		"", "CPUX-SET", "CON2-P32", "POWER-KEY", "CON2-P36",
252			"VCC-IO-EN", "USB0-ID", "WL-PWR-EN",
253		"PWR-STB", "PWR-DRAM", "PWR-LED", "IR-RX", "", "", "", "",
254		"", "", "", "", "", "", "", "",
255		"", "", "", "", "", "", "", "";
256};
257
258&usb_otg {
259	dr_mode = "otg";
260	status = "okay";
261};
262
263&usbphy {
264	usb0_id_det-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
265	/*
266	 * There're two micro-USB connectors, one is power-only and another is
267	 * OTG. The Vbus of these two connectors are connected together, so
268	 * the external USB device will be powered just by the power input
269	 * from the power-only USB port.
270	 */
271	status = "okay";
272};
273