| // 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>; |
| }; |
| }; |
| }; |