19c8c52f7SJianxin Pan// SPDX-License-Identifier: (GPL-2.0+ OR MIT) 29c8c52f7SJianxin Pan/* 39c8c52f7SJianxin Pan * Copyright (c) 2018 Amlogic, Inc. All rights reserved. 49c8c52f7SJianxin Pan */ 59c8c52f7SJianxin Pan 69c8c52f7SJianxin Pan#include <dt-bindings/gpio/gpio.h> 7965c827aSJerome Brunet#include <dt-bindings/clock/g12a-clkc.h> 89c8c52f7SJianxin Pan#include <dt-bindings/interrupt-controller/irq.h> 99c8c52f7SJianxin Pan#include <dt-bindings/interrupt-controller/arm-gic.h> 109c8c52f7SJianxin Pan 119c8c52f7SJianxin Pan/ { 129c8c52f7SJianxin Pan compatible = "amlogic,g12a"; 139c8c52f7SJianxin Pan 149c8c52f7SJianxin Pan interrupt-parent = <&gic>; 159c8c52f7SJianxin Pan #address-cells = <2>; 169c8c52f7SJianxin Pan #size-cells = <2>; 179c8c52f7SJianxin Pan 189c8c52f7SJianxin Pan cpus { 199c8c52f7SJianxin Pan #address-cells = <0x2>; 209c8c52f7SJianxin Pan #size-cells = <0x0>; 219c8c52f7SJianxin Pan 229c8c52f7SJianxin Pan cpu0: cpu@0 { 239c8c52f7SJianxin Pan device_type = "cpu"; 2431af04cdSRob Herring compatible = "arm,cortex-a53"; 259c8c52f7SJianxin Pan reg = <0x0 0x0>; 269c8c52f7SJianxin Pan enable-method = "psci"; 279c8c52f7SJianxin Pan next-level-cache = <&l2>; 289c8c52f7SJianxin Pan }; 299c8c52f7SJianxin Pan 309c8c52f7SJianxin Pan cpu1: cpu@1 { 319c8c52f7SJianxin Pan device_type = "cpu"; 3231af04cdSRob Herring compatible = "arm,cortex-a53"; 339c8c52f7SJianxin Pan reg = <0x0 0x1>; 349c8c52f7SJianxin Pan enable-method = "psci"; 359c8c52f7SJianxin Pan next-level-cache = <&l2>; 369c8c52f7SJianxin Pan }; 379c8c52f7SJianxin Pan 389c8c52f7SJianxin Pan cpu2: cpu@2 { 399c8c52f7SJianxin Pan device_type = "cpu"; 4031af04cdSRob Herring compatible = "arm,cortex-a53"; 419c8c52f7SJianxin Pan reg = <0x0 0x2>; 429c8c52f7SJianxin Pan enable-method = "psci"; 439c8c52f7SJianxin Pan next-level-cache = <&l2>; 449c8c52f7SJianxin Pan }; 459c8c52f7SJianxin Pan 469c8c52f7SJianxin Pan cpu3: cpu@3 { 479c8c52f7SJianxin Pan device_type = "cpu"; 4831af04cdSRob Herring compatible = "arm,cortex-a53"; 499c8c52f7SJianxin Pan reg = <0x0 0x3>; 509c8c52f7SJianxin Pan enable-method = "psci"; 519c8c52f7SJianxin Pan next-level-cache = <&l2>; 529c8c52f7SJianxin Pan }; 539c8c52f7SJianxin Pan 549c8c52f7SJianxin Pan l2: l2-cache0 { 559c8c52f7SJianxin Pan compatible = "cache"; 569c8c52f7SJianxin Pan }; 579c8c52f7SJianxin Pan }; 589c8c52f7SJianxin Pan 59965c827aSJerome Brunet efuse: efuse { 60965c827aSJerome Brunet compatible = "amlogic,meson-gxbb-efuse"; 61965c827aSJerome Brunet clocks = <&clkc CLKID_EFUSE>; 62965c827aSJerome Brunet #address-cells = <1>; 63965c827aSJerome Brunet #size-cells = <1>; 64965c827aSJerome Brunet read-only; 65965c827aSJerome Brunet }; 66965c827aSJerome Brunet 679c8c52f7SJianxin Pan psci { 689c8c52f7SJianxin Pan compatible = "arm,psci-1.0"; 699c8c52f7SJianxin Pan method = "smc"; 709c8c52f7SJianxin Pan }; 719c8c52f7SJianxin Pan 729c8c52f7SJianxin Pan reserved-memory { 739c8c52f7SJianxin Pan #address-cells = <2>; 749c8c52f7SJianxin Pan #size-cells = <2>; 759c8c52f7SJianxin Pan ranges; 769c8c52f7SJianxin Pan 779c8c52f7SJianxin Pan /* 3 MiB reserved for ARM Trusted Firmware (BL31) */ 789c8c52f7SJianxin Pan secmon_reserved: secmon@5000000 { 799c8c52f7SJianxin Pan reg = <0x0 0x05000000 0x0 0x300000>; 809c8c52f7SJianxin Pan no-map; 819c8c52f7SJianxin Pan }; 829c8c52f7SJianxin Pan }; 839c8c52f7SJianxin Pan 84bd395152SJerome Brunet sm: secure-monitor { 85bd395152SJerome Brunet compatible = "amlogic,meson-gxbb-sm"; 86bd395152SJerome Brunet }; 87bd395152SJerome Brunet 889c8c52f7SJianxin Pan soc { 899c8c52f7SJianxin Pan compatible = "simple-bus"; 909c8c52f7SJianxin Pan #address-cells = <2>; 919c8c52f7SJianxin Pan #size-cells = <2>; 929c8c52f7SJianxin Pan ranges; 939c8c52f7SJianxin Pan 94503f5fedSJerome Brunet apb: bus@ff600000 { 959c8c52f7SJianxin Pan compatible = "simple-bus"; 96503f5fedSJerome Brunet reg = <0x0 0xff600000 0x0 0x200000>; 979c8c52f7SJianxin Pan #address-cells = <2>; 989c8c52f7SJianxin Pan #size-cells = <2>; 99503f5fedSJerome Brunet ranges = <0x0 0x0 0x0 0xff600000 0x0 0x200000>; 100503f5fedSJerome Brunet 101503f5fedSJerome Brunet periphs: bus@34400 { 102503f5fedSJerome Brunet compatible = "simple-bus"; 103503f5fedSJerome Brunet reg = <0x0 0x34400 0x0 0x400>; 104503f5fedSJerome Brunet #address-cells = <2>; 105503f5fedSJerome Brunet #size-cells = <2>; 106503f5fedSJerome Brunet ranges = <0x0 0x0 0x0 0x34400 0x0 0x400>; 10711a7bea1SJerome Brunet 10811a7bea1SJerome Brunet periphs_pinctrl: pinctrl@40 { 10911a7bea1SJerome Brunet compatible = "amlogic,meson-g12a-periphs-pinctrl"; 11011a7bea1SJerome Brunet #address-cells = <2>; 11111a7bea1SJerome Brunet #size-cells = <2>; 11211a7bea1SJerome Brunet ranges; 11311a7bea1SJerome Brunet 11411a7bea1SJerome Brunet gpio: bank@40 { 11511a7bea1SJerome Brunet reg = <0x0 0x40 0x0 0x4c>, 11611a7bea1SJerome Brunet <0x0 0xe8 0x0 0x18>, 11711a7bea1SJerome Brunet <0x0 0x120 0x0 0x18>, 11811a7bea1SJerome Brunet <0x0 0x2c0 0x0 0x40>, 11911a7bea1SJerome Brunet <0x0 0x340 0x0 0x1c>; 12011a7bea1SJerome Brunet reg-names = "gpio", 12111a7bea1SJerome Brunet "pull", 12211a7bea1SJerome Brunet "pull-enable", 12311a7bea1SJerome Brunet "mux", 12411a7bea1SJerome Brunet "ds"; 12511a7bea1SJerome Brunet gpio-controller; 12611a7bea1SJerome Brunet #gpio-cells = <2>; 12711a7bea1SJerome Brunet gpio-ranges = <&periphs_pinctrl 0 0 86>; 12811a7bea1SJerome Brunet }; 129ff4f8b6cSNeil Armstrong 130ff4f8b6cSNeil Armstrong uart_a_pins: uart-a { 131ff4f8b6cSNeil Armstrong mux { 132ff4f8b6cSNeil Armstrong groups = "uart_a_tx", 133ff4f8b6cSNeil Armstrong "uart_a_rx"; 134ff4f8b6cSNeil Armstrong function = "uart_a"; 135ff4f8b6cSNeil Armstrong bias-disable; 136ff4f8b6cSNeil Armstrong }; 137ff4f8b6cSNeil Armstrong }; 138ff4f8b6cSNeil Armstrong 139ff4f8b6cSNeil Armstrong uart_a_cts_rts_pins: uart-a-cts-rts { 140ff4f8b6cSNeil Armstrong mux { 141ff4f8b6cSNeil Armstrong groups = "uart_a_cts", 142ff4f8b6cSNeil Armstrong "uart_a_rts"; 143ff4f8b6cSNeil Armstrong function = "uart_a"; 144ff4f8b6cSNeil Armstrong bias-disable; 145ff4f8b6cSNeil Armstrong }; 146ff4f8b6cSNeil Armstrong }; 147ff4f8b6cSNeil Armstrong 148ff4f8b6cSNeil Armstrong uart_b_pins: uart-b { 149ff4f8b6cSNeil Armstrong mux { 150ff4f8b6cSNeil Armstrong groups = "uart_b_tx", 151ff4f8b6cSNeil Armstrong "uart_b_rx"; 152ff4f8b6cSNeil Armstrong function = "uart_b"; 153ff4f8b6cSNeil Armstrong bias-disable; 154ff4f8b6cSNeil Armstrong }; 155ff4f8b6cSNeil Armstrong }; 156ff4f8b6cSNeil Armstrong 157ff4f8b6cSNeil Armstrong uart_c_pins: uart-c { 158ff4f8b6cSNeil Armstrong mux { 159ff4f8b6cSNeil Armstrong groups = "uart_c_tx", 160ff4f8b6cSNeil Armstrong "uart_c_rx"; 161ff4f8b6cSNeil Armstrong function = "uart_c"; 162ff4f8b6cSNeil Armstrong bias-disable; 163ff4f8b6cSNeil Armstrong }; 164ff4f8b6cSNeil Armstrong }; 165ff4f8b6cSNeil Armstrong 166ff4f8b6cSNeil Armstrong uart_c_cts_rts_pins: uart-c-cts-rts { 167ff4f8b6cSNeil Armstrong mux { 168ff4f8b6cSNeil Armstrong groups = "uart_c_cts", 169ff4f8b6cSNeil Armstrong "uart_c_rts"; 170ff4f8b6cSNeil Armstrong function = "uart_c"; 171ff4f8b6cSNeil Armstrong bias-disable; 172ff4f8b6cSNeil Armstrong }; 173ff4f8b6cSNeil Armstrong }; 17411a7bea1SJerome Brunet }; 1759c8c52f7SJianxin Pan }; 1769c8c52f7SJianxin Pan 177503f5fedSJerome Brunet hiu: bus@3c000 { 1789c8c52f7SJianxin Pan compatible = "simple-bus"; 179503f5fedSJerome Brunet reg = <0x0 0x3c000 0x0 0x1400>; 1809c8c52f7SJianxin Pan #address-cells = <2>; 1819c8c52f7SJianxin Pan #size-cells = <2>; 182503f5fedSJerome Brunet ranges = <0x0 0x0 0x0 0x3c000 0x0 0x1400>; 183785fb434SJerome Brunet 184785fb434SJerome Brunet hhi: system-controller@0 { 185785fb434SJerome Brunet compatible = "amlogic,meson-gx-hhi-sysctrl", 186785fb434SJerome Brunet "simple-mfd", "syscon"; 187785fb434SJerome Brunet reg = <0 0 0 0x400>; 188785fb434SJerome Brunet 189785fb434SJerome Brunet clkc: clock-controller { 190785fb434SJerome Brunet compatible = "amlogic,g12a-clkc"; 191785fb434SJerome Brunet #clock-cells = <1>; 192785fb434SJerome Brunet clocks = <&xtal>; 193785fb434SJerome Brunet clock-names = "xtal"; 194785fb434SJerome Brunet }; 195785fb434SJerome Brunet }; 196503f5fedSJerome Brunet }; 1979c8c52f7SJianxin Pan }; 1989c8c52f7SJianxin Pan 1999c8c52f7SJianxin Pan aobus: bus@ff800000 { 2009c8c52f7SJianxin Pan compatible = "simple-bus"; 2019c8c52f7SJianxin Pan reg = <0x0 0xff800000 0x0 0x100000>; 2029c8c52f7SJianxin Pan #address-cells = <2>; 2039c8c52f7SJianxin Pan #size-cells = <2>; 2049c8c52f7SJianxin Pan ranges = <0x0 0x0 0x0 0xff800000 0x0 0x100000>; 2059c8c52f7SJianxin Pan 206b019f4a4SNeil Armstrong rti: sys-ctrl@0 { 207b019f4a4SNeil Armstrong compatible = "amlogic,meson-gx-ao-sysctrl", 208b019f4a4SNeil Armstrong "simple-mfd", "syscon"; 209b019f4a4SNeil Armstrong reg = <0x0 0x0 0x0 0x100>; 210b019f4a4SNeil Armstrong #address-cells = <2>; 211b019f4a4SNeil Armstrong #size-cells = <2>; 212b019f4a4SNeil Armstrong ranges = <0x0 0x0 0x0 0x0 0x0 0x100>; 213b019f4a4SNeil Armstrong 214b019f4a4SNeil Armstrong clkc_AO: clock-controller { 215b019f4a4SNeil Armstrong compatible = "amlogic,meson-g12a-aoclkc"; 216b019f4a4SNeil Armstrong #clock-cells = <1>; 217b019f4a4SNeil Armstrong #reset-cells = <1>; 218b019f4a4SNeil Armstrong clocks = <&xtal>, <&clkc CLKID_CLK81>; 219b019f4a4SNeil Armstrong clock-names = "xtal", "mpeg-clk"; 220b019f4a4SNeil Armstrong }; 22111a7bea1SJerome Brunet 22211a7bea1SJerome Brunet ao_pinctrl: pinctrl@14 { 22311a7bea1SJerome Brunet compatible = "amlogic,meson-g12a-aobus-pinctrl"; 22411a7bea1SJerome Brunet #address-cells = <2>; 22511a7bea1SJerome Brunet #size-cells = <2>; 22611a7bea1SJerome Brunet ranges; 22711a7bea1SJerome Brunet 22811a7bea1SJerome Brunet gpio_ao: bank@14 { 22911a7bea1SJerome Brunet reg = <0x0 0x14 0x0 0x8>, 23011a7bea1SJerome Brunet <0x0 0x1c 0x0 0x8>, 23111a7bea1SJerome Brunet <0x0 0x24 0x0 0x14>; 23211a7bea1SJerome Brunet reg-names = "mux", 23311a7bea1SJerome Brunet "ds", 23411a7bea1SJerome Brunet "gpio"; 23511a7bea1SJerome Brunet gpio-controller; 23611a7bea1SJerome Brunet #gpio-cells = <2>; 23711a7bea1SJerome Brunet gpio-ranges = <&ao_pinctrl 0 0 15>; 23811a7bea1SJerome Brunet }; 239e92546c2SJerome Brunet 240e92546c2SJerome Brunet uart_ao_a_pins: uart-a-ao { 241e92546c2SJerome Brunet mux { 242e92546c2SJerome Brunet groups = "uart_ao_a_tx", 243e92546c2SJerome Brunet "uart_ao_a_rx"; 244e92546c2SJerome Brunet function = "uart_ao_a"; 245e92546c2SJerome Brunet bias-disable; 246e92546c2SJerome Brunet }; 247e92546c2SJerome Brunet }; 248e92546c2SJerome Brunet 249e92546c2SJerome Brunet uart_ao_a_cts_rts_pins: uart-ao-a-cts-rts { 250e92546c2SJerome Brunet mux { 251e92546c2SJerome Brunet groups = "uart_ao_a_cts", 252e92546c2SJerome Brunet "uart_ao_a_rts"; 253e92546c2SJerome Brunet function = "uart_ao_a"; 254e92546c2SJerome Brunet bias-disable; 255e92546c2SJerome Brunet }; 256e92546c2SJerome Brunet }; 25711a7bea1SJerome Brunet }; 258b019f4a4SNeil Armstrong }; 259b019f4a4SNeil Armstrong 2600fa724c5SNeil Armstrong sec_AO: ao-secure@140 { 2610fa724c5SNeil Armstrong compatible = "amlogic,meson-gx-ao-secure", "syscon"; 2620fa724c5SNeil Armstrong reg = <0x0 0x140 0x0 0x140>; 2630fa724c5SNeil Armstrong amlogic,has-chip-id; 2640fa724c5SNeil Armstrong }; 2650fa724c5SNeil Armstrong 2669c8c52f7SJianxin Pan uart_AO: serial@3000 { 267503f5fedSJerome Brunet compatible = "amlogic,meson-gx-uart", 268503f5fedSJerome Brunet "amlogic,meson-ao-uart"; 2699c8c52f7SJianxin Pan reg = <0x0 0x3000 0x0 0x18>; 2709c8c52f7SJianxin Pan interrupts = <GIC_SPI 193 IRQ_TYPE_EDGE_RISING>; 2719c8c52f7SJianxin Pan clocks = <&xtal>, <&xtal>, <&xtal>; 2729c8c52f7SJianxin Pan clock-names = "xtal", "pclk", "baud"; 2739c8c52f7SJianxin Pan status = "disabled"; 2749c8c52f7SJianxin Pan }; 2759c8c52f7SJianxin Pan 2769c8c52f7SJianxin Pan uart_AO_B: serial@4000 { 277503f5fedSJerome Brunet compatible = "amlogic,meson-gx-uart", 278503f5fedSJerome Brunet "amlogic,meson-ao-uart"; 2799c8c52f7SJianxin Pan reg = <0x0 0x4000 0x0 0x18>; 2809c8c52f7SJianxin Pan interrupts = <GIC_SPI 197 IRQ_TYPE_EDGE_RISING>; 2819c8c52f7SJianxin Pan clocks = <&xtal>, <&xtal>, <&xtal>; 2829c8c52f7SJianxin Pan clock-names = "xtal", "pclk", "baud"; 2839c8c52f7SJianxin Pan status = "disabled"; 2849c8c52f7SJianxin Pan }; 2859c8c52f7SJianxin Pan }; 2869c8c52f7SJianxin Pan 2879c8c52f7SJianxin Pan gic: interrupt-controller@ffc01000 { 2889c8c52f7SJianxin Pan compatible = "arm,gic-400"; 2899c8c52f7SJianxin Pan reg = <0x0 0xffc01000 0 0x1000>, 2909c8c52f7SJianxin Pan <0x0 0xffc02000 0 0x2000>, 2919c8c52f7SJianxin Pan <0x0 0xffc04000 0 0x2000>, 2929c8c52f7SJianxin Pan <0x0 0xffc06000 0 0x2000>; 2939c8c52f7SJianxin Pan interrupt-controller; 2949c8c52f7SJianxin Pan interrupts = <GIC_PPI 9 2959c8c52f7SJianxin Pan (GIC_CPU_MASK_SIMPLE(8) | IRQ_TYPE_LEVEL_HIGH)>; 2969c8c52f7SJianxin Pan #interrupt-cells = <3>; 2979c8c52f7SJianxin Pan #address-cells = <0>; 2989c8c52f7SJianxin Pan }; 2999c8c52f7SJianxin Pan 3009c8c52f7SJianxin Pan cbus: bus@ffd00000 { 3019c8c52f7SJianxin Pan compatible = "simple-bus"; 302503f5fedSJerome Brunet reg = <0x0 0xffd00000 0x0 0x100000>; 3039c8c52f7SJianxin Pan #address-cells = <2>; 3049c8c52f7SJianxin Pan #size-cells = <2>; 305503f5fedSJerome Brunet ranges = <0x0 0x0 0x0 0xffd00000 0x0 0x100000>; 3069c8c52f7SJianxin Pan 3077ab41c47SJerome Brunet reset: reset-controller@1004 { 3087ab41c47SJerome Brunet compatible = "amlogic,meson-g12a-reset", 3097ab41c47SJerome Brunet "amlogic,meson-axg-reset"; 3107ab41c47SJerome Brunet reg = <0x0 0x1004 0x0 0x9c>; 3117ab41c47SJerome Brunet #reset-cells = <1>; 3127ab41c47SJerome Brunet }; 3137ab41c47SJerome Brunet 31460d4fdb8SJerome Brunet clk_msr: clock-measure@18000 { 31560d4fdb8SJerome Brunet compatible = "amlogic,meson-g12a-clk-measure"; 31660d4fdb8SJerome Brunet reg = <0x0 0x18000 0x0 0x10>; 31760d4fdb8SJerome Brunet }; 318ff4f8b6cSNeil Armstrong 319ff4f8b6cSNeil Armstrong uart_C: serial@22000 { 320ff4f8b6cSNeil Armstrong compatible = "amlogic,meson-gx-uart"; 321ff4f8b6cSNeil Armstrong reg = <0x0 0x22000 0x0 0x18>; 322ff4f8b6cSNeil Armstrong interrupts = <GIC_SPI 93 IRQ_TYPE_EDGE_RISING>; 323ff4f8b6cSNeil Armstrong clocks = <&xtal>, <&clkc CLKID_UART2>, <&xtal>; 324ff4f8b6cSNeil Armstrong clock-names = "xtal", "pclk", "baud"; 325ff4f8b6cSNeil Armstrong status = "disabled"; 326ff4f8b6cSNeil Armstrong }; 327ff4f8b6cSNeil Armstrong 328ff4f8b6cSNeil Armstrong uart_B: serial@23000 { 329ff4f8b6cSNeil Armstrong compatible = "amlogic,meson-gx-uart"; 330ff4f8b6cSNeil Armstrong reg = <0x0 0x23000 0x0 0x18>; 331ff4f8b6cSNeil Armstrong interrupts = <GIC_SPI 75 IRQ_TYPE_EDGE_RISING>; 332ff4f8b6cSNeil Armstrong clocks = <&xtal>, <&clkc CLKID_UART1>, <&xtal>; 333ff4f8b6cSNeil Armstrong clock-names = "xtal", "pclk", "baud"; 334ff4f8b6cSNeil Armstrong status = "disabled"; 335ff4f8b6cSNeil Armstrong }; 336ff4f8b6cSNeil Armstrong 337ff4f8b6cSNeil Armstrong uart_A: serial@24000 { 338ff4f8b6cSNeil Armstrong compatible = "amlogic,meson-gx-uart"; 339ff4f8b6cSNeil Armstrong reg = <0x0 0x24000 0x0 0x18>; 340ff4f8b6cSNeil Armstrong interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>; 341ff4f8b6cSNeil Armstrong clocks = <&xtal>, <&clkc CLKID_UART0>, <&xtal>; 342ff4f8b6cSNeil Armstrong clock-names = "xtal", "pclk", "baud"; 343ff4f8b6cSNeil Armstrong status = "disabled"; 344ff4f8b6cSNeil Armstrong }; 3459c8c52f7SJianxin Pan }; 3469c8c52f7SJianxin Pan }; 3479c8c52f7SJianxin Pan 3489c8c52f7SJianxin Pan timer { 3499c8c52f7SJianxin Pan compatible = "arm,armv8-timer"; 3509c8c52f7SJianxin Pan interrupts = <GIC_PPI 13 3519c8c52f7SJianxin Pan (GIC_CPU_MASK_RAW(0xff) | IRQ_TYPE_LEVEL_LOW)>, 3529c8c52f7SJianxin Pan <GIC_PPI 14 3539c8c52f7SJianxin Pan (GIC_CPU_MASK_RAW(0xff) | IRQ_TYPE_LEVEL_LOW)>, 3549c8c52f7SJianxin Pan <GIC_PPI 11 3559c8c52f7SJianxin Pan (GIC_CPU_MASK_RAW(0xff) | IRQ_TYPE_LEVEL_LOW)>, 3569c8c52f7SJianxin Pan <GIC_PPI 10 3579c8c52f7SJianxin Pan (GIC_CPU_MASK_RAW(0xff) | IRQ_TYPE_LEVEL_LOW)>; 3589c8c52f7SJianxin Pan }; 3599c8c52f7SJianxin Pan 3609c8c52f7SJianxin Pan xtal: xtal-clk { 3619c8c52f7SJianxin Pan compatible = "fixed-clock"; 3629c8c52f7SJianxin Pan clock-frequency = <24000000>; 3639c8c52f7SJianxin Pan clock-output-names = "xtal"; 3649c8c52f7SJianxin Pan #clock-cells = <0>; 3659c8c52f7SJianxin Pan }; 3669c8c52f7SJianxin Pan 3679c8c52f7SJianxin Pan}; 368