1// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Copyright (c) 2018 BayLibre SAS. All rights reserved.
4 */
5
6/dts-v1/;
7
8#include "meson-g12a.dtsi"
9#include <dt-bindings/gpio/gpio.h>
10#include <dt-bindings/gpio/meson-g12a-gpio.h>
11#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
12
13/ {
14	compatible = "amediatech,x96-max", "amlogic,g12a";
15	model = "Shenzhen Amediatech Technology Co., Ltd X96 Max";
16
17	aliases {
18		serial0 = &uart_AO;
19		ethernet0 = &ethmac;
20	};
21
22	spdif_dit: audio-codec-1 {
23		#sound-dai-cells = <0>;
24		compatible = "linux,spdif-dit";
25		status = "okay";
26		sound-name-prefix = "DIT";
27	};
28
29	chosen {
30		stdout-path = "serial0:115200n8";
31	};
32	memory@0 {
33		device_type = "memory";
34		reg = <0x0 0x0 0x0 0x40000000>;
35	};
36
37	cvbs-connector {
38		compatible = "composite-video-connector";
39
40		port {
41			cvbs_connector_in: endpoint {
42				remote-endpoint = <&cvbs_vdac_out>;
43			};
44		};
45	};
46
47	hdmi-connector {
48		compatible = "hdmi-connector";
49		type = "a";
50
51		port {
52			hdmi_connector_in: endpoint {
53				remote-endpoint = <&hdmi_tx_tmds_out>;
54			};
55		};
56	};
57
58	emmc_pwrseq: emmc-pwrseq {
59		compatible = "mmc-pwrseq-emmc";
60		reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
61	};
62
63	sdio_pwrseq: sdio-pwrseq {
64		compatible = "mmc-pwrseq-simple";
65		reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>;
66		clocks = <&wifi32k>;
67		clock-names = "ext_clock";
68	};
69
70	flash_1v8: regulator-flash_1v8 {
71		compatible = "regulator-fixed";
72		regulator-name = "FLASH_1V8";
73		regulator-min-microvolt = <1800000>;
74		regulator-max-microvolt = <1800000>;
75		vin-supply = <&vcc_3v3>;
76		regulator-always-on;
77	};
78
79	dc_in: regulator-dc_in {
80		compatible = "regulator-fixed";
81		regulator-name = "DC_IN";
82		regulator-min-microvolt = <5000000>;
83		regulator-max-microvolt = <5000000>;
84		regulator-always-on;
85	};
86
87	vcc_1v8: regulator-vcc_1v8 {
88		compatible = "regulator-fixed";
89		regulator-name = "VCC_1V8";
90		regulator-min-microvolt = <1800000>;
91		regulator-max-microvolt = <1800000>;
92		vin-supply = <&vcc_3v3>;
93		regulator-always-on;
94	};
95
96	vcc_3v3: regulator-vcc_3v3 {
97		compatible = "regulator-fixed";
98		regulator-name = "VCC_3V3";
99		regulator-min-microvolt = <3300000>;
100		regulator-max-microvolt = <3300000>;
101		vin-supply = <&vddao_3v3>;
102		regulator-always-on;
103		/* FIXME: actually controlled by VDDCPU_B_EN */
104	};
105
106	vcc_5v: regulator-vcc_5v {
107		compatible = "regulator-fixed";
108		regulator-name = "VCC_5V";
109		regulator-min-microvolt = <5000000>;
110		regulator-max-microvolt = <5000000>;
111		vin-supply = <&dc_in>;
112
113		gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>;
114	};
115
116	vddao_1v8: regulator-vddao_1v8 {
117		compatible = "regulator-fixed";
118		regulator-name = "VDDAO_1V8";
119		regulator-min-microvolt = <1800000>;
120		regulator-max-microvolt = <1800000>;
121		vin-supply = <&vddao_3v3>;
122		regulator-always-on;
123	};
124
125	vddao_3v3: regulator-vddao_3v3 {
126		compatible = "regulator-fixed";
127		regulator-name = "VDDAO_3V3";
128		regulator-min-microvolt = <3300000>;
129		regulator-max-microvolt = <3300000>;
130		vin-supply = <&dc_in>;
131		regulator-always-on;
132	};
133
134	vddcpu: regulator-vddcpu {
135		compatible = "pwm-regulator";
136
137		regulator-name = "VDDCPU";
138		regulator-min-microvolt = <721000>;
139		regulator-max-microvolt = <1022000>;
140
141		pwm-supply = <&dc_in>;
142
143		pwms = <&pwm_AO_cd 1 1250 0>;
144		pwm-dutycycle-range = <100 0>;
145
146		regulator-boot-on;
147		regulator-always-on;
148	};
149
150	sound {
151		compatible = "amlogic,axg-sound-card";
152		model = "X96-MAX";
153		audio-aux-devs = <&tdmout_b>;
154		audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1",
155				"TDMOUT_B IN 1", "FRDDR_B OUT 1",
156				"TDMOUT_B IN 2", "FRDDR_C OUT 1",
157				"TDM_B Playback", "TDMOUT_B OUT",
158				"SPDIFOUT IN 0", "FRDDR_A OUT 3",
159				"SPDIFOUT IN 1", "FRDDR_B OUT 3",
160				"SPDIFOUT IN 2", "FRDDR_C OUT 3";
161
162		assigned-clocks = <&clkc CLKID_MPLL2>,
163				  <&clkc CLKID_MPLL0>,
164				  <&clkc CLKID_MPLL1>;
165		assigned-clock-parents = <0>, <0>, <0>;
166		assigned-clock-rates = <294912000>,
167				       <270950400>,
168				       <393216000>;
169
170		dai-link-0 {
171			sound-dai = <&frddr_a>;
172		};
173
174		dai-link-1 {
175			sound-dai = <&frddr_b>;
176		};
177
178		dai-link-2 {
179			sound-dai = <&frddr_c>;
180		};
181
182		/* 8ch hdmi interface */
183		dai-link-3 {
184			sound-dai = <&tdmif_b>;
185			dai-format = "i2s";
186			dai-tdm-slot-tx-mask-0 = <1 1>;
187			dai-tdm-slot-tx-mask-1 = <1 1>;
188			dai-tdm-slot-tx-mask-2 = <1 1>;
189			dai-tdm-slot-tx-mask-3 = <1 1>;
190			mclk-fs = <256>;
191
192			codec {
193				sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
194			};
195		};
196
197		/* spdif hdmi or toslink interface */
198		dai-link-4 {
199			sound-dai = <&spdifout>;
200
201			codec-0 {
202				sound-dai = <&spdif_dit>;
203			};
204
205			codec-1 {
206				sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_A>;
207			};
208		};
209
210		/* spdif hdmi interface */
211		dai-link-5 {
212			sound-dai = <&spdifout_b>;
213
214			codec {
215				sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_B>;
216			};
217		};
218
219		/* hdmi glue */
220		dai-link-6 {
221			sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
222
223			codec {
224				sound-dai = <&hdmi_tx>;
225			};
226		};
227	};
228
229	wifi32k: wifi32k {
230		compatible = "pwm-clock";
231		#clock-cells = <0>;
232		clock-frequency = <32768>;
233		pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */
234	};
235};
236
237&arb {
238	status = "okay";
239};
240
241&cec_AO {
242	pinctrl-0 = <&cec_ao_a_h_pins>;
243	pinctrl-names = "default";
244	status = "disabled";
245	hdmi-phandle = <&hdmi_tx>;
246};
247
248&cecb_AO {
249	pinctrl-0 = <&cec_ao_b_h_pins>;
250	pinctrl-names = "default";
251	status = "okay";
252	hdmi-phandle = <&hdmi_tx>;
253};
254
255&clkc_audio {
256	status = "okay";
257};
258
259&cpu0 {
260	cpu-supply = <&vddcpu>;
261	operating-points-v2 = <&cpu_opp_table>;
262	clocks = <&clkc CLKID_CPU_CLK>;
263	clock-latency = <50000>;
264};
265
266&cpu1 {
267	cpu-supply = <&vddcpu>;
268	operating-points-v2 = <&cpu_opp_table>;
269	clocks = <&clkc CLKID_CPU_CLK>;
270	clock-latency = <50000>;
271};
272
273&cpu2 {
274	cpu-supply = <&vddcpu>;
275	operating-points-v2 = <&cpu_opp_table>;
276	clocks = <&clkc CLKID_CPU_CLK>;
277	clock-latency = <50000>;
278};
279
280&cpu3 {
281	cpu-supply = <&vddcpu>;
282	operating-points-v2 = <&cpu_opp_table>;
283	clocks = <&clkc CLKID_CPU_CLK>;
284	clock-latency = <50000>;
285};
286
287&cvbs_vdac_port {
288	cvbs_vdac_out: endpoint {
289		remote-endpoint = <&cvbs_connector_in>;
290	};
291};
292
293&frddr_a {
294	status = "okay";
295};
296
297&frddr_b {
298	status = "okay";
299};
300
301&frddr_c {
302	status = "okay";
303};
304
305&hdmi_tx {
306	status = "okay";
307	pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>;
308	pinctrl-names = "default";
309	hdmi-supply = <&vcc_5v>;
310};
311
312&hdmi_tx_tmds_port {
313	hdmi_tx_tmds_out: endpoint {
314		remote-endpoint = <&hdmi_connector_in>;
315	};
316};
317
318&ir {
319	status = "okay";
320	pinctrl-0 = <&remote_input_ao_pins>;
321	pinctrl-names = "default";
322	linux,rc-map-name = "rc-x96max";
323};
324
325&pwm_AO_cd {
326	pinctrl-0 = <&pwm_ao_d_e_pins>;
327	pinctrl-names = "default";
328	clocks = <&xtal>;
329	clock-names = "clkin1";
330	status = "okay";
331};
332
333&ext_mdio {
334	external_phy: ethernet-phy@0 {
335		/* Realtek RTL8211F (0x001cc916) */
336		reg = <0>;
337		max-speed = <1000>;
338		eee-broken-1000t;
339
340		reset-assert-us = <10000>;
341		reset-deassert-us = <80000>;
342		reset-gpios = <&gpio GPIOZ_15 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>;
343
344		interrupt-parent = <&gpio_intc>;
345		/* MAC_INTR on GPIOZ_14 */
346		interrupts = <IRQID_GPIOZ_14 IRQ_TYPE_LEVEL_LOW>;
347	};
348};
349
350&ethmac {
351	pinctrl-0 = <&eth_pins>, <&eth_rgmii_pins>;
352	pinctrl-names = "default";
353	status = "okay";
354	phy-mode = "rgmii";
355	phy-handle = <&external_phy>;
356	amlogic,tx-delay-ns = <2>;
357};
358
359&pwm_ef {
360	status = "okay";
361	pinctrl-0 = <&pwm_e_pins>;
362	pinctrl-names = "default";
363	clocks = <&xtal>;
364	clock-names = "clkin0";
365};
366
367&uart_A {
368	status = "okay";
369	pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
370	pinctrl-names = "default";
371	uart-has-rtscts;
372
373	bluetooth {
374		compatible = "brcm,bcm43438-bt";
375		shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
376		max-speed = <2000000>;
377		clocks = <&wifi32k>;
378		clock-names = "lpo";
379	};
380};
381
382&uart_AO {
383	status = "okay";
384	pinctrl-0 = <&uart_ao_a_pins>;
385	pinctrl-names = "default";
386};
387
388&usb {
389	status = "okay";
390	dr_mode = "host";
391};
392
393/* SDIO */
394&sd_emmc_a {
395	status = "okay";
396	pinctrl-0 = <&sdio_pins>;
397	pinctrl-1 = <&sdio_clk_gate_pins>;
398	pinctrl-names = "default", "clk-gate";
399	#address-cells = <1>;
400	#size-cells = <0>;
401
402	bus-width = <4>;
403	cap-sd-highspeed;
404	sd-uhs-sdr50;
405	max-frequency = <100000000>;
406
407	non-removable;
408	disable-wp;
409
410	/* WiFi firmware requires power to be kept while in suspend */
411	keep-power-in-suspend;
412
413	mmc-pwrseq = <&sdio_pwrseq>;
414
415	vmmc-supply = <&vddao_3v3>;
416	vqmmc-supply = <&vddao_1v8>;
417
418	brcmf: wifi@1 {
419		reg = <1>;
420		compatible = "brcm,bcm4329-fmac";
421	};
422};
423
424/* SD card */
425&sd_emmc_b {
426	status = "okay";
427	pinctrl-0 = <&sdcard_c_pins>;
428	pinctrl-1 = <&sdcard_clk_gate_c_pins>;
429	pinctrl-names = "default", "clk-gate";
430
431	bus-width = <4>;
432	cap-sd-highspeed;
433	max-frequency = <100000000>;
434	disable-wp;
435
436	cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>;
437	vmmc-supply = <&vddao_3v3>;
438	vqmmc-supply = <&vddao_3v3>;
439};
440
441/* eMMC */
442&sd_emmc_c {
443	status = "okay";
444	pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>;
445	pinctrl-1 = <&emmc_clk_gate_pins>;
446	pinctrl-names = "default", "clk-gate";
447
448	bus-width = <8>;
449	cap-mmc-highspeed;
450	max-frequency = <100000000>;
451	non-removable;
452	disable-wp;
453
454	mmc-pwrseq = <&emmc_pwrseq>;
455	vmmc-supply = <&vcc_3v3>;
456	vqmmc-supply = <&flash_1v8>;
457};
458
459&spdifout {
460	pinctrl-0 = <&spdif_out_h_pins>;
461	pinctrl-names = "default";
462	status = "okay";
463};
464
465&spdifout_b {
466	status = "okay";
467};
468
469&tdmif_b {
470	status = "okay";
471};
472
473&tdmout_b {
474	status = "okay";
475};
476
477&tohdmitx {
478	status = "okay";
479};
480