/* * Spreadtrum SC9860 SoC * * Copyright (C) 2016, Spreadtrum Communications Inc. * * SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ #include #include #include #include "whale2.dtsi" / { cpus { #address-cells = <2>; #size-cells = <0>; cpu-map { cluster0 { core0 { cpu = <&CPU0>; }; core1 { cpu = <&CPU1>; }; core2 { cpu = <&CPU2>; }; core3 { cpu = <&CPU3>; }; }; cluster1 { core0 { cpu = <&CPU4>; }; core1 { cpu = <&CPU5>; }; core2 { cpu = <&CPU6>; }; core3 { cpu = <&CPU7>; }; }; }; CPU0: cpu@530000 { device_type = "cpu"; compatible = "arm,cortex-a53"; reg = <0x0 0x530000>; enable-method = "psci"; cpu-idle-states = <&CORE_PD &CLUSTER_PD>; }; CPU1: cpu@530001 { device_type = "cpu"; compatible = "arm,cortex-a53"; reg = <0x0 0x530001>; enable-method = "psci"; cpu-idle-states = <&CORE_PD &CLUSTER_PD>; }; CPU2: cpu@530002 { device_type = "cpu"; compatible = "arm,cortex-a53"; reg = <0x0 0x530002>; enable-method = "psci"; cpu-idle-states = <&CORE_PD &CLUSTER_PD>; }; CPU3: cpu@530003 { device_type = "cpu"; compatible = "arm,cortex-a53"; reg = <0x0 0x530003>; enable-method = "psci"; cpu-idle-states = <&CORE_PD &CLUSTER_PD>; }; CPU4: cpu@530100 { device_type = "cpu"; compatible = "arm,cortex-a53"; reg = <0x0 0x530100>; enable-method = "psci"; cpu-idle-states = <&CORE_PD &CLUSTER_PD>; }; CPU5: cpu@530101 { device_type = "cpu"; compatible = "arm,cortex-a53"; reg = <0x0 0x530101>; enable-method = "psci"; cpu-idle-states = <&CORE_PD &CLUSTER_PD>; }; CPU6: cpu@530102 { device_type = "cpu"; compatible = "arm,cortex-a53"; reg = <0x0 0x530102>; enable-method = "psci"; cpu-idle-states = <&CORE_PD &CLUSTER_PD>; }; CPU7: cpu@530103 { device_type = "cpu"; compatible = "arm,cortex-a53"; reg = <0x0 0x530103>; enable-method = "psci"; cpu-idle-states = <&CORE_PD &CLUSTER_PD>; }; }; idle-states{ entry-method = "psci"; CORE_PD: core_pd { compatible = "arm,idle-state"; entry-latency-us = <1000>; exit-latency-us = <700>; min-residency-us = <2500>; local-timer-stop; arm,psci-suspend-param = <0x00010002>; }; CLUSTER_PD: cluster_pd { compatible = "arm,idle-state"; entry-latency-us = <1000>; exit-latency-us = <1000>; min-residency-us = <3000>; local-timer-stop; arm,psci-suspend-param = <0x01010003>; }; }; gic: interrupt-controller@12001000 { compatible = "arm,gic-400"; reg = <0 0x12001000 0 0x1000>, <0 0x12002000 0 0x2000>, <0 0x12004000 0 0x2000>, <0 0x12006000 0 0x2000>; #interrupt-cells = <3>; interrupt-controller; interrupts = ; }; psci { compatible = "arm,psci-0.2"; method = "smc"; }; timer { compatible = "arm,armv8-timer"; interrupts = , , , ; }; pmu { compatible = "arm,cortex-a53-pmu", "arm,armv8-pmuv3"; interrupts = , , , , , , , ; interrupt-affinity = <&CPU0>, <&CPU1>, <&CPU2>, <&CPU3>, <&CPU4>, <&CPU5>, <&CPU6>, <&CPU7>; }; soc { pmu_gate: pmu-gate { compatible = "sprd,sc9860-pmu-gate"; sprd,syscon = <&pmu_regs>; /* 0x402b0000 */ clocks = <&ext_26m>; #clock-cells = <1>; }; pll: pll { compatible = "sprd,sc9860-pll"; sprd,syscon = <&ana_regs>; /* 0x40400000 */ clocks = <&pmu_gate 0>; #clock-cells = <1>; }; ap_clk: clock-controller@20000000 { compatible = "sprd,sc9860-ap-clk"; reg = <0 0x20000000 0 0x400>; clocks = <&ext_26m>, <&pll 0>, <&pmu_gate 0>; #clock-cells = <1>; }; aon_prediv: aon-prediv { compatible = "sprd,sc9860-aon-prediv"; reg = <0 0x402d0000 0 0x400>; clocks = <&ext_26m>, <&pll 0>, <&pmu_gate 0>; #clock-cells = <1>; }; apahb_gate: apahb-gate { compatible = "sprd,sc9860-apahb-gate"; sprd,syscon = <&ap_ahb_regs>; /* 0x20210000 */ clocks = <&aon_prediv 0>; #clock-cells = <1>; }; aon_gate: aon-gate { compatible = "sprd,sc9860-aon-gate"; sprd,syscon = <&aon_regs>; /* 0x402e0000 */ clocks = <&aon_prediv 0>; #clock-cells = <1>; }; aonsecure_clk: clock-controller@40880000 { compatible = "sprd,sc9860-aonsecure-clk"; reg = <0 0x40880000 0 0x400>; clocks = <&ext_26m>, <&pll 0>; #clock-cells = <1>; }; agcp_gate: agcp-gate { compatible = "sprd,sc9860-agcp-gate"; sprd,syscon = <&agcp_regs>; /* 0x415e0000 */ clocks = <&aon_prediv 0>; #clock-cells = <1>; }; gpu_clk: clock-controller@60200000 { compatible = "sprd,sc9860-gpu-clk"; reg = <0 0x60200000 0 0x400>; clocks = <&pll 0>; #clock-cells = <1>; }; vsp_clk: clock-controller@61000000 { compatible = "sprd,sc9860-vsp-clk"; reg = <0 0x61000000 0 0x400>; clocks = <&ext_26m>, <&pll 0>; #clock-cells = <1>; }; vsp_gate: vsp-gate { compatible = "sprd,sc9860-vsp-gate"; sprd,syscon = <&vsp_regs>; /* 0x61100000 */ clocks = <&vsp_clk 0>; #clock-cells = <1>; }; cam_clk: clock-controller@62000000 { compatible = "sprd,sc9860-cam-clk"; reg = <0 0x62000000 0 0x4000>; clocks = <&ext_26m>, <&pll 0>; #clock-cells = <1>; }; cam_gate: cam-gate { compatible = "sprd,sc9860-cam-gate"; sprd,syscon = <&cam_regs>; /* 0x62100000 */ clocks = <&cam_clk 0>; #clock-cells = <1>; }; disp_clk: clock-controller@63000000 { compatible = "sprd,sc9860-disp-clk"; reg = <0 0x63000000 0 0x400>; clocks = <&ext_26m>, <&pll 0>; #clock-cells = <1>; }; disp_gate: disp-gate { compatible = "sprd,sc9860-disp-gate"; sprd,syscon = <&disp_regs>; /* 0x63100000 */ clocks = <&disp_clk 0>; #clock-cells = <1>; }; apapb_gate: apapb-gate { compatible = "sprd,sc9860-apapb-gate"; sprd,syscon = <&ap_apb_regs>; /* 0x70b00000 */ clocks = <&ap_clk 0>; #clock-cells = <1>; }; funnel@10001000 { /* SoC Funnel */ compatible = "arm,coresight-dynamic-funnel", "arm,primecell"; reg = <0 0x10001000 0 0x1000>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { soc_funnel_out_port: endpoint { remote-endpoint = <&etb_in>; }; }; }; in-ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; soc_funnel_in_port0: endpoint { remote-endpoint = <&main_funnel_out_port>; }; }; port@4 { reg = <4>; soc_funnel_in_port1: endpoint { remote-endpoint = <&stm_out_port>; }; }; }; }; etb@10003000 { compatible = "arm,coresight-tmc", "arm,primecell"; reg = <0 0x10003000 0 0x1000>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { etb_in: endpoint { remote-endpoint = <&soc_funnel_out_port>; }; }; }; }; stm@10006000 { compatible = "arm,coresight-stm", "arm,primecell"; reg = <0 0x10006000 0 0x1000>, <0 0x01000000 0 0x180000>; reg-names = "stm-base", "stm-stimulus-base"; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { stm_out_port: endpoint { remote-endpoint = <&soc_funnel_in_port1>; }; }; }; }; funnel@11001000 { /* Cluster0 Funnel */ compatible = "arm,coresight-dynamic-funnel", "arm,primecell"; reg = <0 0x11001000 0 0x1000>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { cluster0_funnel_out_port: endpoint { remote-endpoint = <&cluster0_etf_in>; }; }; }; in-ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; cluster0_funnel_in_port0: endpoint { remote-endpoint = <&etm0_out>; }; }; port@1 { reg = <1>; cluster0_funnel_in_port1: endpoint { remote-endpoint = <&etm1_out>; }; }; port@2 { reg = <2>; cluster0_funnel_in_port2: endpoint { remote-endpoint = <&etm2_out>; }; }; port@4 { reg = <4>; cluster0_funnel_in_port3: endpoint { remote-endpoint = <&etm3_out>; }; }; }; }; funnel@11002000 { /* Cluster1 Funnel */ compatible = "arm,coresight-dynamic-funnel", "arm,primecell"; reg = <0 0x11002000 0 0x1000>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { cluster1_funnel_out_port: endpoint { remote-endpoint = <&cluster1_etf_in>; }; }; }; in-ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; cluster1_funnel_in_port0: endpoint { remote-endpoint = <&etm4_out>; }; }; port@1 { reg = <1>; cluster1_funnel_in_port1: endpoint { remote-endpoint = <&etm5_out>; }; }; port@2 { reg = <2>; cluster1_funnel_in_port2: endpoint { remote-endpoint = <&etm6_out>; }; }; port@3 { reg = <3>; cluster1_funnel_in_port3: endpoint { remote-endpoint = <&etm7_out>; }; }; }; }; etf@11003000 { /* ETF on Cluster0 */ compatible = "arm,coresight-tmc", "arm,primecell"; reg = <0 0x11003000 0 0x1000>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { cluster0_etf_out: endpoint { remote-endpoint = <&main_funnel_in_port0>; }; }; }; in-ports { port { cluster0_etf_in: endpoint { remote-endpoint = <&cluster0_funnel_out_port>; }; }; }; }; etf@11004000 { /* ETF on Cluster1 */ compatible = "arm,coresight-tmc", "arm,primecell"; reg = <0 0x11004000 0 0x1000>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { cluster1_etf_out: endpoint { remote-endpoint = <&main_funnel_in_port1>; }; }; }; in-ports { port { cluster1_etf_in: endpoint { remote-endpoint = <&cluster1_funnel_out_port>; }; }; }; }; funnel@11005000 { /* Main Funnel */ compatible = "arm,coresight-dynamic-funnel", "arm,primecell"; reg = <0 0x11005000 0 0x1000>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { main_funnel_out_port: endpoint { remote-endpoint = <&soc_funnel_in_port0>; }; }; }; in-ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; main_funnel_in_port0: endpoint { remote-endpoint = <&cluster0_etf_out>; }; }; port@1 { reg = <1>; main_funnel_in_port1: endpoint { remote-endpoint = <&cluster1_etf_out>; }; }; }; }; etm@11440000 { compatible = "arm,coresight-etm4x", "arm,primecell"; reg = <0 0x11440000 0 0x1000>; cpu = <&CPU0>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { etm0_out: endpoint { remote-endpoint = <&cluster0_funnel_in_port0>; }; }; }; }; etm@11540000 { compatible = "arm,coresight-etm4x", "arm,primecell"; reg = <0 0x11540000 0 0x1000>; cpu = <&CPU1>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { etm1_out: endpoint { remote-endpoint = <&cluster0_funnel_in_port1>; }; }; }; }; etm@11640000 { compatible = "arm,coresight-etm4x", "arm,primecell"; reg = <0 0x11640000 0 0x1000>; cpu = <&CPU2>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { etm2_out: endpoint { remote-endpoint = <&cluster0_funnel_in_port2>; }; }; }; }; etm@11740000 { compatible = "arm,coresight-etm4x", "arm,primecell"; reg = <0 0x11740000 0 0x1000>; cpu = <&CPU3>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { etm3_out: endpoint { remote-endpoint = <&cluster0_funnel_in_port3>; }; }; }; }; etm@11840000 { compatible = "arm,coresight-etm4x", "arm,primecell"; reg = <0 0x11840000 0 0x1000>; cpu = <&CPU4>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { etm4_out: endpoint { remote-endpoint = <&cluster1_funnel_in_port0>; }; }; }; }; etm@11940000 { compatible = "arm,coresight-etm4x", "arm,primecell"; reg = <0 0x11940000 0 0x1000>; cpu = <&CPU5>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { etm5_out: endpoint { remote-endpoint = <&cluster1_funnel_in_port1>; }; }; }; }; etm@11a40000 { compatible = "arm,coresight-etm4x", "arm,primecell"; reg = <0 0x11a40000 0 0x1000>; cpu = <&CPU6>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { etm6_out: endpoint { remote-endpoint = <&cluster1_funnel_in_port2>; }; }; }; }; etm@11b40000 { compatible = "arm,coresight-etm4x", "arm,primecell"; reg = <0 0x11b40000 0 0x1000>; cpu = <&CPU7>; clocks = <&ext_26m>; clock-names = "apb_pclk"; out-ports { port { etm7_out: endpoint { remote-endpoint = <&cluster1_funnel_in_port3>; }; }; }; }; gpio-keys { compatible = "gpio-keys"; key-volumedown { label = "Volume Down Key"; linux,code = ; gpios = <&eic_debounce 2 GPIO_ACTIVE_LOW>; debounce-interval = <2>; wakeup-source; }; key-volumeup { label = "Volume Up Key"; linux,code = ; gpios = <&pmic_eic 10 GPIO_ACTIVE_HIGH>; debounce-interval = <2>; wakeup-source; }; key-power { label = "Power Key"; linux,code = ; gpios = <&pmic_eic 1 GPIO_ACTIVE_HIGH>; debounce-interval = <2>; wakeup-source; }; }; }; };