1// SPDX-License-Identifier: GPL-2.0
2/dts-v1/;
3
4#include "jz4770.dtsi"
5#include <dt-bindings/clock/ingenic,tcu.h>
6
7#include <dt-bindings/gpio/gpio.h>
8#include <dt-bindings/iio/adc/ingenic,adc.h>
9#include <dt-bindings/input/input.h>
10
11/ {
12	compatible = "gcw,zero", "ingenic,jz4770";
13	model = "GCW Zero";
14
15	aliases {
16		serial0 = &uart0;
17		serial1 = &uart1;
18		serial2 = &uart2;
19		serial3 = &uart3;
20	};
21
22	memory: memory {
23		device_type = "memory";
24		reg = <0x0 0x10000000>,
25		      <0x30000000 0x10000000>;
26	};
27
28	chosen {
29		stdout-path = "serial2:57600n8";
30	};
31
32	vcc: regulator@0 {
33		compatible = "regulator-fixed";
34		regulator-name = "vcc";
35
36		regulator-min-microvolt = <3300000>;
37		regulator-max-microvolt = <3300000>;
38		regulator-always-on;
39	};
40
41	mmc1_power: regulator@1 {
42		compatible = "regulator-fixed";
43		regulator-name = "mmc1_vcc";
44		gpio = <&gpe 9 0>;
45
46		regulator-min-microvolt = <3300000>;
47		regulator-max-microvolt = <3300000>;
48		vin-supply = <&vcc>;
49	};
50
51	headphones_amp: analog-amplifier@0 {
52		compatible = "simple-audio-amplifier";
53		enable-gpios = <&gpf 3 GPIO_ACTIVE_LOW>;
54		enable-delay-ms = <50>;
55
56		VCC-supply = <&ldo5>;
57		sound-name-prefix = "Headphones Amp";
58	};
59
60	speaker_amp: analog-amplifier@1 {
61		compatible = "simple-audio-amplifier";
62		enable-gpios = <&gpf 20 GPIO_ACTIVE_HIGH>;
63
64		VCC-supply = <&ldo5>;
65		sound-name-prefix = "Speaker Amp";
66	};
67
68	sound {
69		compatible = "simple-audio-card";
70
71		simple-audio-card,name = "gcw0-audio";
72		simple-audio-card,format = "i2s";
73
74		simple-audio-card,widgets =
75			"Speaker", "Speaker",
76			"Headphone", "Headphones",
77			"Microphone", "Built-in Mic";
78		simple-audio-card,routing =
79			"Headphones Amp INL", "LHPOUT",
80			"Headphones Amp INR", "RHPOUT",
81			"Headphones", "Headphones Amp OUTL",
82			"Headphones", "Headphones Amp OUTR",
83			"Speaker Amp INL", "LOUT",
84			"Speaker Amp INR", "ROUT",
85			"Speaker", "Speaker Amp OUTL",
86			"Speaker", "Speaker Amp OUTR",
87			"LLINEIN", "Cap-less",
88			"RLINEIN", "Cap-less",
89			"Built-in Mic", "MICBIAS",
90			"MIC1P", "Built-in Mic",
91			"MIC1N", "Built-in Mic";
92		simple-audio-card,pin-switches = "Speaker", "Headphones";
93
94		simple-audio-card,hp-det-gpio = <&gpf 21 GPIO_ACTIVE_LOW>;
95		simple-audio-card,aux-devs = <&speaker_amp>, <&headphones_amp>;
96
97		simple-audio-card,bitclock-master = <&dai_codec>;
98		simple-audio-card,frame-master = <&dai_codec>;
99
100		dai_cpu: simple-audio-card,cpu {
101			sound-dai = <&aic>;
102		};
103
104		dai_codec: simple-audio-card,codec {
105			sound-dai = <&codec>;
106		};
107	};
108
109	rumble {
110		compatible = "pwm-vibrator";
111		pwms = <&pwm 4 2000000 0>;
112		pwm-names = "enable";
113
114		pinctrl-names = "default";
115		pinctrl-0 = <&pins_pwm4>;
116	};
117
118	backlight: backlight {
119		compatible = "pwm-backlight";
120		pwms = <&pwm 1 40000 0>;
121		power-supply = <&vcc>;
122
123		brightness-levels = <0 16 32 48 64 80 96 112 128
124				     144 160 176 192 208 224 240 255>;
125		default-brightness-level = <12>;
126
127		pinctrl-names = "default";
128		pinctrl-0 = <&pins_pwm1>;
129	};
130
131	gpio-keys {
132		compatible = "gpio-keys";
133		autorepeat;
134
135		button-0 {
136			label = "D-pad up";
137			linux,code = <KEY_UP>;
138			linux,can-disable;
139			gpios = <&gpe 21 GPIO_ACTIVE_LOW>;
140		};
141
142		button-1 {
143			label = "D-pad down";
144			linux,code = <KEY_DOWN>;
145			linux,can-disable;
146			gpios = <&gpe 25 GPIO_ACTIVE_LOW>;
147		};
148
149		button-2 {
150			label = "D-pad left";
151			linux,code = <KEY_LEFT>;
152			linux,can-disable;
153			gpios = <&gpe 23 GPIO_ACTIVE_LOW>;
154		};
155
156		button-3 {
157			label = "D-pad right";
158			linux,code = <KEY_RIGHT>;
159			linux,can-disable;
160			gpios = <&gpe 24 GPIO_ACTIVE_LOW>;
161		};
162
163		button-4 {
164			label = "Button A";
165			linux,code = <KEY_LEFTCTRL>;
166			linux,can-disable;
167			gpios = <&gpe 29 GPIO_ACTIVE_LOW>;
168		};
169
170		button-5 {
171			label = "Button B";
172			linux,code = <KEY_LEFTALT>;
173			linux,can-disable;
174			gpios = <&gpe 20 GPIO_ACTIVE_LOW>;
175		};
176
177		button-6 {
178			label = "Button Y";
179			linux,code = <KEY_SPACE>;
180			linux,can-disable;
181			gpios = <&gpe 27 GPIO_ACTIVE_LOW>;
182		};
183
184		button-7 {
185			label = "Button X";
186			linux,code = <KEY_LEFTSHIFT>;
187			linux,can-disable;
188			gpios = <&gpe 28 GPIO_ACTIVE_LOW>;
189		};
190
191		button-8 {
192			label = "Left shoulder button";
193			linux,code = <KEY_TAB>;
194			linux,can-disable;
195			gpios = <&gpb 20 GPIO_ACTIVE_LOW>;
196		};
197
198		button-9 {
199			label = "Right shoulder button";
200			linux,code = <KEY_BACKSPACE>;
201			linux,can-disable;
202			gpios = <&gpe 26 GPIO_ACTIVE_LOW>;
203		};
204
205		button-10 {
206			label = "Start button";
207			linux,code = <KEY_ENTER>;
208			linux,can-disable;
209			gpios = <&gpb 21 GPIO_ACTIVE_LOW>;
210		};
211
212		button-11 {
213			label = "Select button";
214			linux,code = <KEY_ESC>;
215			linux,can-disable;
216			/*
217			 * This is the only button that is active high,
218			 * since it doubles as BOOT_SEL1.
219			 */
220			gpios = <&gpd 18 GPIO_ACTIVE_HIGH>;
221		};
222
223		button-12 {
224			label = "Power slider";
225			linux,code = <KEY_POWER>;
226			linux,can-disable;
227			gpios = <&gpa 30 GPIO_ACTIVE_LOW>;
228			wakeup-source;
229		};
230
231		button-13 {
232			label = "Power hold";
233			linux,code = <KEY_PAUSE>;
234			linux,can-disable;
235			gpios = <&gpf 11 GPIO_ACTIVE_LOW>;
236		};
237	};
238
239	i2c3: i2c-controller@3 {
240		compatible = "i2c-gpio";
241		#address-cells = <1>;
242		#size-cells = <0>;
243
244		sda-gpios = <&gpd 5 GPIO_ACTIVE_HIGH>;
245		scl-gpios = <&gpd 4 GPIO_ACTIVE_HIGH>;
246		i2c-gpio,delay-us = <2>; /* 250 kHz */
247
248		act8600: pmic@5a {
249			compatible = "active-semi,act8600";
250			reg = <0x5a>;
251
252			regulators {
253				/* USB OTG */
254				otg_vbus: SUDCDC_REG4 {
255					/*
256					 * 5.3V instead of 5.0V to compensate
257					 * for the voltage drop of a diode
258					 * between the regulator and the
259					 * connector.
260					 */
261					regulator-min-microvolt = <5300000>;
262					regulator-max-microvolt = <5300000>;
263					inl-supply = <&vcc>;
264				};
265
266				/*
267				 * When this is off, there is no sound, but also
268				 * no USB networking.
269				 */
270				ldo5: LDO5 {
271					regulator-min-microvolt = <2500000>;
272					regulator-max-microvolt = <2500000>;
273					inl-supply = <&vcc>;
274				};
275
276				/* LCD panel and FM radio */
277				ldo6: LDO6 {
278					regulator-min-microvolt = <3300000>;
279					regulator-max-microvolt = <3300000>;
280					inl-supply = <&vcc>;
281				};
282
283				/* ??? */
284				LDO7 {
285					regulator-min-microvolt = <3300000>;
286					regulator-max-microvolt = <3300000>;
287					/*regulator-always-on;*/
288					inl-supply = <&vcc>;
289				};
290
291				/*
292				 * The colors on the LCD are wrong when this is
293				 * off. Which is strange, since the LCD panel
294				 * data sheet only mentions a 3.3V input.
295				 */
296				LDO8 {
297					regulator-min-microvolt = <1800000>;
298					regulator-max-microvolt = <1800000>;
299					regulator-always-on;
300					inl-supply = <&vcc>;
301				};
302
303				/* RTC fixed 3.3V */
304				LDO_REG9 {
305					regulator-min-microvolt = <3300000>;
306					regulator-max-microvolt = <3300000>;
307					regulator-always-on;
308					inl-supply = <&vcc>;
309				};
310
311				/* Unused fixed 1.2V */
312				LDO_REG10 {
313					inl-supply = <&vcc>;
314				};
315			};
316		};
317	};
318
319	leds {
320		compatible = "gpio-leds";
321
322		led {
323			gpios = <&gpb 30 GPIO_ACTIVE_LOW>;
324			default-state = "on";
325		};
326	};
327
328	spi {
329		compatible = "spi-gpio";
330		#address-cells = <1>;
331		#size-cells = <0>;
332
333		sck-gpios = <&gpe 15 GPIO_ACTIVE_HIGH>;
334		mosi-gpios = <&gpe 17 GPIO_ACTIVE_HIGH>;
335		cs-gpios = <&gpe 16 GPIO_ACTIVE_HIGH>;
336		num-chipselects = <1>;
337
338		nt39016@0 {
339			compatible = "kingdisplay,kd035g6-54nt";
340			reg = <0>;
341
342			spi-max-frequency = <3125000>;
343			spi-3wire;
344
345			reset-gpios = <&gpe 2 GPIO_ACTIVE_LOW>;
346
347			backlight = <&backlight>;
348			power-supply = <&ldo6>;
349
350			port {
351				panel_input: endpoint {
352					remote-endpoint = <&panel_output>;
353				};
354			};
355		};
356	};
357
358	connector {
359		compatible = "gpio-usb-b-connector", "usb-b-connector";
360		label = "mini-USB";
361		type = "mini";
362
363		/*
364		 * USB OTG is not yet working reliably, the ID detection
365		 * mechanism tends to fry easily for unknown reasons.
366		 * Until this is fixed, disable OTG by not providing the
367		 * ID GPIO to the driver.
368		 */
369		//id-gpios = <&gpf 18 GPIO_ACTIVE_LOW>;
370
371		vbus-gpios = <&gpb 5 GPIO_ACTIVE_HIGH>;
372		vbus-supply = <&otg_vbus>;
373
374		pinctrl-names = "default";
375		pinctrl-0 = <&pins_otg>;
376
377		port {
378			usb_ep: endpoint {
379				remote-endpoint = <&usb_otg_ep>;
380			};
381		};
382	};
383};
384
385&ext {
386	clock-frequency = <12000000>;
387};
388
389&pinctrl {
390	pins_lcd: lcd {
391		function = "lcd";
392		groups = "lcd-24bit";
393	};
394
395	pins_uart2: uart2 {
396		function = "uart2";
397		groups = "uart2-data";
398	};
399
400	pins_mmc0: mmc0 {
401		function = "mmc0";
402		groups = "mmc0-1bit-a", "mmc0-4bit-a";
403	};
404
405	pins_mmc1: mmc1 {
406		function = "mmc1";
407		groups = "mmc1-1bit-d", "mmc1-4bit-d";
408	};
409
410	pins_otg: otg {
411		otg-vbus-pin {
412			function = "otg";
413			groups = "otg-vbus";
414		};
415
416		vbus-pin {
417			pins = "PB5";
418			bias-disable;
419		};
420	};
421
422	pins_pwm1: pwm1 {
423		function = "pwm1";
424		groups = "pwm1";
425	};
426
427	pins_pwm4: pwm4 {
428		function = "pwm4";
429		groups = "pwm4";
430	};
431};
432
433&uart2 {
434	pinctrl-names = "default";
435	pinctrl-0 = <&pins_uart2>;
436
437	status = "okay";
438};
439
440&cgu {
441	/*
442	 * Put high-speed peripherals under PLL1, such that we can change the
443	 * PLL0 frequency on demand without having to suspend peripherals.
444	 * We use a rate of 432 MHz, which is the least common multiple of
445	 * 27 MHz (required by TV encoder) and 48 MHz (required by USB host).
446	 * Put the GPU under PLL0 since we want a higher frequency.
447	 * Use the 32 kHz oscillator as the parent of the RTC for a higher
448	 * precision.
449	 */
450	assigned-clocks =
451		<&cgu JZ4770_CLK_PLL1>,
452		<&cgu JZ4770_CLK_GPU>,
453		<&cgu JZ4770_CLK_RTC>,
454		<&cgu JZ4770_CLK_UHC>,
455		<&cgu JZ4770_CLK_LPCLK_MUX>,
456		<&cgu JZ4770_CLK_MMC0_MUX>,
457		<&cgu JZ4770_CLK_MMC1_MUX>;
458	assigned-clock-parents =
459		<0>,
460		<&cgu JZ4770_CLK_PLL0>,
461		<&cgu JZ4770_CLK_OSC32K>,
462		<&cgu JZ4770_CLK_PLL1>,
463		<&cgu JZ4770_CLK_PLL1>,
464		<&cgu JZ4770_CLK_PLL1>,
465		<&cgu JZ4770_CLK_PLL1>;
466	assigned-clock-rates =
467		<432000000>,
468		<600000000>;
469};
470
471&uhc {
472	/* The WiFi module is connected to the UHC. */
473	status = "okay";
474};
475
476&tcu {
477	/*
478	 * 750 kHz for the system timer and clocksource, 12 MHz for the OST,
479	 * and use RTC as the parent for the watchdog clock
480	 */
481	assigned-clocks = <&tcu TCU_CLK_TIMER0>, <&tcu TCU_CLK_TIMER2>,
482			  <&tcu TCU_CLK_OST>, <&tcu TCU_CLK_WDT>;
483	assigned-clock-parents = <0>, <0>, <0>, <&cgu JZ4770_CLK_RTC>;
484	assigned-clock-rates = <750000>, <750000>, <12000000>;
485
486	/* PWM1 is in use, so use channel #2 for the clocksource */
487	ingenic,pwm-channels-mask = <0xfa>;
488};
489
490&usb_otg {
491	port {
492		usb_otg_ep: endpoint {
493			remote-endpoint = <&usb_ep>;
494		};
495	};
496};
497
498&otg_phy {
499	vcc-supply = <&ldo5>;
500};
501
502&rtc {
503	clocks = <&cgu JZ4770_CLK_RTC>;
504	clock-names = "rtc";
505
506	system-power-controller;
507};
508
509&mmc0 {
510	status = "okay";
511
512	bus-width = <4>;
513	max-frequency = <48000000>;
514	vmmc-supply = <&vcc>;
515	non-removable;
516
517	pinctrl-names = "default";
518	pinctrl-0 = <&pins_mmc0>;
519};
520
521&mmc1 {
522	status = "okay";
523
524	bus-width = <4>;
525	max-frequency = <48000000>;
526	cd-gpios = <&gpb 2 GPIO_ACTIVE_LOW>;
527	vmmc-supply = <&mmc1_power>;
528
529	pinctrl-names = "default";
530	pinctrl-0 = <&pins_mmc1>;
531};
532
533&lcd {
534	pinctrl-names = "default";
535	pinctrl-0 = <&pins_lcd>;
536
537	port {
538		panel_output: endpoint {
539			remote-endpoint = <&panel_input>;
540		};
541	};
542};
543