forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
542 lines
11 KiB
542 lines
11 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
/dts-v1/; |
|
|
|
#include "jz4770.dtsi" |
|
#include <dt-bindings/clock/ingenic,tcu.h> |
|
|
|
#include <dt-bindings/gpio/gpio.h> |
|
#include <dt-bindings/iio/adc/ingenic,adc.h> |
|
#include <dt-bindings/input/input.h> |
|
|
|
/ { |
|
compatible = "gcw,zero", "ingenic,jz4770"; |
|
model = "GCW Zero"; |
|
|
|
aliases { |
|
serial0 = &uart0; |
|
serial1 = &uart1; |
|
serial2 = &uart2; |
|
serial3 = &uart3; |
|
}; |
|
|
|
memory: memory { |
|
device_type = "memory"; |
|
reg = <0x0 0x10000000>, |
|
<0x30000000 0x10000000>; |
|
}; |
|
|
|
chosen { |
|
stdout-path = "serial2:57600n8"; |
|
}; |
|
|
|
vcc: regulator@0 { |
|
compatible = "regulator-fixed"; |
|
regulator-name = "vcc"; |
|
|
|
regulator-min-microvolt = <3300000>; |
|
regulator-max-microvolt = <3300000>; |
|
regulator-always-on; |
|
}; |
|
|
|
mmc1_power: regulator@1 { |
|
compatible = "regulator-fixed"; |
|
regulator-name = "mmc1_vcc"; |
|
gpio = <&gpe 9 0>; |
|
|
|
regulator-min-microvolt = <3300000>; |
|
regulator-max-microvolt = <3300000>; |
|
vin-supply = <&vcc>; |
|
}; |
|
|
|
headphones_amp: analog-amplifier@0 { |
|
compatible = "simple-audio-amplifier"; |
|
enable-gpios = <&gpf 3 GPIO_ACTIVE_LOW>; |
|
enable-delay-ms = <50>; |
|
|
|
VCC-supply = <&ldo5>; |
|
sound-name-prefix = "Headphones Amp"; |
|
}; |
|
|
|
speaker_amp: analog-amplifier@1 { |
|
compatible = "simple-audio-amplifier"; |
|
enable-gpios = <&gpf 20 GPIO_ACTIVE_HIGH>; |
|
|
|
VCC-supply = <&ldo5>; |
|
sound-name-prefix = "Speaker Amp"; |
|
}; |
|
|
|
sound { |
|
compatible = "simple-audio-card"; |
|
|
|
simple-audio-card,name = "gcw0-audio"; |
|
simple-audio-card,format = "i2s"; |
|
|
|
simple-audio-card,widgets = |
|
"Speaker", "Speaker", |
|
"Headphone", "Headphones", |
|
"Microphone", "Built-in Mic"; |
|
simple-audio-card,routing = |
|
"Headphones Amp INL", "LHPOUT", |
|
"Headphones Amp INR", "RHPOUT", |
|
"Headphones", "Headphones Amp OUTL", |
|
"Headphones", "Headphones Amp OUTR", |
|
"Speaker Amp INL", "LOUT", |
|
"Speaker Amp INR", "ROUT", |
|
"Speaker", "Speaker Amp OUTL", |
|
"Speaker", "Speaker Amp OUTR", |
|
"LLINEIN", "Cap-less", |
|
"RLINEIN", "Cap-less", |
|
"Built-in Mic", "MICBIAS", |
|
"MIC1P", "Built-in Mic", |
|
"MIC1N", "Built-in Mic"; |
|
simple-audio-card,pin-switches = "Speaker", "Headphones"; |
|
|
|
simple-audio-card,hp-det-gpio = <&gpf 21 GPIO_ACTIVE_LOW>; |
|
simple-audio-card,aux-devs = <&speaker_amp>, <&headphones_amp>; |
|
|
|
simple-audio-card,bitclock-master = <&dai_codec>; |
|
simple-audio-card,frame-master = <&dai_codec>; |
|
|
|
dai_cpu: simple-audio-card,cpu { |
|
sound-dai = <&aic>; |
|
}; |
|
|
|
dai_codec: simple-audio-card,codec { |
|
sound-dai = <&codec>; |
|
}; |
|
}; |
|
|
|
rumble { |
|
compatible = "pwm-vibrator"; |
|
pwms = <&pwm 4 2000000 0>; |
|
pwm-names = "enable"; |
|
|
|
pinctrl-names = "default"; |
|
pinctrl-0 = <&pins_pwm4>; |
|
}; |
|
|
|
backlight: backlight { |
|
compatible = "pwm-backlight"; |
|
pwms = <&pwm 1 40000 0>; |
|
power-supply = <&vcc>; |
|
|
|
brightness-levels = <0 16 32 48 64 80 96 112 128 |
|
144 160 176 192 208 224 240 255>; |
|
default-brightness-level = <12>; |
|
|
|
pinctrl-names = "default"; |
|
pinctrl-0 = <&pins_pwm1>; |
|
}; |
|
|
|
gpio-keys { |
|
compatible = "gpio-keys"; |
|
autorepeat; |
|
|
|
button-0 { |
|
label = "D-pad up"; |
|
linux,code = <KEY_UP>; |
|
linux,can-disable; |
|
gpios = <&gpe 21 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-1 { |
|
label = "D-pad down"; |
|
linux,code = <KEY_DOWN>; |
|
linux,can-disable; |
|
gpios = <&gpe 25 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-2 { |
|
label = "D-pad left"; |
|
linux,code = <KEY_LEFT>; |
|
linux,can-disable; |
|
gpios = <&gpe 23 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-3 { |
|
label = "D-pad right"; |
|
linux,code = <KEY_RIGHT>; |
|
linux,can-disable; |
|
gpios = <&gpe 24 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-4 { |
|
label = "Button A"; |
|
linux,code = <KEY_LEFTCTRL>; |
|
linux,can-disable; |
|
gpios = <&gpe 29 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-5 { |
|
label = "Button B"; |
|
linux,code = <KEY_LEFTALT>; |
|
linux,can-disable; |
|
gpios = <&gpe 20 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-6 { |
|
label = "Button Y"; |
|
linux,code = <KEY_SPACE>; |
|
linux,can-disable; |
|
gpios = <&gpe 27 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-7 { |
|
label = "Button X"; |
|
linux,code = <KEY_LEFTSHIFT>; |
|
linux,can-disable; |
|
gpios = <&gpe 28 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-8 { |
|
label = "Left shoulder button"; |
|
linux,code = <KEY_TAB>; |
|
linux,can-disable; |
|
gpios = <&gpb 20 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-9 { |
|
label = "Right shoulder button"; |
|
linux,code = <KEY_BACKSPACE>; |
|
linux,can-disable; |
|
gpios = <&gpe 26 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-10 { |
|
label = "Start button"; |
|
linux,code = <KEY_ENTER>; |
|
linux,can-disable; |
|
gpios = <&gpb 21 GPIO_ACTIVE_LOW>; |
|
}; |
|
|
|
button-11 { |
|
label = "Select button"; |
|
linux,code = <KEY_ESC>; |
|
linux,can-disable; |
|
/* |
|
* This is the only button that is active high, |
|
* since it doubles as BOOT_SEL1. |
|
*/ |
|
gpios = <&gpd 18 GPIO_ACTIVE_HIGH>; |
|
}; |
|
|
|
button-12 { |
|
label = "Power slider"; |
|
linux,code = <KEY_POWER>; |
|
linux,can-disable; |
|
gpios = <&gpa 30 GPIO_ACTIVE_LOW>; |
|
wakeup-source; |
|
}; |
|
|
|
button-13 { |
|
label = "Power hold"; |
|
linux,code = <KEY_PAUSE>; |
|
linux,can-disable; |
|
gpios = <&gpf 11 GPIO_ACTIVE_LOW>; |
|
}; |
|
}; |
|
|
|
i2c3: i2c-controller@3 { |
|
compatible = "i2c-gpio"; |
|
#address-cells = <1>; |
|
#size-cells = <0>; |
|
|
|
sda-gpios = <&gpd 5 GPIO_ACTIVE_HIGH>; |
|
scl-gpios = <&gpd 4 GPIO_ACTIVE_HIGH>; |
|
i2c-gpio,delay-us = <2>; /* 250 kHz */ |
|
|
|
act8600: pmic@5a { |
|
compatible = "active-semi,act8600"; |
|
reg = <0x5a>; |
|
|
|
regulators { |
|
/* USB OTG */ |
|
otg_vbus: SUDCDC_REG4 { |
|
/* |
|
* 5.3V instead of 5.0V to compensate |
|
* for the voltage drop of a diode |
|
* between the regulator and the |
|
* connector. |
|
*/ |
|
regulator-min-microvolt = <5300000>; |
|
regulator-max-microvolt = <5300000>; |
|
inl-supply = <&vcc>; |
|
}; |
|
|
|
/* |
|
* When this is off, there is no sound, but also |
|
* no USB networking. |
|
*/ |
|
ldo5: LDO5 { |
|
regulator-min-microvolt = <2500000>; |
|
regulator-max-microvolt = <2500000>; |
|
inl-supply = <&vcc>; |
|
}; |
|
|
|
/* LCD panel and FM radio */ |
|
ldo6: LDO6 { |
|
regulator-min-microvolt = <3300000>; |
|
regulator-max-microvolt = <3300000>; |
|
inl-supply = <&vcc>; |
|
}; |
|
|
|
/* ??? */ |
|
LDO7 { |
|
regulator-min-microvolt = <3300000>; |
|
regulator-max-microvolt = <3300000>; |
|
/*regulator-always-on;*/ |
|
inl-supply = <&vcc>; |
|
}; |
|
|
|
/* |
|
* The colors on the LCD are wrong when this is |
|
* off. Which is strange, since the LCD panel |
|
* data sheet only mentions a 3.3V input. |
|
*/ |
|
LDO8 { |
|
regulator-min-microvolt = <1800000>; |
|
regulator-max-microvolt = <1800000>; |
|
regulator-always-on; |
|
inl-supply = <&vcc>; |
|
}; |
|
|
|
/* RTC fixed 3.3V */ |
|
LDO_REG9 { |
|
regulator-min-microvolt = <3300000>; |
|
regulator-max-microvolt = <3300000>; |
|
regulator-always-on; |
|
inl-supply = <&vcc>; |
|
}; |
|
|
|
/* Unused fixed 1.2V */ |
|
LDO_REG10 { |
|
inl-supply = <&vcc>; |
|
}; |
|
}; |
|
}; |
|
}; |
|
|
|
leds { |
|
compatible = "gpio-leds"; |
|
|
|
led { |
|
gpios = <&gpb 30 GPIO_ACTIVE_LOW>; |
|
default-state = "on"; |
|
}; |
|
}; |
|
|
|
spi { |
|
compatible = "spi-gpio"; |
|
#address-cells = <1>; |
|
#size-cells = <0>; |
|
|
|
sck-gpios = <&gpe 15 GPIO_ACTIVE_HIGH>; |
|
mosi-gpios = <&gpe 17 GPIO_ACTIVE_HIGH>; |
|
cs-gpios = <&gpe 16 GPIO_ACTIVE_HIGH>; |
|
num-chipselects = <1>; |
|
|
|
nt39016@0 { |
|
compatible = "kingdisplay,kd035g6-54nt"; |
|
reg = <0>; |
|
|
|
spi-max-frequency = <3125000>; |
|
spi-3wire; |
|
|
|
reset-gpios = <&gpe 2 GPIO_ACTIVE_LOW>; |
|
|
|
backlight = <&backlight>; |
|
power-supply = <&ldo6>; |
|
|
|
port { |
|
panel_input: endpoint { |
|
remote-endpoint = <&panel_output>; |
|
}; |
|
}; |
|
}; |
|
}; |
|
|
|
connector { |
|
compatible = "gpio-usb-b-connector", "usb-b-connector"; |
|
label = "mini-USB"; |
|
type = "mini"; |
|
|
|
/* |
|
* USB OTG is not yet working reliably, the ID detection |
|
* mechanism tends to fry easily for unknown reasons. |
|
* Until this is fixed, disable OTG by not providing the |
|
* ID GPIO to the driver. |
|
*/ |
|
//id-gpios = <&gpf 18 GPIO_ACTIVE_LOW>; |
|
|
|
vbus-gpios = <&gpb 5 GPIO_ACTIVE_HIGH>; |
|
vbus-supply = <&otg_vbus>; |
|
|
|
pinctrl-names = "default"; |
|
pinctrl-0 = <&pins_otg>; |
|
|
|
port { |
|
usb_ep: endpoint { |
|
remote-endpoint = <&usb_otg_ep>; |
|
}; |
|
}; |
|
}; |
|
}; |
|
|
|
&ext { |
|
clock-frequency = <12000000>; |
|
}; |
|
|
|
&pinctrl { |
|
pins_lcd: lcd { |
|
function = "lcd"; |
|
groups = "lcd-24bit"; |
|
}; |
|
|
|
pins_uart2: uart2 { |
|
function = "uart2"; |
|
groups = "uart2-data"; |
|
}; |
|
|
|
pins_mmc0: mmc0 { |
|
function = "mmc0"; |
|
groups = "mmc0-1bit-a", "mmc0-4bit-a"; |
|
}; |
|
|
|
pins_mmc1: mmc1 { |
|
function = "mmc1"; |
|
groups = "mmc1-1bit-d", "mmc1-4bit-d"; |
|
}; |
|
|
|
pins_otg: otg { |
|
otg-vbus-pin { |
|
function = "otg"; |
|
groups = "otg-vbus"; |
|
}; |
|
|
|
vbus-pin { |
|
pins = "PB5"; |
|
bias-disable; |
|
}; |
|
}; |
|
|
|
pins_pwm1: pwm1 { |
|
function = "pwm1"; |
|
groups = "pwm1"; |
|
}; |
|
|
|
pins_pwm4: pwm4 { |
|
function = "pwm4"; |
|
groups = "pwm4"; |
|
}; |
|
}; |
|
|
|
&uart2 { |
|
pinctrl-names = "default"; |
|
pinctrl-0 = <&pins_uart2>; |
|
|
|
status = "okay"; |
|
}; |
|
|
|
&cgu { |
|
/* |
|
* Put high-speed peripherals under PLL1, such that we can change the |
|
* PLL0 frequency on demand without having to suspend peripherals. |
|
* We use a rate of 432 MHz, which is the least common multiple of |
|
* 27 MHz (required by TV encoder) and 48 MHz (required by USB host). |
|
* Put the GPU under PLL0 since we want a higher frequency. |
|
* Use the 32 kHz oscillator as the parent of the RTC for a higher |
|
* precision. |
|
*/ |
|
assigned-clocks = |
|
<&cgu JZ4770_CLK_PLL1>, |
|
<&cgu JZ4770_CLK_GPU>, |
|
<&cgu JZ4770_CLK_RTC>, |
|
<&cgu JZ4770_CLK_UHC>, |
|
<&cgu JZ4770_CLK_LPCLK_MUX>, |
|
<&cgu JZ4770_CLK_MMC0_MUX>, |
|
<&cgu JZ4770_CLK_MMC1_MUX>; |
|
assigned-clock-parents = |
|
<0>, |
|
<&cgu JZ4770_CLK_PLL0>, |
|
<&cgu JZ4770_CLK_OSC32K>, |
|
<&cgu JZ4770_CLK_PLL1>, |
|
<&cgu JZ4770_CLK_PLL1>, |
|
<&cgu JZ4770_CLK_PLL1>, |
|
<&cgu JZ4770_CLK_PLL1>; |
|
assigned-clock-rates = |
|
<432000000>, |
|
<600000000>; |
|
}; |
|
|
|
&uhc { |
|
/* The WiFi module is connected to the UHC. */ |
|
status = "okay"; |
|
}; |
|
|
|
&tcu { |
|
/* |
|
* 750 kHz for the system timer and clocksource, 12 MHz for the OST, |
|
* and use RTC as the parent for the watchdog clock |
|
*/ |
|
assigned-clocks = <&tcu TCU_CLK_TIMER0>, <&tcu TCU_CLK_TIMER2>, |
|
<&tcu TCU_CLK_OST>, <&tcu TCU_CLK_WDT>; |
|
assigned-clock-parents = <0>, <0>, <0>, <&cgu JZ4770_CLK_RTC>; |
|
assigned-clock-rates = <750000>, <750000>, <12000000>; |
|
|
|
/* PWM1 is in use, so use channel #2 for the clocksource */ |
|
ingenic,pwm-channels-mask = <0xfa>; |
|
}; |
|
|
|
&usb_otg { |
|
port { |
|
usb_otg_ep: endpoint { |
|
remote-endpoint = <&usb_ep>; |
|
}; |
|
}; |
|
}; |
|
|
|
&otg_phy { |
|
vcc-supply = <&ldo5>; |
|
}; |
|
|
|
&rtc { |
|
clocks = <&cgu JZ4770_CLK_RTC>; |
|
clock-names = "rtc"; |
|
|
|
system-power-controller; |
|
}; |
|
|
|
&mmc0 { |
|
status = "okay"; |
|
|
|
bus-width = <4>; |
|
max-frequency = <48000000>; |
|
vmmc-supply = <&vcc>; |
|
non-removable; |
|
|
|
pinctrl-names = "default"; |
|
pinctrl-0 = <&pins_mmc0>; |
|
}; |
|
|
|
&mmc1 { |
|
status = "okay"; |
|
|
|
bus-width = <4>; |
|
max-frequency = <48000000>; |
|
cd-gpios = <&gpb 2 GPIO_ACTIVE_LOW>; |
|
vmmc-supply = <&mmc1_power>; |
|
|
|
pinctrl-names = "default"; |
|
pinctrl-0 = <&pins_mmc1>; |
|
}; |
|
|
|
&lcd { |
|
pinctrl-names = "default"; |
|
pinctrl-0 = <&pins_lcd>; |
|
|
|
port { |
|
panel_output: endpoint { |
|
remote-endpoint = <&panel_input>; |
|
}; |
|
}; |
|
};
|
|
|