// SPDX-License-Identifier: GPL-2.0 /dts-v1/; #include "jz4780.dtsi" #include #include #include #include #include / { compatible = "img,ci20", "ingenic,jz4780"; aliases { serial0 = &uart0; serial1 = &uart1; serial3 = &uart3; serial4 = &uart4; }; chosen { stdout-path = &uart4; }; memory { device_type = "memory"; reg = <0x0 0x10000000 0x30000000 0x30000000>; }; gpio-keys { compatible = "gpio-keys"; switch { label = "ci20:sw1"; linux,code = ; gpios = <&gpd 17 GPIO_ACTIVE_HIGH>; wakeup-source; }; }; leds { compatible = "gpio-leds"; led-0 { label = "ci20:red:led0"; gpios = <&gpc 3 GPIO_ACTIVE_HIGH>; linux,default-trigger = "none"; }; led-1 { label = "ci20:red:led1"; gpios = <&gpc 2 GPIO_ACTIVE_HIGH>; linux,default-trigger = "nand-disk"; }; led-2 { label = "ci20:red:led2"; gpios = <&gpc 1 GPIO_ACTIVE_HIGH>; linux,default-trigger = "cpu1"; }; led-3 { label = "ci20:red:led3"; gpios = <&gpc 0 GPIO_ACTIVE_HIGH>; linux,default-trigger = "cpu0"; }; }; eth0_power: fixedregulator-0 { compatible = "regulator-fixed"; regulator-name = "eth0_power"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; gpio = <&gpb 25 0>; enable-active-high; }; hdmi_out: connector { compatible = "hdmi-connector"; label = "HDMI OUT"; type = "a"; ddc-en-gpios = <&gpa 25 GPIO_ACTIVE_HIGH>; port { hdmi_con: endpoint { remote-endpoint = <&dw_hdmi_out>; }; }; }; ir: ir { compatible = "gpio-ir-receiver"; gpios = <&gpe 3 GPIO_ACTIVE_LOW>; }; bt_power: fixedregulator-1 { compatible = "regulator-fixed"; regulator-name = "bt_power"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-settling-time-us = <1400>; vin-supply = <&vcc_50>; gpio = <&gpb 19 0>; enable-active-high; }; otg_power: fixedregulator-2 { compatible = "regulator-fixed"; regulator-name = "otg_power"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; gpio = <&gpf 15 0>; enable-active-high; }; wifi_power: fixedregulator-4 { compatible = "regulator-fixed"; regulator-name = "wifi_power"; /* * Technically it's 5V, the WiFi chip has its own internal * regulators; but the MMC/SD subsystem won't accept such a * value. */ regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-settling-time-us = <150000>; vin-supply = <&bt_power>; }; vcc_33v: fixedregulator-5 { compatible = "regulator-fixed"; regulator-name = "vcc_33v"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; wifi_pwrseq: pwrseq { compatible = "mmc-pwrseq-simple"; reset-gpios = <&gpf 7 GPIO_ACTIVE_LOW>; clocks = <&rtc_dev>; clock-names = "ext_clock"; }; }; &ext { clock-frequency = <48000000>; }; &cgu { /* * Use the 32.768 kHz oscillator as the parent of the RTC for a higher * precision. */ assigned-clocks = <&cgu JZ4780_CLK_OTGPHY>, <&cgu JZ4780_CLK_RTC>, <&cgu JZ4780_CLK_SSIPLL>, <&cgu JZ4780_CLK_SSI>, <&cgu JZ4780_CLK_HDMI>, <&cgu JZ4780_CLK_MSCMUX>; assigned-clock-parents = <0>, <&cgu JZ4780_CLK_RTCLK>, <&cgu JZ4780_CLK_MPLL>, <&cgu JZ4780_CLK_SSIPLL>, <0>, <&cgu JZ4780_CLK_MPLL>; assigned-clock-rates = <48000000>, <0>, <54000000>, <0>, <27000000>; }; &tcu { /* * 750 kHz for the system timers and clocksource, * use channel #0 and #1 for the per cpu system timers, * and use channel #2 for the clocksource. * * 3000 kHz for the OST timer to provide a higher * precision clocksource. */ assigned-clocks = <&tcu TCU_CLK_TIMER0>, <&tcu TCU_CLK_TIMER1>, <&tcu TCU_CLK_TIMER2>, <&tcu TCU_CLK_OST>; assigned-clock-rates = <750000>, <750000>, <750000>, <3000000>; }; &mmc0 { status = "okay"; bus-width = <4>; max-frequency = <50000000>; pinctrl-names = "default"; pinctrl-0 = <&pins_mmc0>; cd-gpios = <&gpf 20 GPIO_ACTIVE_LOW>; vmmc-supply = <&vcc_33v>; vqmmc-supply = <&vcc_33v>; }; &mmc1 { status = "okay"; bus-width = <4>; max-frequency = <25000000>; mmc-pwrseq = <&wifi_pwrseq>; vmmc-supply = <&wifi_power>; vqmmc-supply = <&wifi_io>; non-removable; pinctrl-names = "default"; pinctrl-0 = <&pins_mmc1>; #address-cells = <1>; #size-cells = <0>; wifi@1 { compatible = "brcm,bcm4329-fmac"; reg = <1>; interrupt-parent = <&gpd>; interrupts = <9 IRQ_TYPE_EDGE_FALLING>; interrupt-names = "host-wake"; }; }; &uart0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_uart0>; }; &uart1 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_uart1>; }; &uart2 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_uart2>; uart-has-rtscts; bluetooth { compatible = "brcm,bcm4330-bt"; vbat-supply = <&bt_power>; vddio-supply = <&wifi_io>; interrupt-parent = <&gpf>; interrupts = <6 IRQ_TYPE_EDGE_RISING>; interrupt-names = "host-wakeup"; clocks = <&rtc_dev>; clock-names = "lpo"; reset-gpios = <&gpf 8 GPIO_ACTIVE_LOW>; device-wakeup-gpios = <&gpf 5 GPIO_ACTIVE_HIGH>; shutdown-gpios = <&gpf 4 GPIO_ACTIVE_HIGH>; }; }; &uart3 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_uart3>; }; &uart4 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_uart4>; }; &i2c0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_i2c0>; clock-frequency = <400000>; act8600: act8600@5a { compatible = "active-semi,act8600"; reg = <0x5a>; regulators { vddcore: DCDC1 { regulator-min-microvolt = <1125000>; regulator-max-microvolt = <1125000>; vp1-supply = <&vcc_33v>; regulator-always-on; }; vddmem: DCDC2 { regulator-min-microvolt = <1500000>; regulator-max-microvolt = <1500000>; vp2-supply = <&vcc_33v>; regulator-always-on; }; vcc_33: DCDC3 { regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; vp3-supply = <&vcc_33v>; regulator-always-on; }; vcc_50: SUDCDC_REG4 { regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; regulator-always-on; }; vcc_25: LDO5 { regulator-min-microvolt = <2500000>; regulator-max-microvolt = <2500000>; inl-supply = <&vcc_33v>; regulator-always-on; }; wifi_io: LDO6 { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-settling-time-us = <150000>; inl-supply = <&vcc_33v>; }; cim_io_28: LDO7 { regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; inl-supply = <&vcc_33v>; }; cim_io_15: LDO8 { regulator-min-microvolt = <1500000>; regulator-max-microvolt = <1500000>; inl-supply = <&vcc_33v>; }; vrtc_18: LDO_REG9 { /* Despite the datasheet stating 3.3V * for REG9 and the driver expecting that, * REG9 outputs 1.8V. * Likely the CI20 uses a proprietary * factory programmed chip variant. * Since this is a simple on/off LDO the * exact values do not matter. */ regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vcc_11: LDO_REG10 { regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; regulator-always-on; }; }; }; }; &i2c1 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_i2c1>; }; &i2c2 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_i2c2>; }; &i2c3 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_i2c3>; }; &i2c4 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_i2c4>; clock-frequency = <400000>; rtc@51 { compatible = "nxp,pcf8563"; reg = <0x51>; interrupt-parent = <&gpf>; interrupts = <30 IRQ_TYPE_LEVEL_LOW>; }; }; &nemc { status = "okay"; nandc: nand-controller@1 { compatible = "ingenic,jz4780-nand"; reg = <1 0 0x1000000>; #address-cells = <1>; #size-cells = <0>; ecc-engine = <&bch>; ingenic,nemc-tAS = <10>; ingenic,nemc-tAH = <5>; ingenic,nemc-tBP = <10>; ingenic,nemc-tAW = <15>; ingenic,nemc-tSTRV = <100>; /* * Only CLE/ALE are needed for the devices that are connected, rather * than the full address line set. */ pinctrl-names = "default"; pinctrl-0 = <&pins_nemc>; nand@1 { reg = <1>; nand-ecc-step-size = <1024>; nand-ecc-strength = <24>; nand-ecc-mode = "hw"; nand-on-flash-bbt; pinctrl-names = "default"; pinctrl-0 = <&pins_nemc_cs1>; partitions { compatible = "fixed-partitions"; #address-cells = <2>; #size-cells = <2>; partition@0 { label = "u-boot-spl"; reg = <0x0 0x0 0x0 0x800000>; }; partition@800000 { label = "u-boot"; reg = <0x0 0x800000 0x0 0x200000>; }; partition@a00000 { label = "u-boot-env"; reg = <0x0 0xa00000 0x0 0x200000>; }; partition@c00000 { label = "boot"; reg = <0x0 0xc00000 0x0 0x4000000>; }; partition@4c00000 { label = "system"; reg = <0x0 0x4c00000 0x1 0xfb400000>; }; }; }; }; dm9000@6 { compatible = "davicom,dm9000"; davicom,no-eeprom; pinctrl-names = "default"; pinctrl-0 = <&pins_nemc_cs6>; reg = <6 0 1>, /* addr */ <6 2 1>; /* data */ ingenic,nemc-tAS = <15>; ingenic,nemc-tAH = <10>; ingenic,nemc-tBP = <20>; ingenic,nemc-tAW = <50>; ingenic,nemc-tSTRV = <100>; reset-gpios = <&gpf 12 GPIO_ACTIVE_LOW>; vcc-supply = <ð0_power>; interrupt-parent = <&gpe>; interrupts = <19 IRQ_TYPE_EDGE_RISING>; nvmem-cells = <ð0_addr>; nvmem-cell-names = "mac-address"; }; }; &bch { status = "okay"; }; &otg_phy { status = "okay"; vcc-supply = <&otg_power>; }; &otg { status = "okay"; }; &pinctrl { pins_uart0: uart0 { function = "uart0"; groups = "uart0-data"; bias-disable; }; pins_uart1: uart1 { function = "uart1"; groups = "uart1-data"; bias-disable; }; pins_uart2: uart2 { function = "uart2"; groups = "uart2-data", "uart2-hwflow"; bias-disable; }; pins_uart3: uart3 { function = "uart3"; groups = "uart3-data", "uart3-hwflow"; bias-disable; }; pins_uart4: uart4 { function = "uart4"; groups = "uart4-data"; bias-disable; }; pins_i2c0: i2c0 { function = "i2c0"; groups = "i2c0-data"; bias-disable; }; pins_i2c1: i2c1 { function = "i2c1"; groups = "i2c1-data"; bias-disable; }; pins_i2c2: i2c2 { function = "i2c2"; groups = "i2c2-data"; bias-disable; }; pins_i2c3: i2c3 { function = "i2c3"; groups = "i2c3-data"; bias-disable; }; pins_i2c4: i2c4 { function = "i2c4"; groups = "i2c4-data-e"; bias-disable; }; pins_hdmi_ddc: hdmi_ddc { function = "hdmi-ddc"; groups = "hdmi-ddc"; bias-disable; }; pins_nemc: nemc { function = "nemc"; groups = "nemc-data", "nemc-cle-ale", "nemc-rd-we", "nemc-frd-fwe"; bias-disable; }; pins_nemc_cs1: nemc-cs1 { function = "nemc-cs1"; groups = "nemc-cs1"; bias-disable; }; pins_nemc_cs6: nemc-cs6 { function = "nemc-cs6"; groups = "nemc-cs6"; bias-disable; }; pins_mmc0: mmc0 { function = "mmc0"; groups = "mmc0-1bit-e", "mmc0-4bit-e"; bias-disable; }; pins_mmc1: mmc1 { function = "mmc1"; groups = "mmc1-1bit-d", "mmc1-4bit-d"; bias-disable; }; }; &hdmi { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pins_hdmi_ddc>; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; dw_hdmi_in: endpoint { remote-endpoint = <&lcd_out>; }; }; port@1 { reg = <1>; dw_hdmi_out: endpoint { remote-endpoint = <&hdmi_con>; }; }; }; }; &lcdc0 { status = "okay"; port { lcd_out: endpoint { remote-endpoint = <&dw_hdmi_in>; }; }; };