1// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Copyright (c) 2017 Andreas Färber
4 */
5
6/dts-v1/;
7
8#include "meson-gxbb.dtsi"
9#include <dt-bindings/gpio/gpio.h>
10#include <dt-bindings/sound/meson-aiu.h>
11
12/ {
13	compatible = "friendlyarm,nanopi-k2", "amlogic,meson-gxbb";
14	model = "FriendlyARM NanoPi K2";
15
16	aliases {
17		serial0 = &uart_AO;
18		ethernet0 = &ethmac;
19	};
20
21	chosen {
22		stdout-path = "serial0:115200n8";
23	};
24
25	memory@0 {
26		device_type = "memory";
27		reg = <0x0 0x0 0x0 0x80000000>;
28	};
29
30	leds {
31		compatible = "gpio-leds";
32
33		led-stat {
34			label = "nanopi-k2:blue:stat";
35			gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_HIGH>;
36			default-state = "on";
37			panic-indicator;
38		};
39	};
40
41	vdd_5v: regulator-vdd-5v {
42		compatible = "regulator-fixed";
43		regulator-name = "VDD_5V";
44		regulator-min-microvolt = <5000000>;
45		regulator-max-microvolt = <5000000>;
46	};
47
48	vddio_ao18: regulator-vddio-ao18 {
49		compatible = "regulator-fixed";
50		regulator-name = "VDDIO_AO18";
51		regulator-min-microvolt = <1800000>;
52		regulator-max-microvolt = <1800000>;
53	};
54
55	vddio_ao3v3: regulator-vddio-ao3v3 {
56		compatible = "regulator-fixed";
57		regulator-name = "VDDIO_AO3.3V";
58		regulator-min-microvolt = <3300000>;
59		regulator-max-microvolt = <3300000>;
60	};
61
62	vddio_tf: regulator-vddio-tf {
63		compatible = "regulator-gpio";
64
65		regulator-name = "VDDIO_TF";
66		regulator-min-microvolt = <1800000>;
67		regulator-max-microvolt = <3300000>;
68
69		gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>;
70		gpios-states = <0>;
71
72		states = <3300000 0>,
73		         <1800000 1>;
74
75		regulator-settling-time-up-us = <100>;
76		regulator-settling-time-down-us = <5000>;
77	};
78
79	wifi_32k: wifi-32k {
80		compatible = "pwm-clock";
81		#clock-cells = <0>;
82		clock-frequency = <32768>;
83		pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */
84	};
85
86	sdio_pwrseq: sdio-pwrseq {
87		compatible = "mmc-pwrseq-simple";
88		reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>;
89		clocks = <&wifi_32k>;
90		clock-names = "ext_clock";
91	};
92
93	vcc1v8: regulator-vcc1v8 {
94		compatible = "regulator-fixed";
95		regulator-name = "VCC1.8V";
96		regulator-min-microvolt = <1800000>;
97		regulator-max-microvolt = <1800000>;
98	};
99
100	vcc3v3: regulator-vcc3v3 {
101		compatible = "regulator-fixed";
102		regulator-name = "VCC3.3V";
103		regulator-min-microvolt = <3300000>;
104		regulator-max-microvolt = <3300000>;
105	};
106
107	emmc_pwrseq: emmc-pwrseq {
108		compatible = "mmc-pwrseq-emmc";
109		reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>;
110	};
111
112	/* CVBS is available on CON1 pin 36, disabled by default */
113	cvbs-connector {
114		compatible = "composite-video-connector";
115		status = "disabled";
116
117		port {
118			cvbs_connector_in: endpoint {
119				remote-endpoint = <&cvbs_vdac_out>;
120			};
121		};
122	};
123
124	hdmi-connector {
125		compatible = "hdmi-connector";
126		type = "a";
127
128		port {
129			hdmi_connector_in: endpoint {
130				remote-endpoint = <&hdmi_tx_tmds_out>;
131			};
132		};
133	};
134
135	sound {
136		compatible = "amlogic,gx-sound-card";
137		model = "NANOPI-K2";
138		assigned-clocks = <&clkc CLKID_MPLL0>,
139				  <&clkc CLKID_MPLL1>,
140				  <&clkc CLKID_MPLL2>;
141		assigned-clock-parents = <0>, <0>, <0>;
142		assigned-clock-rates = <294912000>,
143				       <270950400>,
144				       <393216000>;
145
146		dai-link-0 {
147			sound-dai = <&aiu AIU_CPU CPU_I2S_FIFO>;
148		};
149
150		dai-link-1 {
151			sound-dai = <&aiu AIU_CPU CPU_I2S_ENCODER>;
152			dai-format = "i2s";
153			mclk-fs = <256>;
154
155			codec-0 {
156				sound-dai = <&aiu AIU_HDMI CTRL_I2S>;
157			};
158		};
159
160		dai-link-2 {
161			sound-dai = <&aiu AIU_HDMI CTRL_OUT>;
162
163			codec-0 {
164				sound-dai = <&hdmi_tx>;
165			};
166		};
167	};
168};
169
170&aiu {
171	status = "okay";
172};
173
174&cec_AO {
175	status = "okay";
176	pinctrl-0 = <&ao_cec_pins>;
177	pinctrl-names = "default";
178	hdmi-phandle = <&hdmi_tx>;
179};
180
181&cvbs_vdac_port {
182	cvbs_vdac_out: endpoint {
183		remote-endpoint = <&cvbs_connector_in>;
184	};
185};
186
187&ethmac {
188	status = "okay";
189	pinctrl-0 = <&eth_rgmii_pins>;
190	pinctrl-names = "default";
191
192	phy-handle = <&eth_phy0>;
193	phy-mode = "rgmii";
194
195	amlogic,tx-delay-ns = <2>;
196
197	mdio {
198		compatible = "snps,dwmac-mdio";
199		#address-cells = <1>;
200		#size-cells = <0>;
201
202		eth_phy0: ethernet-phy@0 {
203			/* Realtek RTL8211F (0x001cc916) */
204			reg = <0>;
205
206			reset-assert-us = <10000>;
207			reset-deassert-us = <80000>;
208			reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
209
210			interrupt-parent = <&gpio_intc>;
211			/* MAC_INTR on GPIOZ_15 */
212			interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
213		};
214	};
215};
216
217&hdmi_tx {
218	status = "okay";
219	pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>;
220	pinctrl-names = "default";
221};
222
223&hdmi_tx_tmds_port {
224	hdmi_tx_tmds_out: endpoint {
225		remote-endpoint = <&hdmi_connector_in>;
226	};
227};
228
229&ir {
230	status = "okay";
231	pinctrl-0 = <&remote_input_ao_pins>;
232	pinctrl-names = "default";
233};
234
235&gpio_ao {
236	gpio-line-names = "UART TX", "UART RX", "Power Control", "Power Key In",
237			  "VCCK En", "CON1 Header Pin31",
238			  "I2S Header Pin6", "IR In", "I2S Header Pin7",
239			  "I2S Header Pin3", "I2S Header Pin4",
240			  "I2S Header Pin5", "HDMI CEC", "SYS LED",
241			  /* GPIO_TEST_N */
242			  "";
243};
244
245&gpio {
246	gpio-line-names = /* Bank GPIOZ */
247			  "Eth MDIO", "Eth MDC", "Eth RGMII RX Clk",
248			  "Eth RX DV", "Eth RX D0", "Eth RX D1", "Eth RX D2",
249			  "Eth RX D3", "Eth RGMII TX Clk", "Eth TX En",
250			  "Eth TX D0", "Eth TX D1", "Eth TX D2", "Eth TX D3",
251			  "Eth PHY nRESET", "Eth PHY Intc",
252			  /* Bank GPIOH */
253			  "HDMI HPD", "HDMI DDC SDA", "HDMI DDC SCL",
254			  "CON1 Header Pin33",
255			  /* Bank BOOT */
256			  "eMMC D0", "eMMC D1", "eMMC D2", "eMMC D3", "eMMC D4",
257			  "eMMC D5", "eMMC D6", "eMMC D7", "eMMC Clk",
258			  "eMMC Reset", "eMMC CMD",
259			  "", "", "", "", "eMMC DS",
260			  "", "",
261			  /* Bank CARD */
262			  "SDCard D1", "SDCard D0", "SDCard CLK", "SDCard CMD",
263			  "SDCard D3", "SDCard D2", "SDCard Det",
264			  /* Bank GPIODV */
265			  "", "", "", "", "", "", "", "", "", "", "", "", "",
266			  "", "", "", "", "", "", "", "", "", "", "",
267			  "I2C A SDA", "I2C A SCK", "I2C B SDA", "I2C B SCK",
268			  "VDDEE Regulator", "VCCK Regulator",
269			  /* Bank GPIOY */
270			  "CON1 Header Pin7", "CON1 Header Pin11",
271			  "CON1 Header Pin13", "CON1 Header Pin15",
272			  "CON1 Header Pin18", "CON1 Header Pin19",
273			  "CON1 Header Pin22", "CON1 Header Pin21",
274			  "CON1 Header Pin24", "CON1 Header Pin23",
275			  "CON1 Header Pin26", "CON1 Header Pin29",
276			  "CON1 Header Pin32", "CON1 Header Pin8",
277			  "CON1 Header Pin10", "CON1 Header Pin16",
278			  "CON1 Header Pin12",
279			  /* Bank GPIOX */
280			  "WIFI SDIO D0", "WIFI SDIO D1", "WIFI SDIO D2",
281			  "WIFI SDIO D3", "WIFI SDIO CLK", "WIFI SDIO CMD",
282			  "WIFI Power Enable", "WIFI WAKE HOST",
283			  "Bluetooth PCM DOUT", "Bluetooth PCM DIN",
284			  "Bluetooth PCM SYNC", "Bluetooth PCM CLK",
285			  "Bluetooth UART TX", "Bluetooth UART RX",
286			  "Bluetooth UART CTS", "Bluetooth UART RTS",
287			  "", "", "", "WIFI 32K", "Bluetooth Enable",
288			  "Bluetooth WAKE HOST", "",
289			  /* Bank GPIOCLK */
290			  "", "CON1 Header Pin35", "", "";
291};
292
293&pwm_ef {
294	status = "okay";
295	pinctrl-0 = <&pwm_e_pins>;
296	pinctrl-names = "default";
297	clocks = <&clkc CLKID_FCLK_DIV4>;
298	clock-names = "clkin0";
299};
300
301&saradc {
302	status = "okay";
303	vref-supply = <&vddio_ao18>;
304};
305
306/* SDIO */
307&sd_emmc_a {
308	status = "okay";
309	pinctrl-0 = <&sdio_pins>, <&sdio_irq_pins>;
310	pinctrl-1 = <&sdio_clk_gate_pins>;
311	pinctrl-names = "default", "clk-gate";
312	#address-cells = <1>;
313	#size-cells = <0>;
314
315	bus-width = <4>;
316	cap-sd-highspeed;
317	max-frequency = <50000000>;
318
319	non-removable;
320	disable-wp;
321
322	/* WiFi firmware requires power to be kept while in suspend */
323	keep-power-in-suspend;
324
325	mmc-pwrseq = <&sdio_pwrseq>;
326
327	vmmc-supply = <&vddio_ao3v3>;
328	vqmmc-supply = <&vddio_ao18>;
329
330	brcmf: wifi@1 {
331		compatible = "brcm,bcm4329-fmac";
332		reg = <1>;
333	};
334};
335
336/* SD */
337&sd_emmc_b {
338	status = "okay";
339	pinctrl-0 = <&sdcard_pins>;
340	pinctrl-1 = <&sdcard_clk_gate_pins>;
341	pinctrl-names = "default", "clk-gate";
342
343	bus-width = <4>;
344	cap-sd-highspeed;
345	sd-uhs-sdr12;
346	sd-uhs-sdr25;
347	sd-uhs-sdr50;
348	sd-uhs-ddr50;
349	max-frequency = <100000000>;
350	disable-wp;
351
352	cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
353
354	vmmc-supply = <&vddio_ao3v3>;
355	vqmmc-supply = <&vddio_tf>;
356};
357
358/* eMMC */
359&sd_emmc_c {
360	status = "disabled";
361	pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>;
362	pinctrl-1 = <&emmc_clk_gate_pins>;
363	pinctrl-names = "default", "clk-gate";
364
365	bus-width = <8>;
366	max-frequency = <200000000>;
367	non-removable;
368	disable-wp;
369	cap-mmc-highspeed;
370	mmc-ddr-1_8v;
371	mmc-hs200-1_8v;
372
373	mmc-pwrseq = <&emmc_pwrseq>;
374	vmmc-supply = <&vcc3v3>;
375	vqmmc-supply = <&vcc1v8>;
376};
377
378/* DBG_UART */
379&uart_AO {
380	status = "okay";
381	pinctrl-0 = <&uart_ao_a_pins>;
382	pinctrl-names = "default";
383};
384
385/* Bluetooth on AP6212 */
386&uart_A {
387	status = "okay";
388	pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
389	pinctrl-names = "default";
390	uart-has-rtscts;
391
392	bluetooth {
393		compatible = "brcm,bcm43438-bt";
394		clocks = <&wifi_32k>;
395		clock-names = "lpo";
396		vbat-supply = <&vddio_ao3v3>;
397		vddio-supply = <&vddio_ao18>;
398		host-wakeup-gpios = <&gpio GPIOX_21 GPIO_ACTIVE_HIGH>;
399		shutdown-gpios = <&gpio GPIOX_20 GPIO_ACTIVE_HIGH>;
400	};
401};
402
403/* 40-pin CON1 */
404&uart_C {
405	status = "disabled";
406	pinctrl-0 = <&uart_c_pins>;
407	pinctrl-names = "default";
408};
409
410&usb0_phy {
411	status = "okay";
412	phy-supply = <&vdd_5v>;
413};
414
415&usb1_phy {
416	status = "okay";
417};
418
419&usb0 {
420	status = "okay";
421};
422
423&usb1 {
424	status = "okay";
425};
426