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